@fluid-theme/core 0.4.3 → 2.1.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.
Files changed (107) hide show
  1. package/AGENTS.md +6 -29
  2. package/CHANGELOG.md +564 -2
  3. package/CLAUDE.md +201 -14
  4. package/GEMINI.md +6 -45
  5. package/README.md +17 -8
  6. package/assets/js/compare.js +77 -0
  7. package/assets/js/fit-text.js +103 -0
  8. package/assets/js/lightbox.js +153 -0
  9. package/assets/js/scroll-reveal.js +72 -0
  10. package/assets/js/toc-build.mjs +86 -0
  11. package/assets/js/toc.js +384 -0
  12. package/dist/fluid-1x.min.css +4 -0
  13. package/dist/fluid-fonts-archivo.min.css +2 -0
  14. package/dist/fluid-fonts-bodoni.min.css +2 -0
  15. package/dist/fluid-fonts.min.css +2 -0
  16. package/dist/fluid-legacy-1x.css +3 -0
  17. package/dist/fluid-nav.min.css +3 -0
  18. package/dist/fluid-toc.min.css +3 -0
  19. package/dist/fluid-zero.min.css +3 -0
  20. package/dist/fluid.min.css +3 -2
  21. package/dist/fonts/OFL-archivo.txt +93 -0
  22. package/dist/fonts/OFL-bodoni-moda.txt +93 -0
  23. package/dist/fonts/OFL-hanken-grotesk.txt +93 -0
  24. package/dist/fonts/OFL-newsreader.txt +93 -0
  25. package/dist/fonts/OFL-schibsted-grotesk.txt +93 -0
  26. package/dist/fonts/archivo-latin-wdth-italic.woff2 +0 -0
  27. package/dist/fonts/archivo-latin-wdth-normal.woff2 +0 -0
  28. package/dist/fonts/bodoni-moda-latin-opsz-italic.woff2 +0 -0
  29. package/dist/fonts/bodoni-moda-latin-opsz-normal.woff2 +0 -0
  30. package/dist/fonts/hanken-grotesk-latin-wght-italic.woff2 +0 -0
  31. package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  32. package/dist/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  33. package/dist/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  34. package/dist/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
  35. package/dist/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  36. package/fluid-agent-kit/README.md +1 -0
  37. package/fluid-agent-kit/skills/accessibility.md +3 -1
  38. package/fluid-agent-kit/skills/css-conventions.md +22 -5
  39. package/fluid-agent-kit/skills/image-optimization.md +2 -0
  40. package/fluid-agent-kit/skills/preset-composition.md +108 -0
  41. package/package.json +36 -11
  42. package/src/animations/scroll-reveal.css +75 -193
  43. package/src/components/accordion.css +6 -47
  44. package/src/components/alert.css +47 -88
  45. package/src/components/avatar.css +4 -20
  46. package/src/components/badge.css +25 -48
  47. package/src/components/button.css +69 -175
  48. package/src/components/card.css +146 -481
  49. package/src/components/chip.css +46 -12
  50. package/src/components/compare.css +234 -0
  51. package/src/components/dropdown.css +10 -67
  52. package/src/components/empty-state.css +4 -0
  53. package/src/components/form.css +113 -81
  54. package/src/components/gallery.css +252 -0
  55. package/src/components/hero.css +203 -88
  56. package/src/components/indicator.css +23 -117
  57. package/src/components/loading.css +7 -29
  58. package/src/components/modal.css +12 -65
  59. package/src/components/nav-modes.css +261 -0
  60. package/src/components/nav.css +324 -392
  61. package/src/components/search-input.css +4 -2
  62. package/src/components/step-indicator.css +26 -27
  63. package/src/components/table.css +64 -171
  64. package/src/components/toc.css +254 -0
  65. package/src/components/tooltip.css +5 -46
  66. package/src/core/base.css +393 -547
  67. package/src/core/reset.css +17 -5
  68. package/src/core/tokens.css +426 -2276
  69. package/src/fluid.css +258 -17
  70. package/src/fonts/OFL-newsreader.txt +93 -0
  71. package/src/fonts/OFL-schibsted-grotesk.txt +93 -0
  72. package/src/fonts/fluid-fonts.css +55 -0
  73. package/src/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  74. package/src/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  75. package/src/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
  76. package/src/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  77. package/src/layouts/positioning.css +6 -3
  78. package/src/legacy-1x.css +61 -0
  79. package/src/sections/cta.css +33 -101
  80. package/src/sections/features.css +42 -219
  81. package/src/sections/footer.css +53 -134
  82. package/src/sections/stats.css +40 -153
  83. package/src/sections/team.css +24 -113
  84. package/src/sections/testimonials.css +34 -148
  85. package/src/zero/base.css +166 -0
  86. package/src/zero/tokens.css +64 -0
  87. package/src/zero.css +20 -0
  88. package/starters/workflows/README.md +40 -0
  89. package/starters/workflows/dependabot.yml +21 -0
  90. package/starters/workflows/update-fluid-theme.yml +296 -0
  91. package/themes/fonts/OFL-archivo.txt +93 -0
  92. package/themes/fonts/OFL-bodoni-moda.txt +93 -0
  93. package/themes/fonts/OFL-hanken-grotesk.txt +93 -0
  94. package/themes/fonts/archivo-latin-wdth-italic.woff2 +0 -0
  95. package/themes/fonts/archivo-latin-wdth-normal.woff2 +0 -0
  96. package/themes/fonts/archivo.css +20 -0
  97. package/themes/fonts/bodoni-moda-latin-opsz-italic.woff2 +0 -0
  98. package/themes/fonts/bodoni-moda-latin-opsz-normal.woff2 +0 -0
  99. package/themes/fonts/bodoni.css +35 -0
  100. package/themes/fonts/hanken-grotesk-latin-wght-italic.woff2 +0 -0
  101. package/themes/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  102. package/themes/gallery.css +105 -0
  103. package/themes/swiss.css +53 -0
  104. package/src/components/scroll-progress.css +0 -104
  105. package/src/components/settings-panel.css +0 -603
  106. package/src/components/themed-images.css +0 -229
  107. 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.4.3
7
+ * @version 2.1.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/version-badge.css";
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: 2px solid var(--color-focus);
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
- Basic layout utilities until Phase 3
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 - constrained width with centered content */
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% - var(--space-gutter, var(--space-8)), var(--_container-size));
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
- /* Stack - vertical flow with consistent gaps */
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-5));
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
- /* Section - consistent vertical padding */
239
- .section {
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
+ }
@@ -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
  /*