@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.
Files changed (80) hide show
  1. package/AGENTS.md +6 -29
  2. package/CHANGELOG.md +543 -2
  3. package/CLAUDE.md +193 -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.min.css +2 -0
  14. package/dist/fluid-legacy-1x.css +3 -0
  15. package/dist/fluid-nav.min.css +3 -0
  16. package/dist/fluid-toc.min.css +3 -0
  17. package/dist/fluid-zero.min.css +3 -0
  18. package/dist/fluid.min.css +3 -2
  19. package/dist/fonts/OFL-newsreader.txt +93 -0
  20. package/dist/fonts/OFL-schibsted-grotesk.txt +93 -0
  21. package/dist/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  22. package/dist/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  23. package/dist/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
  24. package/dist/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  25. package/fluid-agent-kit/README.md +1 -0
  26. package/fluid-agent-kit/skills/accessibility.md +3 -1
  27. package/fluid-agent-kit/skills/css-conventions.md +22 -5
  28. package/fluid-agent-kit/skills/image-optimization.md +2 -0
  29. package/fluid-agent-kit/skills/preset-composition.md +108 -0
  30. package/package.json +29 -3
  31. package/src/animations/scroll-reveal.css +75 -193
  32. package/src/components/accordion.css +6 -47
  33. package/src/components/alert.css +47 -88
  34. package/src/components/avatar.css +4 -20
  35. package/src/components/badge.css +25 -48
  36. package/src/components/button.css +69 -175
  37. package/src/components/card.css +146 -481
  38. package/src/components/chip.css +46 -12
  39. package/src/components/compare.css +234 -0
  40. package/src/components/dropdown.css +10 -67
  41. package/src/components/empty-state.css +4 -0
  42. package/src/components/form.css +113 -81
  43. package/src/components/gallery.css +252 -0
  44. package/src/components/hero.css +203 -88
  45. package/src/components/indicator.css +23 -117
  46. package/src/components/loading.css +7 -29
  47. package/src/components/modal.css +12 -65
  48. package/src/components/nav-modes.css +261 -0
  49. package/src/components/nav.css +324 -392
  50. package/src/components/search-input.css +4 -2
  51. package/src/components/step-indicator.css +26 -27
  52. package/src/components/table.css +64 -171
  53. package/src/components/toc.css +254 -0
  54. package/src/components/tooltip.css +5 -46
  55. package/src/core/base.css +393 -547
  56. package/src/core/reset.css +17 -5
  57. package/src/core/tokens.css +426 -2276
  58. package/src/fluid.css +258 -17
  59. package/src/fonts/OFL-newsreader.txt +93 -0
  60. package/src/fonts/OFL-schibsted-grotesk.txt +93 -0
  61. package/src/fonts/fluid-fonts.css +55 -0
  62. package/src/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  63. package/src/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  64. package/src/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
  65. package/src/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  66. package/src/layouts/positioning.css +6 -3
  67. package/src/legacy-1x.css +61 -0
  68. package/src/sections/cta.css +33 -101
  69. package/src/sections/features.css +42 -219
  70. package/src/sections/footer.css +53 -134
  71. package/src/sections/stats.css +40 -153
  72. package/src/sections/team.css +24 -113
  73. package/src/sections/testimonials.css +34 -148
  74. package/src/zero/base.css +166 -0
  75. package/src/zero/tokens.css +64 -0
  76. package/src/zero.css +20 -0
  77. package/src/components/scroll-progress.css +0 -104
  78. package/src/components/settings-panel.css +0 -603
  79. package/src/components/themed-images.css +0 -229
  80. 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,502 @@ 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.0.0] - 2026-10-30
9
+
10
+ ### Changed
11
+ - Release 2.0.0: Base v2 with the Firefox fix
12
+
13
+
14
+ ## [1.1.10] - 2026-10-29
15
+
16
+ ### Fixed
17
+ - ci(site): /status/ smoke test without curl | grep -q (pipefail)
18
+
19
+
20
+ ## [1.1.9] - 2026-10-29
21
+
22
+ ### Fixed
23
+ - feat(site): /status/ and /version.json on thefluidtheme.com; footer names the build
24
+
25
+
26
+ ## [1.1.8] - 2026-10-29
27
+
28
+ ### Fixed
29
+ - CLAUDE.md: a pruned ref leaves the purged objects; gc the Mac Studio clone
30
+
31
+
32
+ ## [1.1.7] - 2026-10-29
33
+
34
+ ### Fixed
35
+ - Dependabot: drop engines.browsers (an array) so updates run; CLAUDE.md Exceptions
36
+
37
+
38
+ ## [1.1.6] - 2026-10-29
39
+
40
+ ### Fixed
41
+ - CLAUDE.md: an old clone's gitsync pushed the purged history back
42
+
43
+
44
+ ## [1.1.5] - 2026-10-29
45
+
46
+ ### Fixed
47
+ - Showcase: skip link and <main> on printsofthemasters and shirtsandsquirrels
48
+
49
+
50
+ ## [1.1.4] - 2026-10-28
51
+
52
+ ### Fixed
53
+ - Pass 1 step 0: housekeeping
54
+
55
+
56
+ ## [1.1.3] - 2026-10-28
57
+
58
+ ### Fixed
59
+ - Plan Pass 1: ready to build new sites
60
+
61
+
62
+ ## [1.1.2] - 2026-10-28
63
+
64
+ ### Fixed
65
+ - chore(starter): take Vite 8 with plugin-react 6 and fix the React starter build
66
+
67
+
68
+ ## [1.1.1] - 2026-10-28
69
+
70
+ ### Fixed
71
+ - ci(release): PR number is the last #N in the merge subject
72
+
73
+
74
+ ## [1.1.0] - 2026-10-27
75
+
76
+ ### Added
77
+ - Forms: honeypot and conditional-field rules in core (@layer utilities)
78
+
79
+
80
+ ## [1.0.5] - 2026-10-27
81
+
82
+ ### Fixed
83
+ - Docs: Fluid truth (audit 2026-10-25, batch F4)
84
+
85
+
86
+ ## [1.0.4] - 2026-10-27
87
+
88
+ ### Fixed
89
+ - Docs: lessons from domain-landing (child themes, focus gate gap, skip link, fit text, form stopgaps)
90
+
91
+
92
+ ## [1.0.3] - 2026-10-27
93
+
94
+ ### Fixed
95
+ - Site deploys: job-level concurrency; CLAUDE.md: history was rewritten
96
+
97
+
98
+ ## [1.0.2] - 2026-10-27
99
+
100
+ ### Fixed
101
+ - Site: thefluidtheme.com from Cloudflare Pages, built in Actions
102
+
103
+
104
+ ## [1.0.1] - 2026-10-25
105
+
106
+ ### Fixed
107
+ - Remove Palm Vita student reports from the theme repo
108
+
109
+
110
+ ## [1.0.0] - 2026-10-24
111
+
112
+ ### Breaking
113
+ The CSS is the same as 0.9.27, which shipped Pass 0 (#73) as a patch by
114
+ mistake; 1.0.0 is that change under the right number. Upgrading from 0.9.26 or
115
+ earlier breaks every site that used the variation system. Full list:
116
+ `_docs/STATUS.md`, "What Pass 0 removed".
117
+ - `data-preset`, `data-palette`, `data-accent` and `data-contrast` do nothing:
118
+ the 11 presets, 13 palettes, 13 accents and the subdued mode are gone. A site
119
+ sets about 20 knobs on `:root` instead (a child theme), or it falls back to
120
+ the base look.
121
+ - Dark mode is one `light-dark()` per colour role: the OS decides and
122
+ `<html data-theme>` overrides.
123
+ - Accent text uses `--accent-ink` and text on accent fills `--on-accent`
124
+ (theme issue #49).
125
+ - Removed tokens include `--palette-1..6`, `--theme-dark/light`, the 20-step
126
+ grey scale and `--shadow-offset-hover`; `--radius-button` and
127
+ `--radius-input` are now `--radius-control`.
128
+ - Removed files: `settings-panel.css`, `version-badge.css`,
129
+ `scroll-progress.css`, `themed-images.css`, `fonts/preset-fonts.css`; the
130
+ preset view-transition keyframes; the bare-button gradient skin.
131
+ - Mapping example: the-fluid-stack PR #105 (its D22) turned 7 looks and 6
132
+ colours into knob values.
133
+
134
+ ### Changed
135
+ - Release 1.0.0: let the release job read PR labels
136
+
137
+
138
+ ## [0.9.27] - 2026-10-24
139
+
140
+ ### Fixed
141
+ - Pass 0: strip the variation system, wire the knobs (#73). This is a breaking
142
+ change released as a patch by mistake: the release job could not read the
143
+ PR's `major` label. 1.0.0 is the same CSS under the right number.
144
+
145
+
146
+ ## [0.9.26] - 2026-10-18
147
+
148
+ ### Fixed
149
+ - CLAUDE.md: version is the latest git tag, not a number written here
150
+
151
+
152
+ ## [0.9.25] - 2026-10-18
153
+
154
+ ### Fixed
155
+ - docs: PRINCIPLES_AUDIT.md, playbook pointer, release-time version rule
156
+
157
+
158
+ ## [0.9.24] - 2026-10-17
159
+
160
+ ### Fixed
161
+ - Merge pull request #68 from Agile-Media-Agency/claude/dazzling-gates-pjhwg2
162
+
163
+
164
+ ## [0.9.23] - 2026-10-17
165
+
166
+ ### Fixed
167
+ - Merge pull request #67 from Agile-Media-Agency/claude/dazzling-gates-pjhwg2
168
+
169
+
170
+ ## [0.9.22] - 2026-10-13
171
+
172
+ ### Fixed
173
+ - v1 planning prompt: research is on main now (#63 merged); start a new draft PR
174
+
175
+
176
+ ## [0.9.21] - 2026-10-13
177
+
178
+ ### Fixed
179
+ - Merge pull request #63 from Agile-Media-Agency/claude/dazzling-gates-pjhwg2
180
+
181
+
182
+ ## [0.9.20] - 2026-10-09
183
+
184
+ ### Fixed
185
+ - fix: empty required fields aren't shown as errors before anyone types
186
+
187
+
188
+ ## [0.9.19] - 2026-10-09
189
+
190
+ ### Fixed
191
+ - fix: content never stays hidden when the reveal script isn't loaded
192
+
193
+
194
+ ## [0.9.18] - 2026-10-08
195
+
196
+ ### Fixed
197
+ - feat(site): llms.txt, robots.txt and sitemap.xml for AI assistants and search; nav preset name and template contrast fixes
198
+
199
+
200
+ ## [0.9.17] - 2026-10-08
201
+
202
+ ### Fixed
203
+ - feat(templates): project page for design pros; layouts, reveals and search fit a phone; dropdown trigger contrast
204
+
205
+
206
+ ## [0.9.16] - 2026-10-08
207
+
208
+ ### Fixed
209
+ - feat(compare): before / after photo slider for trades and renovation portfolios
210
+
211
+
212
+ ## [0.9.15] - 2026-10-08
213
+
214
+ ### Fixed
215
+ - ci: move actions to Node 24 (checkout@v5, setup-node@v5; release Node 24)
216
+
217
+
218
+ ## [0.9.14] - 2026-10-08
219
+
220
+ ### Fixed
221
+ - feat(gallery): photo grid + lightbox for portfolio sites
222
+
223
+
224
+ ## [0.9.13] - 2026-10-08
225
+
226
+ ### Fixed
227
+ - fix(table): tables and fieldsets fit a phone; release skips npm with a warning while NPM_TOKEN is missing
228
+
229
+
230
+ ## [0.9.12] - 2026-10-08
231
+
232
+ ### Fixed
233
+ - fix(nav): current-page link reads at 4.5:1 under every preset and palette
234
+
235
+
236
+ ## [0.9.11] - 2026-10-08
237
+
238
+ ### Fixed
239
+ - fix(nav): the narrow layout wraps, the toggle keeps its size, links never run off the page
240
+
241
+
242
+ ## [0.9.10] - 2026-10-08
243
+
244
+ ### Fixed
245
+ - fix(base): bare checkboxes and radios render as boxes, not full-width bars
246
+
247
+
248
+ ## [0.9.9] - 2026-10-08
249
+
250
+ ### Fixed
251
+ - fix(a11y): button focus ring survives preset signature shadows
252
+
253
+
254
+ ## [0.9.8] - 2026-10-08
255
+
256
+ ### Fixed
257
+ - fix(a11y): dark-mode link text reaches 4.5:1
258
+
259
+
260
+ ## [0.9.7] - 2026-10-08
261
+
262
+ ### Fixed
263
+ - fix(a11y): unreadable follow-the-OS dark mode under most presets; status badges below 4.5:1
264
+
265
+
266
+ ## [0.9.6] - 2026-09-01
267
+
268
+ ### Fixed
269
+ - Merge pull request #46 from Agile-Media-Agency/claude/fluid-theme-review-1ywkqb
270
+
271
+
272
+ > **Note on 0.9.1–0.9.5:** the release workflow generates entries from the merge
273
+ > commit subject, which produced five uninformative "Merge pull request #NN"
274
+ > lines. They have been backfilled by hand from the actual diffs.
275
+
276
+ ## [0.9.5] - 2026-08-31
277
+
278
+ ### Added
279
+
280
+ - **`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.
281
+ - **`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.
282
+ - **`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.
283
+
284
+ ### Fixed
285
+
286
+ - **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.
287
+ - **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.
288
+ - `--space-32` was defined but never consumed; `editorial` hardcoded `8rem` instead. Editorial now uses the token.
289
+
290
+ ### Changed
291
+
292
+ - `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.
293
+
294
+ ## [0.9.4] - 2026-08-31
295
+
296
+ ### Fixed
297
+
298
+ - **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.
299
+
300
+ ## [0.9.3] - 2026-08-31
301
+
302
+ ### Fixed
303
+
304
+ - **`[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 }`.
305
+ - **`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])`.
306
+ - **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.
307
+
308
+ ## [0.9.2] - 2026-08-30
309
+
310
+ ### Added
311
+
312
+ - **`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`.
313
+
314
+ ### Fixed
315
+
316
+ - **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.
317
+ - Added a `@media (scripting: none)` guard so revealed-on-scroll content is never hidden when JavaScript is unavailable, restoring the progressive-enhancement guarantee.
318
+
319
+ ## [0.9.1] - 2026-08-30
320
+
321
+ Release-automation version bump; no source changes beyond v0.9.0.
322
+
323
+
324
+ ## [0.9.0] - 2026-08-30
325
+
326
+ ### Added
327
+
328
+ - **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:
329
+ - 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
330
+ - Features: `still` → ruled drafting-table grid with hairline gaps; `serene` → single unboxed literary column; `rapids` → dense 4-up pack; `tsunami` → monumental 2-up
331
+ - 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.
332
+ - **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).
333
+ - **`data-accent="1-6"` without `data-palette`** — numeric accent swatches now work against the active preset's default family (previously required an explicit palette).
334
+ - **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`).
335
+ - **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`).
336
+ - **`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.
337
+ - **`examples/composition.html`** — live demo of preset-driven arrangement with the preset switcher.
338
+
339
+ ### Changed
340
+
341
+ - **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.
342
+ - `:root` `--accent-subtle` now mixes with `--color-background` instead of `--theme-light`, so bare pages get a correct subtle tint in dark mode.
343
+ - `stream` widens to a 96rem canvas; `still` focuses to a 48rem column.
9
344
 
10
345
  ### Fixed
11
- - feat: npm package setup — @fluid-theme/core v0.4.2
346
+
347
+ - `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).
348
+ - Removed the redundant `[data-palette][data-accent="1-6"]` mapping block (byte-identical to the new unguarded rules).
349
+
350
+ ## [0.8.3] - 2026-08-28
351
+
352
+ ### Fixed
353
+ - chore(deps-dev): bump brace-expansion from 2.0.2 to 2.1.2 in the npm_and_yarn group across 1 directory
354
+
355
+
356
+ ## [0.8.2] - 2026-03-26
357
+
358
+ ### Fixed
359
+ - Update .gitignore: ignore terminal sessions
360
+
361
+
362
+ ## [0.8.1] - 2026-03-25
363
+
364
+ ### Fixed
365
+ - feat: complete preset coverage for all components and sections — v0.8.0
366
+
367
+
368
+ ## [0.8.0] - 2026-03-24
369
+
370
+ ### Added
371
+
372
+ - **Preset avatar styles** — Flowing: ocean glow ring; still: fully square (all shapes); cascade: enhanced group lift; rapids: hard shadow on group already present
373
+ - **Preset form styles** — Still: flat no-glow focus (border only); rapids: offset shadow on focus, square fieldset; tsunami: asymmetric fieldset
374
+ - **Preset empty-state styles** — Flowing: soft icon glow; still: square icon container; rapids: hard bordered offset icon; tsunami: asymmetric icon
375
+ - **Preset search-input styles** — Still: square clear button; rapids: offset shadow + square on hover
376
+ - **Preset settings-panel styles** — Flowing: frosted glass drawer panel; still: square FAB and theme cards; rapids: offset FAB hover translate; tsunami: asymmetric drawer
377
+ - **Preset loading/skeleton styles** — Flowing: shadow on skeleton cards; still: square skeleton cards (no rounded corners)
378
+ - **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
379
+
380
+ ## [0.7.0] - 2026-03-24
381
+
382
+ ### Added
383
+
384
+ - **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)
385
+ - **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)
386
+ - **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)
387
+ - **Stream card hover** — Clean minimal lift (-1px) with crisp shadow
388
+ - **Flowing accordion** — Rounded xl corners + ocean shadow-sm for separated/bordered variants
389
+ - **Flowing modal** — Enhanced backdrop blur (8px, 1.5× saturation) for frosted ocean depth
390
+ - **Flowing toast/alert** — Elevated shadow-md
391
+ - **Flowing dropdown** — Frosted glass menu with backdrop-filter + semi-transparent surface
392
+ - **Flowing popover** — Frosted glass with backdrop-filter + semi-transparent surface
393
+ - **Flowing table** — Rounded xl corners + ocean shadow-sm
394
+
395
+ ---
396
+
397
+ ## [0.6.0] - 2026-03-24
398
+
399
+ ### BREAKING CHANGES
400
+
401
+ - **`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.
402
+ - **`data-motion` repurposed** — `data-motion` now controls animation speed only: `reduced` | `slow` | `default` | `fast`. It no longer controls visual design.
403
+
404
+ ### Added
405
+ - **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.
406
+ - **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.
407
+
408
+ ### Migrating from 0.5.x
409
+
410
+ ```html
411
+ <!-- Before -->
412
+ <html data-motion="flowing">
413
+
414
+ <!-- After -->
415
+ <html data-preset="flowing">
416
+
417
+ <!-- Optional: add animation speed override -->
418
+ <html data-preset="flowing" data-motion="fast">
419
+ ```
420
+
421
+ ---
422
+
423
+ ## [0.5.0] - 2026-03-24
424
+
425
+ ### Added
426
+ - **Complete preset typography** — every `data-motion` preset now has a deliberate font personality:
427
+ - `serene`: Cormorant Garamond + EB Garamond (contemplative, literary, spa-like)
428
+ - `stream`: Plus Jakarta Sans (modern SaaS, clean, professional)
429
+ - `flowing`: Outfit + DM Sans (Fluid brand identity — smooth, geometric, the default)
430
+ - `cascade`: Nunito (friendly, rounded, approachable — Notion/Slack vibes)
431
+ - `rapids`: Syne + Space Grotesk (athletic, punchy, high-energy — Stripe/Vercel energy)
432
+ - `tsunami`: Bebas Neue + Barlow (cinematic, dramatic, commanding — Hokusai wave)
433
+ - `still` + `trickling`: system-ui (intentionally minimal — Swiss design needs no ornament)
434
+ - **`src/fonts/preset-fonts.css`** — optional Google Fonts file for npm/bundler users. Import to activate all preset typefaces at once.
435
+ - **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:
436
+ - `still` → cool slate (hue 250) — crisp, disciplined
437
+ - `serene` → warm cream (hue 60) — like aged paper, spa calm
438
+ - `stream` → clean cool (hue 200) — modern SaaS white
439
+ - `flowing` → ocean breath (hue 230) — the Fluid brand signature
440
+ - `cascade` → soft lavender (hue 280) — warm, inviting, playful
441
+ - `rapids` → warm ember (hue 25) — heat, energy, forward motion
442
+ - `tsunami` → deep navy (hue 250) — imposing, cinematic
443
+ - **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)
444
+ - **MutationObserver in `fonts.html`** — fonts load instantly when switching presets via JS, not just on page load
445
+
446
+ ### Changed
447
+ - `flowing` (default) now uses Outfit + DM Sans, giving the Fluid brand a distinctive voice rather than falling back to system-ui
448
+ - `rapids` switched from Archivo Black to Syne (more distinctive, athletic) + Space Grotesk body
449
+ - `tsunami` switched from Space Grotesk to Bebas Neue (far more cinematic/dramatic) + Barlow body
450
+ - `cascade` now uses Nunito for both heading and body (pure Nunito is more cohesive than mixed stacks)
451
+ - Light-mode backgrounds are no longer pure white for any preset — each has a hue identity
452
+
453
+ ## [0.4.9] - 2026-03-24
454
+
455
+ ### Fixed
456
+ - chore: final audit — TASK-QUEUE updated, README starter kits section, version consistency 0.4.8
457
+
458
+ ## [0.4.8] - 2026-03-24
459
+
460
+ ### Added
461
+ - **1920w WebP variants** generated for all 18 hero images (77.5% savings: 33.63MB → 7.58MB)
462
+ - `scripts/add-1920w-srcset.mjs` — adds 1920w to existing `<picture>` srcsets
463
+
464
+ ### Changed
465
+ - `index.html` and 11 templates: 47 `<source>` srcsets now include 1920w WebP for large displays
466
+ - `scripts/optimize-images.js` — now skips already-existing output files (idempotent)
467
+
468
+ ## [0.4.7] - 2026-03-24
469
+
470
+ ### Added
471
+ - **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
472
+ - **`scripts/perf-benchmark.mjs`** — automated benchmark runner
473
+
474
+ ## [0.4.6] - 2026-03-24
475
+
476
+ ### Added
477
+ - **Accessibility audit** (`_docs/ACCESSIBILITY-AUDIT.md`) — axe-core WCAG 2.1 AA audit across Foundation, Components, and Homepage; 0 critical violations
478
+
479
+ ### Fixed
480
+ - Loading spinners: added `role="status"` to all `.spinner` and `.spinner-dots` elements (required for `aria-label` on non-semantic elements)
481
+ - Card ratings: added `role="img"` to `.card__rating` elements (required for `aria-label`)
482
+ - Interactive card demo: removed invalid `role="button"` from `<article>` element
483
+ - Updated `loading.css` usage comment to show correct `role="status"` pattern
484
+
485
+ ## [0.4.5] - 2026-03-24
486
+
487
+ ### Added
488
+ - **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
489
+
490
+ ## [0.4.4] - 2026-03-24
491
+
492
+ ### Added
493
+ - **HTML starter kit** (`starters/html/`) — self-contained CDN-based starter, zero build step, includes nav, hero, features grid, contact form, footer, and full README
494
+
495
+ ## [0.4.3] - 2026-03-24
496
+
497
+ ### Added
498
+ - **First public npm publish** — `@fluid-theme/core@0.4.3` is now live on the npm registry
499
+ - **CDN links active** — jsDelivr and unpkg now serve the package automatically
500
+ - npm account `agilemediaagency` created with `@fluid-theme` organization
501
+
502
+ ### Changed
503
+ - Author email added to `package.json`
12
504
 
13
505
 
14
506
  ## [0.4.2] - 2026-03-21
@@ -157,3 +649,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
157
649
  [0.3.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/releases/tag/v0.3.0
158
650
  [0.4.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.4.1...v0.4.2
159
651
  [0.4.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.4.2...v0.4.3
652
+ [0.4.9]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.4.8...v0.4.9
653
+ [0.8.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.8.0...v0.8.1
654
+ [0.8.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.8.1...v0.8.2
655
+ [0.8.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.8.2...v0.8.3
656
+ [0.9.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.0...v0.9.1
657
+ [0.9.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.1...v0.9.2
658
+ [0.9.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.2...v0.9.3
659
+ [0.9.4]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.3...v0.9.4
660
+ [0.9.5]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.4...v0.9.5
661
+ [0.9.6]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.5...v0.9.6
662
+ [0.9.7]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.6...v0.9.7
663
+ [0.9.8]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.7...v0.9.8
664
+ [0.9.9]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.8...v0.9.9
665
+ [0.9.10]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.9...v0.9.10
666
+ [0.9.11]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.10...v0.9.11
667
+ [0.9.12]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.11...v0.9.12
668
+ [0.9.13]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.12...v0.9.13
669
+ [0.9.14]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.13...v0.9.14
670
+ [0.9.15]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.14...v0.9.15
671
+ [0.9.16]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.15...v0.9.16
672
+ [0.9.17]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.16...v0.9.17
673
+ [0.9.18]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.17...v0.9.18
674
+ [0.9.19]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.18...v0.9.19
675
+ [0.9.20]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.19...v0.9.20
676
+ [0.9.21]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.20...v0.9.21
677
+ [0.9.22]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.21...v0.9.22
678
+ [0.9.23]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.22...v0.9.23
679
+ [0.9.24]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.23...v0.9.24
680
+ [0.9.25]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.24...v0.9.25
681
+ [0.9.26]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.25...v0.9.26
682
+ [0.9.27]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.26...v0.9.27
683
+ [1.0.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v0.9.27...v1.0.0
684
+ [1.0.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.0...v1.0.1
685
+ [1.0.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.1...v1.0.2
686
+ [1.0.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.2...v1.0.3
687
+ [1.0.4]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.3...v1.0.4
688
+ [1.0.5]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.4...v1.0.5
689
+ [1.1.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.0.5...v1.1.0
690
+ [1.1.1]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.0...v1.1.1
691
+ [1.1.2]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.1...v1.1.2
692
+ [1.1.3]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.2...v1.1.3
693
+ [1.1.4]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.3...v1.1.4
694
+ [1.1.5]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.4...v1.1.5
695
+ [1.1.6]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.5...v1.1.6
696
+ [1.1.7]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.6...v1.1.7
697
+ [1.1.8]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.7...v1.1.8
698
+ [1.1.9]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.8...v1.1.9
699
+ [1.1.10]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.9...v1.1.10
700
+ [2.0.0]: https://github.com/Agile-Media-Agency/the-fluid-theme/compare/v1.1.10...v2.0.0