@fluid-theme/core 0.4.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +6 -29
- package/CHANGELOG.md +543 -2
- package/CLAUDE.md +193 -14
- package/GEMINI.md +6 -45
- package/README.md +17 -8
- package/assets/js/compare.js +77 -0
- package/assets/js/fit-text.js +103 -0
- package/assets/js/lightbox.js +153 -0
- package/assets/js/scroll-reveal.js +72 -0
- package/assets/js/toc-build.mjs +86 -0
- package/assets/js/toc.js +384 -0
- package/dist/fluid-1x.min.css +4 -0
- package/dist/fluid-fonts.min.css +2 -0
- package/dist/fluid-legacy-1x.css +3 -0
- package/dist/fluid-nav.min.css +3 -0
- package/dist/fluid-toc.min.css +3 -0
- package/dist/fluid-zero.min.css +3 -0
- package/dist/fluid.min.css +3 -2
- package/dist/fonts/OFL-newsreader.txt +93 -0
- package/dist/fonts/OFL-schibsted-grotesk.txt +93 -0
- package/dist/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/dist/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/dist/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
- package/dist/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
- package/fluid-agent-kit/README.md +1 -0
- package/fluid-agent-kit/skills/accessibility.md +3 -1
- package/fluid-agent-kit/skills/css-conventions.md +22 -5
- package/fluid-agent-kit/skills/image-optimization.md +2 -0
- package/fluid-agent-kit/skills/preset-composition.md +108 -0
- package/package.json +29 -3
- package/src/animations/scroll-reveal.css +75 -193
- package/src/components/accordion.css +6 -47
- package/src/components/alert.css +47 -88
- package/src/components/avatar.css +4 -20
- package/src/components/badge.css +25 -48
- package/src/components/button.css +69 -175
- package/src/components/card.css +146 -481
- package/src/components/chip.css +46 -12
- package/src/components/compare.css +234 -0
- package/src/components/dropdown.css +10 -67
- package/src/components/empty-state.css +4 -0
- package/src/components/form.css +113 -81
- package/src/components/gallery.css +252 -0
- package/src/components/hero.css +203 -88
- package/src/components/indicator.css +23 -117
- package/src/components/loading.css +7 -29
- package/src/components/modal.css +12 -65
- package/src/components/nav-modes.css +261 -0
- package/src/components/nav.css +324 -392
- package/src/components/search-input.css +4 -2
- package/src/components/step-indicator.css +26 -27
- package/src/components/table.css +64 -171
- package/src/components/toc.css +254 -0
- package/src/components/tooltip.css +5 -46
- package/src/core/base.css +393 -547
- package/src/core/reset.css +17 -5
- package/src/core/tokens.css +426 -2276
- package/src/fluid.css +258 -17
- package/src/fonts/OFL-newsreader.txt +93 -0
- package/src/fonts/OFL-schibsted-grotesk.txt +93 -0
- package/src/fonts/fluid-fonts.css +55 -0
- package/src/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/src/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/src/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
- package/src/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
- package/src/layouts/positioning.css +6 -3
- package/src/legacy-1x.css +61 -0
- package/src/sections/cta.css +33 -101
- package/src/sections/features.css +42 -219
- package/src/sections/footer.css +53 -134
- package/src/sections/stats.css +40 -153
- package/src/sections/team.css +24 -113
- package/src/sections/testimonials.css +34 -148
- package/src/zero/base.css +166 -0
- package/src/zero/tokens.css +64 -0
- package/src/zero.css +20 -0
- package/src/components/scroll-progress.css +0 -104
- package/src/components/settings-panel.css +0 -603
- package/src/components/themed-images.css +0 -229
- package/src/components/version-badge.css +0 -70
|
@@ -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.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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-
|
|
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
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
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-
|
|
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.
|
|
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": "
|
|
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
|
-
"
|
|
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
|
}
|