@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
@@ -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.
@@ -28,6 +28,7 @@ Point your assistant to read the files in `fluid-agent-kit/skills/` for framewor
28
28
  | **UX Rules** | `skills/ux-rules.md` | 12 behavioral rules for interactive components |
29
29
  | **Accessibility** | `skills/accessibility.md` | HTML, keyboard, motion, touch, color standards |
30
30
  | **Image Optimization** | `skills/image-optimization.md` | Responsive images, lazy loading, focal points, formats |
31
+ | **Preset Composition** | `skills/preset-composition.md` | Per-preset layout DNA — which arrangements, densities, and section variants suit each preset |
31
32
 
32
33
  ## Key Principle
33
34
 
@@ -18,12 +18,14 @@ Accessibility is a core value of The Fluid Theme, not an afterthought. These rul
18
18
  - Escape closes all overlays (modals, dropdowns, popovers)
19
19
  - Arrow keys navigate within groups (tabs, radio buttons, dropdown items)
20
20
  - Never remove `:focus-visible` outlines — restyle if needed, never delete
21
+ - A child theme in `@layer themes` outranks every rule in `base` and `components`, whatever the specificity. If it restyles an invalid field's border or box-shadow (`[aria-invalid]`, `[data-invalid]`, `:user-invalid`), that style also wins while the field has focus, over core's `input:focus` and `form.css`'s invalid `:focus` rules, so the focus border or ring it replaces never shows. Restyle the focused state too, with a visible change (domain-landing's Swiss look reached review without one, 2026-10-27).
22
+ - Skip link: `<a class="skip-link" href="#main">Skip to content</a>`, never with `sr-only` added. `.sr-only` clips the link to a 1px box, and `.skip-link:focus` only slides it into view without undoing the clip (nor could it: `.sr-only` is in `@layer utilities`, which outranks `.skip-link` in `@layer base`), so the link stays clipped when a keyboard user reaches it. axe does not catch it and no gate here tabs to it (domain-landing review, 2026-10-27).
21
23
  - Native `<dialog>` focus trapping via `.showModal()` — never add manual trap
22
24
 
23
25
  ## Motion
24
26
 
25
27
  - `prefers-reduced-motion: reduce` respected in every animated component
26
- - `[data-motion="still"]` disables all transitions entirely
28
+ - `[data-preset="still"]` disables all transitions entirely
27
29
  - Spinners use pulse animation in reduced motion mode
28
30
  - Skeleton shimmer uses opacity fade in reduced motion mode
29
31
 
@@ -20,12 +20,29 @@ When writing or modifying CSS for a site built with The Fluid Theme, follow thes
20
20
 
21
21
  | Category | Examples |
22
22
  |----------|---------|
23
- | Spacing | `--space-0` through `--space-24` |
24
- | Typography | `--font-size-xs` through `--font-size-5xl` |
25
- | Colors | `--color-text`, `--color-surface`, `--accent`, `--color-success/warning/error/info` |
26
- | Borders | `--radius-sm` through `--radius-full`, `--border-width` |
23
+ | Knobs | ~20 per-site values on `:root`: `--accent`, `--accent-ink`, `--on-accent`, `--neutral-tint`, fonts, radii, `--shadow-style`, … (list: `_docs/STATUS.md`) |
24
+ | Spacing | `--space-0-5` through `--space-24` (4px base) |
25
+ | Typography | `--font-size-xs` through `--font-size-5xl`, `--hero-headline-size` (a knob) |
26
+ | Colors | `--color-text`, `--color-surface`, `--accent` (fills), `--accent-ink` (text), `--on-accent` (text on fills), `--color-success/warning/error/info` (text) with `-fill`, `-on`, `-subtle` |
27
+ | Borders | `--radius-card`, `--radius-control`, `--radius-pill` (knobs), `--radius-sm`…`--radius-xl`, `--radius-full` (circles), `--border-width` |
27
28
  | Shadows | `--shadow-xs` through `--shadow-xl` |
28
- | Motion | `--duration-instant` through `--duration-slowest` |
29
+ | Motion | `--duration-fast`, `-normal`, `-slow`, `-slower`, all from `--motion-base` |
30
+ | Macro dials | `--space-section`, `--space-gutter`, `--container-content` (knobs) |
31
+
32
+ ## Attribute Quick Reference
33
+
34
+ Theme axes (on `<html>`): `data-theme` (`light`/`dark`; absent = follow the OS) and `data-motion` (any element). `data-preset`, `data-palette`, `data-accent` and `data-contrast` were removed in Pass 0. Never use `var(--accent)` as a text colour: use `--accent-ink`.
35
+
36
+ | Attribute | Values | Used on | Notes |
37
+ |-----------|--------|---------|-------|
38
+ | `data-text-overflow` | `hyphenate`, `break`, `clip`, `normal` | Any element | Text overflow (`@layer utilities`). Headings already default to hyphenate; `normal` opts out. Needs `lang` on `<html>` for hyphens |
39
+ | `data-overflow` | `hidden`, `auto`, `scroll` | Any element | Box overflow (`@layer layouts`) — same attribute, different value set; one value per element |
40
+ | `data-fit-text` | (presence) | Any element | Shrink-to-fit display text; needs `assets/js/fit-text.js`. Down only, 55% floor. `window.fluidFitText()` after injecting content |
41
+ | `data-show-if` | one or more of `advertise`, `partner`, `buy-site`, `buy-domain`, `hire`, `other` | A field's wrapper in a form with `select[name="reason"]` | Shown only for those reasons (`@layer utilities`, `form.css`); never required, no constraint a hidden value can fail. `_docs/reference/components.md` |
42
+ | `.hp` (class) | — | The honeypot's wrapper, with `aria-hidden="true"` | Clipped to 1px in place (`@layer utilities`); last in the form |
43
+ | `data-arrange` | `auto` | `.hero` | Centered grid for flat hero markup (`hero__headline`/`hero__subheadline`/`hero__actions`/`hero__media` as direct children); a `hero__content` wrapper opts out. Beats `data-layout` |
44
+
45
+ **Fit text with no script.** On a page whose CSP allows no script (`default-src 'none'`), `fit-text.js` never runs, and `style-src 'self'` refuses a `style=""` the server writes instead. Size the text on the server: estimate its width from a table of glyph widths, err wide, and name a step in a `data-*` attribute that the stylesheet maps to a size. Give the text a safe break (`<wbr>`) for fonts the table did not measure. Do not measure text in CSS with scroll-driven animations: Firefox does not run them, so it gets a different size. Example: domain-landing `nameLength()` in `src/domains.js`, `data-name-length` on `<main>` (2026-10-27).
29
46
 
30
47
  ## Component File Pattern
31
48
 
@@ -113,3 +113,5 @@ Show different images based on viewport orientation:
113
113
  - [ ] Hero backgrounds: consider `data-focus` for focal point control
114
114
  - [ ] Card media: `data-aspect` set appropriately
115
115
  - [ ] Images served in WebP or AVIF with fallbacks
116
+ - [ ] Photo grids: `.gallery` with `data-lightbox` and `assets/js/lightbox.js`; thumbnails link to the full-size file (so they work without JS), captions credit the photographer, and residential photos carry no location metadata
117
+ - [ ] Before / after pairs: `.compare` with `assets/js/compare.js`; both photos the same view and size, each `alt` says which is which, and the labels are real text (they name the slider's values)
@@ -0,0 +1,108 @@
1
+ # Preset Composition — Per-Preset Layout DNA
2
+
3
+ > **Superseded (2026-10-23, Pass 0).** This describes the preset/palette system, which was removed. What the theme is now, and its knobs: [`_docs/STATUS.md`](../../_docs/STATUS.md). Kept as history.
4
+
5
+ When building a page with Fluid, the active `data-preset` is a COMPLETE design decision: it drives which layouts and arrangements you compose, not just colors and fonts. This skill maps each preset to the compositions that suit it.
6
+
7
+ Full preset reference: `_docs/theming-guide.md` ("Visual Presets in Depth").
8
+
9
+ ## The Two Mechanisms
10
+
11
+ **1. Runtime arrangement — `data-arrange="auto"`** (opt-in, on `.hero` and `.features`):
12
+
13
+ - `.hero` — requires flat markup: `hero__headline`, `hero__subheadline`, `hero__actions`, optional `hero__media` as **direct children** (no `hero__content` wrapper). The preset then remaps the arrangement via `grid-template-areas`. `data-arrange` wins over `data-layout`.
14
+ - `.features` — the preset remaps the grid's shape and density.
15
+
16
+ | Preset | Hero signature | Features signature |
17
+ |--------|----------------|--------------------|
18
+ | **still** | Swiss left rail + asymmetric void | Ruled hairline grid |
19
+ | **serene** | Editorial offset: full-width headline, copy hangs right | Single literary column |
20
+ | **rapids** | Poster split: giant headline left, caption column right | Dense 4-up |
21
+ | **tsunami** | Cinema poster: bottom-anchored massive headline, subheadline as kicker | Monumental 2-up |
22
+ | **flowing / stream / cascade** | Centered classic stack | Default responsive card grid |
23
+
24
+ **2. Composition-time choices (the important one)**: when generating page markup for a given preset, CHOOSE section variants, hero `data-layout` (`center` / `split` / `split-reverse`), grid densities, and content order that match the preset's layout DNA below. This applies to ALL sections — not just the two with `data-arrange`.
25
+
26
+ ## Layout DNA
27
+
28
+ | Preset | Canvas | Section rhythm | Hero to prefer | Grid density | Alignment bias |
29
+ |--------|--------|----------------|----------------|--------------|----------------|
30
+ | **still** | Focused 768px column | 32px, tight | Left-rail split, restrained size | Compact, ruled | Flush left |
31
+ | **serene** | 42rem literary column | 144px intervals | Full-width serif headline + offset deck | Single column | Centered, unboxed |
32
+ | **stream** | 1536px wide canvas | 64px | Wide split | 3–4 col cards | Left, horizontal |
33
+ | **flowing** | 1280px | 80px | Balanced centered | 3-up | Centered |
34
+ | **cascade** | 1280px | 64px | Friendly centered | Generous cards | Centered |
35
+ | **rapids** | 1536px | 32px, dense | Poster split, oversized type | Dense 4-up | Hard left |
36
+ | **tsunami** | Full width | 96px cinematic | Full-bleed, bottom-anchored | Monumental 2-up | Left, bottom-anchored |
37
+
38
+ ### still — Swiss precision
39
+
40
+ Mono grayscale default palette, system fonts, restrained display sizes, left-aligned Swiss grid, hairline rules.
41
+
42
+ - DO: compact tables and ruled grids; flush-left headlines; 2-col asymmetric splits with deliberate void
43
+ - DON'T: centered hero copy; decorative gradients; pill shapes
44
+
45
+ ### serene — literary calm
46
+
47
+ Large graceful serif display, morandi default palette (dusty lavender accent), extravagant whitespace.
48
+
49
+ - DO: single-column flows; generous stacked sections; full-width serif headline with offset deck; centered unboxed feature lists
50
+ - DON'T: packed multi-column grids; dense dashboards
51
+
52
+ ### stream — tech-forward
53
+
54
+ Plus Jakarta Sans, fluid deep-teal accent, professional and balanced.
55
+
56
+ - DO: wide split heroes; 3–4 col card grids; horizontal nav emphasis; dashboard patterns
57
+ - DON'T: narrow editorial columns
58
+
59
+ ### flowing — the versatile default
60
+
61
+ Outfit/DM Sans, brand medium-blue accent. Balanced centered heroes, 3-up grids — the reference point when no other DNA applies.
62
+
63
+ ### cascade — warm and bubbly
64
+
65
+ Nunito, bold vivid-purple accent, maximum roundness.
66
+
67
+ - DO: friendly centered layouts; generous card grids; pill buttons
68
+ - DON'T: sharp-edged dense tables
69
+
70
+ ### rapids — bold poster energy
71
+
72
+ Syne/Space Grotesk at 800–900 weight, electric coral accent, oversized display type.
73
+
74
+ - DO: poster splits; dense 4-up packs; tight rhythm; hard offset shadows
75
+ - DON'T: airy whitespace; serif elegance
76
+
77
+ ### tsunami — cinematic maximum
78
+
79
+ Bebas Neue massive display (hero headlines up to 6.5rem), storm-teal accent, asymmetric corners.
80
+
81
+ - DO: full-bleed bottom-anchored heroes; monumental 2-up grids; kicker-above-headline patterns
82
+ - DON'T: small centered cards; subtle anything
83
+
84
+ ### Identity presets
85
+
86
+ - **editorial** — extreme-whitespace serif essay (38rem column, 8rem sections): single-column prose only
87
+ - **brutalist** — monospace ruled rawness: hard borders, raw grids, zero decoration
88
+ - **neon** — dark glowing cyberpunk: dark surfaces, glow shadows, high-tech density
89
+
90
+ ## Default Palettes
91
+
92
+ Each water preset ships a default palette family + accent, so switching presets changes the color mood too:
93
+
94
+ | Preset | Family | Default accent |
95
+ |--------|--------|----------------|
96
+ | still | mono | grayscale slate |
97
+ | serene | morandi | dusty lavender |
98
+ | stream | fluid | deep teal |
99
+ | flowing | fluid | brand medium blue |
100
+ | cascade | bold | vivid purple |
101
+ | rapids | bold | electric coral |
102
+ | tsunami | tsunami | storm teal |
103
+
104
+ Explicit `data-palette` / `data-accent` always override. Do NOT add a `data-palette` unless the user asks for a specific color mood — the default family is part of the preset's design.
105
+
106
+ ## Never Mix DNA
107
+
108
+ Never mix arrangement DNA across presets on one page. If the user's content fights the preset's DNA (e.g., a dense data table on serene), keep the preset's rhythm and adapt the section — or suggest a better-suited preset. Do not import another preset's arrangement to solve it.
package/package.json CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "name": "@fluid-theme/core",
3
- "version": "0.4.3",
3
+ "version": "2.0.0",
4
4
  "description": "A modern, semantic CSS design system built on physics principles — not utility classes",
5
5
  "main": "dist/fluid.min.css",
6
6
  "style": "dist/fluid.min.css",
7
7
  "exports": {
8
8
  ".": "./dist/fluid.min.css",
9
+ "./zero": "./dist/fluid-zero.min.css",
10
+ "./fonts": "./dist/fluid-fonts.min.css",
11
+ "./legacy-1x": "./dist/fluid-legacy-1x.css",
12
+ "./1x": "./dist/fluid-1x.min.css",
13
+ "./toc": "./dist/fluid-toc.min.css",
14
+ "./nav": "./dist/fluid-nav.min.css",
15
+ "./toc-build": "./assets/js/toc-build.mjs",
9
16
  "./src": "./src/fluid.css"
10
17
  },
11
18
  "files": [
12
19
  "dist/",
20
+ "assets/js/",
13
21
  "src/",
14
22
  "fluid-agent-kit/",
15
23
  "CLAUDE.md",
@@ -24,7 +32,14 @@
24
32
  "build": "node scripts/build-css.mjs",
25
33
  "prepublishOnly": "npm run build",
26
34
  "optimize-images": "node scripts/optimize-images.js",
27
- "test": "echo \"Visual testing only - open examples/foundation.html in browser\""
35
+ "test:reveal": "node scripts/reveal-check.mjs",
36
+ "test:forms": "node scripts/form-check.mjs",
37
+ "test:axe": "node scripts/axe-check.mjs",
38
+ "test:focus": "node scripts/focus-check.mjs",
39
+ "test:toc": "node scripts/toc-check.mjs",
40
+ "test:nav": "node scripts/nav-check.mjs",
41
+ "test": "echo \"Visual testing only - open examples/foundation.html in browser\"",
42
+ "test:zero": "node scripts/visual-scan.mjs scripts/fixtures/zero.html && node scripts/axe-check.mjs --pages scripts/fixtures/zero.html && node scripts/focus-check.mjs --page scripts/fixtures/zero.html"
28
43
  },
29
44
  "keywords": [
30
45
  "css",
@@ -62,7 +77,18 @@
62
77
  "supports css-logical-properties"
63
78
  ],
64
79
  "devDependencies": {
80
+ "@capsizecss/core": "^4.1.3",
81
+ "@capsizecss/metrics": "^4.4.0",
82
+ "@fontsource-variable/newsreader": "^5.3.0",
83
+ "@fontsource-variable/schibsted-grotesk": "^5.3.0",
84
+ "axe-core": "^4.11.1",
85
+ "lighthouse": "^13.0.3",
65
86
  "lightningcss": "^1.32.0",
66
- "sharp": "^0.34.5"
87
+ "playwright": "^1.64.1",
88
+ "puppeteer": "^24.40.0",
89
+ "sharp": "^0.35.5"
90
+ },
91
+ "publishConfig": {
92
+ "access": "public"
67
93
  }
68
94
  }