sponsors.tsx 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  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}>{title}</span>
  44. </h3>
  45. <p className="b2 mb-8 text-gray-1 grow">{copy}</p>
  46. <LinkButton light={ctaLight} size="medium" href={ctaLink}>
  47. {cta}
  48. </LinkButton>
  49. </div>
  50. )
  51. const Emphasis = ({ children }) => <span className="font-bold">{children}</span>
  52. function Sponsors() {
  53. const intl = useIntl()
  54. return (
  55. <Layout previewImage={previewImage}>
  56. <Hero>
  57. <h1 className="h2 xl:mt-8 mb-5 lg:col-start-2">
  58. <FormattedMessage
  59. id="sponsors.hero.title"
  60. defaultMessage="Reimagining online discourse"
  61. />
  62. </h1>
  63. <p className="sh1 pb-20 lg:col-start-2 lg:col-end-6">
  64. <FormattedMessage
  65. id="sponsors.hero.body"
  66. defaultMessage="We develop and maintain software for the decentralized social web. No billionaires or mega-corporations here — we rely entirely on your support."
  67. />
  68. </p>
  69. <div className="flex gap-6">
  70. <LinkButton size="large" href="#donate">
  71. <FormattedMessage
  72. id="sponsors.hero.cta.donate"
  73. defaultMessage="Donate"
  74. />
  75. </LinkButton>
  76. <LinkButton size="large" light borderless href="#supported_by">
  77. <FormattedMessage
  78. id="sponsors.hero.cta.view_sponsors"
  79. defaultMessage="View our sponsors"
  80. />
  81. </LinkButton>
  82. </div>
  83. </Hero>
  84. <div className="full-width-bg">
  85. <div className="full-width-bg__inner">
  86. <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">
  87. <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">
  88. <Image src={MastodonInTheCloudsIllustration} alt="" />
  89. </div>
  90. <div className="row-span-full lg:col-span-6 lg:col-start-7 xl:col-span-5">
  91. <h2 className="h4 md:h3 mb-5">
  92. <FormattedMessage
  93. id="sponsors.support_us.title"
  94. defaultMessage="Support us"
  95. />
  96. </h2>
  97. <p className="sh1 text-gray-1 whitespace-pre-line">
  98. <FormattedMessage
  99. id="sponsors.support_us.body"
  100. 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.`}
  101. />
  102. </p>
  103. </div>
  104. </section>
  105. </div>
  106. </div>
  107. <div className="full-width-bg">
  108. <div className="full-width-bg__inner">
  109. <a id="donate" className="invisible block relative -top-32" />
  110. <section className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-8 lg:pb-12">
  111. <div className="md:col-start-1 md:col-span-5 xl:col-start-2 xl:col-span-4">
  112. <h2 className="h4 md:h3 mb-5">
  113. <FormattedMessage
  114. id="sponsors.donate.title"
  115. defaultMessage="Donate today"
  116. />
  117. </h2>
  118. <p className="sh1 text-gray-1 whitespace-pre-line">
  119. <FormattedMessage
  120. id="sponsors.donate.body"
  121. 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!`}
  122. />
  123. </p>
  124. </div>
  125. <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">
  126. <Image src={MastodonsCheeringIllustration} alt="" />
  127. </div>
  128. </section>
  129. </div>
  130. </div>
  131. <div className="full-width-bg">
  132. <div className="full-width-bg__inner">
  133. <div className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-1">
  134. <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">
  135. <div className="grid max-sm:grid-cols-1 sm:grid-cols-2 gap-16 md:grid-cols-3">
  136. <DonateCard
  137. title={
  138. <FormattedMessage
  139. id="sponsors.donate_direct.stripe.title"
  140. defaultMessage="Direct"
  141. />
  142. }
  143. copy={
  144. <FormattedMessage
  145. id="sponsors.donate_direct.stripe.copy"
  146. defaultMessage="Direct donations are very welcome and it's easy to do using Stripe. A direct donation also makes for a great gift."
  147. />
  148. }
  149. cta={
  150. <FormattedMessage
  151. id="sponsors.donate_direct.stripe.cta"
  152. defaultMessage="Donate directly"
  153. />
  154. }
  155. ctaLink="https://donate.stripe.com/00g5l42h8ezY3YcaEE"
  156. />
  157. <DonateCard
  158. title={
  159. <>
  160. <span className="mr-2">
  161. <FormattedMessage
  162. id="sponsors.donate_direct.givebutter.title"
  163. defaultMessage="Direct"
  164. />
  165. </span>
  166. <Image
  167. src={usFlagIcon}
  168. className="aspect-square"
  169. width="20"
  170. height="20"
  171. alt="Direct tax deductable donation for American residents"
  172. />
  173. </>
  174. }
  175. copy={
  176. <FormattedMessage
  177. id="sponsors.donate_direct.givebutter.copy"
  178. defaultMessage="Are you an American resident? If so, you can make a tax deductable donation using Givebutter."
  179. />
  180. }
  181. cta={
  182. <FormattedMessage
  183. id="sponsors.donate_direct.givebutter.cta"
  184. defaultMessage="Donate directly"
  185. />
  186. }
  187. ctaLink="https://givebutter.com/nAk74p"
  188. />
  189. <DonateCard
  190. title={
  191. <FormattedMessage
  192. id="sponsors.donate.patreon.title"
  193. defaultMessage="Patreon"
  194. />
  195. }
  196. copy={
  197. <FormattedMessage
  198. id="sponsors.donate.patreon.copy"
  199. defaultMessage="Patreon donors gain access to <emphasis>Mastodon’s Discord</emphasis> for developers, server admins, and social web supporters."
  200. values={{
  201. emphasis: (text) => <Emphasis>{text}</Emphasis>,
  202. }}
  203. />
  204. }
  205. cta={
  206. <FormattedMessage
  207. id="sponsors.donate.patreon.cta"
  208. defaultMessage="Donate on Patreon"
  209. />
  210. }
  211. ctaLink="https://patreon.com/mastodon"
  212. />
  213. <DonateCard
  214. title={
  215. <FormattedMessage
  216. id="sponsors.donate.github.title"
  217. defaultMessage="GitHub"
  218. />
  219. }
  220. titleInnerClassName="md:before:content-['-'] md:before:block md:before:w-16 md:before:invisible"
  221. copy={
  222. <FormattedMessage
  223. id="sponsors.donate.github.copy"
  224. defaultMessage="GitHub Sponsors receive a Mastodon badge to their Org or Personal profile. Plus we don’t pay fees!"
  225. />
  226. }
  227. cta={
  228. <FormattedMessage
  229. id="sponsors.donate.github.cta"
  230. defaultMessage="Donate on GitHub"
  231. />
  232. }
  233. ctaLink="https://github.com/sponsors/mastodon"
  234. ctaLight
  235. />
  236. <DonateCard
  237. title={
  238. <FormattedMessage
  239. id="sponsors.donate.corporate_sponsorship.title"
  240. defaultMessage="Corporate Sponsorship"
  241. />
  242. }
  243. titleInnerClassName="md:pr-16"
  244. copy={
  245. <FormattedMessage
  246. id="sponsors.donate.corporate_sponsorship.copy"
  247. defaultMessage="We welcome corporate sponsors! Sponsorship includes your company’s logo with a link to your website."
  248. />
  249. }
  250. cta={
  251. <FormattedMessage
  252. id="sponsors.donate.corporate_sponsorship.cta"
  253. defaultMessage="Become a sponsor"
  254. />
  255. }
  256. ctaLink="https://sponsor.joinmastodon.org/"
  257. ctaLight
  258. />
  259. <DonateCard
  260. title={
  261. <FormattedMessage
  262. id="sponsors.donate.corporate_matching.title"
  263. defaultMessage="Corporate Matching"
  264. />
  265. }
  266. titleInnerClassName="md:pr-16"
  267. copy={
  268. <FormattedMessage
  269. id="sponsors.donate.corporate_matching.copy"
  270. defaultMessage="Does your company provide corporate matching? If so, you can use Benevity to donate!"
  271. />
  272. }
  273. cta={
  274. <FormattedMessage
  275. id="sponsors.donate.corporate_matching.cta"
  276. defaultMessage="Donate on Benevity"
  277. />
  278. }
  279. ctaLink="https://causes.benevity.org/causes/276-5575947211653_d7e4"
  280. ctaLight
  281. />
  282. </div>
  283. </div>
  284. </div>
  285. <div className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-16">
  286. <div className="md:col-span-12 md:col-start-1 xl:col-span-10 xl:col-start-2">
  287. <div className="b4 mt-4 text-gray-2 italic pr-4 text-left md:text-right">
  288. <FormattedMessage
  289. id="sponsors.donate.footer.donor_policy"
  290. 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>`}
  291. values={{
  292. link_mastodon_inc: (text) => (
  293. <Link
  294. className="hover:text-blurple-600 ml-0.5"
  295. href="/donor-policy/mastodon-inc"
  296. target="_blank"
  297. >
  298. {text}
  299. </Link>
  300. ),
  301. link_mastodon_ggmbh: (text) => (
  302. <Link
  303. className="hover:text-blurple-600"
  304. href="/donor-policy/mastodon-ggmbh"
  305. target="_blank"
  306. >
  307. {text}
  308. </Link>
  309. ),
  310. middot: () => <span className="px-0.5">&middot;</span>,
  311. }}
  312. />
  313. </div>
  314. </div>
  315. </div>
  316. </div>
  317. </div>
  318. <div className="full-width-bg bg-gray-5">
  319. <div className="full-width-bg__inner">
  320. <section className="pt-14 pb-[4.5rem] md:grid md:items-center md:gap-gutter md:grid-cols-12">
  321. <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">
  322. <Image src={MastodonWithLaptopIllustration} alt="" />
  323. </div>
  324. <div className="row-span-full xl:col-span-5 xl:col-start-2 md:col-span-6 md:col-start-1">
  325. <h2 className="h4 md:h3 mb-2 md:mb-5">
  326. <FormattedMessage
  327. id="sponsors.how_we_use_donations.title"
  328. defaultMessage="How we use donations"
  329. />
  330. </h2>
  331. <p className="sh1 mb-8 text-gray-1 whitespace-pre-line">
  332. <FormattedMessage
  333. id="sponsors.how_we_use_donations.body"
  334. 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.`}
  335. />
  336. </p>
  337. <div className="flex gap-4 items-center">
  338. <LinkButton
  339. size="large"
  340. href="https://joinmastodon.org/reports/Mastodon%20Annual%20Report%202023.pdf"
  341. >
  342. <FormattedMessage
  343. id="sponsors.cta.annual_reports"
  344. defaultMessage="Annual Report"
  345. />{" "}
  346. — 2023
  347. </LinkButton>
  348. <span className="font-semibold">PDF, 4MB</span>
  349. </div>
  350. </div>
  351. </section>
  352. </div>
  353. </div>
  354. <div className="full-width-bg ">
  355. <div className="full-width-bg__inner">
  356. <section className="pt-14 pb-16 md:grid md:items-center md:gap-gutter md:grid-cols-12">
  357. <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">
  358. <Image src={MasotodonFediverseIllustration} alt="" />
  359. </div>
  360. <div className="row-span-full xl:col-span-5 xl:col-start-7 md:col-span-6 md:col-start-7">
  361. <h2 className="h4 md:h3 mb-2 md:mb-5">
  362. <FormattedMessage
  363. id="sponsors.build_the_social_web.title"
  364. defaultMessage="Build the social web"
  365. />
  366. </h2>
  367. <p className="sh1 mb-8 text-gray-1 whitespace-pre-line">
  368. <FormattedMessage
  369. id="sponsors.build_the_social_web.body"
  370. 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!`}
  371. />
  372. </p>
  373. <LinkButton
  374. size="large"
  375. href={
  376. "https://github.com/mastodon/mastodon/blob/main/CONTRIBUTING.md"
  377. }
  378. >
  379. <FormattedMessage
  380. id="sponsors.cta.contribute_to_mastodon"
  381. defaultMessage="Contribute to Mastodon"
  382. />
  383. </LinkButton>
  384. </div>
  385. </section>
  386. </div>
  387. </div>
  388. <section className="platinum-gold-sponsors mb-32 pt-16">
  389. <a id="supported_by" className="invisible block relative -top-32" />
  390. <h2 className="h4 mb-10 text-center">
  391. <FormattedMessage
  392. id="sponsors.supported_by"
  393. defaultMessage="Supported by"
  394. />
  395. </h2>
  396. <SponsorLogoGroup
  397. sponsors={[...sponsorData.platinum, ...sponsorData.gold]}
  398. />
  399. </section>
  400. <section className="silver-sponsors mb-32" id="sponsors">
  401. <h2 className="h5 mb-8">
  402. <FormattedMessage id="sponsors" defaultMessage="Sponsors" />
  403. </h2>
  404. <div className="grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-gutter">
  405. {sponsorData.silver.map((sponsor, i) => {
  406. if (sponsor.url) {
  407. return (
  408. <a
  409. key={i}
  410. href={sponsor.url}
  411. rel={sponsor.nofollow ? "nofollow" : undefined}
  412. >
  413. <SponsorCard
  414. sponsor={sponsor}
  415. tier={sponsor.gold ? "gold" : "silver"}
  416. />
  417. </a>
  418. )
  419. } else {
  420. return (
  421. <SponsorCard
  422. key={i}
  423. sponsor={sponsor}
  424. tier={sponsor.gold ? "gold" : "silver"}
  425. />
  426. )
  427. }
  428. })}
  429. </div>
  430. </section>
  431. <section className="general-sponsors mb-96">
  432. <h2 className="h5 mb-8">
  433. <FormattedMessage
  434. id="sponsors.additional_thanks_to"
  435. defaultMessage="Additional thanks to"
  436. />
  437. </h2>
  438. <div className="grid grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-1">
  439. {sponsors.generalHighlighted.map((sponsor) => {
  440. return (
  441. <SponsorCard
  442. key={sponsor}
  443. sponsor={sponsor}
  444. tier="generalHighlighted"
  445. />
  446. )
  447. })}
  448. {sponsors.general.map((sponsor, i) => {
  449. return (
  450. <SponsorCard
  451. key={`sponsor-${i}`}
  452. sponsor={sponsor}
  453. tier="general"
  454. />
  455. )
  456. })}
  457. </div>
  458. <p className="mt-8 text-gray-2 lg:mt-16">
  459. <FormattedMessage
  460. id="sponsors.sponsorship.statement"
  461. defaultMessage="Sponsorship does not equal influence. Mastodon is fully independent."
  462. />
  463. </p>
  464. </section>
  465. <Head>
  466. <title>
  467. {`${intl.formatMessage({
  468. id: "sponsors.page_title",
  469. defaultMessage: "Donate to Mastodon",
  470. })} - Mastodon`}
  471. </title>
  472. <meta
  473. property="og:title"
  474. content={intl.formatMessage({
  475. id: "sponsors.page_title",
  476. defaultMessage: "Donate to Mastodon",
  477. })}
  478. />
  479. <meta
  480. name="description"
  481. content={intl.formatMessage({
  482. id: "sponsors.page_description",
  483. defaultMessage:
  484. "Donate or become a sponsor and help us build the social web for everyone!",
  485. })}
  486. />
  487. <meta
  488. property="og:description"
  489. content={intl.formatMessage({
  490. id: "sponsors.page_description",
  491. defaultMessage:
  492. "Donate or become a sponsor and help us build the social web for everyone!",
  493. })}
  494. />
  495. </Head>
  496. </Layout>
  497. )
  498. }
  499. export default Sponsors
  500. export const getStaticProps = withDefaultStaticProps()