sponsors.tsx 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. import Head from "next/head"
  2. import Image from "next/legacy/image"
  3. import classNames from "classnames"
  4. import { FormattedMessage, useIntl } from "react-intl"
  5. import Hero from "../components/Hero"
  6. import SponsorCard from "../components/SponsorCard"
  7. import SponsorLogoGroup from "../components/SponsorLogoGroup"
  8. import { withDefaultStaticProps } from "../utils/defaultStaticProps"
  9. import sponsors from "../data/sponsors"
  10. import sponsorData from "../data/sponsors"
  11. import Layout from "../components/Layout"
  12. import LinkButton from "../components/LinkButton"
  13. import MastodonInTheCloudsIllustration from "../public/illustrations/mastodon_in_the_clouds.png"
  14. import MastodonWithLaptopIllustration from "../public/illustrations/mastodon_with_laptop.png"
  15. import MasotodonFediverseIllustration from "../public/illustrations/mastodon_fediverse.png"
  16. import MastodonsCheeringIllustration from "../public/illustrations/mastodons_cheering.png"
  17. import previewImage from "../public/sponsors_preview.png"
  18. import usFlagIcon from "../public/united_states_flag_icon_round.svg"
  19. import Link from "next/link"
  20. const DonateCard = ({
  21. title,
  22. titleClassName = "",
  23. titleInnerClassName = "",
  24. className = null,
  25. copy,
  26. cta,
  27. ctaLink,
  28. ctaLight = false
  29. }) => (
  30. <div
  31. className={classNames(
  32. "flex flex-col items-center text-center sm:items-start sm:text-left",
  33. className
  34. )}
  35. >
  36. <h3
  37. className={classNames(
  38. "h5 mb-5 flex flex-col max-sm:items-center md:items-start",
  39. "after:block after:h-1 after:rounded-md after:w-32 after:mt-2 after:bg-blurple-500",
  40. titleClassName
  41. )}
  42. >
  43. <span className={titleInnerClassName}>
  44. {title}
  45. </span>
  46. </h3>
  47. <p className="b2 mb-8 text-gray-1 grow">
  48. {copy}
  49. </p>
  50. <LinkButton light={ctaLight} size="medium" href={ctaLink}>
  51. {cta}
  52. </LinkButton>
  53. </div>
  54. );
  55. const Emphasis = ({ children }) => (
  56. <span className="font-bold">{children}</span>
  57. );
  58. function Sponsors() {
  59. const intl = useIntl()
  60. return (
  61. <Layout previewImage={previewImage}>
  62. <Hero>
  63. <h1 className="h2 xl:mt-8 mb-5 lg:col-start-2">
  64. <FormattedMessage id="sponsors.hero.title" defaultMessage="Reimagining online discourse" />
  65. </h1>
  66. <p className="sh1 pb-20 lg:col-start-2 lg:col-end-6">
  67. <FormattedMessage
  68. id="sponsors.hero.body"
  69. defaultMessage="We develop and maintain software for the decentralized social web. No billionaires or mega-corporations here — we rely entirely on your support."
  70. />
  71. </p>
  72. <div className="flex gap-6">
  73. <LinkButton size="large" href="#donate">
  74. <FormattedMessage
  75. id="sponsors.hero.cta.donate"
  76. defaultMessage="Donate"
  77. />
  78. </LinkButton>
  79. <LinkButton size="large" light borderless href="#supported_by">
  80. <FormattedMessage
  81. id="sponsors.hero.cta.view_sponsors"
  82. defaultMessage="View our sponsors"
  83. />
  84. </LinkButton>
  85. </div>
  86. </Hero>
  87. <div className="full-width-bg">
  88. <div className="full-width-bg__inner">
  89. <section className="md:grid md:grid-cols-2 items-start md:gap-gutter lg:grid-cols-12 pb-16 lg:pb-20 lg:pt-8 xl:pt-0">
  90. <div className="row-span-full lg:col-span-6 lg:col-start-1 xl:col-span-5 xl:col-start-2 mx-auto pb-6 px-16 max-w-md md:pb-0 md:px-8 md:pt-20 lg:pt-0 lg:pr-8 lg:pl-0">
  91. <Image src={MastodonInTheCloudsIllustration} alt="" />
  92. </div>
  93. <div className="row-span-full lg:col-span-6 lg:col-start-7 xl:col-span-5">
  94. <h2 className="h4 md:h3 mb-5">
  95. <FormattedMessage
  96. id="sponsors.support_us.title"
  97. defaultMessage="Support us"
  98. />
  99. </h2>
  100. <p className="sh1 text-gray-1 whitespace-pre-line">
  101. <FormattedMessage
  102. id="sponsors.support_us.body"
  103. defaultMessage={`We’re rebuilding social media so everyone can build healthy communities locally, connect globally, and own their online presence.\n\nAs a nonprofit we lead development of Mastodon. We’re part of a vast network of organizations building on social web technology. Together, we’re retaking the digital town square for the people.\n\nHelp us build the social web for everyone.`}
  104. />
  105. </p>
  106. </div>
  107. </section>
  108. </div>
  109. </div>
  110. <div className="full-width-bg">
  111. <div className="full-width-bg__inner">
  112. <a id="donate" className="invisible block relative -top-32"/>
  113. <section className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-8 lg:pb-12">
  114. <div className="md:col-start-1 md:col-span-5 xl:col-start-2 xl:col-span-4">
  115. <h2 className="h4 md:h3 mb-5">
  116. <FormattedMessage
  117. id="sponsors.donate.title"
  118. defaultMessage="Donate today"
  119. />
  120. </h2>
  121. <p className="sh1 text-gray-1 whitespace-pre-line">
  122. <FormattedMessage
  123. id="sponsors.donate.body"
  124. defaultMessage={`All donations go directly to Mastodon's development and operation. Recurring donations help us plan for the long term.\n\nWe're forever grateful for every dollar we receive — Thank you!`}
  125. />
  126. </p>
  127. </div>
  128. <div className="row-span-full md:col-start-6 md:col-span-6 mx-auto pt-8 md:pt-0 px-12 max-w-md md:pb-0 md:px-0">
  129. <Image src={MastodonsCheeringIllustration} alt="" />
  130. </div>
  131. </section>
  132. </div>
  133. </div>
  134. <div className="full-width-bg">
  135. <div className="full-width-bg__inner">
  136. <div className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-1">
  137. <div className="md:col-span-12 md:col-start-1 xl:col-span-10 xl:col-start-2 border border-blurple-500 xl:p-16 px-12 py-12 sm:px-24 sm:py-16 md:p-12 rounded-md">
  138. <div className="grid max-sm:grid-cols-1 sm:grid-cols-2 gap-16 md:grid-cols-3">
  139. <DonateCard
  140. title={(
  141. <FormattedMessage
  142. id="sponsors.donate_direct.stripe.title"
  143. defaultMessage="Direct"
  144. />
  145. )}
  146. copy={(
  147. <FormattedMessage
  148. id="sponsors.donate_direct.stripe.copy"
  149. defaultMessage="Direct donations are very welcome and it's easy to do using Stripe. A direct donation also makes for a great gift."
  150. />
  151. )}
  152. cta={(
  153. <FormattedMessage
  154. id="sponsors.donate_direct.stripe.cta"
  155. defaultMessage="Donate directly"
  156. />
  157. )}
  158. ctaLink="https://donate.stripe.com/00g5l42h8ezY3YcaEE"
  159. />
  160. <DonateCard
  161. title={(
  162. <>
  163. <span className="mr-2">
  164. <FormattedMessage
  165. id="sponsors.donate_direct.givebutter.title"
  166. defaultMessage="Direct"
  167. />
  168. </span>
  169. <Image
  170. src={usFlagIcon}
  171. className="aspect-square"
  172. width="20"
  173. height="20"
  174. alt="Direct tax deductable donation for American residents"
  175. />
  176. </>
  177. )}
  178. copy={(
  179. <FormattedMessage
  180. id="sponsors.donate_direct.givebutter.copy"
  181. defaultMessage="Are you an American resident? If so, you can make a tax deductable donation using Givebutter."
  182. />
  183. )}
  184. cta={(
  185. <FormattedMessage
  186. id="sponsors.donate_direct.givebutter.cta"
  187. defaultMessage="Donate directly"
  188. />
  189. )}
  190. ctaLink="https://givebutter.com/nAk74p"
  191. />
  192. <DonateCard
  193. title={(
  194. <FormattedMessage
  195. id="sponsors.donate.patreon.title"
  196. defaultMessage="Patreon"
  197. />
  198. )}
  199. copy={(
  200. <FormattedMessage
  201. id="sponsors.donate.patreon.copy"
  202. defaultMessage="Patreon donors gain access to <emphasis>Mastodon’s Discord</emphasis> for developers, server admins, and social web supporters."
  203. values={{
  204. emphasis: (text) => (
  205. <Emphasis>
  206. {text}
  207. </Emphasis>
  208. ),
  209. }}
  210. />
  211. )}
  212. cta={(
  213. <FormattedMessage
  214. id="sponsors.donate.patreon.cta"
  215. defaultMessage="Donate on Patreon"
  216. />
  217. )}
  218. ctaLink="https://patreon.com/mastodon"
  219. />
  220. <DonateCard
  221. title={(
  222. <FormattedMessage
  223. id="sponsors.donate.github.title"
  224. defaultMessage="GitHub"
  225. />
  226. )}
  227. titleInnerClassName="md:before:content-['-'] md:before:block md:before:w-16 md:before:invisible"
  228. copy={(
  229. <FormattedMessage
  230. id="sponsors.donate.github.copy"
  231. defaultMessage="GitHub Sponsors receive a Mastodon badge to their Org or Personal profile. Plus we don’t pay fees!"
  232. />
  233. )}
  234. cta={(
  235. <FormattedMessage
  236. id="sponsors.donate.github.cta"
  237. defaultMessage="Donate on GitHub"
  238. />
  239. )}
  240. ctaLink="https://github.com/sponsors/mastodon"
  241. ctaLight
  242. />
  243. <DonateCard
  244. title={(
  245. <FormattedMessage
  246. id="sponsors.donate.corporate_sponsorship.title"
  247. defaultMessage="Corporate Sponsorship"
  248. />
  249. )}
  250. titleInnerClassName="md:pr-16"
  251. copy={(
  252. <FormattedMessage
  253. id="sponsors.donate.corporate_sponsorship.copy"
  254. defaultMessage="We welcome corporate sponsors! Sponsorship includes your company’s logo with a link to your website."
  255. />
  256. )}
  257. cta={(
  258. <FormattedMessage
  259. id="sponsors.donate.corporate_sponsorship.cta"
  260. defaultMessage="Become a sponsor"
  261. />
  262. )}
  263. ctaLink="https://sponsor.joinmastodon.org/"
  264. ctaLight
  265. />
  266. <DonateCard
  267. title={(
  268. <FormattedMessage
  269. id="sponsors.donate.corporate_matching.title"
  270. defaultMessage="Corporate Matching"
  271. />
  272. )}
  273. titleInnerClassName="md:pr-16"
  274. copy={(
  275. <FormattedMessage
  276. id="sponsors.donate.corporate_matching.copy"
  277. defaultMessage="Does your company provide corporate matching? If so, you can use Benevity to donate!"
  278. />
  279. )}
  280. cta={(
  281. <FormattedMessage
  282. id="sponsors.donate.corporate_matching.cta"
  283. defaultMessage="Donate on Benevity"
  284. />
  285. )}
  286. ctaLink="https://causes.benevity.org/causes/276-5575947211653_d7e4"
  287. ctaLight
  288. />
  289. </div>
  290. </div>
  291. </div>
  292. <div className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-16">
  293. <div className="md:col-span-12 md:col-start-1 xl:col-span-10 xl:col-start-2">
  294. <div className="b4 mt-4 text-gray-2 italic pr-4 text-left md:text-right">
  295. <FormattedMessage
  296. id="sponsors.donate.footer.donor_policy"
  297. defaultMessage={`To ensure you qualify to make a donation, please refer to our donor policies: <link_mastodon_inc>Mastodon, Inc</link_mastodon_inc> <middot></middot> <link_mastodon_ggmbh>Mastodon gGmbH</link_mastodon_ggmbh>`}
  298. values={{
  299. link_mastodon_inc: (text) => (
  300. <Link className="hover:text-blurple-600 ml-0.5" href="/donor-policy/mastodon-inc" target="_blank">{text}</Link>
  301. ),
  302. link_mastodon_ggmbh: (text) => (
  303. <Link className="hover:text-blurple-600" href="/donor-policy/mastodon-ggmbh" target="_blank">{text}</Link>
  304. ),
  305. middot: () => (<span className="px-0.5">&middot;</span>)
  306. }}
  307. />
  308. </div>
  309. </div>
  310. </div>
  311. </div>
  312. </div>
  313. <div className="full-width-bg bg-gray-5">
  314. <div className="full-width-bg__inner">
  315. <section className="pt-14 pb-[4.5rem] md:grid md:items-center md:gap-gutter md:grid-cols-12">
  316. <div className="row-span-full xl:col-span-4 xl:col-start-8 lg:col-span-5 lg:col-start-8 md:col-span-6 mx-auto pb-6 px-16 max-w-md md:max-w-none md:pb-0 md:px-8 md:col-start-7 lg:p-0">
  317. <Image src={MastodonWithLaptopIllustration} alt="" />
  318. </div>
  319. <div className="row-span-full xl:col-span-5 xl:col-start-2 md:col-span-6 md:col-start-1">
  320. <h2 className="h4 md:h3 mb-2 md:mb-5">
  321. <FormattedMessage
  322. id="sponsors.how_we_use_donations.title"
  323. defaultMessage="How we use donations"
  324. />
  325. </h2>
  326. <p className="sh1 mb-8 text-gray-1 whitespace-pre-line">
  327. <FormattedMessage
  328. id="sponsors.how_we_use_donations.body"
  329. defaultMessage={`Donations go towards software development, paying essential contributors like web developers, mobile app developers, and designers. Your donations also support legal and marketing expenses to advocate for and raise awareness about the social web and Mastodon. Additionally, we operate the two largest Mastodon servers, maintained through financial and in-kind contributions.\n\nFor details, take a look at our latest annual report.`}
  330. />
  331. </p>
  332. <div className="flex gap-4 items-center">
  333. <LinkButton size="large" href="/reports/Mastodon%20Annual%20Report%202022.pdf">
  334. <FormattedMessage
  335. id="sponsors.cta.annual_reports"
  336. defaultMessage="Annual Report"
  337. />
  338. </LinkButton>
  339. <span className="font-semibold">PDF, 6MB</span>
  340. </div>
  341. </div>
  342. </section>
  343. </div>
  344. </div>
  345. <div className="full-width-bg ">
  346. <div className="full-width-bg__inner">
  347. <section className="pt-14 pb-16 md:grid md:items-center md:gap-gutter md:grid-cols-12">
  348. <div className="row-span-full xl:col-span-4 xl:col-start-2 lg:col-span-5 md:col-span-6 md:col-start-1 mx-auto pb-6 px-16 max-w-md md:max-w-none md:pb-0 md:px-8 lg:p-0">
  349. <Image src={MasotodonFediverseIllustration} alt="" />
  350. </div>
  351. <div className="row-span-full xl:col-span-5 xl:col-start-7 md:col-span-6 md:col-start-7">
  352. <h2 className="h4 md:h3 mb-2 md:mb-5">
  353. <FormattedMessage
  354. id="sponsors.build_the_social_web.title"
  355. defaultMessage="Build the social web"
  356. />
  357. </h2>
  358. <p className="sh1 mb-8 text-gray-1 whitespace-pre-line">
  359. <FormattedMessage
  360. id="sponsors.build_the_social_web.body"
  361. defaultMessage={`We’re looking for developers to help build the future of online communities with Mastodon. There’s a lot to do — we need help with new features, scaling operations, improving documentation, and more — but the work doesn’t stop here. We contribute to the decentralized social media protocol underlying Mastodon, ActivityPub, and collaborate with the social web community that uses it.\n\nJoin the social web revolution!`}
  362. />
  363. </p>
  364. <LinkButton size="large" href={'https://github.com/mastodon/mastodon/blob/main/CONTRIBUTING.md'}>
  365. <FormattedMessage
  366. id="sponsors.cta.contribute_to_mastodon"
  367. defaultMessage="Contribute to Mastodon"
  368. />
  369. </LinkButton>
  370. </div>
  371. </section>
  372. </div>
  373. </div>
  374. <section className="platinum-gold-sponsors mb-32 pt-16">
  375. <a id="supported_by" className="invisible block relative -top-32"/>
  376. <h2 className="h4 mb-10 text-center">
  377. <FormattedMessage
  378. id="sponsors.supported_by"
  379. defaultMessage="Supported by"
  380. />
  381. </h2>
  382. <SponsorLogoGroup
  383. sponsors={[...sponsorData.platinum, ...sponsorData.gold]}
  384. />
  385. </section>
  386. <section className="silver-sponsors mb-32" id="sponsors">
  387. <h2 className="h5 mb-8">
  388. <FormattedMessage id="sponsors" defaultMessage="Sponsors" />
  389. </h2>
  390. <div className="grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-gutter">
  391. {sponsorData.silver.map((sponsor, i) => {
  392. if (sponsor.url) {
  393. return (
  394. <a
  395. key={i}
  396. href={sponsor.url}
  397. rel={sponsor.nofollow ? "nofollow" : undefined}
  398. >
  399. <SponsorCard sponsor={sponsor} tier={sponsor.gold ? "gold" : "silver"} />
  400. </a>
  401. )
  402. } else {
  403. return <SponsorCard key={i} sponsor={sponsor} tier={sponsor.gold ? "gold" : "silver"} />
  404. }
  405. })}
  406. </div>
  407. </section>
  408. <section className="general-sponsors mb-96">
  409. <h2 className="h5 mb-8">
  410. <FormattedMessage
  411. id="sponsors.additional_thanks_to"
  412. defaultMessage="Additional thanks to"
  413. />
  414. </h2>
  415. <div className="grid grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-1">
  416. {sponsors.generalHighlighted.map((sponsor) => {
  417. return (
  418. <SponsorCard
  419. key={sponsor}
  420. sponsor={sponsor}
  421. tier="generalHighlighted"
  422. />
  423. )
  424. })}
  425. {sponsors.general.map((sponsor, i) => {
  426. return (
  427. <SponsorCard
  428. key={`sponsor-${i}`}
  429. sponsor={sponsor}
  430. tier="general"
  431. />
  432. )
  433. })}
  434. </div>
  435. <p className="mt-8 text-gray-2 lg:mt-16">
  436. <FormattedMessage
  437. id="sponsors.sponsorship.statement"
  438. defaultMessage="Sponsorship does not equal influence. Mastodon is fully independent."
  439. />
  440. </p>
  441. </section>
  442. <Head>
  443. <title>
  444. {`${intl.formatMessage({
  445. id: "sponsors.page_title",
  446. defaultMessage: "Donate to Mastodon",
  447. })} - Mastodon`}
  448. </title>
  449. <meta
  450. property="og:title"
  451. content={intl.formatMessage({
  452. id: "sponsors.page_title",
  453. defaultMessage: "Donate to Mastodon",
  454. })}
  455. />
  456. <meta
  457. name="description"
  458. content={intl.formatMessage({
  459. id: "sponsors.page_description",
  460. defaultMessage:
  461. "Donate or become a sponsor and help us build the social web for everyone!",
  462. })}
  463. />
  464. <meta
  465. property="og:description"
  466. content={intl.formatMessage({
  467. id: "sponsors.page_description",
  468. defaultMessage:
  469. "Donate or become a sponsor and help us build the social web for everyone!",
  470. })}
  471. />
  472. </Head>
  473. </Layout>
  474. )
  475. }
  476. export default Sponsors
  477. export const getStaticProps = withDefaultStaticProps()