layout-style-css 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +31 -8
  3. package/dist/core.css +1 -1
  4. package/dist/foundation.css +168 -13
  5. package/dist/layout-style-css.css +200 -59
  6. package/dist/layout-style-css.min.css +1 -1
  7. package/dist/personalities/bauhaus.css +1 -1
  8. package/dist/personalities/bento.css +2 -1
  9. package/dist/personalities/brutalism.css +1 -1
  10. package/dist/personalities/cyberpunk.css +1 -1
  11. package/dist/personalities/f-pattern.css +1 -1
  12. package/dist/personalities/maximalist.css +1 -1
  13. package/dist/personalities/minimal-saas.css +1 -1
  14. package/dist/personalities/mondrian.css +1 -1
  15. package/dist/personalities/neumorphism.css +2 -1
  16. package/dist/personalities/retro-glass.css +1 -1
  17. package/dist/personalities/retrofuturism.css +1 -1
  18. package/dist/personalities/split-screen.css +2 -1
  19. package/dist/personalities/synthwave.css +1 -1
  20. package/dist/personalities/tactile.css +2 -1
  21. package/dist/personalities/y2k.css +1 -1
  22. package/dist/personalities/z-pattern.css +1 -1
  23. package/dist/personalities.css +1 -1
  24. package/dist/primitives.css +11 -4
  25. package/dist/recipes.css +4 -2
  26. package/dist/utilities.css +11 -35
  27. package/dist/wrappers.css +6 -9
  28. package/docs/wiki/Getting-Started.md +9 -4
  29. package/docs/wiki/Home.md +3 -1
  30. package/docs/wiki/Installation-And-CDN.md +6 -5
  31. package/docs/wiki/Layout-Primitives.md +16 -3
  32. package/docs/wiki/Layout-Recipes.md +4 -0
  33. package/docs/wiki/Layout-Styles.md +7 -1
  34. package/docs/wiki/Migrating-To-3.1.md +62 -0
  35. package/docs/wiki/Release-And-Publishing.md +5 -5
  36. package/docs/wiki/_Sidebar.md +1 -0
  37. package/manifest.json +18 -7
  38. package/package.json +2 -2
  39. package/personalities.json +1 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,38 @@
2
2
 
3
3
  All notable changes to `layout-style-css` are documented here. This project follows semantic versioning.
4
4
 
5
+ ## [3.1.0] - 2026-08-25
6
+
7
+ ### Added
8
+
9
+ - Added compact, normal, and spacious density contexts that can be applied at the root or to a nested layout subtree.
10
+ - Added the `96rem` workspace Wrapper, all ten local gap utilities, explicit bounded and viewport-relative Scroll modifiers, and recipe-owned threshold metadata.
11
+
12
+ ### Changed
13
+
14
+ - Made normal section spacing more conservative while retaining the former marketing rhythm through spacious density.
15
+ - Made gap utilities local to the element carrying the class and made base Scroll rely on its containing layout for height constraints.
16
+
17
+ ### Migration
18
+
19
+ - 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.
20
+
21
+ ### Tests
22
+
23
+ - Added density, workspace utilization, nested-gap isolation, Scroll-mode, public-token liveness, threshold metadata, cross-height, generated-output, package, and Pages contracts.
24
+
25
+ ## [3.0.2] - 2026-08-25
26
+
27
+ ### Fixed
28
+
29
+ - Matched App Shell row tracks to base, medium, wide, and personality-specific area topologies so primary content receives flexible height while headers and footers remain intrinsic.
30
+ - Separated compact section spacing from normal section spacing and preserved the compact-smaller-than-normal invariant across regular, short, and shallow viewport heights.
31
+ - Connected the documented page-padding and Wrapper-gutter tokens to rendered Wrapper padding while retaining safe-area handling.
32
+
33
+ ### Tests
34
+
35
+ - Added static and rendered regression coverage for App Shell row counts, flexible workspace allocation, compact section ordering, public gutter overrides, generated CSS parity, package metadata, and Pages artifacts.
36
+
5
37
  ## [3.0.1] - 2026-08-09
6
38
 
7
39
  ### Changed
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.1` 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.1.0` is the current additive v3 release. It provides intrinsic wrappers, composition primitives, seven semantic recipes, explicit local density controls, and sixteen 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.1
16
+ npm install layout-style-css@3.1.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 |
@@ -68,6 +80,8 @@ Wrappers are optional measure and nesting controls. Every wrapper uses logical p
68
80
 
69
81
  All lanes clamp to the available inline size, including allocations from 320px through ultrawide screens.
70
82
 
83
+ `--ly-page-padding-inline` supplies the default `--ly-wrapper-gutter` value. Override `--ly-wrapper-gutter` on `.ly-root` or a narrower scope to control rendered Wrapper padding; safe-area compensation is still applied once at the Wrapper edge.
84
+
71
85
  ## Composition Primitives
72
86
 
73
87
  The core includes:
@@ -77,7 +91,9 @@ The core includes:
77
91
  - `.ly-panes` and `.ly-media`
78
92
  - `.ly-reel`, `.ly-frame`, and `.ly-scroll`
79
93
 
80
- 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.
94
+ Grid and flex primitives wrap intrinsically whenever track wrapping can replace a query. Base `.ly-scroll` owns 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. Only `.ly-reel` deliberately scrolls horizontally; only the Scroll family deliberately creates vertical scrolling.
95
+
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.
81
97
 
82
98
  ## Automatic Recipe Engine
83
99
 
@@ -93,6 +109,10 @@ Recipes use attributes only. The stacked semantic source order is always safe, a
93
109
  | `data-ly-recipe="gallery"` | Intrinsic tracks; no topology breakpoint |
94
110
  | `data-ly-recipe="card-grid"` | Intrinsic tracks; no topology breakpoint |
95
111
 
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. This keeps the primary workspace flexible while header and footer tracks remain intrinsic, including personality-specific four-row topologies.
115
+
96
116
  Canonical regions use `data-ly-area`, including `header`, `sidebar`, `nav`, `main`, `aside`, `footer`, `content`, `media`, `actions`, `primary`, and `secondary`.
97
117
 
98
118
  Recipe class aliases such as `.ly-dashboard` no longer exist. Use:
@@ -129,6 +149,8 @@ The system responds to available block size without orientation queries:
129
149
  - At viewport heights of `30rem` or less, recipe-owned sticky behavior becomes normal flow, and cover/shell minimums stop forcing full-height regions.
130
150
  - Safe-area block insets remain available, and required regions are never hidden solely because the viewport is short.
131
151
 
152
+ `--ly-section-padding-block` controls normal sections. `--ly-section-padding-block-compact` independently controls `.ly-section--compact`, preserving a smaller rhythm through the regular, short, and shallow height tiers.
153
+
132
154
  Use the public height, gap, measure, ratio, rail, media, card, and grid-minimum custom properties for advanced tuning. Defaults use `100vh` fallbacks followed by `100dvh`.
133
155
 
134
156
  ## Personalities
@@ -156,7 +178,7 @@ Each personality is a token/topology profile consumed by the shared recipe engin
156
178
  | `layout-style-css/personalities.json` | Public layout-to-visual pairing recommendations |
157
179
  | `layout-style-css/package.json` | Package metadata |
158
180
 
159
- The cascade order is `ly.reset`, `ly.tokens`, `ly.wrappers`, `ly.primitives`, `ly.recipes`, `ly.utilities`, and `ly.personalities`.
181
+ 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.
160
182
 
161
183
  ## Ecosystem Imports
162
184
 
@@ -171,18 +193,18 @@ import "layout-style-css";
171
193
 
172
194
  This order lets UI Style Kit establish paint and theme roles, Interactive Surface add interaction states, and Layout apply structure.
173
195
 
174
- `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.
196
+ `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.
175
197
 
176
198
  ## CDN
177
199
 
178
200
  ```html
179
- <link rel="stylesheet" href="https://unpkg.com/layout-style-css@3.0.1/dist/layout-style-css.min.css">
180
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@3.0.1/dist/layout-style-css.min.css">
201
+ <link rel="stylesheet" href="https://unpkg.com/layout-style-css@3.1.0/dist/layout-style-css.min.css">
202
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@3.1.0/dist/layout-style-css.min.css">
181
203
  ```
182
204
 
183
205
  ## Clean-Break Migration
184
206
 
185
- 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.
207
+ 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 and [Migrating To 3.1](docs/wiki/Migrating-To-3.1.md) for density, local gap, and Scroll behavior changes.
186
208
 
187
209
  ## Demo And Verification
188
210
 
@@ -208,6 +230,7 @@ npm run release:verify
208
230
  - [Layout Recipes](docs/wiki/Layout-Recipes.md)
209
231
  - [Layout Styles](docs/wiki/Layout-Styles.md)
210
232
  - [Migrating To 3.0](docs/wiki/Migrating-To-3.0.md)
233
+ - [Migrating To 3.1](docs/wiki/Migrating-To-3.1.md)
211
234
  - [Demo And GitHub Pages](docs/wiki/Demo-And-GitHub-Pages.md)
212
235
  - [Release And Publishing](docs/wiki/Release-And-Publishing.md)
213
236
  - [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,27 +21,30 @@
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
- --ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
26
+ --ly-page-padding-inline: clamp(1rem, 3vw, 3rem);
26
27
  --ly-safe-area-inline: max(
27
28
  env(safe-area-inset-left, 0px),
28
29
  env(safe-area-inset-right, 0px)
29
30
  );
30
31
  --ly-safe-area-block-start: env(safe-area-inset-top, 0px);
31
32
  --ly-safe-area-block-end: env(safe-area-inset-bottom, 0px);
32
- --ly-wrapper-gutter: max(var(--ly-page-padding-inline), var(--ly-safe-area-inline));
33
+ --ly-wrapper-gutter: var(--ly-page-padding-inline);
33
34
 
34
35
  --ly-profile-gap: var(--ly-space-5);
35
36
  --ly-gap: var(--ly-profile-gap);
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: clamp(2rem, 4vh, 4rem);
41
+ --ly-section-padding-block-compact: clamp(1rem, 2.5vh, 2rem);
40
42
  --ly-header-height: 4.5rem;
41
43
  --ly-sticky-position: sticky;
42
44
  --ly-cover-min: 100vh;
43
45
  --ly-shell-min: 100vh;
44
- --ly-scroll-max: min(70vh, 50rem);
46
+ --ly-scroll-max: 50rem;
47
+ --ly-scroll-viewport-max: min(70vh, 50rem);
45
48
 
46
49
  --ly-switcher-threshold: 42rem;
47
50
  --ly-sidebar-size: 18rem;
@@ -64,11 +67,13 @@
64
67
  --ly-gallery-min: 12rem;
65
68
  --ly-card-grid-min: 16rem;
66
69
 
70
+ --ly-app-shell-base-rows: auto auto minmax(0, 1fr) auto auto;
67
71
  --ly-app-shell-medium-areas:
68
72
  "header header"
69
73
  "sidebar main"
70
74
  "aside main"
71
75
  "footer footer";
76
+ --ly-app-shell-medium-rows: auto auto minmax(0, 1fr) auto;
72
77
  --ly-app-shell-medium-columns:
73
78
  minmax(min(100%, var(--ly-recipe-rail)), auto)
74
79
  minmax(0, 1fr);
@@ -76,6 +81,7 @@
76
81
  "sidebar header header"
77
82
  "sidebar main aside"
78
83
  "sidebar footer footer";
84
+ --ly-app-shell-wide-rows: auto minmax(0, 1fr) auto;
79
85
  --ly-app-shell-wide-columns:
80
86
  minmax(min(100%, var(--ly-recipe-rail)), auto)
81
87
  minmax(0, 1fr)
@@ -125,12 +131,19 @@
125
131
  min-block-size: 0;
126
132
  }
127
133
 
134
+ /* Prefer the nearest layout scope for gutters when container units parse. */
135
+ @supports (width: 1cqi) {
136
+ :where(.ly-root) {
137
+ --ly-page-padding-inline: clamp(1rem, 3cqi, 3rem);
138
+ }
139
+ }
140
+
128
141
  /* Enhance viewport-bound tokens only when dynamic viewport units parse. */
129
142
  @supports (height: 100dvh) {
130
143
  :where(.ly-root) {
131
144
  --ly-cover-min: 100dvh;
132
145
  --ly-shell-min: 100dvh;
133
- --ly-scroll-max: min(70dvh, 50rem);
146
+ --ly-scroll-viewport-max: min(70dvh, 50rem);
134
147
  }
135
148
  }
136
149
  }
@@ -161,17 +174,19 @@
161
174
  --ly-grid-gap: var(--ly-gap);
162
175
  --ly-stack-gap: min(var(--ly-space-4), 3vh);
163
176
  --ly-cluster-gap: min(var(--ly-space-3), 2vh);
164
- --ly-section-padding-block: clamp(1.5rem, 6vh, 3rem);
177
+ --ly-section-padding-block: clamp(1.25rem, 4vh, 2rem);
178
+ --ly-section-padding-block-compact: clamp(0.75rem, 2vh, 1.25rem);
165
179
  --ly-header-height: 3.5rem;
166
- --ly-scroll-max: min(62vh, 34rem);
180
+ --ly-scroll-viewport-max: min(62vh, 34rem);
167
181
  }
168
182
 
169
183
  @supports (height: 100dvh) {
170
184
  :where(.ly-root) {
171
185
  --ly-stack-gap: min(var(--ly-space-4), 3dvh);
172
186
  --ly-cluster-gap: min(var(--ly-space-3), 2dvh);
173
- --ly-section-padding-block: clamp(1.5rem, 6dvh, 3rem);
174
- --ly-scroll-max: min(62dvh, 34rem);
187
+ --ly-section-padding-block: clamp(1.25rem, 4dvh, 2rem);
188
+ --ly-section-padding-block-compact: clamp(0.75rem, 2dvh, 1.25rem);
189
+ --ly-scroll-viewport-max: min(62dvh, 34rem);
175
190
  }
176
191
  }
177
192
  }
@@ -181,14 +196,154 @@
181
196
  --ly-cover-min: auto;
182
197
  --ly-shell-min: auto;
183
198
  --ly-sticky-position: static;
184
- --ly-section-padding-block: var(--ly-space-5);
185
- --ly-scroll-max: max(12rem, calc(100vh - 8rem));
199
+ --ly-section-padding-block: var(--ly-space-4);
200
+ --ly-section-padding-block-compact: var(--ly-space-2);
201
+ --ly-scroll-viewport-max: max(12rem, calc(100vh - 8rem));
186
202
  }
187
203
 
188
204
  @supports (height: 100dvh) {
189
205
  :where(.ly-root) {
190
- --ly-scroll-max: max(12rem, calc(100dvh - 8rem));
206
+ --ly-scroll-viewport-max: max(12rem, calc(100dvh - 8rem));
207
+ }
208
+ }
209
+ }
210
+ }
211
+
212
+ @layer ly.context {
213
+ :where(
214
+ .ly-root[data-ly-density="compact"],
215
+ .ly-root [data-ly-density="compact"]
216
+ ) {
217
+ --ly-gap: var(--ly-space-3);
218
+ --ly-grid-gap: var(--ly-space-3);
219
+ --ly-stack-gap: var(--ly-space-3);
220
+ --ly-cluster-gap: var(--ly-space-2);
221
+ --ly-section-padding-block: clamp(1rem, 2.5vh, 2rem);
222
+ --ly-section-padding-block-compact: clamp(0.5rem, 1.5vh, 1rem);
223
+ }
224
+
225
+ :where(
226
+ .ly-root[data-ly-density="normal"],
227
+ .ly-root [data-ly-density="normal"]
228
+ ) {
229
+ --ly-gap: var(--ly-profile-gap);
230
+ --ly-grid-gap: var(--ly-gap);
231
+ --ly-stack-gap: var(--ly-space-4);
232
+ --ly-cluster-gap: var(--ly-space-3);
233
+ --ly-section-padding-block: clamp(2rem, 4vh, 4rem);
234
+ --ly-section-padding-block-compact: clamp(1rem, 2.5vh, 2rem);
235
+ }
236
+
237
+ :where(
238
+ .ly-root[data-ly-density="spacious"],
239
+ .ly-root [data-ly-density="spacious"]
240
+ ) {
241
+ --ly-gap: max(var(--ly-profile-gap), var(--ly-space-6));
242
+ --ly-grid-gap: var(--ly-gap);
243
+ --ly-stack-gap: var(--ly-space-5);
244
+ --ly-cluster-gap: var(--ly-space-4);
245
+ --ly-section-padding-block: clamp(3rem, 7vh, 6rem);
246
+ --ly-section-padding-block-compact: clamp(1.5rem, 3.5vh, 3rem);
247
+ }
248
+
249
+ @media (max-height: 44rem) {
250
+ :where(
251
+ .ly-root[data-ly-density="compact"],
252
+ .ly-root [data-ly-density="compact"]
253
+ ) {
254
+ --ly-gap: var(--ly-space-3);
255
+ --ly-grid-gap: var(--ly-space-3);
256
+ --ly-stack-gap: var(--ly-space-3);
257
+ --ly-cluster-gap: var(--ly-space-2);
258
+ --ly-section-padding-block: clamp(0.75rem, 2vh, 1.25rem);
259
+ --ly-section-padding-block-compact: var(--ly-space-2);
260
+ }
261
+
262
+ :where(
263
+ .ly-root[data-ly-density="normal"],
264
+ .ly-root [data-ly-density="normal"]
265
+ ) {
266
+ --ly-gap: min(var(--ly-profile-gap), var(--ly-space-4));
267
+ --ly-grid-gap: var(--ly-gap);
268
+ --ly-stack-gap: var(--ly-space-4);
269
+ --ly-cluster-gap: var(--ly-space-3);
270
+ --ly-section-padding-block: clamp(1.25rem, 4vh, 2rem);
271
+ --ly-section-padding-block-compact: clamp(0.75rem, 2vh, 1.25rem);
272
+ }
273
+
274
+ :where(
275
+ .ly-root[data-ly-density="spacious"],
276
+ .ly-root [data-ly-density="spacious"]
277
+ ) {
278
+ --ly-gap: var(--ly-space-5);
279
+ --ly-grid-gap: var(--ly-space-5);
280
+ --ly-stack-gap: var(--ly-space-4);
281
+ --ly-cluster-gap: var(--ly-space-3);
282
+ --ly-section-padding-block: clamp(1.5rem, 6vh, 3rem);
283
+ --ly-section-padding-block-compact: clamp(0.75rem, 3vh, 1.25rem);
284
+ }
285
+
286
+ @supports (height: 100dvh) {
287
+ :where(
288
+ .ly-root[data-ly-density="compact"],
289
+ .ly-root [data-ly-density="compact"]
290
+ ) {
291
+ --ly-section-padding-block: clamp(0.75rem, 2dvh, 1.25rem);
292
+ }
293
+
294
+ :where(
295
+ .ly-root[data-ly-density="normal"],
296
+ .ly-root [data-ly-density="normal"]
297
+ ) {
298
+ --ly-section-padding-block: clamp(1.25rem, 4dvh, 2rem);
299
+ --ly-section-padding-block-compact: clamp(0.75rem, 2dvh, 1.25rem);
191
300
  }
301
+
302
+ :where(
303
+ .ly-root[data-ly-density="spacious"],
304
+ .ly-root [data-ly-density="spacious"]
305
+ ) {
306
+ --ly-section-padding-block: clamp(1.5rem, 6dvh, 3rem);
307
+ --ly-section-padding-block-compact: clamp(0.75rem, 3dvh, 1.25rem);
308
+ }
309
+ }
310
+ }
311
+
312
+ @media (max-height: 30rem) {
313
+ :where(
314
+ .ly-root[data-ly-density="compact"],
315
+ .ly-root [data-ly-density="compact"]
316
+ ) {
317
+ --ly-gap: var(--ly-space-2);
318
+ --ly-grid-gap: var(--ly-space-2);
319
+ --ly-stack-gap: var(--ly-space-2);
320
+ --ly-cluster-gap: var(--ly-space-1);
321
+ --ly-section-padding-block: var(--ly-space-3);
322
+ --ly-section-padding-block-compact: var(--ly-space-2);
323
+ }
324
+
325
+ :where(
326
+ .ly-root[data-ly-density="normal"],
327
+ .ly-root [data-ly-density="normal"]
328
+ ) {
329
+ --ly-gap: var(--ly-space-3);
330
+ --ly-grid-gap: var(--ly-space-3);
331
+ --ly-stack-gap: var(--ly-space-3);
332
+ --ly-cluster-gap: var(--ly-space-2);
333
+ --ly-section-padding-block: var(--ly-space-4);
334
+ --ly-section-padding-block-compact: var(--ly-space-2);
335
+ }
336
+
337
+ :where(
338
+ .ly-root[data-ly-density="spacious"],
339
+ .ly-root [data-ly-density="spacious"]
340
+ ) {
341
+ --ly-gap: var(--ly-space-4);
342
+ --ly-grid-gap: var(--ly-space-4);
343
+ --ly-stack-gap: var(--ly-space-4);
344
+ --ly-cluster-gap: var(--ly-space-3);
345
+ --ly-section-padding-block: var(--ly-space-5);
346
+ --ly-section-padding-block-compact: var(--ly-space-3);
192
347
  }
193
348
  }
194
349
  }