@gjsify/site 0.0.0-stage → 0.63.1-next.236
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -2
- package/lib/cli.d.ts +6 -0
- package/lib/cli.js +91 -0
- package/lib/client/site.css +1286 -0
- package/lib/client/site.js +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/render/color.d.ts +12 -0
- package/lib/render/color.js +45 -0
- package/lib/render/html.d.ts +8 -0
- package/lib/render/html.js +20 -0
- package/lib/render/i18n.d.ts +38 -0
- package/lib/render/i18n.js +106 -0
- package/lib/render/icons.d.ts +14 -0
- package/lib/render/icons.js +42 -0
- package/lib/render/image-backend.d.ts +26 -0
- package/lib/render/image-backend.js +130 -0
- package/lib/render/images.d.ts +51 -0
- package/lib/render/images.js +97 -0
- package/lib/render/pages.d.ts +32 -0
- package/lib/render/pages.js +628 -0
- package/lib/render/qr.d.ts +8 -0
- package/lib/render/qr.js +25 -0
- package/lib/site-data/config.d.ts +23 -0
- package/lib/site-data/config.js +142 -0
- package/lib/site-data/downloads.d.ts +29 -0
- package/lib/site-data/downloads.js +193 -0
- package/lib/site-data/flathub.d.ts +24 -0
- package/lib/site-data/flathub.js +35 -0
- package/lib/site-data/github.d.ts +9 -0
- package/lib/site-data/github.js +45 -0
- package/lib/site-data/index.d.ts +12 -0
- package/lib/site-data/index.js +12 -0
- package/lib/site-data/load.d.ts +18 -0
- package/lib/site-data/load.js +164 -0
- package/lib/site-data/metainfo.d.ts +9 -0
- package/lib/site-data/metainfo.js +142 -0
- package/lib/site-data/network.d.ts +32 -0
- package/lib/site-data/network.js +67 -0
- package/lib/site-data/oars.d.ts +15 -0
- package/lib/site-data/oars.js +62 -0
- package/lib/site-data/po.d.ts +40 -0
- package/lib/site-data/po.js +148 -0
- package/lib/site-data/screenshots.d.ts +33 -0
- package/lib/site-data/screenshots.js +90 -0
- package/lib/site-data/sepa.d.ts +20 -0
- package/lib/site-data/sepa.js +45 -0
- package/lib/site-data/types.d.ts +224 -0
- package/lib/site-data/types.js +1 -0
- package/lib/site-data/xml.d.ts +11 -0
- package/lib/site-data/xml.js +51 -0
- package/lib/site.d.ts +49 -0
- package/lib/site.js +161 -0
- package/package.json +78 -5
- package/po/de.po +265 -0
- package/po/site.pot +264 -0
|
@@ -0,0 +1,1286 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* One stylesheet for the whole page, driven by the tokens below. The app's own colours only ever
|
|
3
|
+
* reach `--brand`, which paints the masthead; every other surface is the site's own neutral
|
|
4
|
+
* palette, so a pale brand colour cannot make the body text unreadable.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
:root {
|
|
8
|
+
color-scheme: light dark;
|
|
9
|
+
|
|
10
|
+
--brand: var(--brand-light, #84bbfd);
|
|
11
|
+
/* Text on the brand. A colour cannot be measured in CSS, so the generator measures the app's
|
|
12
|
+
* `<branding>` against near-black and white and writes the winner into `--band-fg-*`; these
|
|
13
|
+
* fallbacks belong to the two default brand colours above. */
|
|
14
|
+
--band-fg: var(--band-fg-light, #10233b);
|
|
15
|
+
/* Pills, dividers and hover fills drawn on the brand: the text colour, thinned. */
|
|
16
|
+
--band-line: color-mix(in srgb, var(--band-fg) 18%, transparent);
|
|
17
|
+
--band-tint: color-mix(in srgb, var(--band-fg) 10%, transparent);
|
|
18
|
+
|
|
19
|
+
--bg: #fff;
|
|
20
|
+
--surface: #f6f5f4;
|
|
21
|
+
--fg: #1d1d20;
|
|
22
|
+
--muted: #5e5c64;
|
|
23
|
+
--line: rgb(0 0 0 / 0.1);
|
|
24
|
+
--accent: #1c71d8;
|
|
25
|
+
--accent-fg: #fff;
|
|
26
|
+
--shadow: 0 8px 24px rgb(0 0 0 / 0.14);
|
|
27
|
+
/* Lifts the screenshot off the brand band without drawing a card around it. */
|
|
28
|
+
--shot-shadow: 0 0.75rem 2rem rgb(0 0 0 / 0.25);
|
|
29
|
+
|
|
30
|
+
--radius: 10px;
|
|
31
|
+
--radius-lg: 14px;
|
|
32
|
+
--max: 64rem;
|
|
33
|
+
--text: 45rem;
|
|
34
|
+
--shot-h: 28rem;
|
|
35
|
+
|
|
36
|
+
font-family: "Adwaita Sans", Inter, "Segoe UI", system-ui, -apple-system, "Cantarell", sans-serif;
|
|
37
|
+
line-height: 1.5;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@media (prefers-color-scheme: dark) {
|
|
41
|
+
:root {
|
|
42
|
+
--brand: var(--brand-dark, #1a5fb4);
|
|
43
|
+
--band-fg: var(--band-fg-dark, #fff);
|
|
44
|
+
--bg: #1a1a1c;
|
|
45
|
+
--surface: #26262a;
|
|
46
|
+
--fg: #f6f5f4;
|
|
47
|
+
--muted: #b6b4b1;
|
|
48
|
+
--line: rgb(255 255 255 / 0.11);
|
|
49
|
+
--accent: #3584e4;
|
|
50
|
+
--shadow: 0 8px 24px rgb(0 0 0 / 0.5);
|
|
51
|
+
--shot-shadow: 0 0.75rem 2rem rgb(0 0 0 / 0.45);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
* {
|
|
56
|
+
box-sizing: border-box;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
[hidden] {
|
|
60
|
+
display: none !important;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
body {
|
|
64
|
+
margin: 0;
|
|
65
|
+
background: var(--bg);
|
|
66
|
+
color: var(--fg);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
a {
|
|
70
|
+
color: inherit;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
img,
|
|
74
|
+
picture {
|
|
75
|
+
max-width: 100%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
h1,
|
|
79
|
+
h2,
|
|
80
|
+
h3 {
|
|
81
|
+
line-height: 1.2;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
:focus-visible {
|
|
85
|
+
outline: 2px solid var(--accent);
|
|
86
|
+
outline-offset: 2px;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.icon {
|
|
90
|
+
display: block;
|
|
91
|
+
width: 1em;
|
|
92
|
+
height: 1em;
|
|
93
|
+
flex: none;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* One content width for the whole page: the bar, the hero, the facts, the text and the footer all
|
|
97
|
+
* start and end on the same two lines. */
|
|
98
|
+
.bar-inner,
|
|
99
|
+
.hero-inner,
|
|
100
|
+
.badges,
|
|
101
|
+
.column,
|
|
102
|
+
.footer-inner {
|
|
103
|
+
width: min(100% - 2rem, var(--max));
|
|
104
|
+
margin-inline: auto;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Masthead: bar, hero, facts and screenshots on the app's own colour */
|
|
108
|
+
|
|
109
|
+
.masthead {
|
|
110
|
+
background: var(--brand);
|
|
111
|
+
color: var(--band-fg);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
main {
|
|
115
|
+
padding-block-start: 2.5rem;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* The bar is painted in the same colour as the masthead below it, so at rest the two read as one
|
|
119
|
+
* surface and, once it sticks over the text, it is already an opaque bar — no script has to notice
|
|
120
|
+
* the moment it detaches. */
|
|
121
|
+
.topbar {
|
|
122
|
+
position: sticky;
|
|
123
|
+
top: 0;
|
|
124
|
+
z-index: 10;
|
|
125
|
+
background: var(--brand);
|
|
126
|
+
color: var(--band-fg);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.bar-inner {
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
gap: 1rem;
|
|
133
|
+
min-height: 3.5rem;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Scrolling shrinks the bar and lifts it off the page — driven by the scroll position itself, so
|
|
137
|
+
* no script is involved. A browser without scroll-driven animations keeps the resting bar, which
|
|
138
|
+
* is legible at every scroll position because it is opaque. */
|
|
139
|
+
@supports (animation-timeline: scroll()) {
|
|
140
|
+
.topbar,
|
|
141
|
+
.bar-inner {
|
|
142
|
+
animation: linear both;
|
|
143
|
+
animation-timeline: scroll(root block);
|
|
144
|
+
animation-range: 0 6rem;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.topbar {
|
|
148
|
+
animation-name: bar-detach;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.bar-inner {
|
|
152
|
+
animation-name: bar-compact;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* The shrinking is the motion here; the shadow alone still marks the detached bar. */
|
|
156
|
+
@media (prefers-reduced-motion: reduce) {
|
|
157
|
+
.bar-inner {
|
|
158
|
+
animation-name: none;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@keyframes bar-detach {
|
|
164
|
+
to {
|
|
165
|
+
box-shadow: 0 1px 12px rgb(0 0 0 / 0.22);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@keyframes bar-compact {
|
|
170
|
+
to {
|
|
171
|
+
min-height: 2.75rem;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.bar-brand {
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
gap: 0.5rem;
|
|
179
|
+
font-weight: 700;
|
|
180
|
+
text-decoration: none;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.bar-brand img {
|
|
184
|
+
width: 1.5rem;
|
|
185
|
+
height: 1.5rem;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.bar-end {
|
|
189
|
+
display: flex;
|
|
190
|
+
align-items: center;
|
|
191
|
+
gap: 1rem;
|
|
192
|
+
margin-inline-start: auto;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* On the brand colour the muted greys of the text column would be unreadable, so the bar fades its
|
|
196
|
+
* own text colour instead and restores it fully on hover. */
|
|
197
|
+
.bar-link {
|
|
198
|
+
display: inline-flex;
|
|
199
|
+
align-items: center;
|
|
200
|
+
gap: 0.4rem;
|
|
201
|
+
font-size: 0.9rem;
|
|
202
|
+
text-decoration: none;
|
|
203
|
+
opacity: 0.75;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.bar-link:hover,
|
|
207
|
+
.bar-languages a:hover {
|
|
208
|
+
opacity: 1;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.bar-languages ul,
|
|
212
|
+
.footer-languages ul,
|
|
213
|
+
.card-list,
|
|
214
|
+
.os-group ul,
|
|
215
|
+
.tags,
|
|
216
|
+
.carousel-track,
|
|
217
|
+
.footer-legal,
|
|
218
|
+
.languages-list {
|
|
219
|
+
list-style: none;
|
|
220
|
+
margin: 0;
|
|
221
|
+
padding: 0;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.bar-languages ul,
|
|
225
|
+
.footer-languages ul {
|
|
226
|
+
display: flex;
|
|
227
|
+
gap: 0.75rem;
|
|
228
|
+
font-size: 0.85rem;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.bar-languages a {
|
|
232
|
+
text-decoration: none;
|
|
233
|
+
opacity: 0.75;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.footer-languages a {
|
|
237
|
+
color: var(--muted);
|
|
238
|
+
text-decoration: none;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.bar-languages [aria-current],
|
|
242
|
+
.footer-languages [aria-current] {
|
|
243
|
+
font-weight: 700;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.hero-inner {
|
|
247
|
+
display: flex;
|
|
248
|
+
align-items: center;
|
|
249
|
+
gap: 1.75rem;
|
|
250
|
+
padding-block: 2.5rem 1.75rem;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.hero-icon {
|
|
254
|
+
position: relative;
|
|
255
|
+
flex: none;
|
|
256
|
+
isolation: isolate;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* The soft glow: the icon again, blown up and blurred behind itself. */
|
|
260
|
+
.hero-icon::before {
|
|
261
|
+
content: "";
|
|
262
|
+
position: absolute;
|
|
263
|
+
inset: -18%;
|
|
264
|
+
z-index: -1;
|
|
265
|
+
background-image: var(--icon-url);
|
|
266
|
+
background-size: contain;
|
|
267
|
+
background-position: center;
|
|
268
|
+
background-repeat: no-repeat;
|
|
269
|
+
filter: blur(26px) saturate(1.5);
|
|
270
|
+
opacity: 0.55;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.hero-icon img {
|
|
274
|
+
display: block;
|
|
275
|
+
width: 7rem;
|
|
276
|
+
height: 7rem;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.hero-text {
|
|
280
|
+
flex: 1 1 auto;
|
|
281
|
+
min-width: 0;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
h1 {
|
|
285
|
+
margin: 0;
|
|
286
|
+
font-size: clamp(2rem, 5vw, 2.75rem);
|
|
287
|
+
letter-spacing: -0.02em;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.hero-by {
|
|
291
|
+
margin: 0.25rem 0 0;
|
|
292
|
+
opacity: 0.8;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/* Buttons and the download split */
|
|
296
|
+
|
|
297
|
+
.button {
|
|
298
|
+
display: inline-flex;
|
|
299
|
+
align-items: center;
|
|
300
|
+
justify-content: center;
|
|
301
|
+
gap: 0.5rem;
|
|
302
|
+
padding: 0.7rem 1.15rem;
|
|
303
|
+
border: none;
|
|
304
|
+
border-radius: var(--radius);
|
|
305
|
+
background: var(--accent);
|
|
306
|
+
color: var(--accent-fg);
|
|
307
|
+
font: inherit;
|
|
308
|
+
font-weight: 700;
|
|
309
|
+
text-decoration: none;
|
|
310
|
+
cursor: pointer;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.button:hover {
|
|
314
|
+
background: color-mix(in srgb, var(--accent) 88%, var(--fg));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.button .icon {
|
|
318
|
+
font-size: 1.1em;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.download {
|
|
322
|
+
flex: none;
|
|
323
|
+
margin-inline-start: auto;
|
|
324
|
+
min-width: 0;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.download-split {
|
|
328
|
+
display: flex;
|
|
329
|
+
gap: 2px;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.download-cta {
|
|
333
|
+
border-radius: var(--radius) 0 0 var(--radius);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.download-toggle {
|
|
337
|
+
padding-inline: 0.6rem;
|
|
338
|
+
border-radius: 0 var(--radius) var(--radius) 0;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* The accent would have to be contrasted against the app's colour, which is unknowable here. The
|
|
342
|
+
* band's text colour was already measured against it, so the button inverts that pair and is
|
|
343
|
+
* readable on any brand. */
|
|
344
|
+
.masthead .download-split .button {
|
|
345
|
+
background: var(--band-fg);
|
|
346
|
+
color: var(--brand);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.masthead .download-split .button:hover {
|
|
350
|
+
background: color-mix(in srgb, var(--band-fg) 86%, var(--brand));
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/* Badges */
|
|
354
|
+
|
|
355
|
+
/* One equal column per fact, however many facts there are, spread over the hero's width. */
|
|
356
|
+
.badges {
|
|
357
|
+
display: grid;
|
|
358
|
+
grid-template-columns: repeat(var(--badge-count, 4), minmax(0, 1fr));
|
|
359
|
+
gap: 0.75rem 1rem;
|
|
360
|
+
list-style: none;
|
|
361
|
+
padding: 1.25rem 0 0.5rem;
|
|
362
|
+
border-block-start: 1px solid var(--band-line);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.badge {
|
|
366
|
+
display: flex;
|
|
367
|
+
flex-direction: column;
|
|
368
|
+
align-items: center;
|
|
369
|
+
gap: 0.3rem;
|
|
370
|
+
min-width: 0;
|
|
371
|
+
text-align: center;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.badge-pill {
|
|
375
|
+
display: flex;
|
|
376
|
+
align-items: center;
|
|
377
|
+
justify-content: center;
|
|
378
|
+
gap: 0.3rem;
|
|
379
|
+
width: 2.5rem;
|
|
380
|
+
height: 2.5rem;
|
|
381
|
+
border-radius: 999px;
|
|
382
|
+
background: var(--band-tint);
|
|
383
|
+
font-size: 1.15rem;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/* The platform badge draws one glyph per system, so its chip grows into a pill instead. A
|
|
387
|
+
* Firefox and a Chromium glyph are only distinguishable at a size the others do not need. */
|
|
388
|
+
.badge-platforms {
|
|
389
|
+
display: flex;
|
|
390
|
+
align-items: center;
|
|
391
|
+
gap: 0.6rem;
|
|
392
|
+
font-size: 1.6rem;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.badge:has(.badge-platforms) .badge-pill {
|
|
396
|
+
width: auto;
|
|
397
|
+
min-width: 2.5rem;
|
|
398
|
+
height: 2.75rem;
|
|
399
|
+
padding-inline: 0.85rem;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/* Hovering or tabbing to a platform brings up the colour that system is known by; at rest they all
|
|
403
|
+
* share the band's text colour, so the row stays one row and not a fruit salad. */
|
|
404
|
+
.platform {
|
|
405
|
+
color: inherit;
|
|
406
|
+
transition: color 150ms ease;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
@media (prefers-reduced-motion: reduce) {
|
|
410
|
+
.platform {
|
|
411
|
+
transition: none;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.platform:hover {
|
|
416
|
+
color: var(--platform-color);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* A glyph is not focusable and a touch screen cannot hover, so there the colours are simply on. */
|
|
420
|
+
@media (hover: none) {
|
|
421
|
+
.platform {
|
|
422
|
+
color: var(--platform-color);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.platform-linux {
|
|
427
|
+
--platform-color: #f5c211;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.platform-darwin {
|
|
431
|
+
--platform-color: #d9d9dd;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.platform-win32 {
|
|
435
|
+
--platform-color: #3584e4;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.platform-android {
|
|
439
|
+
--platform-color: #3ddc84;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.platform-web {
|
|
443
|
+
--platform-color: #62a0ea;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
.platform-firefox {
|
|
447
|
+
--platform-color: #ff7139;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
.platform-chromium {
|
|
451
|
+
--platform-color: #4285f4;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/* Kept in the flow even when a badge has no value, so every label sits on the same line. */
|
|
455
|
+
.badge-value {
|
|
456
|
+
line-height: 1.5;
|
|
457
|
+
min-height: 1.5em;
|
|
458
|
+
font-weight: 700;
|
|
459
|
+
font-size: 0.95rem;
|
|
460
|
+
/* A long licence id must wrap inside the badge instead of widening the row. */
|
|
461
|
+
overflow-wrap: anywhere;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.badge-label {
|
|
465
|
+
color: var(--muted);
|
|
466
|
+
font-size: 0.78rem;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/* Screenshot band — the bottom of the masthead, whose colour it already sits on. */
|
|
470
|
+
|
|
471
|
+
.band {
|
|
472
|
+
padding-block: 1.5rem 3rem;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.carousel {
|
|
476
|
+
display: block;
|
|
477
|
+
position: relative;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/* One slide fills the track, so the snapped screenshot is centred and no neighbour peeks in. */
|
|
481
|
+
.carousel-track {
|
|
482
|
+
display: flex;
|
|
483
|
+
overflow-x: auto;
|
|
484
|
+
scroll-snap-type: x mandatory;
|
|
485
|
+
scroll-behavior: smooth;
|
|
486
|
+
scrollbar-width: none;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.carousel-track::-webkit-scrollbar {
|
|
490
|
+
display: none;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.slide {
|
|
494
|
+
flex: 0 0 100%;
|
|
495
|
+
scroll-snap-align: center;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/* Shrink-wrapped around the screenshot: the rounded corners and the shadow belong to the image,
|
|
499
|
+
* not to a box the letterboxed image sits in. */
|
|
500
|
+
.slide figure {
|
|
501
|
+
margin: 0;
|
|
502
|
+
width: fit-content;
|
|
503
|
+
max-width: 86vw;
|
|
504
|
+
margin-inline: auto;
|
|
505
|
+
position: relative;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/* A fixed track height keeps mixed aspect ratios from resizing the band slide by slide; a shot
|
|
509
|
+
* that does not fill it sits centred rather than stretched. */
|
|
510
|
+
.slide picture {
|
|
511
|
+
display: flex;
|
|
512
|
+
align-items: center;
|
|
513
|
+
justify-content: center;
|
|
514
|
+
height: var(--shot-h);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/* `--shot-w` is the CSS width this screenshot's renditions were cut for: at that width a 2560px
|
|
518
|
+
* source is a 2× image, and above it the browser would be upscaling. Width and max-height
|
|
519
|
+
* together shrink-wrap the artwork — `object-fit: contain` would letterbox it instead, and the
|
|
520
|
+
* shadow would then be drawn around the empty strip. */
|
|
521
|
+
.slide img {
|
|
522
|
+
width: min(100%, var(--shot-w, 100%));
|
|
523
|
+
height: auto;
|
|
524
|
+
max-height: 100%;
|
|
525
|
+
border-radius: var(--radius-lg);
|
|
526
|
+
box-shadow: var(--shot-shadow);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/* A window shot carries its own rounded corners and shadow (like on Flathub): show it as it is. */
|
|
530
|
+
.slide picture[data-frame="none"] img,
|
|
531
|
+
.lightbox picture[data-frame="none"] img {
|
|
532
|
+
border-radius: 0;
|
|
533
|
+
box-shadow: none;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.slide figcaption {
|
|
537
|
+
margin-top: 0.85rem;
|
|
538
|
+
text-align: center;
|
|
539
|
+
font-size: 0.9rem;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
.slide-expand,
|
|
543
|
+
.carousel-arrow {
|
|
544
|
+
display: inline-flex;
|
|
545
|
+
align-items: center;
|
|
546
|
+
justify-content: center;
|
|
547
|
+
border: 1px solid var(--line);
|
|
548
|
+
border-radius: 999px;
|
|
549
|
+
background: color-mix(in srgb, var(--bg) 85%, transparent);
|
|
550
|
+
backdrop-filter: blur(8px);
|
|
551
|
+
color: var(--fg);
|
|
552
|
+
cursor: pointer;
|
|
553
|
+
padding: 0;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
.slide-expand {
|
|
557
|
+
position: absolute;
|
|
558
|
+
inset-block-start: 0.6rem;
|
|
559
|
+
inset-inline-end: 0.6rem;
|
|
560
|
+
width: 2rem;
|
|
561
|
+
height: 2rem;
|
|
562
|
+
opacity: 0;
|
|
563
|
+
transition: opacity 0.15s;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
.slide:hover .slide-expand,
|
|
567
|
+
.slide-expand:focus-visible {
|
|
568
|
+
opacity: 1;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.carousel-arrow {
|
|
572
|
+
position: absolute;
|
|
573
|
+
inset-block-start: calc(var(--shot-h) / 2);
|
|
574
|
+
translate: 0 -50%;
|
|
575
|
+
width: 2.5rem;
|
|
576
|
+
height: 2.5rem;
|
|
577
|
+
font-size: 1.1rem;
|
|
578
|
+
z-index: 1;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/* At the edges of the band: a screenshot shrink-wraps to its own aspect, so there is no image edge
|
|
582
|
+
* to pin them to that would not move from slide to slide. */
|
|
583
|
+
.carousel-prev {
|
|
584
|
+
inset-inline-start: clamp(0.75rem, 3vw, 2.5rem);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
.carousel-next {
|
|
588
|
+
inset-inline-end: clamp(0.75rem, 3vw, 2.5rem);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.carousel-dots {
|
|
592
|
+
display: flex;
|
|
593
|
+
justify-content: center;
|
|
594
|
+
gap: 0.5rem;
|
|
595
|
+
margin: 1rem 0 0;
|
|
596
|
+
padding: 0;
|
|
597
|
+
list-style: none;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
.carousel-dot {
|
|
601
|
+
width: 0.55rem;
|
|
602
|
+
height: 0.55rem;
|
|
603
|
+
padding: 0;
|
|
604
|
+
border: none;
|
|
605
|
+
border-radius: 999px;
|
|
606
|
+
background: currentcolor;
|
|
607
|
+
opacity: 0.35;
|
|
608
|
+
cursor: pointer;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
.carousel-dot[aria-current="true"] {
|
|
612
|
+
opacity: 1;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
.lightbox {
|
|
616
|
+
border: none;
|
|
617
|
+
padding: 0;
|
|
618
|
+
max-width: 100vw;
|
|
619
|
+
max-height: 100vh;
|
|
620
|
+
width: 100vw;
|
|
621
|
+
height: 100vh;
|
|
622
|
+
background: transparent;
|
|
623
|
+
color: #fff;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.lightbox::backdrop {
|
|
627
|
+
background: rgb(0 0 0 / 0.94);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
.lightbox figure {
|
|
631
|
+
display: flex;
|
|
632
|
+
flex-direction: column;
|
|
633
|
+
gap: 1rem;
|
|
634
|
+
align-items: center;
|
|
635
|
+
justify-content: center;
|
|
636
|
+
height: 100%;
|
|
637
|
+
margin: 0;
|
|
638
|
+
padding: 1.5rem;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/* The cloned figure loses the .slide sizing rules, so the lightbox caps it itself. */
|
|
642
|
+
.lightbox picture {
|
|
643
|
+
display: flex;
|
|
644
|
+
min-height: 0;
|
|
645
|
+
max-width: 100%;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/* The clone keeps the picture's `--shot-w`, so the full-screen view stops at the same width the
|
|
649
|
+
* renditions were cut for instead of upscaling the file the browser already fetched. */
|
|
650
|
+
.lightbox img {
|
|
651
|
+
width: min(100%, var(--shot-w, 100%));
|
|
652
|
+
height: auto;
|
|
653
|
+
/* Leaves room for the figure padding, the gap and the caption. */
|
|
654
|
+
max-height: calc(100vh - 8rem);
|
|
655
|
+
object-fit: contain;
|
|
656
|
+
border-radius: var(--radius-lg);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.lightbox figcaption {
|
|
660
|
+
text-align: center;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
.lightbox .dialog-close {
|
|
664
|
+
position: absolute;
|
|
665
|
+
inset-block-start: 1rem;
|
|
666
|
+
inset-inline-end: 1rem;
|
|
667
|
+
color: #fff;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/* Text column */
|
|
671
|
+
|
|
672
|
+
.about h2 {
|
|
673
|
+
margin: 0 0 0.75rem;
|
|
674
|
+
font-size: 1.5rem;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
.about p {
|
|
678
|
+
color: var(--fg);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
.about ul {
|
|
682
|
+
padding-inline-start: 1.25rem;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
.card {
|
|
686
|
+
display: block;
|
|
687
|
+
margin-block: 2rem;
|
|
688
|
+
padding: 1.25rem 1.5rem;
|
|
689
|
+
border: 1px solid var(--line);
|
|
690
|
+
border-radius: var(--radius-lg);
|
|
691
|
+
background: var(--surface);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
.release-head {
|
|
695
|
+
display: flex;
|
|
696
|
+
align-items: baseline;
|
|
697
|
+
justify-content: space-between;
|
|
698
|
+
gap: 1rem;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.release-head h2,
|
|
702
|
+
.release-head h3 {
|
|
703
|
+
margin: 0;
|
|
704
|
+
font-size: 1.15rem;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.date-pill {
|
|
708
|
+
flex: none;
|
|
709
|
+
margin: 0;
|
|
710
|
+
padding: 0.1rem 0.6rem;
|
|
711
|
+
border: 1px solid var(--line);
|
|
712
|
+
border-radius: 999px;
|
|
713
|
+
background: var(--bg);
|
|
714
|
+
color: var(--muted);
|
|
715
|
+
font-size: 0.8rem;
|
|
716
|
+
white-space: nowrap;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
.release-body ul {
|
|
720
|
+
padding-inline-start: 1.25rem;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
.release-body.clamped {
|
|
724
|
+
max-height: 11rem;
|
|
725
|
+
overflow: hidden;
|
|
726
|
+
mask-image: linear-gradient(to bottom, #000 60%, transparent);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
.release-more {
|
|
730
|
+
margin-top: 0.5rem;
|
|
731
|
+
padding: 0;
|
|
732
|
+
border: none;
|
|
733
|
+
background: none;
|
|
734
|
+
color: var(--accent);
|
|
735
|
+
font: inherit;
|
|
736
|
+
font-weight: 600;
|
|
737
|
+
cursor: pointer;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
.older summary {
|
|
741
|
+
display: flex;
|
|
742
|
+
align-items: center;
|
|
743
|
+
gap: 0.5rem;
|
|
744
|
+
font-weight: 600;
|
|
745
|
+
cursor: pointer;
|
|
746
|
+
list-style: none;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
.older summary::-webkit-details-marker {
|
|
750
|
+
display: none;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
.summary-chevron {
|
|
754
|
+
margin-inline-start: auto;
|
|
755
|
+
color: var(--muted);
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
.older[open] .summary-chevron {
|
|
759
|
+
rotate: 180deg;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
.release-old {
|
|
763
|
+
margin-top: 1.5rem;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/* Link cards, also the download rows */
|
|
767
|
+
|
|
768
|
+
.links h2,
|
|
769
|
+
.support h2 {
|
|
770
|
+
font-size: 1.15rem;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
.card-list,
|
|
774
|
+
.os-group ul {
|
|
775
|
+
border: 1px solid var(--line);
|
|
776
|
+
border-radius: var(--radius-lg);
|
|
777
|
+
background: var(--surface);
|
|
778
|
+
overflow: hidden;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
.card-list li + li,
|
|
782
|
+
.os-group li + li {
|
|
783
|
+
border-top: 1px solid var(--line);
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
.card-list a,
|
|
787
|
+
.target a,
|
|
788
|
+
.target-link {
|
|
789
|
+
display: flex;
|
|
790
|
+
align-items: center;
|
|
791
|
+
gap: 0.875rem;
|
|
792
|
+
padding: 0.7rem 1rem;
|
|
793
|
+
text-decoration: none;
|
|
794
|
+
color: inherit;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
.card-list a:hover,
|
|
798
|
+
.target a:hover {
|
|
799
|
+
background: color-mix(in srgb, var(--fg) 6%, transparent);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/* A target that is announced but cannot be downloaded yet: same row, no hover, muted. */
|
|
803
|
+
.target-link {
|
|
804
|
+
cursor: default;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
.target-link .target-icon,
|
|
808
|
+
.target-link .target-name {
|
|
809
|
+
opacity: 0.6;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.link-icon,
|
|
813
|
+
.target-icon {
|
|
814
|
+
display: flex;
|
|
815
|
+
align-items: center;
|
|
816
|
+
justify-content: center;
|
|
817
|
+
flex: none;
|
|
818
|
+
width: 2rem;
|
|
819
|
+
height: 2rem;
|
|
820
|
+
border-radius: 8px;
|
|
821
|
+
background: var(--bg);
|
|
822
|
+
color: var(--muted);
|
|
823
|
+
font-size: 1rem;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.link-text,
|
|
827
|
+
.target-text {
|
|
828
|
+
display: flex;
|
|
829
|
+
flex-direction: column;
|
|
830
|
+
min-width: 0;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
.link-title,
|
|
834
|
+
.target-name {
|
|
835
|
+
font-weight: 600;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
.link-url,
|
|
839
|
+
.target-meta {
|
|
840
|
+
color: var(--muted);
|
|
841
|
+
font-size: 0.78rem;
|
|
842
|
+
overflow: hidden;
|
|
843
|
+
text-overflow: ellipsis;
|
|
844
|
+
white-space: nowrap;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
.link-external {
|
|
848
|
+
flex: none;
|
|
849
|
+
margin-inline-start: auto;
|
|
850
|
+
color: var(--muted);
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
.target-size {
|
|
854
|
+
flex: none;
|
|
855
|
+
margin-inline-start: auto;
|
|
856
|
+
color: var(--muted);
|
|
857
|
+
font-size: 0.8rem;
|
|
858
|
+
font-variant-numeric: tabular-nums;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/* Tags */
|
|
862
|
+
|
|
863
|
+
.tags-section {
|
|
864
|
+
display: flex;
|
|
865
|
+
flex-wrap: wrap;
|
|
866
|
+
gap: 1.5rem 3rem;
|
|
867
|
+
margin-block: 2rem;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
.tag-group h3 {
|
|
871
|
+
margin: 0 0 0.5rem;
|
|
872
|
+
color: var(--muted);
|
|
873
|
+
font-size: 0.85rem;
|
|
874
|
+
font-weight: 600;
|
|
875
|
+
text-transform: uppercase;
|
|
876
|
+
letter-spacing: 0.04em;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
.tags {
|
|
880
|
+
display: flex;
|
|
881
|
+
flex-wrap: wrap;
|
|
882
|
+
gap: 0.5rem;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
.tags li {
|
|
886
|
+
padding: 0.15rem 0.75rem;
|
|
887
|
+
border: 1px solid var(--line);
|
|
888
|
+
border-radius: 999px;
|
|
889
|
+
background: var(--surface);
|
|
890
|
+
font-size: 0.85rem;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/* Dialogs */
|
|
894
|
+
|
|
895
|
+
.download-dialog,
|
|
896
|
+
.support-dialog {
|
|
897
|
+
width: 34rem;
|
|
898
|
+
max-width: min(34rem, calc(100vw - 2rem));
|
|
899
|
+
max-height: 85vh;
|
|
900
|
+
padding: 0;
|
|
901
|
+
border: 1px solid var(--line);
|
|
902
|
+
border-radius: var(--radius-lg);
|
|
903
|
+
background: var(--bg);
|
|
904
|
+
color: var(--fg);
|
|
905
|
+
overflow: auto;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
.download-dialog::backdrop,
|
|
909
|
+
.support-dialog::backdrop {
|
|
910
|
+
background: rgb(0 0 0 / 0.5);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
.dialog-head {
|
|
914
|
+
position: sticky;
|
|
915
|
+
top: 0;
|
|
916
|
+
z-index: 1;
|
|
917
|
+
display: flex;
|
|
918
|
+
align-items: center;
|
|
919
|
+
justify-content: space-between;
|
|
920
|
+
gap: 1rem;
|
|
921
|
+
padding: 1rem 1.25rem;
|
|
922
|
+
border-bottom: 1px solid var(--line);
|
|
923
|
+
background: var(--bg);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
.dialog-head h2 {
|
|
927
|
+
margin: 0;
|
|
928
|
+
font-size: 1.05rem;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
.dialog-close {
|
|
932
|
+
display: inline-flex;
|
|
933
|
+
padding: 0.4rem;
|
|
934
|
+
border: none;
|
|
935
|
+
border-radius: 8px;
|
|
936
|
+
background: none;
|
|
937
|
+
color: var(--muted);
|
|
938
|
+
font-size: 1rem;
|
|
939
|
+
cursor: pointer;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
.dialog-close:hover {
|
|
943
|
+
background: var(--surface);
|
|
944
|
+
color: var(--fg);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.os-tabs {
|
|
948
|
+
display: flex;
|
|
949
|
+
gap: 0.35rem;
|
|
950
|
+
padding: 0.9rem 1.25rem 0;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
.os-tab {
|
|
954
|
+
display: inline-flex;
|
|
955
|
+
flex: 1;
|
|
956
|
+
flex-direction: column;
|
|
957
|
+
align-items: center;
|
|
958
|
+
gap: 0.25rem;
|
|
959
|
+
padding: 0.5rem 0.25rem;
|
|
960
|
+
border: 1px solid var(--line);
|
|
961
|
+
border-radius: var(--radius);
|
|
962
|
+
background: var(--surface);
|
|
963
|
+
color: var(--muted);
|
|
964
|
+
font: inherit;
|
|
965
|
+
font-size: 0.78rem;
|
|
966
|
+
cursor: pointer;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
.os-tab .icon {
|
|
970
|
+
font-size: 1.1rem;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.os-tab[aria-selected="true"] {
|
|
974
|
+
border-color: transparent;
|
|
975
|
+
background: var(--accent);
|
|
976
|
+
color: var(--accent-fg);
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
.os-groups {
|
|
980
|
+
padding: 0 1.25rem;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
.os-group h3 {
|
|
984
|
+
display: flex;
|
|
985
|
+
align-items: center;
|
|
986
|
+
gap: 0.5rem;
|
|
987
|
+
margin: 1.1rem 0 0.5rem;
|
|
988
|
+
font-size: 0.95rem;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
/* With tabs visible the group heading only repeats the selected tab. */
|
|
992
|
+
.os-tabs:not([hidden]) ~ .os-groups h3 {
|
|
993
|
+
display: none;
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
.os-tabs:not([hidden]) ~ .os-groups .os-group ul {
|
|
997
|
+
margin-top: 1rem;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
.os-note {
|
|
1001
|
+
margin: 0.5rem 0 0;
|
|
1002
|
+
color: var(--muted);
|
|
1003
|
+
font-size: 0.8rem;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
.dialog-foot {
|
|
1007
|
+
margin: 1rem 0 0;
|
|
1008
|
+
padding: 0 1.25rem 1.25rem;
|
|
1009
|
+
font-size: 0.9rem;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
.dialog-foot a {
|
|
1013
|
+
display: inline-flex;
|
|
1014
|
+
align-items: center;
|
|
1015
|
+
gap: 0.4rem;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
/* Without JavaScript the dialog is not a modal but a panel: everything stays reachable. */
|
|
1019
|
+
app-download:not([data-enhanced]) dialog,
|
|
1020
|
+
app-support:not([data-enhanced]) dialog {
|
|
1021
|
+
display: block;
|
|
1022
|
+
position: static;
|
|
1023
|
+
width: 100%;
|
|
1024
|
+
max-width: none;
|
|
1025
|
+
max-height: none;
|
|
1026
|
+
margin-block-start: 1rem;
|
|
1027
|
+
overflow: visible;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
app-download:not([data-enhanced]) .dialog-head,
|
|
1031
|
+
app-support:not([data-enhanced]) .dialog-head {
|
|
1032
|
+
position: static;
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
app-download:not([data-enhanced]) .download-toggle {
|
|
1036
|
+
display: none;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
/* The inline panel is taller than the name, so the hero reads top down, not centred. */
|
|
1040
|
+
.hero-inner:has(app-download:not([data-enhanced])) {
|
|
1041
|
+
align-items: flex-start;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
.support {
|
|
1045
|
+
margin-block: 2rem;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
/* Footer */
|
|
1049
|
+
|
|
1050
|
+
.footer {
|
|
1051
|
+
margin-top: 3rem;
|
|
1052
|
+
padding-block: 2rem 3rem;
|
|
1053
|
+
border-top: 1px solid var(--line);
|
|
1054
|
+
color: var(--muted);
|
|
1055
|
+
font-size: 0.9rem;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
.footer-inner {
|
|
1059
|
+
display: flex;
|
|
1060
|
+
flex-direction: column;
|
|
1061
|
+
gap: 0.6rem;
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
.footer p {
|
|
1065
|
+
margin: 0;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
.footer-source a,
|
|
1069
|
+
.footer-made a {
|
|
1070
|
+
display: inline-flex;
|
|
1071
|
+
align-items: center;
|
|
1072
|
+
gap: 0.4rem;
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
.footer-legal {
|
|
1076
|
+
display: flex;
|
|
1077
|
+
flex-wrap: wrap;
|
|
1078
|
+
gap: 0.5rem 1.25rem;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
/* The language picker shown when no page has been chosen yet. */
|
|
1082
|
+
|
|
1083
|
+
.root main {
|
|
1084
|
+
width: min(100% - 2rem, var(--text));
|
|
1085
|
+
margin-inline: auto;
|
|
1086
|
+
padding-block: 4rem;
|
|
1087
|
+
text-align: center;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
.languages-list {
|
|
1091
|
+
display: flex;
|
|
1092
|
+
gap: 1rem;
|
|
1093
|
+
justify-content: center;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
/* Breakpoints */
|
|
1097
|
+
|
|
1098
|
+
@media (max-width: 1000px) {
|
|
1099
|
+
:root {
|
|
1100
|
+
--shot-h: 22rem;
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
@media (max-width: 760px) {
|
|
1105
|
+
.hero-inner {
|
|
1106
|
+
flex-wrap: wrap;
|
|
1107
|
+
padding-block: 2.25rem 1.5rem;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
.download {
|
|
1111
|
+
flex: 1 1 100%;
|
|
1112
|
+
margin-inline-start: 0;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
.download-split {
|
|
1116
|
+
width: 100%;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
.download-cta {
|
|
1120
|
+
flex: 1;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
@media (max-width: 600px) {
|
|
1125
|
+
:root {
|
|
1126
|
+
--shot-h: 15rem;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
/* A portrait phone shot would be tiny in a 15rem track. When any slide has one, the track is as
|
|
1130
|
+
* tall for all of them (no jump between slides) and landscape slides sit centred in it. */
|
|
1131
|
+
.carousel[data-portrait] {
|
|
1132
|
+
--shot-h: min(70svh, 40rem);
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
.carousel[data-portrait] .slide {
|
|
1136
|
+
display: flex;
|
|
1137
|
+
align-items: center;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
.carousel[data-portrait] .slide:not([data-portrait]) picture {
|
|
1141
|
+
height: 15rem;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
.hero-inner {
|
|
1145
|
+
flex-direction: column;
|
|
1146
|
+
gap: 1rem;
|
|
1147
|
+
text-align: center;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/* Two columns on a phone; an odd last badge takes the whole final row instead of hanging left. */
|
|
1151
|
+
.badges {
|
|
1152
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
1153
|
+
gap: 1.1rem 1rem;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
.badges[data-odd] .badge:last-child {
|
|
1157
|
+
grid-column: 1 / -1;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
.band {
|
|
1161
|
+
padding-block: 1.75rem;
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
.carousel-arrow {
|
|
1165
|
+
display: none;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
.card {
|
|
1169
|
+
padding: 1rem 1.1rem;
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
.release-head {
|
|
1173
|
+
flex-direction: column;
|
|
1174
|
+
align-items: flex-start;
|
|
1175
|
+
gap: 0.35rem;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
.tags-section {
|
|
1179
|
+
gap: 1.25rem;
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
.os-tab span:not(.icon) {
|
|
1183
|
+
font-size: 0.7rem;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1188
|
+
.carousel-track {
|
|
1189
|
+
scroll-behavior: auto;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
.slide-expand {
|
|
1193
|
+
transition: none;
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
/* Bank transfer card in the support dialog */
|
|
1198
|
+
|
|
1199
|
+
.card-list .sepa {
|
|
1200
|
+
display: flex;
|
|
1201
|
+
flex-wrap: wrap;
|
|
1202
|
+
align-items: center;
|
|
1203
|
+
gap: 1rem 1.25rem;
|
|
1204
|
+
padding: 1rem;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
.sepa-text {
|
|
1208
|
+
flex: 1 1 14rem;
|
|
1209
|
+
min-width: 0;
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
.sepa-text h3 {
|
|
1213
|
+
margin: 0 0 0.5rem;
|
|
1214
|
+
font-size: 1rem;
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
.sepa-details {
|
|
1218
|
+
margin: 0;
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
.sepa-row {
|
|
1222
|
+
padding-block: 0.3rem;
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.sepa-row dt {
|
|
1226
|
+
color: var(--muted);
|
|
1227
|
+
font-size: 0.8rem;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
.sepa-row dd {
|
|
1231
|
+
display: flex;
|
|
1232
|
+
flex-wrap: wrap;
|
|
1233
|
+
align-items: center;
|
|
1234
|
+
gap: 0.25rem 0.5rem;
|
|
1235
|
+
margin: 0;
|
|
1236
|
+
min-width: 0;
|
|
1237
|
+
overflow-wrap: anywhere;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
.sepa-value {
|
|
1241
|
+
font-family: ui-monospace, "SF Mono", Menlo, monospace;
|
|
1242
|
+
font-size: 0.9rem;
|
|
1243
|
+
user-select: all;
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
.sepa-copy {
|
|
1247
|
+
display: inline-flex;
|
|
1248
|
+
align-items: center;
|
|
1249
|
+
gap: 0.3rem;
|
|
1250
|
+
padding: 0.2rem 0.55rem;
|
|
1251
|
+
border: 1px solid var(--line);
|
|
1252
|
+
border-radius: 8px;
|
|
1253
|
+
background: var(--bg);
|
|
1254
|
+
color: var(--fg);
|
|
1255
|
+
font: inherit;
|
|
1256
|
+
font-size: 0.8rem;
|
|
1257
|
+
cursor: pointer;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
.sepa-copy[hidden] {
|
|
1261
|
+
display: none;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
.sepa-copy:hover {
|
|
1265
|
+
background: color-mix(in srgb, var(--fg) 6%, var(--bg));
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
.sepa-qr {
|
|
1269
|
+
flex: none;
|
|
1270
|
+
margin: 0 auto;
|
|
1271
|
+
text-align: center;
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
/* Scanners need dark modules on a light ground: the SVG carries its own white quiet zone in both themes. */
|
|
1275
|
+
.qr {
|
|
1276
|
+
display: block;
|
|
1277
|
+
width: 9.5rem;
|
|
1278
|
+
height: 9.5rem;
|
|
1279
|
+
border-radius: 8px;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
.sepa-qr figcaption {
|
|
1283
|
+
margin-top: 0.4rem;
|
|
1284
|
+
color: var(--muted);
|
|
1285
|
+
font-size: 0.78rem;
|
|
1286
|
+
}
|