layout-style-css 3.0.2 → 3.2.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 (47) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +35 -14
  3. package/dist/core.css +1 -1
  4. package/dist/foundation.css +168 -24
  5. package/dist/layout-style-css.css +486 -159
  6. package/dist/layout-style-css.min.css +1 -1
  7. package/dist/personalities/bauhaus.css +4 -11
  8. package/dist/personalities/bento.css +1 -11
  9. package/dist/personalities/brutalism.css +3 -11
  10. package/dist/personalities/cyberpunk.css +2 -2
  11. package/dist/personalities/data-terminal.css +13 -0
  12. package/dist/personalities/editorial.css +14 -0
  13. package/dist/personalities/f-pattern.css +4 -4
  14. package/dist/personalities/industrial-hmi.css +11 -0
  15. package/dist/personalities/maximalist.css +2 -11
  16. package/dist/personalities/minimal-saas.css +1 -1
  17. package/dist/personalities/mondrian.css +2 -2
  18. package/dist/personalities/neumorphism.css +4 -13
  19. package/dist/personalities/retro-glass.css +11 -11
  20. package/dist/personalities/retrofuturism.css +2 -2
  21. package/dist/personalities/split-screen.css +6 -6
  22. package/dist/personalities/synthwave.css +2 -2
  23. package/dist/personalities/tactile.css +4 -13
  24. package/dist/personalities/technical-blueprint.css +13 -0
  25. package/dist/personalities/y2k.css +9 -9
  26. package/dist/personalities/z-pattern.css +4 -4
  27. package/dist/personalities.css +5 -1
  28. package/dist/primitives.css +122 -4
  29. package/dist/recipes.css +84 -1
  30. package/dist/utilities.css +14 -35
  31. package/dist/wrappers.css +5 -1
  32. package/docs/wiki/Demo-And-GitHub-Pages.md +4 -2
  33. package/docs/wiki/Getting-Started.md +11 -4
  34. package/docs/wiki/Home.md +7 -2
  35. package/docs/wiki/Installation-And-CDN.md +6 -5
  36. package/docs/wiki/Layout-Personality-Reference.md +67 -0
  37. package/docs/wiki/Layout-Primitives.md +16 -3
  38. package/docs/wiki/Layout-Recipes.md +3 -1
  39. package/docs/wiki/Layout-Styles.md +10 -23
  40. package/docs/wiki/Migrating-To-3.1.md +62 -0
  41. package/docs/wiki/Migrating-To-3.2.md +70 -0
  42. package/docs/wiki/Release-And-Publishing.md +6 -6
  43. package/docs/wiki/UI-Style-Kit-Compatibility.md +6 -0
  44. package/docs/wiki/_Sidebar.md +3 -0
  45. package/manifest.json +48 -28
  46. package/package.json +3 -3
  47. package/personalities.json +76 -14
package/CHANGELOG.md CHANGED
@@ -2,6 +2,48 @@
2
2
 
3
3
  All notable changes to `layout-style-css` are documented here. This project follows semantic versioning.
4
4
 
5
+ ## [3.2.0] - 2026-09-08
6
+
7
+ ### Added
8
+
9
+ - Added Mosaic and Action Bar compositions for responsive dashboards, task bars, and workflow surfaces that need stable DOM order and wrapping actions.
10
+ - Added four specialized layout personalities: Technical Blueprint, Data Terminal, Industrial HMI, and Editorial.
11
+ - Added the Layout Personality Reference and the 3.2 migration guide covering Mosaic, Action Bar, area-aware App Shell behavior, Scroll, and content resilience.
12
+
13
+ ### Changed
14
+
15
+ - Made App Shell area-aware so absent direct-child side regions do not reserve empty tracks while complete shells preserve their approved topology.
16
+ - Hardened layout content tracks and Scroll behavior so long labels, technical content, tables, and all-three-library fixtures remain usable with UI Style Kit 2.4.0.
17
+ - Expanded personality pairing metadata with recommended and compatible visual presets for the complete 20-layout inventory.
18
+
19
+ ### Security
20
+
21
+ - Updated the audited `fast-uri` override to the fixed 3.1.7 line while keeping runtime and peer dependencies empty.
22
+
23
+ ### Tests
24
+
25
+ - Added focused and rendered coverage for Mosaic, Action Bar, area-aware shells, pairing metadata, generated artifacts, release documentation, Pages output, and the final UI Style Kit 2.4.0 ecosystem fixture.
26
+
27
+ ## [3.1.0] - 2026-08-25
28
+
29
+ ### Added
30
+
31
+ - Added compact, normal, and spacious density contexts that can be applied at the root or to a nested layout subtree.
32
+ - Added the `96rem` workspace Wrapper, all ten local gap utilities, explicit bounded and viewport-relative Scroll modifiers, and recipe-owned threshold metadata.
33
+
34
+ ### Changed
35
+
36
+ - Made normal section spacing more conservative while retaining the former marketing rhythm through spacious density.
37
+ - Made gap utilities local to the element carrying the class and made base Scroll rely on its containing layout for height constraints.
38
+
39
+ ### Migration
40
+
41
+ - Use spacious density for the former section rhythm, explicit inherited gap tokens for a shared spacing context, and `ly-scroll--viewport` for the former viewport-relative Scroll behavior.
42
+
43
+ ### Tests
44
+
45
+ - Added density, workspace utilization, nested-gap isolation, Scroll-mode, public-token liveness, threshold metadata, cross-height, generated-output, package, and Pages contracts.
46
+
5
47
  ## [3.0.2] - 2026-08-25
6
48
 
7
49
  ### Fixed
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Zero-configuration, dependency-free structural CSS that responds to the width and height a layout actually receives.
4
4
 
5
- `layout-style-css@3.0.2` is the current v3 patch release and preserves the clean-break structural contract introduced in 3.0.0. It provides intrinsic wrappers, composition primitives, seven semantic recipes, and sixteen spatial personalities. Layout owns structure; UI Style Kit owns paint; Interactive Surface owns interaction styling.
5
+ `layout-style-css@3.2.0` is the current v3 release candidate. It provides intrinsic wrappers, Mosaic and Action Bar compositions, seven semantic recipes, explicit local density controls, and twenty spatial personalities. Layout owns structure; UI Style Kit owns paint; Interactive Surface owns interaction styling.
6
6
 
7
7
  ## Requirements
8
8
 
@@ -13,7 +13,7 @@ Zero-configuration, dependency-free structural CSS that responds to the width an
13
13
  ## Install
14
14
 
15
15
  ```bash
16
- npm install layout-style-css@3.0.2
16
+ npm install layout-style-css@3.2.0
17
17
  ```
18
18
 
19
19
  Most applications need one import:
@@ -44,6 +44,17 @@ Use `.ly-root` as the responsive boundary and keep the mobile DOM order authorit
44
44
 
45
45
  `.ly-root`, wrappers, and recipe roots establish the named `ly-scope` inline-size container. A recipe works directly in the root; when it is nested in a wrapper, it responds to that nearest wrapper.
46
46
 
47
+ ## Density Contexts
48
+
49
+ Normal density is the zero-configuration default. Use `data-ly-density="compact"`, `data-ly-density="normal"`, or `data-ly-density="spacious"` on `.ly-root` or any nested layout subtree. A nested density explicitly resets inherited gaps and section rhythm, so task controls can remain compact inside a spacious marketing page.
50
+
51
+ ```html
52
+ <main class="ly-root" data-ly-density="normal">
53
+ <section data-ly-density="compact">Dense application controls</section>
54
+ <section data-ly-density="spacious">Campaign presentation</section>
55
+ </main>
56
+ ```
57
+
47
58
  ## Wrappers
48
59
 
49
60
  Wrappers are optional measure and nesting controls. Every wrapper uses logical properties, fluid container-relative gutters, safe-area compensation, and shrink-safe sizing.
@@ -54,6 +65,7 @@ Wrappers are optional measure and nesting controls. Every wrapper uses logical p
54
65
  | `.ly-wrapper--compact` | `40rem` compact measure |
55
66
  | `.ly-wrapper--prose` | `68ch` reading measure |
56
67
  | `.ly-wrapper--content` | `72rem` content measure |
68
+ | `.ly-wrapper--workspace` | `96rem` task-oriented application measure |
57
69
  | `.ly-wrapper--wide` | `112rem` wide measure |
58
70
  | `.ly-wrapper--full` | Full available inline size |
59
71
  | `.ly-wrapper--breakout` | Clamped content, feature, and full lanes |
@@ -75,11 +87,13 @@ All lanes clamp to the available inline size, including allocations from 320px t
75
87
  The core includes:
76
88
 
77
89
  - `.ly-stack`, `.ly-cluster`, `.ly-center`, and `.ly-cover`
78
- - `.ly-switcher`, `.ly-sidebar`, `.ly-grid`, and `.ly-split`
90
+ - `.ly-switcher`, `.ly-sidebar`, `.ly-grid`, `.ly-mosaic`, and `.ly-split`
79
91
  - `.ly-panes` and `.ly-media`
80
- - `.ly-reel`, `.ly-frame`, and `.ly-scroll`
92
+ - `.ly-action-bar`, `.ly-reel`, `.ly-frame`, and `.ly-scroll`
93
+
94
+ Grid and flex primitives wrap intrinsically whenever track wrapping can replace a query. Mosaic uses one, six, and twelve tracks at its base, `42rem`, and `72rem` tiers while keeping DOM order authoritative. Base `.ly-scroll` owns horizontal and vertical overflow but no height cap. Add `.ly-scroll--bounded` for the stable `--ly-scroll-max` cap or `.ly-scroll--viewport` for height-aware `--ly-scroll-viewport-max` behavior.
81
95
 
82
- Grid and flex primitives wrap intrinsically whenever track wrapping can replace a query. Page, cover, and bounded-scroll sizing use `vh` fallbacks followed by `100dvh`-aware behavior. Only `.ly-reel` deliberately scrolls horizontally; only `.ly-scroll` deliberately creates a bounded vertical scroll region.
96
+ Gap utilities `.ly-gap-0` through `.ly-gap-9` assign `gap` only on the element carrying the class. They do not alter inherited primitive gap variables. Override `--ly-gap`, `--ly-grid-gap`, `--ly-stack-gap`, or `--ly-cluster-gap` when a shared spacing context is intentional.
83
97
 
84
98
  ## Automatic Recipe Engine
85
99
 
@@ -95,7 +109,9 @@ Recipes use attributes only. The stacked semantic source order is always safe, a
95
109
  | `data-ly-recipe="gallery"` | Intrinsic tracks; no topology breakpoint |
96
110
  | `data-ly-recipe="card-grid"` | Intrinsic tracks; no topology breakpoint |
97
111
 
98
- App Shell base, medium, and wide topologies own matching row definitions. This keeps the primary workspace flexible while header and footer tracks remain intrinsic, including personality-specific four-row topologies.
112
+ The same ownership is available in `manifest.json` through `thresholds.recipes`, alongside the generic container-width and viewport-height arrays. Release checks verify every mapping against authored queries and require every public geometry token to reach a runtime CSS declaration.
113
+
114
+ App Shell base, medium, and wide topologies own matching row definitions. The automatic shell is area-aware: absent direct-child side regions do not reserve empty tracks, while full shells preserve personality-approved geometry. `--ly-recipe-main-min: 20rem` guards automatic primary tracks.
99
115
 
100
116
  Canonical regions use `data-ly-area`, including `header`, `sidebar`, `nav`, `main`, `aside`, `footer`, `content`, `media`, `actions`, `primary`, and `secondary`.
101
117
 
@@ -139,12 +155,14 @@ Use the public height, gap, measure, ratio, rail, media, card, and grid-minimum
139
155
 
140
156
  ## Personalities
141
157
 
142
- Set one of sixteen canonical `data-ly-layout` values on `.ly-root`:
158
+ Set one of twenty canonical `data-ly-layout` values on `.ly-root`:
143
159
 
144
- `minimal-saas`, `bauhaus`, `tactile`, `cyberpunk`, `f-pattern`, `brutalism`, `neumorphism`, `y2k`, `retro-glass`, `z-pattern`, `retrofuturism`, `mondrian`, `synthwave`, `bento`, `maximalist`, or `split-screen`.
160
+ `minimal-saas`, `bento`, `maximalist`, `bauhaus`, `tactile`, `neumorphism`, `retrofuturism`, `brutalism`, `cyberpunk`, `y2k`, `retro-glass`, `f-pattern`, `z-pattern`, `split-screen`, `mondrian`, `synthwave`, `technical-blueprint`, `data-terminal`, `industrial-hmi`, or `editorial`.
145
161
 
146
162
  Each personality is a token/topology profile consumed by the shared recipe engine. A profile changes at least two spatial characteristics—such as measure, gap, rail, media size, card minimum, or ratio—but does not declare its own container or viewport breakpoint system.
147
163
 
164
+ See the [Layout Personality Reference](docs/wiki/Layout-Personality-Reference.md) for canonical geometry, responsive intent, Mosaic usage, and recommended/compatible UI presets.
165
+
148
166
  ## Public Exports
149
167
 
150
168
  | Import | Contents |
@@ -157,12 +175,12 @@ Each personality is a token/topology profile consumed by the shared recipe engin
157
175
  | `layout-style-css/primitives.css` | Intrinsic composition primitives |
158
176
  | `layout-style-css/recipes.css` | Seven attribute-only recipes |
159
177
  | `layout-style-css/utilities.css` | Small structural utility set |
160
- | `layout-style-css/personalities.css` | All sixteen profiles |
178
+ | `layout-style-css/personalities.css` | All twenty profiles |
161
179
  | `layout-style-css/personalities/minimal-saas.css` | One profile; substitute any public personality name |
162
180
  | `layout-style-css/personalities.json` | Public layout-to-visual pairing recommendations |
163
181
  | `layout-style-css/package.json` | Package metadata |
164
182
 
165
- The cascade order is `ly.reset`, `ly.tokens`, `ly.wrappers`, `ly.primitives`, `ly.recipes`, `ly.utilities`, and `ly.personalities`.
183
+ The cascade order is `ly.reset`, `ly.tokens`, `ly.wrappers`, `ly.primitives`, `ly.recipes`, `ly.utilities`, `ly.personalities`, and `ly.context`. Unlayered application CSS remains stronger than every library layer.
166
184
 
167
185
  ## Ecosystem Imports
168
186
 
@@ -177,18 +195,18 @@ import "layout-style-css";
177
195
 
178
196
  This order lets UI Style Kit establish paint and theme roles, Interactive Surface add interaction states, and Layout apply structure.
179
197
 
180
- `data-ly-layout`, `data-ui`, `data-theme`, and `data-mode` are independently selectable. See [Layout Styles](docs/wiki/Layout-Styles.md#visual-pairing-guidance) for the full recommendation matrix; pairings are never dependencies.
198
+ `data-ly-layout`, `data-ly-density`, `data-ui`, `data-theme`, and `data-mode` are independently selectable. See [Layout Styles](docs/wiki/Layout-Styles.md#visual-pairing-guidance) for the full recommendation matrix; pairings are never dependencies.
181
199
 
182
200
  ## CDN
183
201
 
184
202
  ```html
185
- <link rel="stylesheet" href="https://unpkg.com/layout-style-css@3.0.2/dist/layout-style-css.min.css">
186
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@3.0.2/dist/layout-style-css.min.css">
203
+ <link rel="stylesheet" href="https://unpkg.com/layout-style-css@3.2.0/dist/layout-style-css.min.css">
204
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@3.2.0/dist/layout-style-css.min.css">
187
205
  ```
188
206
 
189
207
  ## Clean-Break Migration
190
208
 
191
- v3 has no compatibility bundle. It removes `legacy.css`, the deprecated UI Style Kit structural bridge, v1/v2 aliases, responsive `ly-md-*` and `ly-lg-*` utilities, and all visual-order utilities. See [Migrating To 3.0](docs/wiki/Migrating-To-3.0.md) for exact mappings.
209
+ v3 has no compatibility bundle. It removes `legacy.css`, the deprecated UI Style Kit structural bridge, v1/v2 aliases, responsive `ly-md-*` and `ly-lg-*` utilities, and all visual-order utilities. See [Migrating To 3.0](docs/wiki/Migrating-To-3.0.md) for the major-version mappings, [Migrating To 3.1](docs/wiki/Migrating-To-3.1.md) for density and local-gap changes, and [Migrating To 3.2](docs/wiki/Migrating-To-3.2.md) for Mosaic, Action Bar, area-aware shells, and content resilience.
192
210
 
193
211
  ## Demo And Verification
194
212
 
@@ -213,7 +231,10 @@ npm run release:verify
213
231
  - [Layout Primitives](docs/wiki/Layout-Primitives.md)
214
232
  - [Layout Recipes](docs/wiki/Layout-Recipes.md)
215
233
  - [Layout Styles](docs/wiki/Layout-Styles.md)
234
+ - [Layout Personality Reference](docs/wiki/Layout-Personality-Reference.md)
216
235
  - [Migrating To 3.0](docs/wiki/Migrating-To-3.0.md)
236
+ - [Migrating To 3.1](docs/wiki/Migrating-To-3.1.md)
237
+ - [Migrating To 3.2](docs/wiki/Migrating-To-3.2.md)
217
238
  - [Demo And GitHub Pages](docs/wiki/Demo-And-GitHub-Pages.md)
218
239
  - [Release And Publishing](docs/wiki/Release-And-Publishing.md)
219
240
  - [Security And Support](docs/wiki/Security-And-Support.md)
package/dist/core.css CHANGED
@@ -1,4 +1,4 @@
1
- @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.context;
2
2
 
3
3
  @import url("./foundation.css");
4
4
  @import url("./wrappers.css");
@@ -1,4 +1,4 @@
1
- @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.context;
2
2
 
3
3
  /*
4
4
  Foundation owns only shared spatial tokens, containment, and defensive
@@ -21,6 +21,7 @@
21
21
  --ly-wrapper-compact: 40rem;
22
22
  --ly-wrapper-prose: 68ch;
23
23
  --ly-wrapper-content: 72rem;
24
+ --ly-wrapper-workspace: 96rem;
24
25
  --ly-wrapper-wide: 112rem;
25
26
  --ly-page-padding-inline: clamp(1rem, 3vw, 3rem);
26
27
  --ly-safe-area-inline: max(
@@ -36,19 +37,22 @@
36
37
  --ly-grid-gap: var(--ly-gap);
37
38
  --ly-stack-gap: var(--ly-space-4);
38
39
  --ly-cluster-gap: var(--ly-space-3);
39
- --ly-section-padding-block: clamp(3rem, 7vh, 6rem);
40
- --ly-section-padding-block-compact: clamp(1.5rem, 3.5vh, 3rem);
40
+ --ly-section-padding-block: clamp(2rem, 4vh, 4rem);
41
+ --ly-section-padding-block-compact: clamp(1rem, 2.5vh, 2rem);
41
42
  --ly-header-height: 4.5rem;
42
43
  --ly-sticky-position: sticky;
43
44
  --ly-cover-min: 100vh;
44
45
  --ly-shell-min: 100vh;
45
- --ly-scroll-max: min(70vh, 50rem);
46
+ --ly-scroll-max: 50rem;
47
+ --ly-scroll-viewport-max: min(70vh, 50rem);
46
48
 
47
49
  --ly-switcher-threshold: 42rem;
48
50
  --ly-sidebar-size: 18rem;
49
51
  --ly-sidebar-content-min: 50%;
50
52
  --ly-grid-columns: 12;
51
53
  --ly-grid-min: 16rem;
54
+ --ly-mosaic-medium-columns: 6;
55
+ --ly-mosaic-wide-columns: 12;
52
56
  --ly-split-min: 20rem;
53
57
  --ly-pane-min: 18rem;
54
58
  --ly-pane-size: 22rem;
@@ -60,6 +64,7 @@
60
64
  --ly-split-primary: 1fr;
61
65
  --ly-split-secondary: 1fr;
62
66
 
67
+ --ly-recipe-main-min: 20rem;
63
68
  --ly-recipe-rail: 18rem;
64
69
  --ly-recipe-aside: 22rem;
65
70
  --ly-gallery-min: 12rem;
@@ -74,7 +79,7 @@
74
79
  --ly-app-shell-medium-rows: auto auto minmax(0, 1fr) auto;
75
80
  --ly-app-shell-medium-columns:
76
81
  minmax(min(100%, var(--ly-recipe-rail)), auto)
77
- minmax(0, 1fr);
82
+ minmax(min(100%, var(--ly-recipe-main-min)), 1fr);
78
83
  --ly-app-shell-wide-areas:
79
84
  "sidebar header header"
80
85
  "sidebar main aside"
@@ -82,7 +87,7 @@
82
87
  --ly-app-shell-wide-rows: auto minmax(0, 1fr) auto;
83
88
  --ly-app-shell-wide-columns:
84
89
  minmax(min(100%, var(--ly-recipe-rail)), auto)
85
- minmax(0, 1fr)
90
+ minmax(min(100%, var(--ly-recipe-main-min)), 1fr)
86
91
  minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
87
92
 
88
93
  --ly-dashboard-medium-areas:
@@ -91,7 +96,7 @@
91
96
  "main aside"
92
97
  "footer footer";
93
98
  --ly-dashboard-medium-columns:
94
- minmax(0, 1fr)
99
+ minmax(min(100%, var(--ly-recipe-main-min)), 1fr)
95
100
  minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
96
101
  --ly-dashboard-wide-areas:
97
102
  "nav header header"
@@ -99,7 +104,7 @@
99
104
  "nav footer footer";
100
105
  --ly-dashboard-wide-columns:
101
106
  minmax(min(100%, var(--ly-recipe-rail)), auto)
102
- minmax(0, 1fr)
107
+ minmax(min(100%, var(--ly-recipe-main-min)), 1fr)
103
108
  minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
104
109
 
105
110
  --ly-docs-wide-areas:
@@ -109,19 +114,19 @@
109
114
  "footer footer";
110
115
  --ly-docs-wide-columns:
111
116
  minmax(min(100%, var(--ly-recipe-rail)), auto)
112
- minmax(0, 1fr);
117
+ minmax(min(100%, var(--ly-recipe-main-min)), 1fr);
113
118
  --ly-list-detail-wide-areas:
114
119
  "primary secondary"
115
120
  "actions actions";
116
121
  --ly-list-detail-wide-columns:
117
- minmax(min(100%, var(--ly-pane-size)), 0.7fr)
118
- minmax(0, 1fr);
122
+ minmax(min(100%, max(var(--ly-pane-min), var(--ly-pane-size))), 0.7fr)
123
+ minmax(min(100%, var(--ly-pane-min)), 1fr);
119
124
  --ly-split-hero-wide-areas:
120
125
  "content media"
121
126
  "actions media";
122
127
  --ly-split-hero-wide-columns:
123
- minmax(0, var(--ly-split-primary, 1fr))
124
- minmax(0, var(--ly-split-secondary, 1fr));
128
+ minmax(min(100%, var(--ly-split-min)), var(--ly-split-primary, 1fr))
129
+ minmax(min(100%, var(--ly-split-min)), var(--ly-split-secondary, 1fr));
125
130
 
126
131
  container-name: ly-scope;
127
132
  container-type: inline-size;
@@ -141,7 +146,7 @@
141
146
  :where(.ly-root) {
142
147
  --ly-cover-min: 100dvh;
143
148
  --ly-shell-min: 100dvh;
144
- --ly-scroll-max: min(70dvh, 50rem);
149
+ --ly-scroll-viewport-max: min(70dvh, 50rem);
145
150
  }
146
151
  }
147
152
  }
@@ -172,19 +177,19 @@
172
177
  --ly-grid-gap: var(--ly-gap);
173
178
  --ly-stack-gap: min(var(--ly-space-4), 3vh);
174
179
  --ly-cluster-gap: min(var(--ly-space-3), 2vh);
175
- --ly-section-padding-block: clamp(1.5rem, 6vh, 3rem);
176
- --ly-section-padding-block-compact: clamp(0.75rem, 3vh, 1.25rem);
180
+ --ly-section-padding-block: clamp(1.25rem, 4vh, 2rem);
181
+ --ly-section-padding-block-compact: clamp(0.75rem, 2vh, 1.25rem);
177
182
  --ly-header-height: 3.5rem;
178
- --ly-scroll-max: min(62vh, 34rem);
183
+ --ly-scroll-viewport-max: min(62vh, 34rem);
179
184
  }
180
185
 
181
186
  @supports (height: 100dvh) {
182
187
  :where(.ly-root) {
183
188
  --ly-stack-gap: min(var(--ly-space-4), 3dvh);
184
189
  --ly-cluster-gap: min(var(--ly-space-3), 2dvh);
185
- --ly-section-padding-block: clamp(1.5rem, 6dvh, 3rem);
186
- --ly-section-padding-block-compact: clamp(0.75rem, 3dvh, 1.25rem);
187
- --ly-scroll-max: min(62dvh, 34rem);
190
+ --ly-section-padding-block: clamp(1.25rem, 4dvh, 2rem);
191
+ --ly-section-padding-block-compact: clamp(0.75rem, 2dvh, 1.25rem);
192
+ --ly-scroll-viewport-max: min(62dvh, 34rem);
188
193
  }
189
194
  }
190
195
  }
@@ -194,15 +199,154 @@
194
199
  --ly-cover-min: auto;
195
200
  --ly-shell-min: auto;
196
201
  --ly-sticky-position: static;
197
- --ly-section-padding-block: var(--ly-space-5);
198
- --ly-section-padding-block-compact: var(--ly-space-3);
199
- --ly-scroll-max: max(12rem, calc(100vh - 8rem));
202
+ --ly-section-padding-block: var(--ly-space-4);
203
+ --ly-section-padding-block-compact: var(--ly-space-2);
204
+ --ly-scroll-viewport-max: max(12rem, calc(100vh - 8rem));
200
205
  }
201
206
 
202
207
  @supports (height: 100dvh) {
203
208
  :where(.ly-root) {
204
- --ly-scroll-max: max(12rem, calc(100dvh - 8rem));
209
+ --ly-scroll-viewport-max: max(12rem, calc(100dvh - 8rem));
210
+ }
211
+ }
212
+ }
213
+ }
214
+
215
+ @layer ly.context {
216
+ :where(
217
+ .ly-root[data-ly-density="compact"],
218
+ .ly-root [data-ly-density="compact"]
219
+ ) {
220
+ --ly-gap: var(--ly-space-3);
221
+ --ly-grid-gap: var(--ly-space-3);
222
+ --ly-stack-gap: var(--ly-space-3);
223
+ --ly-cluster-gap: var(--ly-space-2);
224
+ --ly-section-padding-block: clamp(1rem, 2.5vh, 2rem);
225
+ --ly-section-padding-block-compact: clamp(0.5rem, 1.5vh, 1rem);
226
+ }
227
+
228
+ :where(
229
+ .ly-root[data-ly-density="normal"],
230
+ .ly-root [data-ly-density="normal"]
231
+ ) {
232
+ --ly-gap: var(--ly-profile-gap);
233
+ --ly-grid-gap: var(--ly-gap);
234
+ --ly-stack-gap: var(--ly-space-4);
235
+ --ly-cluster-gap: var(--ly-space-3);
236
+ --ly-section-padding-block: clamp(2rem, 4vh, 4rem);
237
+ --ly-section-padding-block-compact: clamp(1rem, 2.5vh, 2rem);
238
+ }
239
+
240
+ :where(
241
+ .ly-root[data-ly-density="spacious"],
242
+ .ly-root [data-ly-density="spacious"]
243
+ ) {
244
+ --ly-gap: max(var(--ly-profile-gap), var(--ly-space-6));
245
+ --ly-grid-gap: var(--ly-gap);
246
+ --ly-stack-gap: var(--ly-space-5);
247
+ --ly-cluster-gap: var(--ly-space-4);
248
+ --ly-section-padding-block: clamp(3rem, 7vh, 6rem);
249
+ --ly-section-padding-block-compact: clamp(1.5rem, 3.5vh, 3rem);
250
+ }
251
+
252
+ @media (max-height: 44rem) {
253
+ :where(
254
+ .ly-root[data-ly-density="compact"],
255
+ .ly-root [data-ly-density="compact"]
256
+ ) {
257
+ --ly-gap: var(--ly-space-3);
258
+ --ly-grid-gap: var(--ly-space-3);
259
+ --ly-stack-gap: var(--ly-space-3);
260
+ --ly-cluster-gap: var(--ly-space-2);
261
+ --ly-section-padding-block: clamp(0.75rem, 2vh, 1.25rem);
262
+ --ly-section-padding-block-compact: var(--ly-space-2);
263
+ }
264
+
265
+ :where(
266
+ .ly-root[data-ly-density="normal"],
267
+ .ly-root [data-ly-density="normal"]
268
+ ) {
269
+ --ly-gap: min(var(--ly-profile-gap), var(--ly-space-4));
270
+ --ly-grid-gap: var(--ly-gap);
271
+ --ly-stack-gap: var(--ly-space-4);
272
+ --ly-cluster-gap: var(--ly-space-3);
273
+ --ly-section-padding-block: clamp(1.25rem, 4vh, 2rem);
274
+ --ly-section-padding-block-compact: clamp(0.75rem, 2vh, 1.25rem);
275
+ }
276
+
277
+ :where(
278
+ .ly-root[data-ly-density="spacious"],
279
+ .ly-root [data-ly-density="spacious"]
280
+ ) {
281
+ --ly-gap: var(--ly-space-5);
282
+ --ly-grid-gap: var(--ly-space-5);
283
+ --ly-stack-gap: var(--ly-space-4);
284
+ --ly-cluster-gap: var(--ly-space-3);
285
+ --ly-section-padding-block: clamp(1.5rem, 6vh, 3rem);
286
+ --ly-section-padding-block-compact: clamp(0.75rem, 3vh, 1.25rem);
287
+ }
288
+
289
+ @supports (height: 100dvh) {
290
+ :where(
291
+ .ly-root[data-ly-density="compact"],
292
+ .ly-root [data-ly-density="compact"]
293
+ ) {
294
+ --ly-section-padding-block: clamp(0.75rem, 2dvh, 1.25rem);
205
295
  }
296
+
297
+ :where(
298
+ .ly-root[data-ly-density="normal"],
299
+ .ly-root [data-ly-density="normal"]
300
+ ) {
301
+ --ly-section-padding-block: clamp(1.25rem, 4dvh, 2rem);
302
+ --ly-section-padding-block-compact: clamp(0.75rem, 2dvh, 1.25rem);
303
+ }
304
+
305
+ :where(
306
+ .ly-root[data-ly-density="spacious"],
307
+ .ly-root [data-ly-density="spacious"]
308
+ ) {
309
+ --ly-section-padding-block: clamp(1.5rem, 6dvh, 3rem);
310
+ --ly-section-padding-block-compact: clamp(0.75rem, 3dvh, 1.25rem);
311
+ }
312
+ }
313
+ }
314
+
315
+ @media (max-height: 30rem) {
316
+ :where(
317
+ .ly-root[data-ly-density="compact"],
318
+ .ly-root [data-ly-density="compact"]
319
+ ) {
320
+ --ly-gap: var(--ly-space-2);
321
+ --ly-grid-gap: var(--ly-space-2);
322
+ --ly-stack-gap: var(--ly-space-2);
323
+ --ly-cluster-gap: var(--ly-space-1);
324
+ --ly-section-padding-block: var(--ly-space-3);
325
+ --ly-section-padding-block-compact: var(--ly-space-2);
326
+ }
327
+
328
+ :where(
329
+ .ly-root[data-ly-density="normal"],
330
+ .ly-root [data-ly-density="normal"]
331
+ ) {
332
+ --ly-gap: var(--ly-space-3);
333
+ --ly-grid-gap: var(--ly-space-3);
334
+ --ly-stack-gap: var(--ly-space-3);
335
+ --ly-cluster-gap: var(--ly-space-2);
336
+ --ly-section-padding-block: var(--ly-space-4);
337
+ --ly-section-padding-block-compact: var(--ly-space-2);
338
+ }
339
+
340
+ :where(
341
+ .ly-root[data-ly-density="spacious"],
342
+ .ly-root [data-ly-density="spacious"]
343
+ ) {
344
+ --ly-gap: var(--ly-space-4);
345
+ --ly-grid-gap: var(--ly-space-4);
346
+ --ly-stack-gap: var(--ly-space-4);
347
+ --ly-cluster-gap: var(--ly-space-3);
348
+ --ly-section-padding-block: var(--ly-space-5);
349
+ --ly-section-padding-block-compact: var(--ly-space-3);
206
350
  }
207
351
  }
208
352
  }