sponsors.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import Head from "next/head"
  2. import { FormattedMessage, useIntl } from "react-intl"
  3. import Hero from "../components/Hero"
  4. import SponsorCard from "../components/SponsorCard"
  5. import SponsorLogoGroup from "../components/SponsorLogoGroup"
  6. import TwoUpFeature from "../components/TwoUpFeature"
  7. import { withDefaultStaticProps } from "../utils/defaultStaticProps"
  8. import sponsors from "../data/sponsors"
  9. import sponsorData from "../data/sponsors"
  10. import Layout from "../components/Layout"
  11. import DonateIcon from "../public/icons/donate.svg?inline"
  12. import DonateBoxIcon from "../public/icons/donate-box.svg?inline"
  13. function Sponsors() {
  14. const intl = useIntl()
  15. return (
  16. <Layout>
  17. <Hero>
  18. <h1 className="h1 mb-5 lg:col-start-2">
  19. <FormattedMessage id="sponsors.hero.title" defaultMessage="Donate" />
  20. </h1>
  21. <p className="sh1 lg:col-start-2 lg:col-end-6">
  22. <FormattedMessage
  23. id="sponsors.hero.body"
  24. defaultMessage="We develop and maintain the free and open-source software that powers the social web. There is no capital behind this—we rely entirely on your support through platforms like Patreon."
  25. />
  26. </p>
  27. </Hero>
  28. <TwoUpFeature
  29. padding="md:!pt-16"
  30. features={[
  31. {
  32. Icon: DonateIcon,
  33. title: (
  34. <FormattedMessage
  35. id="sponsors.sponsorship.title"
  36. defaultMessage="Commercial sponsorship"
  37. />
  38. ),
  39. copy: (
  40. <FormattedMessage
  41. id="sponsors.sponsorship.body"
  42. defaultMessage="If you would like to see your company's logo with a do-follow link on this site, you can become a sponsor directly through our own platform!"
  43. />
  44. ),
  45. cta: (
  46. <FormattedMessage
  47. id="sponsors.become_a_sponsor"
  48. defaultMessage="Become a sponsor"
  49. />
  50. ),
  51. cta_link: "https://sponsor.joinmastodon.org/",
  52. },
  53. {
  54. Icon: DonateBoxIcon,
  55. title: (
  56. <FormattedMessage
  57. id="sponsors.patreon.title"
  58. defaultMessage="Support us on Patreon"
  59. />
  60. ),
  61. copy: (
  62. <FormattedMessage
  63. id="sponsors.patreon.body"
  64. defaultMessage="Making a contribution through our Patreon will reward you with access to our development Discord and your name listed on this page."
  65. />
  66. ),
  67. cta: (
  68. <FormattedMessage
  69. id="sponsors.patreon.cta"
  70. defaultMessage="Go to Patreon"
  71. />
  72. ),
  73. cta_link: "https://patreon.com/mastodon",
  74. },
  75. ]}
  76. />
  77. <section className="platinum-gold-sponsors mb-32">
  78. <h2 className="h4 mb-10 text-center">
  79. <FormattedMessage
  80. id="sponsors.supported_by"
  81. defaultMessage="Supported by"
  82. />
  83. </h2>
  84. <SponsorLogoGroup
  85. sponsors={[...sponsorData.platinum, ...sponsorData.gold]}
  86. />
  87. </section>
  88. <section className="silver-sponsors mb-32">
  89. <h2 className="h5 mb-8">
  90. <FormattedMessage id="sponsors" defaultMessage="Sponsors" />
  91. </h2>
  92. <div className="grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-gutter">
  93. {sponsorData.silver.map((sponsor, i) => {
  94. if (sponsor.url) {
  95. return (
  96. <a
  97. key={i}
  98. href={sponsor.url}
  99. rel={sponsor.nofollow ? "nofollow" : undefined}
  100. >
  101. <SponsorCard sponsor={sponsor} tier="silver" />
  102. </a>
  103. )
  104. } else {
  105. return <SponsorCard key={i} sponsor={sponsor} tier="silver" />
  106. }
  107. })}
  108. </div>
  109. </section>
  110. <section className="general-sponsors mb-96">
  111. <h2 className="h5 mb-8">
  112. <FormattedMessage
  113. id="sponsors.additional_thanks_to"
  114. defaultMessage="Additional thanks to"
  115. />
  116. </h2>
  117. <div className="grid grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-1">
  118. {sponsors.generalHighlighted.map((sponsor) => {
  119. return (
  120. <SponsorCard
  121. key={sponsor}
  122. sponsor={sponsor}
  123. tier="generalHighlighted"
  124. />
  125. )
  126. })}
  127. {sponsors.general.map((sponsor, i) => {
  128. return (
  129. <SponsorCard
  130. key={`sponsor-${i}`}
  131. sponsor={sponsor}
  132. tier="general"
  133. />
  134. )
  135. })}
  136. </div>
  137. <p className="mt-8 text-gray-2 lg:mt-16">
  138. Sponsorship does not equal influence. Mastodon is fully independent.
  139. </p>
  140. </section>
  141. <Head>
  142. <title>
  143. {`${intl.formatMessage({
  144. id: "sponsors.page_title",
  145. defaultMessage: "Donate to Mastodon",
  146. })} - Mastodon`}
  147. </title>
  148. <meta
  149. property="og:title"
  150. content={intl.formatMessage({
  151. id: "sponsors.page_title",
  152. defaultMessage: "Donate to Mastodon",
  153. })}
  154. />
  155. <meta
  156. name="description"
  157. content={intl.formatMessage({
  158. id: "sponsors.page_description",
  159. defaultMessage:
  160. "View people and companies who crowdfund the development of the decentralized, open-source social media platform Mastodon.",
  161. })}
  162. />
  163. <meta
  164. property="og:description"
  165. content={intl.formatMessage({
  166. id: "sponsors.page_description",
  167. defaultMessage:
  168. "View people and companies who crowdfund the development of the decentralized, open-source social media platform Mastodon.",
  169. })}
  170. />
  171. </Head>
  172. </Layout>
  173. )
  174. }
  175. export default Sponsors
  176. export const getStaticProps = withDefaultStaticProps()