Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mastodon
GitHub Repository: mastodon/joinmastodon
Path: blob/main/components/Footer.tsx
1006 views
1
import React from "react"
2
import Link from "next/link"
3
import { FormattedMessage } from "react-intl"
4
import Image from "next/legacy/image"
5
import footerImage from "../public/illustrations/footer.png"
6
import LogoWhite from "../public/logos/logo-white.svg?inline"
7
import GitHub from "../public/logos/github.svg?inline"
8
9
/** Sitewide footer component */
10
export const Footer = () => (
11
<footer className="full-width-bg relative mt-footer-offset bg-[#150118] pb-24 text-center text-white md:pt-24 md:text-start">
12
<div className="pointer-events-none absolute bottom-full left-1/2 z-0 ml-[-1px] h-48 w-full -translate-x-1/2 translate-y-[1px] md:bottom-footer-offset md:h-full">
13
<Image
14
src={footerImage}
15
alt=""
16
layout="fill"
17
objectFit="cover"
18
objectPosition="center top"
19
placeholder="empty"
20
unoptimized
21
/>
22
</div>
23
24
<nav className="full-width-bg__inner relative z-10">
25
<div className="grid gap-x-4 gap-y-16 md:grid-cols-12 md:gap-x-5">
26
<div className="flex flex-col items-center gap-8 text-nightshade-50 md:col-start-1 md:col-end-5 md:items-start lg:col-start-1 lg:col-end-5">
27
<LogoWhite className="w-20 max-w-full" fill="currentColor" />
28
<p className="mt-2 max-w-[28ch]">
29
<FormattedMessage
30
id="footer.quip"
31
defaultMessage="Free, open-source decentralized social media platform."
32
/>
33
</p>
34
</div>
35
36
<div className="grid gap-10 gap-x-4 md:col-start-6 md:col-end-13 md:grid-cols-3 md:gap-x-5">
37
{[
38
{
39
heading: (
40
<FormattedMessage
41
id="nav.product.title"
42
defaultMessage="Product"
43
/>
44
),
45
links: [
46
<Link
47
key="servers"
48
href="/servers"
49
className="inline-block py-2 hover:underline"
50
>
51
<FormattedMessage
52
id="nav.servers.title"
53
defaultMessage="Servers"
54
/>
55
</Link>,
56
<Link
57
key="apps"
58
href="/apps"
59
className="inline-block py-2 hover:underline"
60
>
61
<FormattedMessage id="nav.apps.title" defaultMessage="Apps" />
62
</Link>,
63
<Link
64
key="sponsors"
65
href="/sponsors#donate"
66
className="inline-block py-2 hover:underline"
67
>
68
<FormattedMessage
69
id="nav.sponsors.title"
70
defaultMessage="Donate"
71
/>
72
</Link>,
73
<Link
74
key="roadmap"
75
href="/roadmap"
76
className="inline-block py-2 hover:underline"
77
>
78
<FormattedMessage
79
id="nav.roadmap.title"
80
defaultMessage="Roadmap"
81
/>
82
</Link>,
83
<a
84
className="inline-block py-2 hover:underline"
85
key="mastodon/merch"
86
target="_blank"
87
rel="noopener"
88
href="https://shop.joinmastodon.org"
89
>
90
<FormattedMessage
91
id="nav.merch.title"
92
defaultMessage="Merch"
93
/>
94
</a>,
95
],
96
},
97
{
98
heading: (
99
<FormattedMessage
100
id="nav.resources.title"
101
defaultMessage="Resources"
102
/>
103
),
104
links: [
105
<a
106
className="inline-block py-2 hover:underline"
107
key="mastodon/mastodon"
108
target="_blank"
109
rel="noopener"
110
href="https://github.com/mastodon/mastodon"
111
>
112
<FormattedMessage
113
id="nav.code.title"
114
defaultMessage="Source code"
115
/>
116
</a>,
117
<a
118
className="inline-block py-2 hover:underline"
119
target="_blank"
120
rel="noopener"
121
key="https://blog.joinmastodon.org"
122
href="https://blog.joinmastodon.org/"
123
>
124
<FormattedMessage id="nav.blog.title" defaultMessage="Blog" />
125
</a>,
126
<a
127
className="inline-block py-2 hover:underline"
128
key="joinmastodon.org"
129
target="_blank"
130
rel="noopener"
131
href="https://docs.joinmastodon.org"
132
>
133
<FormattedMessage
134
id="nav.docs.title"
135
defaultMessage="Documentation"
136
/>
137
</a>,
138
<a
139
className="inline-block py-2 hover:underline"
140
key="mastodon/discussions"
141
target="_blank"
142
rel="noopener"
143
href="https://github.com/mastodon/mastodon/discussions"
144
>
145
<FormattedMessage
146
id="nav.support.title"
147
defaultMessage="Support"
148
/>
149
</a>,
150
<a
151
className="inline-block py-2 hover:underline"
152
key="mastodon/share"
153
target="_blank"
154
rel="noopener"
155
href="https://share.joinmastodon.org"
156
>
157
<FormattedMessage
158
id="nav.share.title"
159
defaultMessage="Share button"
160
/>
161
</a>,
162
],
163
},
164
{
165
heading: (
166
<FormattedMessage
167
id="nav.company.title"
168
defaultMessage="Company"
169
/>
170
),
171
links: [
172
<Link
173
key="/about"
174
href="/about"
175
className="inline-block py-2 hover:underline"
176
>
177
<FormattedMessage
178
id="nav.about_us.title"
179
defaultMessage="About us"
180
/>
181
</Link>,
182
<Link
183
key="/about#contact"
184
href="/about#contact"
185
className="inline-block py-2 hover:underline"
186
>
187
<FormattedMessage
188
id="nav.contact.title"
189
defaultMessage="Contact"
190
/>
191
</Link>,
192
<Link
193
key="/branding"
194
href="/branding"
195
className="inline-block py-2 hover:underline"
196
>
197
<FormattedMessage
198
id="nav.branding.title"
199
defaultMessage="Branding"
200
/>
201
</Link>,
202
<Link
203
key="/careers"
204
href="/careers"
205
className="inline-block py-2 hover:underline"
206
>
207
<FormattedMessage
208
id="nav.careers.title"
209
defaultMessage="Careers"
210
/>
211
</Link>,
212
<Link
213
key="/impressum"
214
href="/about#impressum"
215
className="inline-block py-2 hover:underline"
216
>
217
<FormattedMessage
218
id="nav.impressum.title"
219
defaultMessage="Impressum"
220
/>
221
</Link>,
222
],
223
},
224
].map((menu, i) => (
225
<div className="flex flex-col gap-2" key={i}>
226
<h2 className="h6 py-1">{menu.heading}</h2>
227
<ul className="b2 m-0 flex flex-col gap-2 p-0 text-nightshade-100">
228
{menu.links.map((link) => (
229
<li key={link.key}>{link}</li>
230
))}
231
</ul>
232
</div>
233
))}
234
</div>
235
</div>
236
237
<hr className="my-6 border-nightshade-600 sm:mx-auto lg:my-8" />
238
239
<div className="sm:flex sm:items-center sm:justify-between">
240
<span className="text-center text-nightshade-100 md:text-start">
241
Copyright © 2026 Mastodon GmbH.{" "}
242
<Link
243
href="/trademark"
244
className="border-nightshade-600 hover:underline sm:ml-4 sm:border-l sm:pl-4"
245
>
246
<FormattedMessage
247
id="nav.trademark_policy.title"
248
defaultMessage="Trademark Policy"
249
/>
250
</Link>
251
<span aria-hidden>{" • "}</span>
252
<Link href="/privacy-policy" className="hover:underline">
253
<FormattedMessage
254
id="nav.privacy_policy.title"
255
defaultMessage="Privacy Policy"
256
/>
257
</Link>
258
<span aria-hidden>{" • "}</span>
259
<Link
260
href="https://joinmastodon.instatus.com"
261
className="hover:underline"
262
>
263
<FormattedMessage id="nav.status.title" defaultMessage="Status" />
264
</Link>
265
</span>
266
267
<div className="mt-4 flex justify-center space-x-2 md:mt-0 md:space-x-6">
268
<a
269
href="https://mastodon.social/@Mastodon"
270
rel="me"
271
className="text-nightshade-100 hover:text-nightshade-50"
272
>
273
<LogoWhite className="h-5 w-5" fill="currentColor" />
274
<span className="sr-only">
275
<FormattedMessage
276
id="footer.follow_us_on_mastodon"
277
defaultMessage="Follow us on Mastodon"
278
/>
279
</span>
280
</a>
281
282
<a
283
href="https://github.com/mastodon"
284
rel="me"
285
className="text-nightshade-100 hover:text-nightshade-50"
286
>
287
<GitHub className="h-5 w-5" fill="currentColor" />
288
<span className="sr-only">GitHub</span>
289
</a>
290
</div>
291
</div>
292
</nav>
293
</footer>
294
)
295
296
export default Footer
297
298