Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mastodon
GitHub Repository: mastodon/joinmastodon
Path: blob/main/pages/sponsors.tsx
1006 views
1
import Head from "next/head"
2
import Image from "next/legacy/image"
3
import classNames from "classnames"
4
import Link from "next/link"
5
import { FormattedMessage, useIntl } from "react-intl"
6
7
import Hero from "../components/Hero"
8
import SponsorCard from "../components/SponsorCard"
9
import SponsorLogoGroup from "../components/SponsorLogoGroup"
10
import { withDefaultStaticProps } from "../utils/defaultStaticProps"
11
import sponsors from "../data/sponsors"
12
import sponsorData from "../data/sponsors"
13
import { DonatePopup } from "../donate/DonatePopup"
14
import Layout from "../components/Layout"
15
import LinkButton from "../components/LinkButton"
16
17
import MastodonInTheCloudsIllustration from "../public/illustrations/mastodon_in_the_clouds.png"
18
import MastodonWithLaptopIllustration from "../public/illustrations/mastodon_with_laptop.png"
19
import MasotodonFediverseIllustration from "../public/illustrations/mastodon_fediverse.png"
20
import MastodonsCheeringIllustration from "../public/illustrations/mastodons_cheering.png"
21
import previewImage from "../public/sponsors_preview.png"
22
import { DonateTabs } from "../components/DonateTabs"
23
24
interface DonateCardProps {
25
title: React.ReactNode
26
titleClassName?: string
27
titleInnerClassName?: string
28
className?: string
29
copy: React.ReactNode
30
cta: React.ReactNode
31
ctaLink?: string
32
ctaLight?: boolean
33
isPopup?: boolean
34
}
35
36
const DonateCard = ({
37
title,
38
titleClassName = "",
39
titleInnerClassName = "",
40
className,
41
copy,
42
cta,
43
ctaLink,
44
ctaLight = false,
45
isPopup = false,
46
}: DonateCardProps) => (
47
<div
48
className={classNames(
49
"flex flex-col items-center text-center sm:items-start sm:text-left",
50
className
51
)}
52
>
53
<h3
54
className={classNames(
55
"h5 mb-5 flex flex-col max-sm:items-center md:items-start",
56
"after:block after:h-1 after:rounded-md after:w-32 after:mt-2 after:bg-blurple-500",
57
titleClassName
58
)}
59
>
60
<span className={titleInnerClassName}>{title}</span>
61
</h3>
62
<p className="b2 mb-8 text-gray-1 grow">{copy}</p>
63
{!!ctaLink && (
64
<LinkButton light={ctaLight} size="medium" href={ctaLink}>
65
{cta}
66
</LinkButton>
67
)}
68
{isPopup && (
69
<DonatePopup dark={!ctaLight} size="medium">
70
{cta}
71
</DonatePopup>
72
)}
73
</div>
74
)
75
76
const Emphasis = ({ children }) => <span className="font-bold">{children}</span>
77
78
function Sponsors() {
79
const intl = useIntl()
80
return (
81
<Layout previewImage={previewImage}>
82
<Hero>
83
<h1 className="h2 xl:mt-8 mb-5 lg:col-start-2">
84
<FormattedMessage
85
id="sponsors.hero.title"
86
defaultMessage="Reimagining online discourse"
87
/>
88
</h1>
89
<p className="sh1 pb-20 lg:col-start-2 lg:col-end-6">
90
<FormattedMessage
91
id="sponsors.hero.body"
92
defaultMessage="We develop and maintain software for the decentralized social web. No billionaires or mega-corporations here — we rely entirely on your support."
93
/>
94
</p>
95
<div className="flex gap-6">
96
<LinkButton size="large" href="#donate">
97
<FormattedMessage
98
id="sponsors.hero.cta.donate"
99
defaultMessage="Donate"
100
/>
101
</LinkButton>
102
<LinkButton size="large" light borderless href="#supported_by">
103
<FormattedMessage
104
id="sponsors.hero.cta.view_sponsors"
105
defaultMessage="View our sponsors"
106
/>
107
</LinkButton>
108
</div>
109
</Hero>
110
111
<div className="full-width-bg">
112
<div className="full-width-bg__inner">
113
<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">
114
<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">
115
<Image src={MastodonInTheCloudsIllustration} alt="" />
116
</div>
117
<div className="row-span-full lg:col-span-6 lg:col-start-7 xl:col-span-5">
118
<h2 className="h4 md:h3 mb-5">
119
<FormattedMessage
120
id="sponsors.support_us.title"
121
defaultMessage="Support us"
122
/>
123
</h2>
124
<p className="sh1 text-gray-1 whitespace-pre-line">
125
<FormattedMessage
126
id="sponsors.support_us.body"
127
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.`}
128
/>
129
</p>
130
</div>
131
</section>
132
</div>
133
</div>
134
135
<div className="full-width-bg">
136
<div className="full-width-bg__inner">
137
<a id="donate" className="invisible block relative -top-32" />
138
<section className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-8 lg:pb-12">
139
<div className="md:col-start-1 md:col-span-5 xl:col-start-2 xl:col-span-4">
140
<h2 className="h4 md:h3 mb-5">
141
<FormattedMessage
142
id="sponsors.donate.title"
143
defaultMessage="Donate today"
144
/>
145
</h2>
146
<p className="sh1 text-gray-1 whitespace-pre-line">
147
<FormattedMessage
148
id="sponsors.donate.body"
149
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!`}
150
/>
151
</p>
152
</div>
153
154
<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">
155
<Image src={MastodonsCheeringIllustration} alt="" />
156
</div>
157
</section>
158
</div>
159
</div>
160
161
<div className="full-width-bg">
162
<div className="full-width-bg__inner">
163
<div className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-1">
164
<DonateTabs className="md:col-span-12 md:col-start-1 xl:col-span-10 xl:col-start-2" />
165
</div>
166
<div className="md:grid md:items-center md:gap-gutter md:grid-cols-12 pb-16">
167
<div className="md:col-span-12 md:col-start-1 xl:col-span-10 xl:col-start-2">
168
<div className="b4 mt-4 text-gray-2 italic pr-4 text-left md:text-right">
169
<FormattedMessage
170
id="sponsors.donate.footer.donor_policy"
171
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 GmbH</link_mastodon_ggmbh>`}
172
values={{
173
link_mastodon_inc: (text) => (
174
<Link
175
className="hover:text-blurple-600 ml-0.5"
176
href="/donor-policy/mastodon-inc"
177
target="_blank"
178
>
179
{text}
180
</Link>
181
),
182
link_mastodon_ggmbh: (text) => (
183
<Link
184
className="hover:text-blurple-600"
185
href="/donor-policy/mastodon-ggmbh"
186
target="_blank"
187
>
188
{text}
189
</Link>
190
),
191
middot: () => <span className="px-0.5">&middot;</span>,
192
}}
193
/>
194
</div>
195
</div>
196
</div>
197
</div>
198
</div>
199
200
<div className="full-width-bg bg-gray-5">
201
<div className="full-width-bg__inner">
202
<section className="pt-14 pb-[4.5rem] md:grid md:items-center md:gap-gutter md:grid-cols-12">
203
<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">
204
<Image src={MastodonWithLaptopIllustration} alt="" />
205
</div>
206
207
<div className="row-span-full xl:col-span-5 xl:col-start-2 md:col-span-6 md:col-start-1">
208
<h2 className="h4 md:h3 mb-2 md:mb-5">
209
<FormattedMessage
210
id="sponsors.how_we_use_donations.title"
211
defaultMessage="How we use donations"
212
/>
213
</h2>
214
<p className="sh1 mb-8 text-gray-1 whitespace-pre-line">
215
<FormattedMessage
216
id="sponsors.how_we_use_donations.body"
217
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.`}
218
/>
219
</p>
220
<div className="flex gap-4 items-center">
221
<LinkButton
222
size="large"
223
href="https://joinmastodon.org/reports/Mastodon%20Annual%20Report%202024.pdf"
224
>
225
<FormattedMessage
226
id="sponsors.cta.annual_reports"
227
defaultMessage="Annual Report"
228
/>{" "}
229
— 2024
230
</LinkButton>
231
<span className="font-semibold">PDF, 4MB</span>
232
</div>
233
</div>
234
</section>
235
</div>
236
</div>
237
238
<div className="full-width-bg ">
239
<div className="full-width-bg__inner">
240
<section className="pt-14 pb-16 md:grid md:items-center md:gap-gutter md:grid-cols-12">
241
<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">
242
<Image src={MasotodonFediverseIllustration} alt="" />
243
</div>
244
245
<div className="row-span-full xl:col-span-5 xl:col-start-7 md:col-span-6 md:col-start-7">
246
<h2 className="h4 md:h3 mb-2 md:mb-5">
247
<FormattedMessage
248
id="sponsors.build_the_social_web.title"
249
defaultMessage="Build the social web"
250
/>
251
</h2>
252
<p className="sh1 mb-8 text-gray-1 whitespace-pre-line">
253
<FormattedMessage
254
id="sponsors.build_the_social_web.body"
255
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!`}
256
/>
257
</p>
258
<LinkButton
259
size="large"
260
href={
261
"https://github.com/mastodon/.github/blob/main/CONTRIBUTING.md"
262
}
263
>
264
<FormattedMessage
265
id="sponsors.cta.contribute_to_mastodon"
266
defaultMessage="Contribute to Mastodon"
267
/>
268
</LinkButton>
269
</div>
270
</section>
271
</div>
272
</div>
273
274
<section className="platinum-gold-sponsors mb-32 pt-16">
275
<a id="supported_by" className="invisible block relative -top-32" />
276
<h2 className="h4 mb-10 text-center">
277
<FormattedMessage
278
id="sponsors.supported_by"
279
defaultMessage="Supported by"
280
/>
281
</h2>
282
<SponsorLogoGroup
283
sponsors={[...sponsorData.platinum, ...sponsorData.gold]}
284
/>
285
</section>
286
287
<section className="silver-sponsors mb-32" id="sponsors">
288
<h2 className="h5 mb-8">
289
<FormattedMessage id="sponsors" defaultMessage="Sponsors" />
290
</h2>
291
<div className="grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-gutter">
292
{sponsorData.silver.map((sponsor, i) => {
293
if (sponsor.url) {
294
return (
295
<a
296
key={i}
297
href={sponsor.url}
298
rel={sponsor.nofollow ? "nofollow" : undefined}
299
>
300
<SponsorCard
301
sponsor={sponsor}
302
tier={sponsor.gold ? "gold" : "silver"}
303
/>
304
</a>
305
)
306
} else {
307
return (
308
<SponsorCard
309
key={i}
310
sponsor={sponsor}
311
tier={sponsor.gold ? "gold" : "silver"}
312
/>
313
)
314
}
315
})}
316
</div>
317
</section>
318
319
<section className="general-sponsors mb-96">
320
<h2 className="h5 mb-8">
321
<FormattedMessage
322
id="sponsors.additional_thanks_to"
323
defaultMessage="Additional thanks to"
324
/>
325
</h2>
326
<div className="grid grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-1">
327
{sponsors.generalHighlighted.map((sponsor) => {
328
return (
329
<SponsorCard
330
key={sponsor}
331
sponsor={sponsor}
332
tier="generalHighlighted"
333
/>
334
)
335
})}
336
{sponsors.general.map((sponsor, i) => {
337
return (
338
<SponsorCard
339
key={`sponsor-${i}`}
340
sponsor={sponsor}
341
tier="general"
342
/>
343
)
344
})}
345
</div>
346
347
<p className="mt-8 text-gray-2 lg:mt-16">
348
<FormattedMessage
349
id="sponsors.sponsorship.statement"
350
defaultMessage="Sponsorship does not equal influence. Mastodon is fully independent."
351
/>
352
</p>
353
</section>
354
<Head>
355
<title>
356
{`${intl.formatMessage({
357
id: "sponsors.page_title",
358
defaultMessage: "Donate to Mastodon",
359
})} - Mastodon`}
360
</title>
361
<meta
362
property="og:title"
363
content={intl.formatMessage({
364
id: "sponsors.page_title",
365
defaultMessage: "Donate to Mastodon",
366
})}
367
/>
368
<meta
369
name="description"
370
content={intl.formatMessage({
371
id: "sponsors.page_description",
372
defaultMessage:
373
"Donate or become a sponsor and help us build the social web for everyone!",
374
})}
375
/>
376
<meta
377
property="og:description"
378
content={intl.formatMessage({
379
id: "sponsors.page_description",
380
defaultMessage:
381
"Donate or become a sponsor and help us build the social web for everyone!",
382
})}
383
/>
384
</Head>
385
</Layout>
386
)
387
}
388
389
export default Sponsors
390
391
export const getStaticProps = withDefaultStaticProps()
392
393