@fluid-theme/core 0.4.3 → 2.0.0
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/AGENTS.md +6 -29
- package/CHANGELOG.md +543 -2
- package/CLAUDE.md +193 -14
- package/GEMINI.md +6 -45
- package/README.md +17 -8
- package/assets/js/compare.js +77 -0
- package/assets/js/fit-text.js +103 -0
- package/assets/js/lightbox.js +153 -0
- package/assets/js/scroll-reveal.js +72 -0
- package/assets/js/toc-build.mjs +86 -0
- package/assets/js/toc.js +384 -0
- package/dist/fluid-1x.min.css +4 -0
- package/dist/fluid-fonts.min.css +2 -0
- package/dist/fluid-legacy-1x.css +3 -0
- package/dist/fluid-nav.min.css +3 -0
- package/dist/fluid-toc.min.css +3 -0
- package/dist/fluid-zero.min.css +3 -0
- package/dist/fluid.min.css +3 -2
- package/dist/fonts/OFL-newsreader.txt +93 -0
- package/dist/fonts/OFL-schibsted-grotesk.txt +93 -0
- package/dist/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/dist/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/dist/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
- package/dist/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
- package/fluid-agent-kit/README.md +1 -0
- package/fluid-agent-kit/skills/accessibility.md +3 -1
- package/fluid-agent-kit/skills/css-conventions.md +22 -5
- package/fluid-agent-kit/skills/image-optimization.md +2 -0
- package/fluid-agent-kit/skills/preset-composition.md +108 -0
- package/package.json +29 -3
- package/src/animations/scroll-reveal.css +75 -193
- package/src/components/accordion.css +6 -47
- package/src/components/alert.css +47 -88
- package/src/components/avatar.css +4 -20
- package/src/components/badge.css +25 -48
- package/src/components/button.css +69 -175
- package/src/components/card.css +146 -481
- package/src/components/chip.css +46 -12
- package/src/components/compare.css +234 -0
- package/src/components/dropdown.css +10 -67
- package/src/components/empty-state.css +4 -0
- package/src/components/form.css +113 -81
- package/src/components/gallery.css +252 -0
- package/src/components/hero.css +203 -88
- package/src/components/indicator.css +23 -117
- package/src/components/loading.css +7 -29
- package/src/components/modal.css +12 -65
- package/src/components/nav-modes.css +261 -0
- package/src/components/nav.css +324 -392
- package/src/components/search-input.css +4 -2
- package/src/components/step-indicator.css +26 -27
- package/src/components/table.css +64 -171
- package/src/components/toc.css +254 -0
- package/src/components/tooltip.css +5 -46
- package/src/core/base.css +393 -547
- package/src/core/reset.css +17 -5
- package/src/core/tokens.css +426 -2276
- package/src/fluid.css +258 -17
- package/src/fonts/OFL-newsreader.txt +93 -0
- package/src/fonts/OFL-schibsted-grotesk.txt +93 -0
- package/src/fonts/fluid-fonts.css +55 -0
- package/src/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/src/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/src/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
- package/src/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
- package/src/layouts/positioning.css +6 -3
- package/src/legacy-1x.css +61 -0
- package/src/sections/cta.css +33 -101
- package/src/sections/features.css +42 -219
- package/src/sections/footer.css +53 -134
- package/src/sections/stats.css +40 -153
- package/src/sections/team.css +24 -113
- package/src/sections/testimonials.css +34 -148
- package/src/zero/base.css +166 -0
- package/src/zero/tokens.css +64 -0
- package/src/zero.css +20 -0
- package/src/components/scroll-progress.css +0 -104
- package/src/components/settings-panel.css +0 -603
- package/src/components/themed-images.css +0 -229
- package/src/components/version-badge.css +0 -70
package/src/fluid.css
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Like water: adaptable, natural, powerful yet gentle.
|
|
6
6
|
*
|
|
7
|
-
* @version 0.
|
|
7
|
+
* @version 2.0.0
|
|
8
8
|
* @license MIT
|
|
9
9
|
*
|
|
10
10
|
* Layer Architecture:
|
|
@@ -50,9 +50,6 @@
|
|
|
50
50
|
@import "./components/form.css";
|
|
51
51
|
@import "./components/hero.css";
|
|
52
52
|
@import "./components/indicator.css";
|
|
53
|
-
@import "./components/settings-panel.css";
|
|
54
|
-
@import "./components/scroll-progress.css";
|
|
55
|
-
@import "./components/themed-images.css";
|
|
56
53
|
@import "./components/modal.css";
|
|
57
54
|
@import "./components/tooltip.css";
|
|
58
55
|
@import "./components/accordion.css";
|
|
@@ -66,7 +63,8 @@
|
|
|
66
63
|
@import "./components/step-indicator.css";
|
|
67
64
|
@import "./components/search-input.css";
|
|
68
65
|
@import "./components/chip.css";
|
|
69
|
-
@import "./components/
|
|
66
|
+
@import "./components/gallery.css";
|
|
67
|
+
@import "./components/compare.css";
|
|
70
68
|
|
|
71
69
|
|
|
72
70
|
/* ========================================
|
|
@@ -118,7 +116,7 @@
|
|
|
118
116
|
|
|
119
117
|
/* Focus utility - show only with focus-visible */
|
|
120
118
|
.focus-ring:focus-visible {
|
|
121
|
-
outline:
|
|
119
|
+
outline: var(--focus-ring-width) solid var(--color-focus);
|
|
122
120
|
outline-offset: 3px;
|
|
123
121
|
}
|
|
124
122
|
|
|
@@ -127,11 +125,47 @@
|
|
|
127
125
|
margin-block-start: var(--flow-space, var(--space-5));
|
|
128
126
|
}
|
|
129
127
|
|
|
130
|
-
/* Prose utility - optimal reading width */
|
|
131
|
-
.prose {
|
|
128
|
+
/* Prose utility - optimal reading width (a .content-grid sets its own) */
|
|
129
|
+
.prose:not(.content-grid) {
|
|
132
130
|
max-inline-size: var(--container-prose);
|
|
133
131
|
}
|
|
134
132
|
|
|
133
|
+
/* ========================================
|
|
134
|
+
TEXT OVERFLOW CONTROL
|
|
135
|
+
Headings hyphenate overlong words by default (see base.css).
|
|
136
|
+
data-text-overflow overrides the handling per element:
|
|
137
|
+
|
|
138
|
+
data-text-overflow="hyphenate" break + hyphen (the heading default)
|
|
139
|
+
data-text-overflow="break" hard break, no hyphen
|
|
140
|
+
data-text-overflow="clip" single line, ellipsis
|
|
141
|
+
data-text-overflow="normal" browser default (opt back out)
|
|
142
|
+
|
|
143
|
+
For shrink-to-fit sizing instead, add data-fit-text and include
|
|
144
|
+
assets/js/fit-text.js (progressive enhancement — these CSS
|
|
145
|
+
rules remain the no-JS safety net).
|
|
146
|
+
======================================== */
|
|
147
|
+
|
|
148
|
+
[data-text-overflow="hyphenate"] {
|
|
149
|
+
overflow-wrap: break-word;
|
|
150
|
+
hyphens: auto;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
[data-text-overflow="break"] {
|
|
154
|
+
overflow-wrap: anywhere;
|
|
155
|
+
hyphens: none;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
[data-text-overflow="clip"] {
|
|
159
|
+
overflow: hidden;
|
|
160
|
+
white-space: nowrap;
|
|
161
|
+
text-overflow: ellipsis;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
[data-text-overflow="normal"] {
|
|
165
|
+
overflow-wrap: normal;
|
|
166
|
+
hyphens: manual;
|
|
167
|
+
}
|
|
168
|
+
|
|
135
169
|
/* Center utility - horizontally centered content */
|
|
136
170
|
.center {
|
|
137
171
|
display: grid;
|
|
@@ -192,14 +226,16 @@
|
|
|
192
226
|
|
|
193
227
|
/* ========================================
|
|
194
228
|
LAYOUTS LAYER
|
|
195
|
-
|
|
229
|
+
Container, primitives, prose rhythm, the content grid, section bands
|
|
230
|
+
and the section head.
|
|
196
231
|
======================================== */
|
|
197
232
|
|
|
198
233
|
@layer layouts {
|
|
199
|
-
/* Container -
|
|
234
|
+
/* Container: --page-edge on EACH side (the gutter knob, never below 3vi),
|
|
235
|
+
the same edge .content-grid, the hero and the section components use. */
|
|
200
236
|
.container {
|
|
201
237
|
--_container-size: var(--container-content, var(--container-xl));
|
|
202
|
-
inline-size: min(100% -
|
|
238
|
+
inline-size: min(100% - 2 * var(--page-edge), var(--_container-size));
|
|
203
239
|
margin-inline: auto;
|
|
204
240
|
container-type: inline-size;
|
|
205
241
|
}
|
|
@@ -210,14 +246,18 @@
|
|
|
210
246
|
.container--xl { --_container-size: var(--container-xl); }
|
|
211
247
|
.container--2xl { --_container-size: var(--container-2xl); }
|
|
212
248
|
|
|
213
|
-
/*
|
|
249
|
+
/* A display headline fills the column it sits in. */
|
|
250
|
+
.entry-header {
|
|
251
|
+
container-type: inline-size;
|
|
252
|
+
padding-block: var(--space-xl) var(--space-l);
|
|
253
|
+
}
|
|
254
|
+
|
|
214
255
|
.stack {
|
|
215
256
|
display: flex;
|
|
216
257
|
flex-direction: column;
|
|
217
258
|
gap: var(--stack-gap, var(--space-5));
|
|
218
259
|
}
|
|
219
260
|
|
|
220
|
-
/* Cluster - horizontal flow that wraps */
|
|
221
261
|
.cluster {
|
|
222
262
|
display: flex;
|
|
223
263
|
flex-wrap: wrap;
|
|
@@ -225,18 +265,219 @@
|
|
|
225
265
|
align-items: var(--cluster-align, center);
|
|
226
266
|
}
|
|
227
267
|
|
|
228
|
-
/* Grid - auto-responsive grid */
|
|
229
268
|
.grid {
|
|
230
269
|
display: grid;
|
|
231
|
-
gap: var(--grid-gap, var(--space-
|
|
270
|
+
gap: var(--grid-gap, var(--space-l) var(--space-m));
|
|
232
271
|
grid-template-columns: repeat(
|
|
233
272
|
auto-fit,
|
|
234
273
|
minmax(min(100%, var(--grid-min, 16rem)), 1fr)
|
|
235
274
|
);
|
|
236
275
|
}
|
|
237
276
|
|
|
238
|
-
|
|
239
|
-
|
|
277
|
+
|
|
278
|
+
/* ========================================
|
|
279
|
+
PROSE RHYTHM
|
|
280
|
+
More space above a heading than below it; figures and quotes get a
|
|
281
|
+
larger beat. Old-style figures in running text.
|
|
282
|
+
======================================== */
|
|
283
|
+
|
|
284
|
+
.prose { font-variant-numeric: oldstyle-nums proportional-nums; }
|
|
285
|
+
.prose > * { margin-block: 0; }
|
|
286
|
+
.prose > * + * { margin-block-start: var(--flow, 1.1em); }
|
|
287
|
+
/* A chapter (h2) opens with a hairline and 1.5× the beat; a subsection
|
|
288
|
+
(h3) stays close to its chapter. The outline reads at a glance. */
|
|
289
|
+
.prose > h2 {
|
|
290
|
+
margin-block-start: calc(var(--space-xl) * 1.5);
|
|
291
|
+
padding-block-start: var(--space-m);
|
|
292
|
+
border-block-start: var(--border-width) solid var(--color-border);
|
|
293
|
+
}
|
|
294
|
+
.prose > h3 { margin-block-start: var(--space-l); }
|
|
295
|
+
.prose > :is(h2, h3, h4) + * { margin-block-start: var(--space-s); }
|
|
296
|
+
/* Top margins only: .prose is a grid, and grid items' margins add up
|
|
297
|
+
instead of collapsing (48 + 120px stacked above an h2). A block gets
|
|
298
|
+
the larger beat above it, and the text after it gets the same. */
|
|
299
|
+
.prose > :is(figure, blockquote, .pullquote, table, pre, .gallery, hr) { margin-block: var(--space-l) 0; }
|
|
300
|
+
.prose > :is(figure, blockquote, .pullquote, table, pre, .gallery) + :not(h2, h3) { margin-block-start: var(--space-l); }
|
|
301
|
+
.prose > hr { margin-block-start: var(--space-xl); }
|
|
302
|
+
/* A rule already separates: the chapter after it drops its hairline. */
|
|
303
|
+
.prose > hr + h2 { margin-block-start: var(--space-xl); border-block-start: 0; padding-block-start: 0; }
|
|
304
|
+
.prose > :first-child { margin-block-start: 0; }
|
|
305
|
+
.prose :is(p, li, dd, blockquote) { max-inline-size: var(--measure); }
|
|
306
|
+
:is(h2, h3)[id] { scroll-margin-block-start: var(--space-l); }
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
/* ========================================
|
|
310
|
+
CONTENT GRID: content, wide, full
|
|
311
|
+
Children sit in the reading column; data-bleed="wide" (or WordPress
|
|
312
|
+
.alignwide) takes the wide column, data-bleed="full" (.alignfull) the
|
|
313
|
+
whole width, its text returning to the wide column. The side and rail
|
|
314
|
+
tracks shrink to 0 on narrow screens with no media query. A wider
|
|
315
|
+
--rail moves the column off-centre and frees a start-side label track.
|
|
316
|
+
======================================== */
|
|
317
|
+
|
|
318
|
+
.content-grid {
|
|
319
|
+
--_edge: var(--page-edge);
|
|
320
|
+
--_side: max(0rem, (var(--container-content) - var(--measure) - var(--rail)) / 2);
|
|
321
|
+
container-type: inline-size;
|
|
322
|
+
display: grid;
|
|
323
|
+
grid-template-columns:
|
|
324
|
+
[full-start] minmax(var(--_edge), 1fr)
|
|
325
|
+
[wide-start] minmax(0, var(--rail)) [rail-end] minmax(0, var(--_side))
|
|
326
|
+
[content-start] min(var(--measure), 100% - 2 * var(--_edge)) [content-end]
|
|
327
|
+
minmax(0, var(--_side)) [wide-end]
|
|
328
|
+
minmax(var(--_edge), 1fr) [full-end];
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.content-grid > * { grid-column: content; }
|
|
332
|
+
|
|
333
|
+
/* .content-grid is itself a size container, so a display headline placed
|
|
334
|
+
straight in it would fit the whole grid (the viewport), not its column. */
|
|
335
|
+
.content-grid > :is(.display, .hero__headline) {
|
|
336
|
+
font-size: var(--hero-headline-size,
|
|
337
|
+
clamp(var(--step-4), min(100cqi, var(--measure)) / var(--fit, 8), min(var(--display-max), 15svh)));
|
|
338
|
+
}
|
|
339
|
+
.content-grid > :is([data-bleed="wide"], .alignwide) { grid-column: wide; }
|
|
340
|
+
|
|
341
|
+
.content-grid > :is([data-bleed="full"], .alignfull) {
|
|
342
|
+
grid-column: full;
|
|
343
|
+
display: grid;
|
|
344
|
+
grid-template-columns: subgrid;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.content-grid > :is([data-bleed="full"], .alignfull) > * { grid-column: wide; }
|
|
348
|
+
|
|
349
|
+
.content-grid > :is([data-bleed="full"], .alignfull) > :is(img, picture, video) {
|
|
350
|
+
grid-column: full;
|
|
351
|
+
inline-size: 100%;
|
|
352
|
+
border-radius: 0;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
/* ========================================
|
|
357
|
+
SECTION BANDS
|
|
358
|
+
data-bg: none or "plain" (page), "tinted" ("alt" is an alias),
|
|
359
|
+
"inverse" (the dark band; its roles live in tokens.css), "accent" (the
|
|
360
|
+
15% accent wash), "accent-strong" (solid accent; at most one a page).
|
|
361
|
+
Sections are told apart by tone, and by a rule or the section head's
|
|
362
|
+
thick rule when two plain ones meet. Never shadows, gradients or
|
|
363
|
+
rounded panels between sections.
|
|
364
|
+
======================================== */
|
|
365
|
+
|
|
366
|
+
.section { padding-block: var(--space-section); }
|
|
367
|
+
|
|
368
|
+
/* Every band is a size container, so what sits in it (a side caption,
|
|
369
|
+
a display headline) reads the band's width with or without a .container. */
|
|
370
|
+
:is(.section, .features, .stats, .team, .testimonials, .cta) { container-type: inline-size; }
|
|
371
|
+
|
|
372
|
+
/* The section components take the band's full width and put their
|
|
373
|
+
content on the .container edges. */
|
|
374
|
+
:is(.features, .stats, .team, .testimonials) {
|
|
240
375
|
padding-block: var(--space-section);
|
|
376
|
+
padding-inline: max(var(--page-edge), (100% - var(--container-content)) / 2);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/* The band paint. Each band also sets --_band-bg, the hook a component
|
|
380
|
+
band (.cta) reads for its own background, so a band always beats the
|
|
381
|
+
component's default without a :not([data-bg]) guard. A section resets
|
|
382
|
+
it, so a nested band never inherits its parent's paint. Never put an
|
|
383
|
+
accent band next to an accent-strong one: the wash kills the punch. */
|
|
384
|
+
:is(.section, section, .cta) { --_band-bg: initial; }
|
|
385
|
+
|
|
386
|
+
:is(.section, section)[data-bg="plain"] { --_band-bg: transparent; }
|
|
387
|
+
|
|
388
|
+
:is(.section, section)[data-bg="tinted"],
|
|
389
|
+
:is(.section, section)[data-bg="alt"] {
|
|
390
|
+
--_band-bg: var(--color-surface);
|
|
391
|
+
background-color: var(--color-surface);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
:is(.section, section)[data-bg="accent"] {
|
|
395
|
+
--_band-bg: var(--accent-subtle);
|
|
396
|
+
background-color: var(--accent-subtle);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* The dark band (its roles and scheme: tokens.css). The text colour is
|
|
400
|
+
set here: inherited colour was already resolved on body. */
|
|
401
|
+
:is(.section, section)[data-bg="inverse"] {
|
|
402
|
+
--_band-bg: var(--band-inverse);
|
|
403
|
+
background-color: var(--band-inverse);
|
|
404
|
+
color: var(--color-text);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* Solid accent, shared with .hero[data-theme="accent"]: the roles point
|
|
408
|
+
at --on-accent, and buttons invert through the --_btn-* hooks. */
|
|
409
|
+
:is(.section, section)[data-bg="accent-strong"],
|
|
410
|
+
.hero[data-theme="accent"] {
|
|
411
|
+
--color-text: var(--on-accent);
|
|
412
|
+
--color-text-muted: var(--on-accent);
|
|
413
|
+
--color-text-subtle: var(--on-accent);
|
|
414
|
+
--color-background: var(--accent);
|
|
415
|
+
--color-border: color-mix(in oklch, var(--on-accent) 40%, transparent);
|
|
416
|
+
--color-border-strong: var(--on-accent);
|
|
417
|
+
--accent-ink: var(--on-accent);
|
|
418
|
+
--color-focus: var(--on-accent);
|
|
419
|
+
/* The error red vanishes on the accent (1.1 to 2.9:1); an invalid
|
|
420
|
+
field keeps its heavy start edge (form.css) in --on-accent. */
|
|
421
|
+
--color-error: var(--on-accent);
|
|
422
|
+
--_btn-color: var(--accent);
|
|
423
|
+
--_btn-bg: var(--on-accent);
|
|
424
|
+
--_btn-bg-hover: color-mix(in oklch, var(--on-accent) 85%, var(--accent));
|
|
425
|
+
--_band-bg: var(--accent);
|
|
426
|
+
background-color: var(--accent);
|
|
427
|
+
color: var(--color-text);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/* Two plain sections in a row: the second loses its top padding. Its
|
|
431
|
+
section head's thick rule separates them; without a head, a hairline
|
|
432
|
+
on its .container does. A default .cta is painted (surface), so it is
|
|
433
|
+
not plain. Needs :has(); older browsers keep the padding. */
|
|
434
|
+
@supports selector(:has(*)) {
|
|
435
|
+
:is(.section, section):not([data-bg]:not([data-bg="plain"]), .hero, .cta:not([data-bg])) + :is(.section, section):not([data-bg]:not([data-bg="plain"]), .hero, .cta:not([data-bg])) {
|
|
436
|
+
padding-block-start: 0;
|
|
437
|
+
|
|
438
|
+
&:not(:has(:is(.section__head, .features__header, .stats__header, .team__header, .testimonials__header))) > .container {
|
|
439
|
+
border-block-start: var(--border-width) solid var(--color-border);
|
|
440
|
+
padding-block-start: calc(var(--space-section) / 2);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
241
443
|
}
|
|
444
|
+
|
|
445
|
+
/* A plate between two sections (a .content-grid straight in <main>)
|
|
446
|
+
keeps the section rhythm: the band's space under its caption, and a
|
|
447
|
+
plain section after it starts at the plate's edge. */
|
|
448
|
+
main > .content-grid { padding-block-end: var(--space-section); }
|
|
449
|
+
main > .content-grid + :is(.section, section):not([data-bg]:not([data-bg="plain"])) { padding-block-start: 0; }
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
/* ========================================
|
|
453
|
+
SECTION HEAD: the default strong separator
|
|
454
|
+
<header class="section__head">
|
|
455
|
+
<p class="eyebrow"><span class="section__num">02</span> Work</p>
|
|
456
|
+
<h2>Quiet things, <em>made loud</em></h2>
|
|
457
|
+
<p class="lede">One or two sentences.</p>
|
|
458
|
+
</header>
|
|
459
|
+
Start-aligned, one edge: the eyebrow over the h2 over the lede, under a
|
|
460
|
+
thick ink rule. (A label column beside the h2 gave every section two
|
|
461
|
+
start edges, the body back at the page edge under an indented lede; a
|
|
462
|
+
child theme with a rail can hang the eyebrow.) --section-rule (a hook,
|
|
463
|
+
not a knob) sets the rule's width; 0 removes it.
|
|
464
|
+
======================================== */
|
|
465
|
+
|
|
466
|
+
:is(.section__head, .features__header, .stats__header, .team__header, .testimonials__header) {
|
|
467
|
+
display: grid;
|
|
468
|
+
row-gap: var(--space-s);
|
|
469
|
+
text-align: start;
|
|
470
|
+
border-block-start: var(--section-rule, var(--border-width-thick)) solid var(--color-border-strong);
|
|
471
|
+
padding-block-start: var(--space-s);
|
|
472
|
+
margin-block-end: var(--space-xl);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
:is(.section__head, .features__header, .stats__header, .team__header, .testimonials__header) > * { margin: 0; }
|
|
476
|
+
|
|
477
|
+
:is(.section__head, .features__header, .stats__header, .team__header, .testimonials__header) h2 {
|
|
478
|
+
font-size: var(--step-3);
|
|
479
|
+
max-inline-size: 18em;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.section__num { font-variant-numeric: lining-nums tabular-nums; }
|
|
242
483
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2020 The Newsreader Project Authors (http://github.com/productiontype/Newsreader) Newsreader-Italic[opsz,wght].ttf: Copyright 2020 The Newsreader Project Authors (http://github.com/productiontype/Newsreader)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
http://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2023 The Schibsted-Grotesk Project Authors (https://github.com/schibsted/schibsted-grotesk) SchibstedGrotesk-Italic[wght].ttf: Copyright 2023 The Schibsted-Grotesk Project Authors (https://github.com/schibsted/schibsted-grotesk)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
http://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluid Theme - the default type pairing (opt-in second stylesheet)
|
|
3
|
+
* Built to dist/fluid-fonts.min.css; the woff2 files go to dist/fonts/.
|
|
4
|
+
*
|
|
5
|
+
* <link rel="preload" href="/fonts/newsreader-latin-opsz-normal.woff2"
|
|
6
|
+
* as="font" type="font/woff2" crossorigin>
|
|
7
|
+
* <link rel="stylesheet" href="/fluid.min.css">
|
|
8
|
+
* <link rel="stylesheet" href="/fluid-fonts.min.css">
|
|
9
|
+
*
|
|
10
|
+
* Newsreader (display and headings; opsz 6-72, wght 200-800, true italic)
|
|
11
|
+
* over Schibsted Grotesk (text and UI; wght 400-900). Both SIL OFL 1.1
|
|
12
|
+
* (OFL-*.txt beside this file). Latin only. The italic files are fetched
|
|
13
|
+
* only when a page sets italic text in that face.
|
|
14
|
+
*
|
|
15
|
+
* The build puts the metric-matched fallback faces ("Newsreader Fallback",
|
|
16
|
+
* "Schibsted Fallback") in front of these, generated with capsize from the
|
|
17
|
+
* real font metrics: never tune them by hand. Without this file the stacks
|
|
18
|
+
* in tokens.css fall back to system serif over system sans.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
@font-face {
|
|
22
|
+
font-family: "Newsreader Variable";
|
|
23
|
+
font-style: normal;
|
|
24
|
+
font-display: swap;
|
|
25
|
+
font-weight: 200 800;
|
|
26
|
+
src: url("./newsreader-latin-opsz-normal.woff2") format("woff2");
|
|
27
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@font-face {
|
|
31
|
+
font-family: "Newsreader Variable";
|
|
32
|
+
font-style: italic;
|
|
33
|
+
font-display: swap;
|
|
34
|
+
font-weight: 200 800;
|
|
35
|
+
src: url("./newsreader-latin-opsz-italic.woff2") format("woff2");
|
|
36
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@font-face {
|
|
40
|
+
font-family: "Schibsted Grotesk Variable";
|
|
41
|
+
font-style: normal;
|
|
42
|
+
font-display: swap;
|
|
43
|
+
font-weight: 400 900;
|
|
44
|
+
src: url("./schibsted-grotesk-latin-wght-normal.woff2") format("woff2");
|
|
45
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@font-face {
|
|
49
|
+
font-family: "Schibsted Grotesk Variable";
|
|
50
|
+
font-style: italic;
|
|
51
|
+
font-display: swap;
|
|
52
|
+
font-weight: 400 900;
|
|
53
|
+
src: url("./schibsted-grotesk-latin-wght-italic.woff2") format("woff2");
|
|
54
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
55
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -113,8 +113,11 @@
|
|
|
113
113
|
text-align: center;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
/* min(100%, …): these layouts shrink-wrap their children, and an auto-fill
|
|
117
|
+
grid (.grid, .gallery) sizes itself from its max width, not the screen,
|
|
118
|
+
so without the 100% cap it ran ~1000px wide on a phone. */
|
|
116
119
|
[data-layout="center"] > * {
|
|
117
|
-
max-inline-size: var(--content-width, var(--container-md));
|
|
120
|
+
max-inline-size: min(100%, var(--content-width, var(--container-md)));
|
|
118
121
|
}
|
|
119
122
|
|
|
120
123
|
/*
|
|
@@ -130,7 +133,7 @@
|
|
|
130
133
|
}
|
|
131
134
|
|
|
132
135
|
[data-layout="left"] > * {
|
|
133
|
-
max-inline-size: var(--content-width, var(--container-md));
|
|
136
|
+
max-inline-size: min(100%, var(--content-width, var(--container-md)));
|
|
134
137
|
}
|
|
135
138
|
|
|
136
139
|
/*
|
|
@@ -146,7 +149,7 @@
|
|
|
146
149
|
}
|
|
147
150
|
|
|
148
151
|
[data-layout="right"] > * {
|
|
149
|
-
max-inline-size: var(--content-width, var(--container-md));
|
|
152
|
+
max-inline-size: min(100%, var(--content-width, var(--container-md)));
|
|
150
153
|
}
|
|
151
154
|
|
|
152
155
|
/*
|