@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/AGENTS.md CHANGED
@@ -1,32 +1,9 @@
1
- # AI Agent Instructions
1
+ # AI agent instructions: The Fluid Theme
2
2
 
3
- This project uses **The Fluid Theme** — a semantic CSS design system. If you are an AI coding assistant, read the following files to understand project conventions:
3
+ This file is a pointer. The instructions for every agent live in one place:
4
4
 
5
- ## Essential Reading
5
+ - **[`CLAUDE.md`](https://github.com/Agile-Media-Agency/the-fluid-theme/blob/main/CLAUDE.md)**: rules, gates, key files and the docs table. Agent-neutral despite the name.
6
+ - **[`_docs/STATUS.md`](https://github.com/Agile-Media-Agency/the-fluid-theme/blob/main/_docs/STATUS.md)**: what the theme is now (one lean base, a child theme per site, about 20 knobs on `:root`). It wins over every older doc.
7
+ - How every project is built: `Agile-Media-Agency/the-fluid-stack` `playbook/README.md`.
6
8
 
7
- 1. **`fluid-agent-kit/skills/css-conventions.md`** — CSS layer order, design tokens, logical properties, data attributes
8
- 2. **`fluid-agent-kit/skills/accessibility.md`** — Non-negotiable accessibility standards
9
- 3. **`fluid-agent-kit/skills/ux-rules.md`** — 12 behavioral rules for interactive components
10
- 4. **`fluid-agent-kit/skills/image-optimization.md`** — Responsive images, lazy loading, focal points
11
-
12
- ## Key Rules
13
-
14
- - Use **semantic HTML** with data attributes — not utility classes
15
- - Use **CSS custom properties** (tokens) for all values — never hardcode `16px` or `#333`
16
- - Use **logical properties** — `margin-block-start` not `margin-top`
17
- - Use **`<dialog>`** for modals — not `<div role="dialog">`
18
- - **Never remove focus outlines** — restyle if needed
19
- - **Respect `prefers-reduced-motion`** in all animations
20
- - Every `<img>` needs `alt`, `width`, `height`, and `loading="lazy"` (except above-fold)
21
-
22
- ## Full Documentation
23
-
24
- - `_docs/DEVELOPMENT.md` — Master development guide
25
- - `_docs/UX-BEHAVIOR-SPEC.md` — Complete UX specification (18 sections)
26
- - `_docs/images-guide.md` — Image optimization guide
27
- - `_docs/reference/components.md` — Component API reference
28
- - `_docs/reference/tokens.md` — Design token reference
29
-
30
- ## Framework Version
31
-
32
- 0.4.0
9
+ Presets, palettes, `data-preset`, `data-palette` and `_docs/reference/tokens.md` are superseded (Pass 0, 2026-10-23); do not write code for them. The version is the latest git tag; never write or bump it by hand. Pass 1 (draft PR #75, step 8) plans to replace this file and `CLAUDE.md` with one `AGENT.md`.
package/CHANGELOG.md CHANGED
@@ -5,10 +5,522 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.4.3] - 2026-03-24
8
+ ## [2.1.0] - 2026-11-01
9
+
10
+ ### Added
11
+ - feat(v2): package Swiss and Gallery child themes, 1.x migration guide, showcase re-vendor, and site auto-updater
12
+
13
+
14
+ ## [2.0.0] - 2026-10-30
15
+
16
+ ### Breaking
17
+ - **Base v2 typographic default:** body text moves to fluid `17–20px` (was `16–18px`) on a `pow(var(--type-ratio), n)` scale; default stacks become Newsreader (display/headings) over Schibsted Grotesk (body/UI) with system fallbacks when no font stylesheet is linked; default `--accent` becomes deep oxblood `oklch(42% 0.15 22)` on warm paper `--neutral-tint`; `--radius-card`, `--radius-control` and `--shadow-style` default to `0`; `--motion-base` defaults to `320ms`; cards are open without hover lift; `--color-border-strong` is ink; `--hero-headline-size` no longer sets a `:root` default (still honoured when set). See `_docs/migrations/from-1x.md`.
18
+ - **Inverted `.nav` by default:** `.nav` renders in the opposite scheme of the page (dark bar on a light page, light bar on a dark page) with a border hairline only when `[data-sticky]` is present. Add `data-bg="plain"` on `.nav` to keep a page-coloured bar.
19
+
20
+ ### Added
21
+ - **New `:root` knobs:** `--font-display`, `--type-ratio`, `--text-min`, `--text-max`, `--weight-display`, `--weight-heading`, `--h1-size`, `--h2-size`, `--h3-size`, `--display-max`, `--measure`, and `--rail`.
22
+ - **Layouts & typography:** `.content-grid` (`content`, `wide`, `full` bleed tracks), `.section__head` with ink rules, hang-line `.gallery` (with Firefox intrinsic-ratio fallback), `.display` headlines and `assets/js/fit-text.js` (`data-fit` column/measure fitting), and section bands (`tinted`, `accent`, `inverse`, `accent-strong`).
23
+ - **Opt-in self-hosted fonts (`dist/fluid-fonts.min.css`, export `./fonts`):** Newsreader + Schibsted Grotesk variable WOFF2 subset with capsize metric-matched local fallback faces (`Newsreader Fallback`, `Schibsted Fallback`) across regular, bold, italic, and bold-italic cuts.
24
+ - **Fluid Zero (`dist/fluid-zero.min.css`, export `./zero`):** ~2.4 KB gzip alternate base (reset, `:root` colour/type roles, and native HTML elements) sharing core's `@layer` order and knob names.
25
+ - **Article TOC module (`dist/fluid-toc.min.css`, export `./toc`, plus `assets/js/toc.js` and `assets/js/toc-build.mjs`, export `./toc-build`):** server- or client-built H2/H3 table of contents with scroll spy, inline fold, sticky rail, and two-row mobile bottom dock (`data-toc="rail dock"`).
26
+ - **Navigation modes (`dist/fluid-nav.min.css`, export `./nav`):** opt-in compact `"+"` popover (`data-nav="compact"`), drop panel (`data-nav="compact drop"`), icon mode (`data-nav="icon"`), and sticky-links bar (`data-sticky="links"`), while core keeps one-line tracking squeeze and balanced-row wrapping within the 24,500 B gzip core budget.
27
+ - **1.x compatibility bundles:** `dist/fluid-legacy-1x.css` (export `./legacy-1x`) and single-file `dist/fluid-1x.min.css` (export `./1x`) restoring 1.x knob defaults on 2.0 core.
28
+ - **Verification gates:** `scripts/toc-check.mjs` (`npm run test:toc`), `scripts/nav-check.mjs` (`npm run test:nav`), `npm run test:zero`, `visual-scan.mjs` `ALIGN`, `SHIFT` and `RATIO` checks, child-theme `--theme` flags on `visual-scan`, `axe-check`, and `focus-check`, and unfocused-vs-focused indicator delta measurement in `focus-check.mjs`.
29
+
30
+ ### Changed
31
+ - **npm Trusted Publishing:** `.github/workflows/release.yml` publishes `@fluid-theme/core` publicly via GitHub OIDC (`id-token: write`, Node 24, `npm@^11.5.1`) with a `workflow_dispatch` publish-only recovery path.
32
+
33
+
34
+ ## [1.1.10] - 2026-10-29
35
+
36
+ ### Fixed
37
+ - ci(site): /status/ smoke test without curl | grep -q (pipefail)
38
+
39
+
40
+ ## [1.1.9] - 2026-10-29
41
+
42
+ ### Fixed
43
+ - feat(site): /status/ and /version.json on thefluidtheme.com; footer names the build
44
+
45
+
46
+ ## [1.1.8] - 2026-10-29
47
+
48
+ ### Fixed
49
+ - CLAUDE.md: a pruned ref leaves the purged objects; gc the Mac Studio clone
50
+
51
+
52
+ ## [1.1.7] - 2026-10-29
53
+
54
+ ### Fixed
55
+ - Dependabot: drop engines.browsers (an array) so updates run; CLAUDE.md Exceptions
56
+
57
+
58
+ ## [1.1.6] - 2026-10-29
59
+
60
+ ### Fixed
61
+ - CLAUDE.md: an old clone's gitsync pushed the purged history back
62
+
63
+
64
+ ## [1.1.5] - 2026-10-29
65
+
66
+ ### Fixed
67
+ - Showcase: skip link and <main> on printsofthemasters and shirtsandsquirrels
68
+
69
+
70
+ ## [1.1.4] - 2026-10-28
71
+
72
+ ### Fixed
73
+ - Pass 1 step 0: housekeeping
74
+
75
+
76
+ ## [1.1.3] - 2026-10-28
77
+
78
+ ### Fixed
79
+ - Plan Pass 1: ready to build new sites
80
+
81
+
82
+ ## [1.1.2] - 2026-10-28
83
+
84
+ ### Fixed
85
+ - chore(starter): take Vite 8 with plugin-react 6 and fix the React starter build
86
+
87
+
88
+ ## [1.1.1] - 2026-10-28
89
+
90
+ ### Fixed
91
+ - ci(release): PR number is the last #N in the merge subject
92
+
93
+
94
+ ## [1.1.0] - 2026-10-27
95
+
96
+ ### Added
97
+ - Forms: honeypot and conditional-field rules in core (@layer utilities)
98
+
99
+
100
+ ## [1.0.5] - 2026-10-27
101
+
102
+ ### Fixed
103
+ - Docs: Fluid truth (audit 2026-10-25, batch F4)
104
+
105
+
106
+ ## [1.0.4] - 2026-10-27
107
+
108
+ ### Fixed
109
+ - Docs: lessons from domain-landing (child themes, focus gate gap, skip link, fit text, form stopgaps)
110
+
111
+
112
+ ## [1.0.3] - 2026-10-27
113
+
114
+ ### Fixed
115
+ - Site deploys: job-level concurrency; CLAUDE.md: history was rewritten
116
+
117
+
118
+ ## [1.0.2] - 2026-10-27
9
119
 
10
120
  ### Fixed
11
- - feat: npm package setup — @fluid-theme/core v0.4.2
121
+ - Site: thefluidtheme.com from Cloudflare Pages, built in Actions
122
+
123
+
124
+ ## [1.0.1] - 2026-10-25
125
+
126
+ ### Fixed
127
+ - Remove Palm Vita student reports from the theme repo
128
+
129
+
130
+ ## [1.0.0] - 2026-10-24
131
+
132
+ ### Breaking
133
+ The CSS is the same as 0.9.27, which shipped Pass 0 (#73) as a patch by
134
+ mistake; 1.0.0 is that change under the right number. Upgrading from 0.9.26 or
135
+ earlier breaks every site that used the variation system. Full list:
136
+ `_docs/STATUS.md`, "What Pass 0 removed".
137
+ - `data-preset`, `data-palette`, `data-accent` and `data-contrast` do nothing:
138
+ the 11 presets, 13 palettes, 13 accents and the subdued mode are gone. A site
139
+ sets about 20 knobs on `:root` instead (a child theme), or it falls back to
140
+ the base look.
141
+ - Dark mode is one `light-dark()` per colour role: the OS decides and
142
+ `<html data-theme>` overrides.
143
+ - Accent text uses `--accent-ink` and text on accent fills `--on-accent`
144
+ (theme issue #49).
145
+ - Removed tokens include `--palette-1..6`, `--theme-dark/light`, the 20-step
146
+ grey scale and `--shadow-offset-hover`; `--radius-button` and
147
+ `--radius-input` are now `--radius-control`.
148
+ - Removed files: `settings-panel.css`, `version-badge.css`,
149
+ `scroll-progress.css`, `themed-images.css`, `fonts/preset-fonts.css`; the
150
+ preset view-transition keyframes; the bare-button gradient skin.
151
+ - Mapping example: the-fluid-stack PR #105 (its D22) turned 7 looks and 6
152
+ colours into knob values.
153
+
154
+ ### Changed
155
+ - Release 1.0.0: let the release job read PR labels
156
+
157
+
158
+ ## [0.9.27] - 2026-10-24
159
+
160
+ ### Fixed
161
+ - Pass 0: strip the variation system, wire the knobs (#73). This is a breaking
162
+ change released as a patch by mistake: the release job could not read the
163
+ PR's `major` label. 1.0.0 is the same CSS under the right number.
164
+
165
+
166
+ ## [0.9.26] - 2026-10-18
167
+
168
+ ### Fixed
169
+ - CLAUDE.md: version is the latest git tag, not a number written here
170
+
171
+
172
+ ## [0.9.25] - 2026-10-18
173
+
174
+ ### Fixed
175
+ - docs: PRINCIPLES_AUDIT.md, playbook pointer, release-time version rule
176
+
177
+
178
+ ## [0.9.24] - 2026-10-17
179
+
180
+ ### Fixed
181
+ - Merge pull request #68 from Agile-Media-Agency/claude/dazzling-gates-pjhwg2
182
+
183
+
184
+ ## [0.9.23] - 2026-10-17
185
+
186
+ ### Fixed
187
+ - Merge pull request #67 from Agile-Media-Agency/claude/dazzling-gates-pjhwg2
188
+
189
+
190
+ ## [0.9.22] - 2026-10-13
191
+
192
+ ### Fixed
193
+ - v1 planning prompt: research is on main now (#63 merged); start a new draft PR
194
+
195
+
196
+ ## [0.9.21] - 2026-10-13
197
+
198
+ ### Fixed
199
+ - Merge pull request #63 from Agile-Media-Agency/claude/dazzling-gates-pjhwg2
200
+
201
+
202
+ ## [0.9.20] - 2026-10-09
203
+
204
+ ### Fixed
205
+ - fix: empty required fields aren't shown as errors before anyone types
206
+
207
+
208
+ ## [0.9.19] - 2026-10-09
209
+
210
+ ### Fixed
211
+ - fix: content never stays hidden when the reveal script isn't loaded
212
+
213
+
214
+ ## [0.9.18] - 2026-10-08
215
+
216
+ ### Fixed
217
+ - feat(site): llms.txt, robots.txt and sitemap.xml for AI assistants and search; nav preset name and template contrast fixes
218
+
219
+
220
+ ## [0.9.17] - 2026-10-08
221
+
222
+ ### Fixed
223
+ - feat(templates): project page for design pros; layouts, reveals and search fit a phone; dropdown trigger contrast
224
+
225
+
226
+ ## [0.9.16] - 2026-10-08
227
+
228
+ ### Fixed
229
+ - feat(compare): before / after photo slider for trades and renovation portfolios
230
+
231
+
232
+ ## [0.9.15] - 2026-10-08
233
+
234
+ ### Fixed
235
+ - ci: move actions to Node 24 (checkout@v5, setup-node@v5; release Node 24)
236
+
237
+
238
+ ## [0.9.14] - 2026-10-08
239
+
240
+ ### Fixed
241
+ - feat(gallery): photo grid + lightbox for portfolio sites
242
+
243
+
244
+ ## [0.9.13] - 2026-10-08
245
+
246
+ ### Fixed
247
+ - fix(table): tables and fieldsets fit a phone; release skips npm with a warning while NPM_TOKEN is missing
248
+
249
+
250
+ ## [0.9.12] - 2026-10-08
251
+
252
+ ### Fixed
253
+ - fix(nav): current-page link reads at 4.5:1 under every preset and palette
254
+
255
+
256
+ ## [0.9.11] - 2026-10-08
257
+
258
+ ### Fixed
259
+ - fix(nav): the narrow layout wraps, the toggle keeps its size, links never run off the page
260
+
261
+
262
+ ## [0.9.10] - 2026-10-08
263
+
264
+ ### Fixed
265
+ - fix(base): bare checkboxes and radios render as boxes, not full-width bars
266
+
267
+
268
+ ## [0.9.9] - 2026-10-08
269
+
270
+ ### Fixed
271
+ - fix(a11y): button focus ring survives preset signature shadows
272
+
273
+
274
+ ## [0.9.8] - 2026-10-08
275
+
276
+ ### Fixed
277
+ - fix(a11y): dark-mode link text reaches 4.5:1
278
+
279
+
280
+ ## [0.9.7] - 2026-10-08
281
+
282
+ ### Fixed
283
+ - fix(a11y): unreadable follow-the-OS dark mode under most presets; status badges below 4.5:1
284
+
285
+
286
+ ## [0.9.6] - 2026-09-01
287
+
288
+ ### Fixed
289
+ - Merge pull request #46 from Agile-Media-Agency/claude/fluid-theme-review-1ywkqb
290
+
291
+
292
+ > **Note on 0.9.1–0.9.5:** the release workflow generates entries from the merge
293
+ > commit subject, which produced five uninformative "Merge pull request #NN"
294
+ > lines. They have been backfilled by hand from the actual diffs.
295
+
296
+ ## [0.9.5] - 2026-08-31
297
+
298
+ ### Added
299
+
300
+ - **`data-text-overflow` utility** (`hyphenate` | `break` | `clip` | `normal`) — per-element control over how overlong words are handled. Named to avoid colliding with the layout layer's `data-overflow` (`hidden`/`auto`/`scroll`), which is a different concern.
301
+ - **`data-fit-text` + `assets/js/fit-text.js`** — opt-in shrink-to-fit for display text. Steps font-size down (never up) to a 55% floor until content fits; refits on resize and on `document.fonts.ready`; `window.fluidFitText()` re-runs it after injecting dynamic content. Progressive enhancement — the CSS overflow handling remains the no-JS layer.
302
+ - **`scripts/visual-scan.mjs`** — mechanical layout-defect scanner (page horizontal overflow, per-element text overflow, painted-band seam collapse) across four viewport widths, exit 1 on any flag. `scripts/fixtures/visual-scan-selftest.html` is its deliberately-broken self-test.
303
+
304
+ ### Fixed
305
+
306
+ - **Heroes had no default vertical padding.** Once a hero's content outgrew `--hero-min-height` (long headlines on narrow screens), content rendered flush against the band's block edges — a CTA could touch the section below it. `.hero:not([data-padding])` now applies `--space-10`; the `data-padding` scale still wins when set.
307
+ - **Serene scaled unrevealed sections up.** `scroll-reveal.css` used `transform: scale(1.02)` for serene's pre-reveal state, making every below-fold section wider than the viewport — horizontal overflow on mobile for any serene page. Now scales down (0.98) with the same settle.
308
+ - `--space-32` was defined but never consumed; `editorial` hardcoded `8rem` instead. Editorial now uses the token.
309
+
310
+ ### Changed
311
+
312
+ - `assets/js/` is now included in the npm package `files`, so `fit-text.js` and `scroll-reveal.js` reach package consumers instead of existing only in the repo.
313
+
314
+ ## [0.9.4] - 2026-08-31
315
+
316
+ ### Fixed
317
+
318
+ - **Release workflow never installed dependencies.** `npm publish` triggers `prepublishOnly` → `npm run build` → `import 'lightningcss'`, a devDependency that was never installed on the runner (`ERR_MODULE_NOT_FOUND`). Added `npm ci` (with setup-node's npm cache) before the publish step. This had failed every release since v0.4.3 — see `_docs/HANDOFF.md`; a missing `NPM_TOKEN` secret still blocks publishing.
319
+
320
+ ## [0.9.3] - 2026-08-31
321
+
322
+ ### Fixed
323
+
324
+ - **`[hidden]` was defeated by components that set `display`.** `.alert { display: flex }` overrode the UA stylesheet's `[hidden] { display: none }`, so success alerts rendered on page load and toggling `hidden` produced no visible change. `reset.css` now enforces `[hidden] { display: none !important }`.
325
+ - **`scroll-margin` sat on links instead of targets.** The rule was on `a[href^="#"]`, where scroll-margin has no effect; anchor navigation buried destination headings under sticky navs. Moved to `:where([id])`.
326
+ - **Rapids' default accent failed WCAG AA.** White-on-coral measured 4.37:1. Tuned `oklch(60% 0.25 25)` → `oklch(57% 0.245 25)`: 4.8:1 on fills and 4.7:1 for coral text on light, still reading as electric coral. All derived tokens recompute automatically.
327
+
328
+ ## [0.9.2] - 2026-08-30
329
+
330
+ ### Added
331
+
332
+ - **`showcase/`** — three complete, self-contained example sites, each a living demonstration of a different preset and a test bed for the framework: `urbictionary` (rapids), `printsofthemasters` (serene), `shirtsandsquirrels` (cascade). See `_docs/SHOWCASE-SITES.md`.
333
+
334
+ ### Fixed
335
+
336
+ - **Sections were invisible under every preset.** `scroll-reveal.css` hides `.section:not([data-reveal])` (opacity 0) expecting a `.revealed` class, but `scroll-reveal.js` only observed `[data-reveal]` elements — so any page using `.section` with a preset rendered its sections permanently invisible. The script now observes bare sections too.
337
+ - Added a `@media (scripting: none)` guard so revealed-on-scroll content is never hidden when JavaScript is unavailable, restoring the progressive-enhancement guarantee.
338
+
339
+ ## [0.9.1] - 2026-08-30
340
+
341
+ Release-automation version bump; no source changes beyond v0.9.0.
342
+
343
+
344
+ ## [0.9.0] - 2026-08-30
345
+
346
+ ### Added
347
+
348
+ - **Preset-driven composition (pilot)** — new opt-in `data-arrange="auto"` attribute on `.hero` and `.features`: the active preset now changes the ARRANGEMENT of content, not just its skin. Same HTML recomposes per preset:
349
+ - Hero: `still` → Swiss left rail with asymmetric void; `serene` → editorial offset (full-width serif headline, copy hangs in the right column); `rapids` → poster split (giant headline left, caption column right); `tsunami` → cinema poster (bottom-anchored massive headline, subheadline as kicker); `flowing`/`stream`/`cascade` → the classic centered stack
350
+ - Features: `still` → ruled drafting-table grid with hairline gaps; `serene` → single unboxed literary column; `rapids` → dense 4-up pack; `tsunami` → monumental 2-up
351
+ - Requires flat hero markup (`hero__headline`/`hero__subheadline`/`hero__actions`/optional `hero__media` as direct children); markup using a `hero__content` wrapper is left untouched. Collapses to a single column below 48rem, preserving each preset's alignment.
352
+ - **Default palette + accent per preset** — each water preset now ships a color identity: `still` → mono grayscale (deep slate), `serene` → morandi (dusty lavender), `stream` → fluid (deep teal), `flowing` → fluid (brand blue), `cascade`/`rapids` → bold (vivid purple / electric coral), `tsunami` → tsunami (storm teal). An explicit `data-palette` or `data-accent` always wins. Dark mode swaps to lighter swatches where a light-mode default would be unreadable (still, serene, tsunami).
353
+ - **`data-accent="1-6"` without `data-palette`** — numeric accent swatches now work against the active preset's default family (previously required an explicit palette).
354
+ - **Preset display-scale contrast** — presets now size display type differently: `still` restrained (5xl caps at 2.875rem), `rapids` oversized, `tsunami` massive (hero headlines up to 6.5rem via new `--hero-headline-size` token consumed by `.hero__headline`).
355
+ - **Wider macro-dial ranges** — section rhythm now spans a 4.5× band (32px `still`/`rapids` → 144px `serene` via new `--space-32`/`--space-36` tokens) and content width spans 42rem (`serene` literary column) → 96rem (`stream`) → 100% (`tsunami`).
356
+ - **`fluid-agent-kit/skills/preset-composition.md`** — new agent skill: per-preset layout DNA (canvas, rhythm, hero arrangement, grid density, alignment bias, do/don't) so AI assistants compose pages differently per preset at build time.
357
+ - **`examples/composition.html`** — live demo of preset-driven arrangement with the preset switcher.
358
+
359
+ ### Changed
360
+
361
+ - **Default accent is now the Fluid brand blue** (`oklch(60% 0.18 240)`), previously a neutral gray. Pages with no `data-preset`/`data-palette`/`data-accent` pick up the brand voice; `data-accent="default"` still gives the neutral gray.
362
+ - `:root` `--accent-subtle` now mixes with `--color-background` instead of `--theme-light`, so bare pages get a correct subtle tint in dark mode.
363
+ - `stream` widens to a 96rem canvas; `still` focuses to a 48rem column.
364
+
365
+ ### Fixed
366
+
367
+ - `data-palette="fluid"` combined with `data-preset="stream"` or `"cascade"` produced an invalid accent (both presets were missing from the fluid palette's motion-to-color mapping).
368
+ - Removed the redundant `[data-palette][data-accent="1-6"]` mapping block (byte-identical to the new unguarded rules).
369
+
370
+ ## [0.8.3] - 2026-08-28
371
+
372
+ ### Fixed
373
+ - chore(deps-dev): bump brace-expansion from 2.0.2 to 2.1.2 in the npm_and_yarn group across 1 directory
374
+
375
+
376
+ ## [0.8.2] - 2026-03-26
377
+
378
+ ### Fixed
379
+ - Update .gitignore: ignore terminal sessions
380
+
381
+
382
+ ## [0.8.1] - 2026-03-25
383
+
384
+ ### Fixed
385
+ - feat: complete preset coverage for all components and sections — v0.8.0
386
+
387
+
388
+ ## [0.8.0] - 2026-03-24
389
+
390
+ ### Added
391
+
392
+ - **Preset avatar styles** — Flowing: ocean glow ring; still: fully square (all shapes); cascade: enhanced group lift; rapids: hard shadow on group already present
393
+ - **Preset form styles** — Still: flat no-glow focus (border only); rapids: offset shadow on focus, square fieldset; tsunami: asymmetric fieldset
394
+ - **Preset empty-state styles** — Flowing: soft icon glow; still: square icon container; rapids: hard bordered offset icon; tsunami: asymmetric icon
395
+ - **Preset search-input styles** — Still: square clear button; rapids: offset shadow + square on hover
396
+ - **Preset settings-panel styles** — Flowing: frosted glass drawer panel; still: square FAB and theme cards; rapids: offset FAB hover translate; tsunami: asymmetric drawer
397
+ - **Preset loading/skeleton styles** — Flowing: shadow on skeleton cards; still: square skeleton cards (no rounded corners)
398
+ - **All 6 sections get preset coverage** — Features, CTA, footer, stats, testimonials, and team sections now each have still/flowing/rapids/tsunami/cascade preset-specific styles covering radius, shadow, and hover behavior
399
+
400
+ ## [0.7.0] - 2026-03-24
401
+
402
+ ### Added
403
+
404
+ - **Preset signature hero gradients** — Every preset now has a unique hero background: flowing (ocean radial), serene (warm cream radial), stream (cool-white sky), cascade (accent waterfall mist), rapids (diagonal energy), tsunami (deep ocean vertical)
405
+ - **Preset sticky nav styles** — All 5 non-flowing presets now have distinct sticky nav treatments: serene (warm cream glass), stream (crisp glass), cascade (friendly glass), rapids (hard neo-brutalist offset shadow), tsunami (dramatic deep shadow)
406
+ - **Preset button interactions** — Serene, stream, cascade, and rapids each have signature button hover/active physics: serene (shadow expansion, no lift), stream (clean 1px lift), cascade (bouncy spring), rapids (hard offset translate)
407
+ - **Stream card hover** — Clean minimal lift (-1px) with crisp shadow
408
+ - **Flowing accordion** — Rounded xl corners + ocean shadow-sm for separated/bordered variants
409
+ - **Flowing modal** — Enhanced backdrop blur (8px, 1.5× saturation) for frosted ocean depth
410
+ - **Flowing toast/alert** — Elevated shadow-md
411
+ - **Flowing dropdown** — Frosted glass menu with backdrop-filter + semi-transparent surface
412
+ - **Flowing popover** — Frosted glass with backdrop-filter + semi-transparent surface
413
+ - **Flowing table** — Rounded xl corners + ocean shadow-sm
414
+
415
+ ---
416
+
417
+ ## [0.6.0] - 2026-03-24
418
+
419
+ ### BREAKING CHANGES
420
+
421
+ - **`data-motion` renamed to `data-preset`** — The attribute that controls visual personality (fonts, radius, shadows, spacing, color tint) has been renamed from `data-motion` to `data-preset`. Update all `<html data-motion="...">` to `<html data-preset="...">` in your code.
422
+ - **`data-motion` repurposed** — `data-motion` now controls animation speed only: `reduced` | `slow` | `default` | `fast`. It no longer controls visual design.
423
+
424
+ ### Added
425
+ - **New `data-motion` animation speed system** — override animation timing independently of visual preset. Four values: `reduced` (0ms, accessibility), `slow` (1.5× base), `default` (no override), `fast` (0.5× base). `prefers-reduced-motion` always wins.
426
+ - **Separation of concerns** — visual personality (`data-preset`) and animation timing (`data-motion`) are now orthogonal axes. Any combination is valid: `data-preset="rapids" data-motion="slow"` gives the bold Rapids design with deliberate, cinematic motion.
427
+
428
+ ### Migrating from 0.5.x
429
+
430
+ ```html
431
+ <!-- Before -->
432
+ <html data-motion="flowing">
433
+
434
+ <!-- After -->
435
+ <html data-preset="flowing">
436
+
437
+ <!-- Optional: add animation speed override -->
438
+ <html data-preset="flowing" data-motion="fast">
439
+ ```
440
+
441
+ ---
442
+
443
+ ## [0.5.0] - 2026-03-24
444
+
445
+ ### Added
446
+ - **Complete preset typography** — every `data-motion` preset now has a deliberate font personality:
447
+ - `serene`: Cormorant Garamond + EB Garamond (contemplative, literary, spa-like)
448
+ - `stream`: Plus Jakarta Sans (modern SaaS, clean, professional)
449
+ - `flowing`: Outfit + DM Sans (Fluid brand identity — smooth, geometric, the default)
450
+ - `cascade`: Nunito (friendly, rounded, approachable — Notion/Slack vibes)
451
+ - `rapids`: Syne + Space Grotesk (athletic, punchy, high-energy — Stripe/Vercel energy)
452
+ - `tsunami`: Bebas Neue + Barlow (cinematic, dramatic, commanding — Hokusai wave)
453
+ - `still` + `trickling`: system-ui (intentionally minimal — Swiss design needs no ornament)
454
+ - **`src/fonts/preset-fonts.css`** — optional Google Fonts file for npm/bundler users. Import to activate all preset typefaces at once.
455
+ - **Light-mode color character** — each preset now applies a subtle hue tint to background surfaces. The same page feels different in every preset, not just in dark mode:
456
+ - `still` → cool slate (hue 250) — crisp, disciplined
457
+ - `serene` → warm cream (hue 60) — like aged paper, spa calm
458
+ - `stream` → clean cool (hue 200) — modern SaaS white
459
+ - `flowing` → ocean breath (hue 230) — the Fluid brand signature
460
+ - `cascade` → soft lavender (hue 280) — warm, inviting, playful
461
+ - `rapids` → warm ember (hue 25) — heat, energy, forward motion
462
+ - `tsunami` → deep navy (hue 250) — imposing, cinematic
463
+ - **Live preset switcher** on `examples/foundation.html` and `examples/components.html` — click any preset to see the full personality change in real time (typography + color + motion + radius + shadows)
464
+ - **MutationObserver in `fonts.html`** — fonts load instantly when switching presets via JS, not just on page load
465
+
466
+ ### Changed
467
+ - `flowing` (default) now uses Outfit + DM Sans, giving the Fluid brand a distinctive voice rather than falling back to system-ui
468
+ - `rapids` switched from Archivo Black to Syne (more distinctive, athletic) + Space Grotesk body
469
+ - `tsunami` switched from Space Grotesk to Bebas Neue (far more cinematic/dramatic) + Barlow body
470
+ - `cascade` now uses Nunito for both heading and body (pure Nunito is more cohesive than mixed stacks)
471
+ - Light-mode backgrounds are no longer pure white for any preset — each has a hue identity
472
+
473
+ ## [0.4.9] - 2026-03-24
474
+
475
+ ### Fixed
476
+ - chore: final audit — TASK-QUEUE updated, README starter kits section, version consistency 0.4.8
477
+
478
+ ## [0.4.8] - 2026-03-24
479
+
480
+ ### Added
481
+ - **1920w WebP variants** generated for all 18 hero images (77.5% savings: 33.63MB → 7.58MB)
482
+ - `scripts/add-1920w-srcset.mjs` — adds 1920w to existing `<picture>` srcsets
483
+
484
+ ### Changed
485
+ - `index.html` and 11 templates: 47 `<source>` srcsets now include 1920w WebP for large displays
486
+ - `scripts/optimize-images.js` — now skips already-existing output files (idempotent)
487
+
488
+ ## [0.4.7] - 2026-03-24
489
+
490
+ ### Added
491
+ - **Performance benchmarks** (`_docs/PERFORMANCE-BENCHMARKS.md`) — Lighthouse v13 scores: Homepage Perf 100, Foundation Perf 100, Components Perf 88; CLS=0 and TBT=0ms across all pages
492
+ - **`scripts/perf-benchmark.mjs`** — automated benchmark runner
493
+
494
+ ## [0.4.6] - 2026-03-24
495
+
496
+ ### Added
497
+ - **Accessibility audit** (`_docs/ACCESSIBILITY-AUDIT.md`) — axe-core WCAG 2.1 AA audit across Foundation, Components, and Homepage; 0 critical violations
498
+
499
+ ### Fixed
500
+ - Loading spinners: added `role="status"` to all `.spinner` and `.spinner-dots` elements (required for `aria-label` on non-semantic elements)
501
+ - Card ratings: added `role="img"` to `.card__rating` elements (required for `aria-label`)
502
+ - Interactive card demo: removed invalid `role="button"` from `<article>` element
503
+ - Updated `loading.css` usage comment to show correct `role="status"` pattern
504
+
505
+ ## [0.4.5] - 2026-03-24
506
+
507
+ ### Added
508
+ - **React starter kit** (`starters/react/`) — Vite + React 18 starter with live theming demo, drives `data-*` attributes via React state, includes Next.js instructions in README
509
+
510
+ ## [0.4.4] - 2026-03-24
511
+
512
+ ### Added
513
+ - **HTML starter kit** (`starters/html/`) — self-contained CDN-based starter, zero build step, includes nav, hero, features grid, contact form, footer, and full README
514
+
515
+ ## [0.4.3] - 2026-03-24
516
+
517
+ ### Added
518
+ - **First public npm publish** — `@fluid-theme/core@0.4.3` is now live on the npm registry
519
+ - **CDN links active** — jsDelivr and unpkg now serve the package automatically
520
+ - npm account `agilemediaagency` created with `@fluid-theme` organization
521
+
522
+ ### Changed
523
+ - Author email added to `package.json`
12
524
 
13
525
 
14
526
  ## [0.4.2] - 2026-03-21
@@ -157,3 +669,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
157
669
  [0.3.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/releases/tag/v0.3.0
158
670
  [0.4.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.4.1...v0.4.2
159
671
  [0.4.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.4.2...v0.4.3
672
+ [0.4.9]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.4.8...v0.4.9
673
+ [0.8.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.8.0...v0.8.1
674
+ [0.8.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.8.1...v0.8.2
675
+ [0.8.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.8.2...v0.8.3
676
+ [0.9.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.0...v0.9.1
677
+ [0.9.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.1...v0.9.2
678
+ [0.9.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.2...v0.9.3
679
+ [0.9.4]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.3...v0.9.4
680
+ [0.9.5]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.4...v0.9.5
681
+ [0.9.6]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.5...v0.9.6
682
+ [0.9.7]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.6...v0.9.7
683
+ [0.9.8]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.7...v0.9.8
684
+ [0.9.9]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.8...v0.9.9
685
+ [0.9.10]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.9...v0.9.10
686
+ [0.9.11]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.10...v0.9.11
687
+ [0.9.12]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.11...v0.9.12
688
+ [0.9.13]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.12...v0.9.13
689
+ [0.9.14]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.13...v0.9.14
690
+ [0.9.15]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.14...v0.9.15
691
+ [0.9.16]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.15...v0.9.16
692
+ [0.9.17]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.16...v0.9.17
693
+ [0.9.18]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.17...v0.9.18
694
+ [0.9.19]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.18...v0.9.19
695
+ [0.9.20]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.19...v0.9.20
696
+ [0.9.21]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.20...v0.9.21
697
+ [0.9.22]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.21...v0.9.22
698
+ [0.9.23]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.22...v0.9.23
699
+ [0.9.24]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.23...v0.9.24
700
+ [0.9.25]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.24...v0.9.25
701
+ [0.9.26]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.25...v0.9.26
702
+ [0.9.27]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.26...v0.9.27
703
+ [1.0.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.27...v1.0.0
704
+ [1.0.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.0...v1.0.1
705
+ [1.0.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.1...v1.0.2
706
+ [1.0.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.2...v1.0.3
707
+ [1.0.4]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.3...v1.0.4
708
+ [1.0.5]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.4...v1.0.5
709
+ [1.1.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.5...v1.1.0
710
+ [1.1.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.0...v1.1.1
711
+ [1.1.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.1...v1.1.2
712
+ [1.1.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.2...v1.1.3
713
+ [1.1.4]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.3...v1.1.4
714
+ [1.1.5]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.4...v1.1.5
715
+ [1.1.6]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.5...v1.1.6
716
+ [1.1.7]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.6...v1.1.7
717
+ [1.1.8]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.7...v1.1.8
718
+ [1.1.9]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.8...v1.1.9
719
+ [1.1.10]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.9...v1.1.10
720
+ [2.0.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.10...v2.0.0
721
+ [2.1.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v2.0.0...v2.1.0