layout-style-css 2.1.1 → 3.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 (79) hide show
  1. package/README.md +124 -145
  2. package/dist/core.css +2 -1
  3. package/dist/foundation.css +194 -0
  4. package/dist/layout-style-css.css +527 -984
  5. package/dist/layout-style-css.min.css +1 -1
  6. package/dist/personalities/bauhaus.css +13 -42
  7. package/dist/personalities/bento.css +16 -40
  8. package/dist/personalities/brutalism.css +13 -33
  9. package/dist/personalities/cyberpunk.css +12 -32
  10. package/dist/personalities/f-pattern.css +16 -45
  11. package/dist/personalities/maximalist.css +16 -48
  12. package/dist/personalities/minimal-saas.css +7 -33
  13. package/dist/personalities/mondrian.css +12 -40
  14. package/dist/personalities/neumorphism.css +15 -39
  15. package/dist/personalities/retro-glass.css +14 -42
  16. package/dist/personalities/retrofuturism.css +12 -32
  17. package/dist/personalities/split-screen.css +24 -36
  18. package/dist/personalities/synthwave.css +13 -41
  19. package/dist/personalities/tactile.css +15 -32
  20. package/dist/personalities/y2k.css +13 -33
  21. package/dist/personalities/z-pattern.css +16 -46
  22. package/dist/personalities.css +1 -1
  23. package/dist/primitives.css +27 -63
  24. package/dist/recipes.css +92 -175
  25. package/dist/utilities.css +39 -104
  26. package/dist/wrappers.css +28 -108
  27. package/package.json +12 -24
  28. package/CHANGELOG.md +0 -107
  29. package/CONTRIBUTING.md +0 -55
  30. package/SECURITY.md +0 -50
  31. package/demo/assets/apple-touch-icon.svg +0 -7
  32. package/demo/assets/favicon.svg +0 -7
  33. package/demo/assets/social-card.png +0 -0
  34. package/demo/browserconfig.xml +0 -9
  35. package/demo/demo.css +0 -523
  36. package/demo/demo.js +0 -605
  37. package/demo/index.html +0 -325
  38. package/demo/robots.txt +0 -4
  39. package/demo/site.webmanifest +0 -23
  40. package/demo/sitemap.xml +0 -9
  41. package/dist/integrations/ui-style-kit.css +0 -175
  42. package/dist/legacy.css +0 -822
  43. package/docs/wiki/Contributing.md +0 -36
  44. package/docs/wiki/Demo-And-GitHub-Pages.md +0 -53
  45. package/docs/wiki/Getting-Started.md +0 -51
  46. package/docs/wiki/Home.md +0 -33
  47. package/docs/wiki/Installation-And-CDN.md +0 -72
  48. package/docs/wiki/Layout-Primitives.md +0 -48
  49. package/docs/wiki/Layout-Recipes.md +0 -49
  50. package/docs/wiki/Layout-Styles.md +0 -33
  51. package/docs/wiki/Migrating-To-2.0.md +0 -186
  52. package/docs/wiki/Release-And-Publishing.md +0 -77
  53. package/docs/wiki/Security-And-Support.md +0 -36
  54. package/docs/wiki/UI-Style-Kit-Compatibility.md +0 -49
  55. package/docs/wiki/_Sidebar.md +0 -15
  56. package/styles/core.css +0 -6
  57. package/styles/integrations/ui-style-kit.css +0 -175
  58. package/styles/legacy.css +0 -173
  59. package/styles/personalities/bauhaus.css +0 -49
  60. package/styles/personalities/bento.css +0 -46
  61. package/styles/personalities/brutalism.css +0 -39
  62. package/styles/personalities/cyberpunk.css +0 -39
  63. package/styles/personalities/f-pattern.css +0 -51
  64. package/styles/personalities/maximalist.css +0 -54
  65. package/styles/personalities/minimal-saas.css +0 -39
  66. package/styles/personalities/mondrian.css +0 -47
  67. package/styles/personalities/neumorphism.css +0 -46
  68. package/styles/personalities/retro-glass.css +0 -47
  69. package/styles/personalities/retrofuturism.css +0 -39
  70. package/styles/personalities/split-screen.css +0 -41
  71. package/styles/personalities/synthwave.css +0 -48
  72. package/styles/personalities/tactile.css +0 -39
  73. package/styles/personalities/y2k.css +0 -39
  74. package/styles/personalities/z-pattern.css +0 -52
  75. package/styles/personalities.css +0 -18
  76. package/styles/primitives.css +0 -219
  77. package/styles/recipes.css +0 -278
  78. package/styles/utilities.css +0 -162
  79. package/styles/wrappers.css +0 -174
@@ -1,11 +1,11 @@
1
- @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
2
2
 
3
- /* layout-style-css bundle. Generated from focused styles/ modules by scripts/build.mjs. */
3
+ /* layout-style-css v3 bundle. Generated from focused styles/ modules. */
4
4
 
5
- /* wrappers.css */
5
+ /* foundation.css */
6
6
  /*
7
- Shared structural tokens and wrapper geometry. Theme, type, borders, shadows,
8
- and interactive states remain outside Layout Style's ownership boundary.
7
+ Foundation owns only shared spatial tokens, containment, and defensive
8
+ sizing. Theme and interaction libraries remain responsible for paint.
9
9
  */
10
10
 
11
11
  @layer ly.tokens {
@@ -25,57 +25,116 @@
25
25
  --ly-wrapper-prose: 68ch;
26
26
  --ly-wrapper-content: 72rem;
27
27
  --ly-wrapper-wide: 112rem;
28
- --ly-wrapper-max: var(--ly-wrapper-content);
29
28
  --ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
30
29
  --ly-safe-area-inline: max(
31
30
  env(safe-area-inset-left, 0px),
32
31
  env(safe-area-inset-right, 0px)
33
32
  );
33
+ --ly-safe-area-block-start: env(safe-area-inset-top, 0px);
34
+ --ly-safe-area-block-end: env(safe-area-inset-bottom, 0px);
34
35
  --ly-wrapper-gutter: max(var(--ly-page-padding-inline), var(--ly-safe-area-inline));
35
36
 
36
- --ly-section-padding-block: clamp(3rem, 7vw, 6rem);
37
- --ly-gap: var(--ly-space-5);
37
+ --ly-profile-gap: var(--ly-space-5);
38
+ --ly-gap: var(--ly-profile-gap);
38
39
  --ly-grid-gap: var(--ly-gap);
39
40
  --ly-stack-gap: var(--ly-space-4);
40
41
  --ly-cluster-gap: var(--ly-space-3);
41
- --ly-cover-min: 100svh;
42
+ --ly-section-padding-block: clamp(3rem, 7vh, 6rem);
43
+ --ly-header-height: 4.5rem;
44
+ --ly-sticky-position: sticky;
45
+ --ly-cover-min: 100vh;
46
+ --ly-shell-min: 100vh;
47
+ --ly-scroll-max: min(70vh, 50rem);
48
+
42
49
  --ly-switcher-threshold: 42rem;
43
50
  --ly-sidebar-size: 18rem;
44
51
  --ly-sidebar-content-min: 50%;
45
52
  --ly-grid-columns: 12;
46
53
  --ly-grid-min: 16rem;
54
+ --ly-split-min: 20rem;
55
+ --ly-pane-min: 18rem;
47
56
  --ly-pane-size: 22rem;
57
+ --ly-media-min: 18rem;
48
58
  --ly-media-size: 14rem;
49
59
  --ly-reel-item-min: 16rem;
50
60
  --ly-reel-item-max: 28rem;
51
- --ly-scroll-max: 70svh;
52
61
  --ly-frame-ratio: 16 / 9;
62
+ --ly-split-primary: 1fr;
63
+ --ly-split-secondary: 1fr;
53
64
 
54
65
  --ly-recipe-rail: 18rem;
55
66
  --ly-recipe-aside: 22rem;
56
- --ly-card-grid-min: 16rem;
57
67
  --ly-gallery-min: 12rem;
58
- --ly-card-size-sm: 10rem;
59
- --ly-card-size-md: 14rem;
60
- --ly-card-size-lg: 18rem;
61
- --ly-header-height: 4.5rem;
62
- --ly-z-header: 20;
63
-
64
- /* V1 token aliases remain available so legacy selectors can preserve sizing. */
65
- --ly-container-sm: var(--ly-wrapper-compact);
66
- --ly-container-md: 56rem;
67
- --ly-container-lg: var(--ly-wrapper-content);
68
- --ly-container-xl: 88rem;
69
- --ly-container-wide: var(--ly-wrapper-wide);
70
- --ly-container-max: var(--ly-container-lg);
71
- --ly-content-readable: var(--ly-wrapper-prose);
72
- --ly-carousel-item-min: var(--ly-reel-item-min);
73
- --ly-carousel-item-max: var(--ly-reel-item-max);
74
- --ly-sidebar-min: 14rem;
75
- --ly-sidebar-width: var(--ly-recipe-rail);
76
- --ly-sidebar-max: var(--ly-recipe-aside);
77
- --ly-pane-fixed: var(--ly-pane-size);
78
- --ly-z-sidebar: 10;
68
+ --ly-card-grid-min: 16rem;
69
+
70
+ --ly-app-shell-medium-areas:
71
+ "header header"
72
+ "sidebar main"
73
+ "aside main"
74
+ "footer footer";
75
+ --ly-app-shell-medium-columns:
76
+ minmax(min(100%, var(--ly-recipe-rail)), auto)
77
+ minmax(0, 1fr);
78
+ --ly-app-shell-wide-areas:
79
+ "sidebar header header"
80
+ "sidebar main aside"
81
+ "sidebar footer footer";
82
+ --ly-app-shell-wide-columns:
83
+ minmax(min(100%, var(--ly-recipe-rail)), auto)
84
+ minmax(0, 1fr)
85
+ minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
86
+
87
+ --ly-dashboard-medium-areas:
88
+ "header header"
89
+ "nav nav"
90
+ "main aside"
91
+ "footer footer";
92
+ --ly-dashboard-medium-columns:
93
+ minmax(0, 1fr)
94
+ minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
95
+ --ly-dashboard-wide-areas:
96
+ "nav header header"
97
+ "nav main aside"
98
+ "nav footer footer";
99
+ --ly-dashboard-wide-columns:
100
+ minmax(min(100%, var(--ly-recipe-rail)), auto)
101
+ minmax(0, 1fr)
102
+ minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
103
+
104
+ --ly-docs-wide-areas:
105
+ "header header"
106
+ "nav main"
107
+ "nav aside"
108
+ "footer footer";
109
+ --ly-docs-wide-columns:
110
+ minmax(min(100%, var(--ly-recipe-rail)), auto)
111
+ minmax(0, 1fr);
112
+ --ly-list-detail-wide-areas:
113
+ "primary secondary"
114
+ "actions actions";
115
+ --ly-list-detail-wide-columns:
116
+ minmax(min(100%, var(--ly-pane-size)), 0.7fr)
117
+ minmax(0, 1fr);
118
+ --ly-split-hero-wide-areas:
119
+ "content media"
120
+ "actions media";
121
+ --ly-split-hero-wide-columns:
122
+ minmax(0, var(--ly-split-primary, 1fr))
123
+ minmax(0, var(--ly-split-secondary, 1fr));
124
+
125
+ container-name: ly-scope;
126
+ container-type: inline-size;
127
+ min-inline-size: 0;
128
+ min-block-size: 0;
129
+ }
130
+
131
+ /* Enhance viewport-bound tokens only when dynamic viewport units parse. */
132
+ @supports (height: 100dvh) {
133
+ :where(.ly-root) {
134
+ --ly-cover-min: 100dvh;
135
+ --ly-shell-min: 100dvh;
136
+ --ly-scroll-max: min(70dvh, 50rem);
137
+ }
79
138
  }
80
139
  }
81
140
 
@@ -86,45 +145,98 @@
86
145
  }
87
146
 
88
147
  :where(.ly-root) {
89
- min-inline-size: 0;
90
148
  margin: 0;
91
149
  }
92
150
 
93
151
  :where(.ly-root img),
94
152
  :where(.ly-root svg),
95
153
  :where(.ly-root video),
96
- :where(.ly-root canvas) {
154
+ :where(.ly-root canvas),
155
+ :where(.ly-root iframe) {
97
156
  max-inline-size: 100%;
98
157
  }
99
158
  }
100
159
 
160
+ @layer ly.tokens {
161
+ @media (max-height: 44rem) {
162
+ :where(.ly-root) {
163
+ --ly-gap: min(var(--ly-profile-gap), var(--ly-space-4));
164
+ --ly-grid-gap: var(--ly-gap);
165
+ --ly-stack-gap: min(var(--ly-space-4), 3vh);
166
+ --ly-cluster-gap: min(var(--ly-space-3), 2vh);
167
+ --ly-section-padding-block: clamp(1.5rem, 6vh, 3rem);
168
+ --ly-header-height: 3.5rem;
169
+ --ly-scroll-max: min(62vh, 34rem);
170
+ }
171
+
172
+ @supports (height: 100dvh) {
173
+ :where(.ly-root) {
174
+ --ly-stack-gap: min(var(--ly-space-4), 3dvh);
175
+ --ly-cluster-gap: min(var(--ly-space-3), 2dvh);
176
+ --ly-section-padding-block: clamp(1.5rem, 6dvh, 3rem);
177
+ --ly-scroll-max: min(62dvh, 34rem);
178
+ }
179
+ }
180
+ }
181
+
182
+ @media (max-height: 30rem) {
183
+ :where(.ly-root) {
184
+ --ly-cover-min: auto;
185
+ --ly-shell-min: auto;
186
+ --ly-sticky-position: static;
187
+ --ly-section-padding-block: var(--ly-space-5);
188
+ --ly-scroll-max: max(12rem, calc(100vh - 8rem));
189
+ }
190
+
191
+ @supports (height: 100dvh) {
192
+ :where(.ly-root) {
193
+ --ly-scroll-max: max(12rem, calc(100dvh - 8rem));
194
+ }
195
+ }
196
+ }
197
+ }
198
+
199
+ /* wrappers.css */
200
+ /* Wrappers provide fluid measures and become the nearest responsive scope. */
201
+
101
202
  @layer ly.wrappers {
102
203
  .ly-wrapper {
103
- /* Personalities provide only the plain-wrapper default; explicit variants stay authoritative. */
104
204
  --ly-wrapper-max: var(--ly-personality-wrapper-max, var(--ly-wrapper-content));
205
+ --ly-wrapper-fluid-gutter: clamp(1rem, 3vw, 3rem);
206
+ --ly-wrapper-local-gutter: max(
207
+ var(--ly-wrapper-fluid-gutter),
208
+ var(--ly-safe-area-inline)
209
+ );
105
210
 
106
- /* Symmetric safe-area compensation keeps logical gutters stable in either direction. */
107
- container-name: ly-wrapper;
211
+ container-name: ly-scope;
108
212
  container-type: inline-size;
109
- inline-size: min(100%, calc(var(--ly-wrapper-max) + (var(--ly-wrapper-gutter) * 2)));
213
+ inline-size: min(100%, calc(var(--ly-wrapper-max) + (var(--ly-wrapper-local-gutter) * 2)));
214
+ max-inline-size: 100%;
110
215
  margin-inline: auto;
111
- padding-inline: var(--ly-wrapper-gutter);
216
+ padding-inline: var(--ly-wrapper-local-gutter);
217
+ }
218
+
219
+ /* Container-relative gutters enhance the universally valid viewport fallback. */
220
+ @supports (width: 1cqi) {
221
+ .ly-wrapper {
222
+ --ly-wrapper-fluid-gutter: clamp(1rem, 3cqi, 3rem);
223
+ }
112
224
  }
113
225
 
114
226
  .ly-wrapper--compact {
115
- --ly-wrapper-max: 40rem;
227
+ --ly-wrapper-max: var(--ly-wrapper-compact);
116
228
  }
117
229
 
118
230
  .ly-wrapper--prose {
119
- --ly-wrapper-max: 68ch;
231
+ --ly-wrapper-max: var(--ly-wrapper-prose);
120
232
  }
121
233
 
122
234
  .ly-wrapper--content {
123
- --ly-wrapper-max: 72rem;
235
+ --ly-wrapper-max: var(--ly-wrapper-content);
124
236
  }
125
237
 
126
238
  .ly-wrapper--wide {
127
- --ly-wrapper-max: 112rem;
239
+ --ly-wrapper-max: var(--ly-wrapper-wide);
128
240
  }
129
241
 
130
242
  .ly-wrapper--full {
@@ -132,18 +244,19 @@
132
244
  }
133
245
 
134
246
  .ly-wrapper--breakout {
247
+ --ly-wrapper-max: 100%;
135
248
  --ly-breakout-content-size: min(
136
249
  var(--ly-wrapper-content),
137
- calc(100% - (var(--ly-wrapper-gutter) * 2))
250
+ calc(100% - (var(--ly-wrapper-local-gutter) * 2))
138
251
  );
139
252
  --ly-breakout-feature-size: min(
140
253
  var(--ly-wrapper-wide),
141
- calc(100% - (var(--ly-wrapper-gutter) * 2))
254
+ calc(100% - (var(--ly-wrapper-local-gutter) * 2))
142
255
  );
143
256
 
144
257
  display: grid;
145
258
  grid-template-columns:
146
- [full-start] minmax(min(100%, var(--ly-wrapper-gutter)), 1fr)
259
+ [full-start] minmax(min(100%, var(--ly-wrapper-local-gutter)), 1fr)
147
260
  [feature-start] minmax(
148
261
  0,
149
262
  calc((var(--ly-breakout-feature-size) - var(--ly-breakout-content-size)) / 2)
@@ -153,7 +266,7 @@
153
266
  0,
154
267
  calc((var(--ly-breakout-feature-size) - var(--ly-breakout-content-size)) / 2)
155
268
  )
156
- [feature-end] minmax(min(100%, var(--ly-wrapper-gutter)), 1fr) [full-end];
269
+ [feature-end] minmax(min(100%, var(--ly-wrapper-local-gutter)), 1fr) [full-end];
157
270
  inline-size: 100%;
158
271
  padding-inline: 0;
159
272
  }
@@ -161,6 +274,7 @@
161
274
  .ly-wrapper--breakout > * {
162
275
  grid-column: content;
163
276
  min-inline-size: 0;
277
+ max-inline-size: 100%;
164
278
  }
165
279
 
166
280
  .ly-wrapper--breakout > :where(.ly-lane--content, [data-ly-lane="content"]) {
@@ -177,11 +291,14 @@
177
291
  }
178
292
 
179
293
  /* primitives.css */
180
- /* Reusable composition primitives own flow and sizing only. */
294
+ /* Composition primitives use intrinsic sizing so their content chooses reflow points. */
181
295
 
182
296
  @layer ly.primitives {
183
297
  .ly-page {
184
- min-block-size: 100svh;
298
+ min-block-size: 100vh;
299
+ min-block-size: 100dvh;
300
+ padding-block-start: var(--ly-safe-area-block-start);
301
+ padding-block-end: var(--ly-safe-area-block-end);
185
302
  }
186
303
 
187
304
  .ly-header,
@@ -198,9 +315,9 @@
198
315
  }
199
316
 
200
317
  .ly-header--sticky {
201
- position: sticky;
318
+ position: var(--ly-sticky-position, sticky);
202
319
  inset-block-start: 0;
203
- z-index: var(--ly-z-header);
320
+ z-index: var(--ly-z-header, 20);
204
321
  }
205
322
 
206
323
  .ly-section {
@@ -240,6 +357,7 @@
240
357
  .ly-cover {
241
358
  display: flex;
242
359
  flex-direction: column;
360
+ min-block-size: 100vh;
243
361
  min-block-size: var(--ly-cover-min);
244
362
  padding-block: var(--ly-cover-padding, var(--ly-space-5));
245
363
  }
@@ -269,6 +387,7 @@
269
387
  .ly-sidebar > :where(.ly-sidebar__side, [data-ly-sidebar="side"]) {
270
388
  flex-basis: var(--ly-sidebar-size);
271
389
  flex-grow: 1;
390
+ min-inline-size: min(100%, var(--ly-sidebar-size));
272
391
  }
273
392
 
274
393
  .ly-sidebar > :where(.ly-sidebar__content, [data-ly-sidebar="content"]) {
@@ -279,55 +398,44 @@
279
398
 
280
399
  .ly-grid {
281
400
  display: grid;
282
- grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
283
- gap: var(--ly-grid-gap);
284
- }
285
-
286
- .ly-grid--auto {
287
401
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
402
+ gap: var(--ly-grid-gap);
288
403
  }
289
404
 
290
- .ly-grid > *,
291
- .ly-split > *,
292
- .ly-panes > *,
293
- .ly-media > * {
294
- min-inline-size: 0;
405
+ .ly-grid--fixed {
406
+ grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
295
407
  }
296
408
 
297
409
  .ly-split {
298
410
  display: grid;
299
- grid-template-columns: minmax(0, 1fr);
411
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-split-min)), 1fr));
300
412
  gap: var(--ly-gap);
301
413
  align-items: var(--ly-split-align, center);
302
414
  }
303
415
 
304
416
  .ly-panes {
305
417
  display: grid;
306
- grid-template-columns: minmax(0, 1fr);
418
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-pane-min)), 1fr));
307
419
  gap: var(--ly-gap);
308
420
  }
309
421
 
310
422
  .ly-media {
311
423
  display: grid;
312
- grid-template-areas:
313
- "media"
314
- "content"
315
- "actions";
316
- grid-template-columns: minmax(0, 1fr);
424
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-media-min)), 1fr));
317
425
  gap: var(--ly-gap);
318
426
  align-items: var(--ly-media-align, start);
319
427
  }
320
428
 
321
- .ly-media > :where(.ly-media__asset, [data-ly-media="asset"]) {
322
- grid-area: media;
323
- }
324
-
325
- .ly-media > :where(.ly-media__content, [data-ly-media="content"]) {
326
- grid-area: content;
429
+ .ly-media > :where(.ly-media__actions, [data-ly-media="actions"]) {
430
+ min-inline-size: min(100%, var(--ly-media-size));
327
431
  }
328
432
 
329
- .ly-media > :where(.ly-media__actions, [data-ly-media="actions"]) {
330
- grid-area: actions;
433
+ .ly-grid > *,
434
+ .ly-split > *,
435
+ .ly-panes > *,
436
+ .ly-media > * {
437
+ min-inline-size: 0;
438
+ min-block-size: 0;
331
439
  }
332
440
 
333
441
  .ly-reel {
@@ -336,7 +444,6 @@
336
444
  grid-auto-columns: minmax(min(100%, var(--ly-reel-item-min)), var(--ly-reel-item-max));
337
445
  gap: var(--ly-grid-gap);
338
446
  overflow-x: auto;
339
- overflow-inline: auto;
340
447
  overscroll-behavior-inline: contain;
341
448
  scroll-snap-type: inline proximity;
342
449
  }
@@ -360,72 +467,49 @@
360
467
  .ly-scroll {
361
468
  min-block-size: 0;
362
469
  max-block-size: var(--ly-scroll-max);
363
- overflow: auto;
364
- overscroll-behavior: contain;
365
- }
366
-
367
- /* Unsupported container-query browsers retain this safe DOM-order stack. */
368
- }
369
-
370
- @layer ly.primitives {
371
- @container (min-width: 48rem) {
372
- .ly-split {
373
- grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
374
- }
375
-
376
- .ly-panes--2 {
377
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-pane-size)), 0.7fr);
378
- }
379
-
380
- .ly-media {
381
- grid-template-areas:
382
- "media content"
383
- "media actions";
384
- grid-template-columns: minmax(min(100%, var(--ly-media-size)), auto) minmax(0, 1fr);
385
- }
386
- }
387
-
388
- @container (min-width: 64rem) {
389
- .ly-panes--3 {
390
- grid-template-columns:
391
- minmax(min(100%, var(--ly-pane-rail, 14rem)), 0.35fr)
392
- minmax(0, 1fr)
393
- minmax(min(100%, var(--ly-pane-rail, 14rem)), 0.35fr);
394
- }
470
+ overflow-x: clip;
471
+ overflow-y: auto;
472
+ overscroll-behavior-block: contain;
395
473
  }
396
474
  }
397
475
 
398
476
  /* recipes.css */
399
477
  /*
400
- Built-in recipes follow semantic mobile DOM order. Wider arrangements use
401
- named areas so visual placement never changes keyboard or reading order.
478
+ Recipes preserve the narrow-screen DOM order. Automatic topology queries
479
+ consume inherited profile tokens and can be disabled per recipe.
402
480
  */
403
481
 
404
482
  @layer ly.recipes {
405
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]),
406
- :where(.ly-dashboard, [data-ly-recipe="dashboard"]),
407
- :where(.ly-docs, [data-ly-recipe="docs"]),
408
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]),
409
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]),
410
- :where(.ly-gallery, [data-ly-recipe="gallery"]),
411
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
412
- container-name: ly-recipe;
483
+ :where(
484
+ [data-ly-recipe="app-shell"],
485
+ [data-ly-recipe="dashboard"],
486
+ [data-ly-recipe="docs"],
487
+ [data-ly-recipe="list-detail"],
488
+ [data-ly-recipe="split-hero"],
489
+ [data-ly-recipe="gallery"],
490
+ [data-ly-recipe="card-grid"]
491
+ ) {
492
+ container-name: ly-scope;
413
493
  container-type: inline-size;
414
494
  min-inline-size: 0;
495
+ min-block-size: 0;
415
496
  }
416
497
 
417
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]),
418
- :where(.ly-dashboard, [data-ly-recipe="dashboard"]),
419
- :where(.ly-docs, [data-ly-recipe="docs"]),
420
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]),
421
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
498
+ :where(
499
+ [data-ly-recipe="app-shell"],
500
+ [data-ly-recipe="dashboard"],
501
+ [data-ly-recipe="docs"],
502
+ [data-ly-recipe="list-detail"],
503
+ [data-ly-recipe="split-hero"]
504
+ ) {
422
505
  display: grid;
423
506
  grid-template-columns: minmax(0, 1fr);
424
507
  gap: var(--ly-gap);
425
508
  }
426
509
 
427
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
428
- min-block-size: 100svh;
510
+ [data-ly-recipe="app-shell"] {
511
+ min-block-size: 100vh;
512
+ min-block-size: var(--ly-shell-min);
429
513
  grid-template-areas:
430
514
  "header"
431
515
  "sidebar"
@@ -435,16 +519,8 @@
435
519
  grid-template-rows: auto auto minmax(0, 1fr) auto auto;
436
520
  }
437
521
 
438
- :where(.ly-dashboard, [data-ly-recipe="dashboard"]) {
439
- grid-template-areas:
440
- "header"
441
- "nav"
442
- "main"
443
- "aside"
444
- "footer";
445
- }
446
-
447
- :where(.ly-docs, [data-ly-recipe="docs"]) {
522
+ [data-ly-recipe="dashboard"],
523
+ [data-ly-recipe="docs"] {
448
524
  grid-template-areas:
449
525
  "header"
450
526
  "nav"
@@ -453,14 +529,14 @@
453
529
  "footer";
454
530
  }
455
531
 
456
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
532
+ [data-ly-recipe="list-detail"] {
457
533
  grid-template-areas:
458
534
  "primary"
459
535
  "secondary"
460
536
  "actions";
461
537
  }
462
538
 
463
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
539
+ [data-ly-recipe="split-hero"] {
464
540
  grid-template-areas:
465
541
  "content"
466
542
  "media"
@@ -468,279 +544,192 @@
468
544
  align-items: var(--ly-split-hero-align, center);
469
545
  }
470
546
 
471
- :where(.ly-gallery, [data-ly-recipe="gallery"]),
472
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
547
+ [data-ly-recipe="gallery"],
548
+ [data-ly-recipe="card-grid"] {
473
549
  display: grid;
474
550
  gap: var(--ly-grid-gap);
475
551
  }
476
552
 
477
- :where(.ly-gallery, [data-ly-recipe="gallery"]) {
553
+ [data-ly-recipe="gallery"] {
478
554
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-gallery-min)), 1fr));
479
555
  }
480
556
 
481
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
557
+ [data-ly-recipe="card-grid"] {
482
558
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-card-grid-min)), 1fr));
483
559
  }
484
560
 
485
- :where(.ly-gallery, [data-ly-recipe="gallery"]) > *,
486
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) > * {
561
+ :where(
562
+ [data-ly-recipe="gallery"],
563
+ [data-ly-recipe="card-grid"]
564
+ )[data-ly-responsive="manual"] {
565
+ grid-template-columns: minmax(0, 1fr);
566
+ }
567
+
568
+ :where(
569
+ [data-ly-recipe="app-shell"],
570
+ [data-ly-recipe="dashboard"],
571
+ [data-ly-recipe="docs"],
572
+ [data-ly-recipe="list-detail"],
573
+ [data-ly-recipe="split-hero"],
574
+ [data-ly-recipe="gallery"],
575
+ [data-ly-recipe="card-grid"]
576
+ ) > * {
487
577
  min-inline-size: 0;
578
+ min-block-size: 0;
488
579
  }
489
580
 
490
- :where(.ly-area--header, [data-ly-area="header"]) {
581
+ [data-ly-area="header"] {
491
582
  grid-area: header;
492
- min-inline-size: 0;
493
583
  }
494
584
 
495
- :where(.ly-area--nav, [data-ly-area="nav"]) {
585
+ [data-ly-area="nav"] {
496
586
  grid-area: nav;
497
- min-inline-size: 0;
498
587
  }
499
588
 
500
- :where(.ly-area--main, [data-ly-area="main"]) {
589
+ [data-ly-area="sidebar"] {
590
+ grid-area: sidebar;
591
+ }
592
+
593
+ [data-ly-area="main"] {
501
594
  grid-area: main;
502
- min-inline-size: 0;
503
595
  }
504
596
 
505
- :where(.ly-area--aside, [data-ly-area="aside"]) {
597
+ [data-ly-area="aside"] {
506
598
  grid-area: aside;
507
- min-inline-size: 0;
508
599
  }
509
600
 
510
- :where(.ly-area--footer, [data-ly-area="footer"]) {
601
+ [data-ly-area="footer"] {
511
602
  grid-area: footer;
512
- min-inline-size: 0;
513
603
  }
514
604
 
515
- :where(.ly-area--content, [data-ly-area="content"]) {
605
+ [data-ly-area="content"] {
516
606
  grid-area: content;
517
- min-inline-size: 0;
518
607
  }
519
608
 
520
- :where(.ly-area--media, [data-ly-area="media"]) {
609
+ [data-ly-area="media"] {
521
610
  grid-area: media;
522
- min-inline-size: 0;
523
611
  }
524
612
 
525
- :where(.ly-area--actions, [data-ly-area="actions"]) {
613
+ [data-ly-area="actions"] {
526
614
  grid-area: actions;
527
- min-inline-size: 0;
528
615
  }
529
616
 
530
- :where(.ly-area--primary, [data-ly-area="primary"]) {
617
+ [data-ly-area="primary"] {
531
618
  grid-area: primary;
532
- min-inline-size: 0;
533
619
  }
534
620
 
535
- :where(.ly-area--secondary, [data-ly-area="secondary"]) {
621
+ [data-ly-area="secondary"] {
536
622
  grid-area: secondary;
537
- min-inline-size: 0;
538
- }
539
-
540
- .ly-app-header {
541
- grid-area: header;
542
- min-inline-size: 0;
543
- }
544
-
545
- .ly-app-sidebar {
546
- grid-area: sidebar;
547
- min-inline-size: 0;
548
623
  }
549
624
 
550
- .ly-app-main {
551
- grid-area: main;
552
- min-inline-size: 0;
553
- }
554
-
555
- .ly-app-aside {
556
- grid-area: aside;
557
- min-inline-size: 0;
558
- }
559
-
560
- .ly-app-footer {
561
- grid-area: footer;
562
- min-inline-size: 0;
563
- }
564
-
565
- :where(.ly-app-shell, [data-ly-recipe="app-shell"])
566
- > :where(.ly-area--nav, [data-ly-area="nav"]) {
567
- grid-area: sidebar;
568
- }
569
-
570
- /*
571
- A recipe responds to its nearest ancestor container and then becomes the
572
- containment scope for nested compositions. Standalone roots keep the safe
573
- mobile template when no ancestor container is present.
574
- */
575
- @container (min-width: 48rem) {
576
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
577
- grid-template-areas:
578
- "header header"
579
- "sidebar main"
580
- "aside main"
581
- "footer footer";
582
- grid-template-columns: minmax(min(100%, var(--ly-recipe-rail)), auto) minmax(0, 1fr);
583
- }
584
-
585
- :where(.ly-dashboard, [data-ly-recipe="dashboard"]) {
586
- grid-template-areas:
587
- "header header"
588
- "nav nav"
589
- "main aside"
590
- "footer footer";
591
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
592
- }
593
-
594
- :where(.ly-docs, [data-ly-recipe="docs"]) {
595
- grid-template-areas:
596
- "header header"
597
- "nav main"
598
- "nav aside"
599
- "footer footer";
600
- grid-template-columns: minmax(min(100%, var(--ly-recipe-rail)), auto) minmax(0, 1fr);
601
- }
602
-
603
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
604
- grid-template-areas:
605
- "primary secondary"
606
- "actions actions";
607
- grid-template-columns: minmax(min(100%, var(--ly-pane-size)), 0.7fr) minmax(0, 1fr);
608
- }
609
-
610
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
611
- grid-template-areas:
612
- "content media"
613
- "actions media";
614
- grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
615
- }
616
-
617
- :where(.ly-gallery, [data-ly-recipe="gallery"]) {
618
- --ly-gallery-min: 14rem;
619
- }
620
-
621
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
622
- --ly-card-grid-min: 18rem;
625
+ @container ly-scope (min-width: 42rem) {
626
+ [data-ly-recipe="split-hero"]:not([data-ly-responsive="manual"]) {
627
+ grid-template-areas: var(--ly-split-hero-wide-areas);
628
+ grid-template-columns: var(--ly-split-hero-wide-columns);
623
629
  }
624
630
  }
625
631
 
626
- @container (min-width: 64rem) {
627
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
628
- grid-template-areas:
629
- "sidebar header header"
630
- "sidebar main aside"
631
- "sidebar footer footer";
632
- grid-template-columns:
633
- minmax(min(100%, var(--ly-recipe-rail)), auto)
634
- minmax(0, 1fr)
635
- minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
636
- }
637
-
638
- :where(.ly-dashboard, [data-ly-recipe="dashboard"]) {
639
- grid-template-areas:
640
- "nav header header"
641
- "nav main aside"
642
- "nav footer footer";
643
- grid-template-columns:
644
- minmax(min(100%, var(--ly-recipe-rail)), auto)
645
- minmax(0, 1fr)
646
- minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
632
+ @container ly-scope (min-width: 44rem) {
633
+ [data-ly-recipe="list-detail"]:not([data-ly-responsive="manual"]) {
634
+ grid-template-areas: var(--ly-list-detail-wide-areas);
635
+ grid-template-columns: var(--ly-list-detail-wide-columns);
647
636
  }
637
+ }
648
638
 
649
- :where(.ly-docs, [data-ly-recipe="docs"]) {
650
- grid-template-areas:
651
- "nav header"
652
- "nav main"
653
- "nav aside"
654
- "nav footer";
655
- grid-template-columns: minmax(min(100%, var(--ly-recipe-rail)), auto) minmax(0, 1fr);
639
+ @container ly-scope (min-width: 48rem) {
640
+ [data-ly-recipe="docs"]:not([data-ly-responsive="manual"]) {
641
+ grid-template-areas: var(--ly-docs-wide-areas);
642
+ grid-template-columns: var(--ly-docs-wide-columns);
656
643
  }
644
+ }
657
645
 
658
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
659
- grid-template-columns: minmax(min(100%, var(--ly-pane-size)), 0.45fr) minmax(0, 1fr);
646
+ @container ly-scope (min-width: 52rem) {
647
+ [data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]) {
648
+ grid-template-areas: var(--ly-app-shell-medium-areas);
649
+ grid-template-columns: var(--ly-app-shell-medium-columns);
660
650
  }
661
651
 
662
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
663
- grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
652
+ [data-ly-recipe="dashboard"]:not([data-ly-responsive="manual"]) {
653
+ grid-template-areas: var(--ly-dashboard-medium-areas);
654
+ grid-template-columns: var(--ly-dashboard-medium-columns);
664
655
  }
656
+ }
665
657
 
666
- :where(.ly-gallery, [data-ly-recipe="gallery"]) {
667
- --ly-gallery-min: 16rem;
658
+ @container ly-scope (min-width: 72rem) {
659
+ [data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]) {
660
+ grid-template-areas: var(--ly-app-shell-wide-areas);
661
+ grid-template-columns: var(--ly-app-shell-wide-columns);
668
662
  }
669
663
 
670
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
671
- --ly-card-grid-min: 20rem;
664
+ [data-ly-recipe="dashboard"]:not([data-ly-responsive="manual"]) {
665
+ grid-template-areas: var(--ly-dashboard-wide-areas);
666
+ grid-template-columns: var(--ly-dashboard-wide-columns);
672
667
  }
673
668
  }
674
669
  }
675
670
 
676
671
  /* utilities.css */
672
+ /* Optional structural utilities expose direct token overrides without breakpoint tiers. */
673
+
677
674
  @layer ly.utilities {
678
675
  .ly-cols-1 { --ly-grid-columns: 1; }
679
676
  .ly-cols-2 { --ly-grid-columns: 2; }
680
677
  .ly-cols-3 { --ly-grid-columns: 3; }
681
678
  .ly-cols-4 { --ly-grid-columns: 4; }
682
- .ly-cols-5 { --ly-grid-columns: 5; }
683
679
  .ly-cols-6 { --ly-grid-columns: 6; }
684
- .ly-cols-7 { --ly-grid-columns: 7; }
685
- .ly-cols-8 { --ly-grid-columns: 8; }
686
- .ly-cols-9 { --ly-grid-columns: 9; }
687
- .ly-cols-10 { --ly-grid-columns: 10; }
688
- .ly-cols-11 { --ly-grid-columns: 11; }
689
680
  .ly-cols-12 { --ly-grid-columns: 12; }
690
- .ly-cols-16 { --ly-grid-columns: 16; }
691
681
 
692
682
  .ly-span-1 { grid-column: span 1; }
693
683
  .ly-span-2 { grid-column: span 2; }
694
684
  .ly-span-3 { grid-column: span 3; }
695
685
  .ly-span-4 { grid-column: span 4; }
696
- .ly-span-5 { grid-column: span 5; }
697
- .ly-span-6 { grid-column: span 6; }
698
- .ly-span-7 { grid-column: span 7; }
699
- .ly-span-8 { grid-column: span 8; }
700
- .ly-span-9 { grid-column: span 9; }
701
- .ly-span-10 { grid-column: span 10; }
702
- .ly-span-11 { grid-column: span 11; }
703
- .ly-span-12 { grid-column: span 12; }
704
- .ly-span-13 { grid-column: span 13; }
705
- .ly-span-14 { grid-column: span 14; }
706
- .ly-span-15 { grid-column: span 15; }
707
- .ly-span-16 { grid-column: span 16; }
708
686
  .ly-span-full { grid-column: 1 / -1; }
709
687
 
710
- .ly-gap-0 { --ly-gap: var(--ly-space-0); --ly-grid-gap: var(--ly-space-0); --ly-stack-gap: var(--ly-space-0); --ly-cluster-gap: var(--ly-space-0); }
711
- .ly-gap-1 { --ly-gap: var(--ly-space-1); --ly-grid-gap: var(--ly-space-1); --ly-stack-gap: var(--ly-space-1); --ly-cluster-gap: var(--ly-space-1); }
712
- .ly-gap-2 { --ly-gap: var(--ly-space-2); --ly-grid-gap: var(--ly-space-2); --ly-stack-gap: var(--ly-space-2); --ly-cluster-gap: var(--ly-space-2); }
713
- .ly-gap-3 { --ly-gap: var(--ly-space-3); --ly-grid-gap: var(--ly-space-3); --ly-stack-gap: var(--ly-space-3); --ly-cluster-gap: var(--ly-space-3); }
714
- .ly-gap-4 { --ly-gap: var(--ly-space-4); --ly-grid-gap: var(--ly-space-4); --ly-stack-gap: var(--ly-space-4); --ly-cluster-gap: var(--ly-space-4); }
715
- .ly-gap-5 { --ly-gap: var(--ly-space-5); --ly-grid-gap: var(--ly-space-5); --ly-stack-gap: var(--ly-space-5); --ly-cluster-gap: var(--ly-space-5); }
716
- .ly-gap-6 { --ly-gap: var(--ly-space-6); --ly-grid-gap: var(--ly-space-6); --ly-stack-gap: var(--ly-space-6); --ly-cluster-gap: var(--ly-space-6); }
717
- .ly-gap-7 { --ly-gap: var(--ly-space-7); --ly-grid-gap: var(--ly-space-7); --ly-stack-gap: var(--ly-space-7); --ly-cluster-gap: var(--ly-space-7); }
718
- .ly-gap-8 { --ly-gap: var(--ly-space-8); --ly-grid-gap: var(--ly-space-8); --ly-stack-gap: var(--ly-space-8); --ly-cluster-gap: var(--ly-space-8); }
719
- .ly-gap-9 { --ly-gap: var(--ly-space-9); --ly-grid-gap: var(--ly-space-9); --ly-stack-gap: var(--ly-space-9); --ly-cluster-gap: var(--ly-space-9); }
688
+ .ly-gap-0 {
689
+ --ly-gap: var(--ly-space-0);
690
+ --ly-grid-gap: var(--ly-space-0);
691
+ --ly-stack-gap: var(--ly-space-0);
692
+ --ly-cluster-gap: var(--ly-space-0);
693
+ }
694
+
695
+ .ly-gap-2 {
696
+ --ly-gap: var(--ly-space-2);
697
+ --ly-grid-gap: var(--ly-space-2);
698
+ --ly-stack-gap: var(--ly-space-2);
699
+ --ly-cluster-gap: var(--ly-space-2);
700
+ }
701
+
702
+ .ly-gap-4 {
703
+ --ly-gap: var(--ly-space-4);
704
+ --ly-grid-gap: var(--ly-space-4);
705
+ --ly-stack-gap: var(--ly-space-4);
706
+ --ly-cluster-gap: var(--ly-space-4);
707
+ }
708
+
709
+ .ly-gap-6 {
710
+ --ly-gap: var(--ly-space-6);
711
+ --ly-grid-gap: var(--ly-space-6);
712
+ --ly-stack-gap: var(--ly-space-6);
713
+ --ly-cluster-gap: var(--ly-space-6);
714
+ }
715
+
716
+ .ly-gap-8 {
717
+ --ly-gap: var(--ly-space-8);
718
+ --ly-grid-gap: var(--ly-space-8);
719
+ --ly-stack-gap: var(--ly-space-8);
720
+ --ly-cluster-gap: var(--ly-space-8);
721
+ }
720
722
 
721
723
  .ly-pad-0 { padding: var(--ly-space-0); }
722
- .ly-pad-1 { padding: var(--ly-space-1); }
723
724
  .ly-pad-2 { padding: var(--ly-space-2); }
724
- .ly-pad-3 { padding: var(--ly-space-3); }
725
725
  .ly-pad-4 { padding: var(--ly-space-4); }
726
- .ly-pad-5 { padding: var(--ly-space-5); }
727
726
  .ly-pad-6 { padding: var(--ly-space-6); }
728
- .ly-pad-7 { padding: var(--ly-space-7); }
729
727
  .ly-pad-8 { padding: var(--ly-space-8); }
730
- .ly-pad-9 { padding: var(--ly-space-9); }
731
-
732
- .ly-px-4 { padding-inline: var(--ly-space-4); }
733
- .ly-px-6 { padding-inline: var(--ly-space-6); }
734
- .ly-px-8 { padding-inline: var(--ly-space-8); }
735
- .ly-py-4 { padding-block: var(--ly-space-4); }
736
- .ly-py-6 { padding-block: var(--ly-space-6); }
737
- .ly-py-8 { padding-block: var(--ly-space-8); }
738
728
 
739
729
  .ly-mx-auto { margin-inline: auto; }
740
730
  .ly-w-full { inline-size: 100%; }
741
731
  .ly-h-full { block-size: 100%; }
742
- .ly-min-h-screen { min-block-size: 100svh; }
743
- .ly-bleed { inline-size: 100vw; margin-inline: calc(50% - 50vw); }
732
+ .ly-min-h-screen { min-block-size: 100vh; min-block-size: 100dvh; }
744
733
  .ly-overflow-auto { overflow: auto; }
745
734
  .ly-overflow-hidden { overflow: hidden; }
746
735
 
@@ -754,16 +743,12 @@
754
743
  .ly-justify-between { justify-content: space-between; }
755
744
 
756
745
  .ly-frame-1x1 { --ly-frame-ratio: 1 / 1; }
757
- .ly-frame-2x1 { --ly-frame-ratio: 2 / 1; }
758
746
  .ly-frame-3x2 { --ly-frame-ratio: 3 / 2; }
759
747
  .ly-frame-4x3 { --ly-frame-ratio: 4 / 3; }
760
748
  .ly-frame-16x9 { --ly-frame-ratio: 16 / 9; }
761
749
  .ly-frame-21x9 { --ly-frame-ratio: 21 / 9; }
762
750
 
763
- .ly-hidden { display: none !important; }
764
-
765
- .ly-show-md-up,
766
- .ly-show-lg-up {
751
+ .ly-hidden {
767
752
  display: none !important;
768
753
  }
769
754
 
@@ -778,774 +763,332 @@
778
763
  clip-path: inset(50%) !important;
779
764
  white-space: nowrap !important;
780
765
  }
781
-
782
- /* Explicit escape hatches require consumers to verify focus and reading order. */
783
- .ly-order-first { order: -1; }
784
- .ly-order-normal { order: 0; }
785
- .ly-order-last { order: 999; }
786
- .ly-order-1 { order: 1; }
787
- .ly-order-2 { order: 2; }
788
- .ly-order-3 { order: 3; }
789
- .ly-order-4 { order: 4; }
790
- .ly-order-5 { order: 5; }
791
- .ly-order-6 { order: 6; }
792
-
793
- @container (min-width: 48rem) {
794
- .ly-md-cols-1 { --ly-grid-columns: 1; }
795
- .ly-md-cols-2 { --ly-grid-columns: 2; }
796
- .ly-md-cols-3 { --ly-grid-columns: 3; }
797
- .ly-md-cols-4 { --ly-grid-columns: 4; }
798
- .ly-md-cols-6 { --ly-grid-columns: 6; }
799
- .ly-md-cols-8 { --ly-grid-columns: 8; }
800
- .ly-md-cols-12 { --ly-grid-columns: 12; }
801
- .ly-md-cols-16 { --ly-grid-columns: 16; }
802
- .ly-show-md-up { display: revert !important; }
803
-
804
- .ly-md-order-first { order: -1; }
805
- .ly-md-order-normal { order: 0; }
806
- .ly-md-order-last { order: 999; }
807
- .ly-md-order-1 { order: 1; }
808
- .ly-md-order-2 { order: 2; }
809
- .ly-md-order-3 { order: 3; }
810
- .ly-md-order-4 { order: 4; }
811
- .ly-md-order-5 { order: 5; }
812
- .ly-md-order-6 { order: 6; }
813
- }
814
-
815
- @container (min-width: 64rem) {
816
- .ly-lg-cols-1 { --ly-grid-columns: 1; }
817
- .ly-lg-cols-2 { --ly-grid-columns: 2; }
818
- .ly-lg-cols-3 { --ly-grid-columns: 3; }
819
- .ly-lg-cols-4 { --ly-grid-columns: 4; }
820
- .ly-lg-cols-6 { --ly-grid-columns: 6; }
821
- .ly-lg-cols-8 { --ly-grid-columns: 8; }
822
- .ly-lg-cols-12 { --ly-grid-columns: 12; }
823
- .ly-lg-cols-16 { --ly-grid-columns: 16; }
824
- .ly-show-lg-up { display: revert !important; }
825
-
826
- .ly-lg-order-first { order: -1; }
827
- .ly-lg-order-normal { order: 0; }
828
- .ly-lg-order-last { order: 999; }
829
- .ly-lg-order-1 { order: 1; }
830
- .ly-lg-order-2 { order: 2; }
831
- .ly-lg-order-3 { order: 3; }
832
- .ly-lg-order-4 { order: 4; }
833
- .ly-lg-order-5 { order: 5; }
834
- .ly-lg-order-6 { order: 6; }
835
- }
836
766
  }
837
767
 
838
768
  /* personalities/minimal-saas.css */
839
- /* Layout style: minimal-saas. A measured left rail keeps work areas predictable. */
840
-
841
- @layer ly.personalities.minimal_saas {
769
+ @layer ly.personalities.minimal-saas {
842
770
  :where(.ly-root[data-ly-layout="minimal-saas"]) {
771
+ --ly-personality-wrapper-max: 88rem;
772
+ --ly-profile-gap: var(--ly-space-5);
773
+ --ly-grid-min: 16rem;
843
774
  --ly-recipe-rail: 15rem;
844
775
  --ly-recipe-aside: 16rem;
845
- --ly-grid-columns: 4;
846
- --ly-grid-min: 16rem;
847
- --ly-personality-wrapper-max: 88rem;
848
-
849
- container-name: ly-personality;
850
- container-type: inline-size;
851
- min-inline-size: 0;
852
- }
853
-
854
- @container (min-width: 48rem) {
855
- :where(.ly-root[data-ly-layout="minimal-saas"]) .ly-grid > :nth-child(4n + 1) {
856
- grid-column: span 2;
857
- }
858
- }
859
-
860
- /* The three-track shell waits for a locally feasible allocation. */
861
- @container (min-width: 64rem) {
862
- :where(.ly-root[data-ly-layout="minimal-saas"])
863
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
864
- grid-template-areas:
865
- "sidebar header header"
866
- "sidebar main aside"
867
- "sidebar footer footer";
868
- grid-template-rows: auto minmax(0, 1fr) auto;
869
- grid-template-columns:
870
- minmax(min(100%, 15rem), 0.24fr)
871
- minmax(0, 1fr)
872
- minmax(min(100%, 16rem), 0.28fr);
873
- }
776
+ --ly-split-primary: 1.05fr;
777
+ --ly-split-secondary: 0.95fr;
874
778
  }
875
779
  }
876
780
 
877
781
  /* personalities/bento.css */
878
- /* Layout style: bento. A full-width shell and staggered spans form modular tiles. */
879
-
880
782
  @layer ly.personalities.bento {
881
783
  :where(.ly-root[data-ly-layout="bento"]) {
882
- --ly-grid-columns: 6;
883
- --ly-grid-min: 12rem;
884
- --ly-card-grid-min: 13rem;
885
784
  --ly-personality-wrapper-max: 112rem;
886
-
887
- container-name: ly-personality;
888
- container-type: inline-size;
889
- min-inline-size: 0;
890
- }
891
-
892
- @container (min-width: 48rem) {
893
- :where(.ly-root[data-ly-layout="bento"]) .ly-grid > :nth-child(6n + 1) {
894
- grid-column: span 2;
895
- grid-row: span 2;
896
- }
897
-
898
- :where(.ly-root[data-ly-layout="bento"])
899
- :where(.ly-card-grid, [data-ly-recipe="card-grid"])
900
- > :nth-child(6n + 1) {
901
- grid-column: span 2;
902
- }
903
- }
904
-
905
- /* The three-track shell waits for a locally feasible allocation. */
906
- @container (min-width: 64rem) {
907
- :where(.ly-root[data-ly-layout="bento"])
908
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
909
- grid-template-areas:
910
- "header header header"
911
- "sidebar main main"
912
- "aside main main"
913
- "footer footer footer";
914
- grid-template-rows: auto minmax(0, 1fr) auto auto;
915
- grid-template-columns:
916
- minmax(min(100%, 14rem), 0.3fr)
917
- minmax(0, 1fr)
918
- minmax(0, 1fr);
919
- }
785
+ --ly-profile-gap: var(--ly-space-4);
786
+ --ly-grid-min: 12rem;
787
+ --ly-card-grid-min: 14rem;
788
+ --ly-gallery-min: 11rem;
789
+ --ly-recipe-rail: 14rem;
790
+ --ly-recipe-aside: 18rem;
791
+ --ly-app-shell-wide-areas:
792
+ "header header header"
793
+ "sidebar main main"
794
+ "aside main main"
795
+ "footer footer footer";
796
+ --ly-app-shell-wide-columns:
797
+ minmax(min(100%, var(--ly-recipe-rail)), 0.3fr)
798
+ minmax(0, 1fr)
799
+ minmax(0, 1fr);
920
800
  }
921
801
  }
922
802
 
923
803
  /* personalities/maximalist.css */
924
- /* Layout style: maximalist. A full-bleed four-track mosaic favors dramatic spans. */
925
-
926
804
  @layer ly.personalities.maximalist {
927
805
  :where(.ly-root[data-ly-layout="maximalist"]) {
928
- --ly-grid-columns: 12;
929
- --ly-grid-min: 10rem;
930
806
  --ly-personality-wrapper-max: 100%;
931
- --ly-card-grid-min: 12rem;
932
-
933
- container-name: ly-personality;
934
- container-type: inline-size;
935
- min-inline-size: 0;
936
- }
937
-
938
- @container (min-width: 48rem) {
939
- :where(.ly-root[data-ly-layout="maximalist"])
940
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
941
- grid-template-columns: minmax(min(100%, 18rem), 0.3fr) minmax(0, 1fr);
942
- }
943
- }
944
-
945
- @container (min-width: 56rem) {
946
- :where(.ly-root[data-ly-layout="maximalist"]) .ly-grid > :nth-child(7n + 1) {
947
- grid-column: span 3;
948
- grid-row: span 2;
949
- }
950
-
951
- :where(.ly-root[data-ly-layout="maximalist"])
952
- :where(.ly-gallery, [data-ly-recipe="gallery"])
953
- > :nth-child(5n + 1) {
954
- grid-column: span 2;
955
- grid-row: span 2;
956
- }
957
- }
958
-
959
- /* The four-track shell waits for a locally feasible allocation. */
960
- @container (min-width: 64rem) {
961
- :where(.ly-root[data-ly-layout="maximalist"])
962
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
963
- grid-template-areas:
964
- "header header header header"
965
- "main main sidebar aside"
966
- "main main footer footer";
967
- grid-template-rows: auto minmax(0, 1fr) auto;
968
- grid-template-columns:
969
- minmax(0, 1.4fr)
970
- minmax(0, 0.6fr)
971
- minmax(min(100%, 15rem), 0.32fr)
972
- minmax(min(100%, 18rem), 0.38fr);
973
- }
807
+ --ly-profile-gap: var(--ly-space-7);
808
+ --ly-grid-min: 10rem;
809
+ --ly-card-grid-min: 13rem;
810
+ --ly-gallery-min: 10rem;
811
+ --ly-recipe-rail: 15rem;
812
+ --ly-recipe-aside: 18rem;
813
+ --ly-app-shell-wide-areas:
814
+ "header header header header"
815
+ "main main sidebar aside"
816
+ "main main footer footer";
817
+ --ly-app-shell-wide-columns:
818
+ minmax(0, 1.4fr)
819
+ minmax(0, 0.6fr)
820
+ minmax(min(100%, var(--ly-recipe-rail)), 0.32fr)
821
+ minmax(min(100%, var(--ly-recipe-aside)), 0.38fr);
974
822
  }
975
823
  }
976
824
 
977
825
  /* personalities/bauhaus.css */
978
- /* Layout style: bauhaus. A left rail anchors an intentionally asymmetric grid. */
979
-
980
826
  @layer ly.personalities.bauhaus {
981
827
  :where(.ly-root[data-ly-layout="bauhaus"]) {
828
+ --ly-personality-wrapper-max: 96rem;
829
+ --ly-profile-gap: var(--ly-space-6);
830
+ --ly-grid-min: 13rem;
982
831
  --ly-recipe-rail: 14rem;
983
832
  --ly-recipe-aside: 18rem;
984
- --ly-grid-columns: 6;
985
- --ly-grid-min: 13rem;
986
- --ly-personality-wrapper-max: 96rem;
987
-
988
- container-name: ly-personality;
989
- container-type: inline-size;
990
- min-inline-size: 0;
991
- }
992
-
993
- /* Cap the fallback rail until the wider personality template is eligible. */
994
- @container (min-width: 48rem) {
995
- :where(.ly-root[data-ly-layout="bauhaus"])
996
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
997
- grid-template-columns: minmax(min(100%, 14rem), 0.3fr) minmax(0, 1fr);
998
- }
999
- }
1000
-
1001
- @container (min-width: 52rem) {
1002
- :where(.ly-root[data-ly-layout="bauhaus"]) .ly-grid > :nth-child(3n + 1) {
1003
- grid-column: span 2;
1004
- grid-row: span 2;
1005
- }
1006
- }
1007
-
1008
- /* The four-track shell waits for a locally feasible allocation. */
1009
- @container (min-width: 64rem) {
1010
- :where(.ly-root[data-ly-layout="bauhaus"])
1011
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1012
- grid-template-areas:
1013
- "sidebar header header aside"
1014
- "sidebar main main aside"
1015
- "sidebar footer footer footer";
1016
- grid-template-rows: auto minmax(0, 1fr) auto;
1017
- grid-template-columns:
1018
- minmax(min(100%, 14rem), 0.24fr)
1019
- minmax(0, 0.7fr)
1020
- minmax(0, 1.3fr)
1021
- minmax(min(100%, 18rem), 0.3fr);
1022
- }
833
+ --ly-app-shell-wide-areas:
834
+ "header header header header"
835
+ "sidebar main main aside"
836
+ "sidebar footer footer aside";
837
+ --ly-app-shell-wide-columns:
838
+ minmax(min(100%, var(--ly-recipe-rail)), 0.24fr)
839
+ minmax(0, 0.7fr)
840
+ minmax(0, 1.3fr)
841
+ minmax(min(100%, var(--ly-recipe-aside)), 0.3fr);
1023
842
  }
1024
843
  }
1025
844
 
1026
845
  /* personalities/tactile.css */
1027
- /* Layout style: tactile. A compact left rail leaves a broad, steady work lane. */
1028
-
1029
846
  @layer ly.personalities.tactile {
1030
847
  :where(.ly-root[data-ly-layout="tactile"]) {
848
+ --ly-personality-wrapper-max: 82rem;
849
+ --ly-profile-gap: var(--ly-space-4);
850
+ --ly-grid-min: 15rem;
1031
851
  --ly-recipe-rail: 17rem;
1032
852
  --ly-recipe-aside: 20rem;
1033
- --ly-grid-columns: 5;
1034
- --ly-grid-min: 15rem;
1035
- --ly-personality-wrapper-max: 82rem;
1036
-
1037
- container-name: ly-personality;
1038
- container-type: inline-size;
1039
- min-inline-size: 0;
1040
- }
1041
-
1042
- @container (min-width: 48rem) {
1043
- :where(.ly-root[data-ly-layout="tactile"])
1044
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1045
- grid-template-areas:
1046
- "sidebar header"
1047
- "sidebar main"
1048
- "sidebar aside"
1049
- "sidebar footer";
1050
- grid-template-rows: auto minmax(0, 1fr) auto auto;
1051
- grid-template-columns: minmax(min(100%, 17rem), 0.28fr) minmax(0, 1fr);
1052
- }
1053
-
1054
- :where(.ly-root[data-ly-layout="tactile"]) .ly-grid > :nth-child(5n + 2) {
1055
- grid-column: span 2;
1056
- }
1057
-
1058
- :where(.ly-root[data-ly-layout="tactile"])
1059
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
1060
- grid-template-columns: minmax(min(100%, 20rem), 0.42fr) minmax(0, 0.58fr);
1061
- }
853
+ --ly-app-shell-wide-areas:
854
+ "header header"
855
+ "sidebar main"
856
+ "aside main"
857
+ "footer footer";
858
+ --ly-app-shell-wide-columns:
859
+ minmax(min(100%, var(--ly-recipe-rail)), 0.28fr)
860
+ minmax(0, 1fr);
861
+ --ly-list-detail-wide-columns:
862
+ minmax(min(100%, var(--ly-pane-size)), 0.5fr)
863
+ minmax(0, 0.9fr);
1062
864
  }
1063
865
  }
1064
866
 
1065
867
  /* personalities/neumorphism.css */
1066
- /* Layout style: neumorphism. A calm right rail preserves a compact workspace. */
1067
-
1068
868
  @layer ly.personalities.neumorphism {
1069
869
  :where(.ly-root[data-ly-layout="neumorphism"]) {
870
+ --ly-personality-wrapper-max: 84rem;
871
+ --ly-profile-gap: var(--ly-space-6);
872
+ --ly-grid-min: 17rem;
1070
873
  --ly-recipe-rail: 17rem;
1071
874
  --ly-recipe-aside: 19rem;
1072
- --ly-grid-columns: 4;
1073
- --ly-grid-min: 17rem;
1074
- --ly-personality-wrapper-max: 84rem;
1075
-
1076
- container-name: ly-personality;
1077
- container-type: inline-size;
1078
- min-inline-size: 0;
1079
- }
1080
-
1081
- @container (min-width: 48rem) {
1082
- :where(.ly-root[data-ly-layout="neumorphism"])
1083
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1084
- grid-template-columns: minmax(min(100%, 17rem), 0.3fr) minmax(0, 1fr);
1085
- }
1086
- }
1087
-
1088
- @container (min-width: 52rem) {
1089
- :where(.ly-root[data-ly-layout="neumorphism"])
1090
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1091
- grid-template-areas:
1092
- "header sidebar"
1093
- "main sidebar"
1094
- "aside sidebar"
1095
- "footer sidebar";
1096
- grid-template-rows: auto minmax(0, 1fr) auto auto;
1097
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.3fr);
1098
- }
1099
-
1100
- :where(.ly-root[data-ly-layout="neumorphism"]) .ly-grid > :nth-child(4n + 1) {
1101
- grid-column: span 2;
1102
- }
1103
-
1104
- :where(.ly-root[data-ly-layout="neumorphism"])
1105
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
1106
- grid-template-columns: minmax(0, 0.58fr) minmax(min(100%, 19rem), 0.42fr);
1107
- }
875
+ --ly-app-shell-wide-areas:
876
+ "header sidebar"
877
+ "main sidebar"
878
+ "aside sidebar"
879
+ "footer sidebar";
880
+ --ly-app-shell-wide-columns:
881
+ minmax(0, 1fr)
882
+ minmax(min(100%, var(--ly-recipe-rail)), 0.3fr);
883
+ --ly-list-detail-wide-columns:
884
+ minmax(0, 1.1fr)
885
+ minmax(min(100%, var(--ly-pane-size)), 0.7fr);
1108
886
  }
1109
887
  }
1110
888
 
1111
889
  /* personalities/retrofuturism.css */
1112
- /* Layout style: retrofuturism. Twin rails frame a focused central work zone. */
1113
-
1114
890
  @layer ly.personalities.retrofuturism {
1115
891
  :where(.ly-root[data-ly-layout="retrofuturism"]) {
892
+ --ly-personality-wrapper-max: 106rem;
893
+ --ly-profile-gap: var(--ly-space-5);
894
+ --ly-grid-min: 14rem;
1116
895
  --ly-recipe-rail: 14rem;
1117
896
  --ly-recipe-aside: 17rem;
1118
- --ly-grid-columns: 6;
1119
- --ly-grid-min: 14rem;
1120
- --ly-personality-wrapper-max: 106rem;
1121
-
1122
- container-name: ly-personality;
1123
- container-type: inline-size;
1124
- min-inline-size: 0;
1125
- }
1126
-
1127
- @container (min-width: 48rem) {
1128
- :where(.ly-root[data-ly-layout="retrofuturism"]) .ly-grid > :nth-child(6n + 1) {
1129
- grid-column: span 2;
1130
- }
1131
- }
1132
-
1133
- /* The three-track shell waits for a locally feasible allocation. */
1134
- @container (min-width: 64rem) {
1135
- :where(.ly-root[data-ly-layout="retrofuturism"])
1136
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1137
- grid-template-areas:
1138
- "sidebar header aside"
1139
- "sidebar main aside"
1140
- "sidebar footer aside";
1141
- grid-template-rows: auto minmax(0, 1fr) auto;
1142
- grid-template-columns:
1143
- minmax(min(100%, 14rem), 0.24fr)
1144
- minmax(0, 1fr)
1145
- minmax(min(100%, 17rem), 0.3fr);
1146
- }
897
+ --ly-app-shell-wide-areas:
898
+ "sidebar header aside"
899
+ "sidebar main aside"
900
+ "sidebar footer aside";
901
+ --ly-app-shell-wide-columns:
902
+ minmax(min(100%, var(--ly-recipe-rail)), 0.24fr)
903
+ minmax(0, 1fr)
904
+ minmax(min(100%, var(--ly-recipe-aside)), 0.3fr);
1147
905
  }
1148
906
  }
1149
907
 
1150
908
  /* personalities/brutalism.css */
1151
- /* Layout style: brutalism. A blunt right rail counters a broad primary plane. */
1152
-
1153
909
  @layer ly.personalities.brutalism {
1154
910
  :where(.ly-root[data-ly-layout="brutalism"]) {
1155
- --ly-recipe-rail: 18rem;
1156
- --ly-recipe-aside: 16rem;
1157
- --ly-grid-columns: 6;
1158
- --ly-grid-min: 14rem;
1159
911
  --ly-personality-wrapper-max: 100rem;
1160
-
1161
- container-name: ly-personality;
1162
- container-type: inline-size;
1163
- min-inline-size: 0;
1164
- }
1165
-
1166
- @container (min-width: 48rem) {
1167
- :where(.ly-root[data-ly-layout="brutalism"]) .ly-grid > :nth-child(3n) {
1168
- grid-column: span 2;
1169
- }
1170
- }
1171
-
1172
- /* The three-track shell waits for a locally feasible allocation. */
1173
- @container (min-width: 64rem) {
1174
- :where(.ly-root[data-ly-layout="brutalism"])
1175
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1176
- grid-template-areas:
1177
- "header header sidebar"
1178
- "main aside sidebar"
1179
- "footer footer sidebar";
1180
- grid-template-rows: auto minmax(0, 1fr) auto;
1181
- grid-template-columns:
1182
- minmax(0, 1.3fr)
1183
- minmax(min(100%, 16rem), 0.7fr)
1184
- minmax(min(100%, 18rem), 0.34fr);
1185
- }
912
+ --ly-profile-gap: var(--ly-space-3);
913
+ --ly-grid-min: 14rem;
914
+ --ly-recipe-rail: 16rem;
915
+ --ly-recipe-aside: 18rem;
916
+ --ly-app-shell-wide-areas:
917
+ "header header sidebar"
918
+ "main aside sidebar"
919
+ "footer footer sidebar";
920
+ --ly-app-shell-wide-columns:
921
+ minmax(0, 1.3fr)
922
+ minmax(0, 0.7fr)
923
+ minmax(min(100%, var(--ly-recipe-rail)), 0.34fr);
1186
924
  }
1187
925
  }
1188
926
 
1189
927
  /* personalities/cyberpunk.css */
1190
- /* Layout style: cyberpunk. A narrow command rail fronts a dense three-lane shell. */
1191
-
1192
928
  @layer ly.personalities.cyberpunk {
1193
929
  :where(.ly-root[data-ly-layout="cyberpunk"]) {
930
+ --ly-personality-wrapper-max: 112rem;
931
+ --ly-profile-gap: var(--ly-space-4);
932
+ --ly-grid-min: 12rem;
1194
933
  --ly-recipe-rail: 13rem;
1195
934
  --ly-recipe-aside: 19rem;
1196
- --ly-grid-columns: 8;
1197
- --ly-grid-min: 12rem;
1198
- --ly-personality-wrapper-max: 112rem;
1199
-
1200
- container-name: ly-personality;
1201
- container-type: inline-size;
1202
- min-inline-size: 0;
1203
- }
1204
-
1205
- @container (min-width: 44rem) {
1206
- :where(.ly-root[data-ly-layout="cyberpunk"]) .ly-grid > :nth-child(4n + 2) {
1207
- grid-column: span 3;
1208
- }
1209
- }
1210
-
1211
- /* The three-track shell waits for a locally feasible allocation. */
1212
- @container (min-width: 64rem) {
1213
- :where(.ly-root[data-ly-layout="cyberpunk"])
1214
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1215
- grid-template-areas:
1216
- "sidebar header aside"
1217
- "sidebar main aside"
1218
- "sidebar footer aside";
1219
- grid-template-rows: auto minmax(0, 1fr) auto;
1220
- grid-template-columns:
1221
- minmax(min(100%, 13rem), 0.2fr)
1222
- minmax(0, 1fr)
1223
- minmax(min(100%, 19rem), 0.32fr);
1224
- }
935
+ --ly-app-shell-wide-areas:
936
+ "sidebar header header"
937
+ "sidebar main aside"
938
+ "sidebar footer footer";
939
+ --ly-app-shell-wide-columns:
940
+ minmax(min(100%, var(--ly-recipe-rail)), 0.2fr)
941
+ minmax(0, 1fr)
942
+ minmax(min(100%, var(--ly-recipe-aside)), 0.32fr);
1225
943
  }
1226
944
  }
1227
945
 
1228
946
  /* personalities/y2k.css */
1229
- /* Layout style: y2k. A tall right rail frames a reversed supporting workspace. */
1230
-
1231
947
  @layer ly.personalities.y2k {
1232
948
  :where(.ly-root[data-ly-layout="y2k"]) {
1233
- --ly-recipe-rail: 16rem;
1234
- --ly-recipe-aside: 18rem;
1235
- --ly-grid-columns: 5;
1236
- --ly-grid-min: 13rem;
1237
949
  --ly-personality-wrapper-max: 90rem;
1238
-
1239
- container-name: ly-personality;
1240
- container-type: inline-size;
1241
- min-inline-size: 0;
1242
- }
1243
-
1244
- @container (min-width: 48rem) {
1245
- :where(.ly-root[data-ly-layout="y2k"]) .ly-grid > :nth-child(5n + 1) {
1246
- grid-column: span 3;
1247
- }
1248
- }
1249
-
1250
- /* The three-track shell waits for a locally feasible allocation. */
1251
- @container (min-width: 64rem) {
1252
- :where(.ly-root[data-ly-layout="y2k"])
1253
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1254
- grid-template-areas:
1255
- "header header sidebar"
1256
- "aside main sidebar"
1257
- "footer footer sidebar";
1258
- grid-template-rows: auto minmax(0, 1fr) auto;
1259
- grid-template-columns:
1260
- minmax(min(100%, 18rem), 0.34fr)
1261
- minmax(0, 1fr)
1262
- minmax(min(100%, 16rem), 0.28fr);
1263
- }
950
+ --ly-profile-gap: var(--ly-space-6);
951
+ --ly-grid-min: 13rem;
952
+ --ly-recipe-rail: 18rem;
953
+ --ly-recipe-aside: 16rem;
954
+ --ly-app-shell-wide-areas:
955
+ "header header sidebar"
956
+ "aside main sidebar"
957
+ "footer footer sidebar";
958
+ --ly-app-shell-wide-columns:
959
+ minmax(min(100%, var(--ly-recipe-aside)), 0.34fr)
960
+ minmax(0, 1fr)
961
+ minmax(min(100%, var(--ly-recipe-rail)), 0.28fr);
1264
962
  }
1265
963
  }
1266
964
 
1267
965
  /* personalities/retro-glass.css */
1268
- /* Layout style: retro-glass. A stepped right rail floats beside a wide stage. */
1269
-
1270
- @layer ly.personalities.retro_glass {
966
+ @layer ly.personalities.retro-glass {
1271
967
  :where(.ly-root[data-ly-layout="retro-glass"]) {
1272
- --ly-recipe-rail: 18rem;
1273
- --ly-recipe-aside: 20rem;
1274
- --ly-grid-columns: 8;
1275
- --ly-grid-min: 15rem;
1276
968
  --ly-personality-wrapper-max: 104rem;
1277
-
1278
- container-name: ly-personality;
1279
- container-type: inline-size;
1280
- min-inline-size: 0;
1281
- }
1282
-
1283
- @container (min-width: 48rem) {
1284
- :where(.ly-root[data-ly-layout="retro-glass"])
1285
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1286
- grid-template-columns: minmax(min(100%, 18rem), 0.3fr) minmax(0, 1fr);
1287
- }
1288
- }
1289
-
1290
- @container (min-width: 56rem) {
1291
- :where(.ly-root[data-ly-layout="retro-glass"]) .ly-grid > :nth-child(4n) {
1292
- grid-column: span 2;
1293
- grid-row: span 2;
1294
- }
1295
- }
1296
-
1297
- /* The three-track shell waits for a locally feasible allocation. */
1298
- @container (min-width: 64rem) {
1299
- :where(.ly-root[data-ly-layout="retro-glass"])
1300
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1301
- grid-template-areas:
1302
- "header header sidebar"
1303
- "main main sidebar"
1304
- "aside footer footer";
1305
- grid-template-rows: auto minmax(0, 1fr) auto;
1306
- grid-template-columns:
1307
- minmax(0, 1.25fr)
1308
- minmax(0, 0.75fr)
1309
- minmax(min(100%, 18rem), 0.32fr);
1310
- }
969
+ --ly-profile-gap: var(--ly-space-5);
970
+ --ly-grid-min: 15rem;
971
+ --ly-recipe-rail: 18rem;
972
+ --ly-recipe-aside: 18rem;
973
+ --ly-app-shell-wide-areas:
974
+ "header header sidebar"
975
+ "main main sidebar"
976
+ "aside footer footer";
977
+ --ly-app-shell-wide-columns:
978
+ minmax(0, 1.25fr)
979
+ minmax(0, 0.75fr)
980
+ minmax(min(100%, var(--ly-recipe-rail)), 0.32fr);
1311
981
  }
1312
982
  }
1313
983
 
1314
984
  /* personalities/f-pattern.css */
1315
- /* Layout style: f-pattern. A left rail supports a wide first-reading column. */
1316
-
1317
- @layer ly.personalities.f_pattern {
985
+ @layer ly.personalities.f-pattern {
1318
986
  :where(.ly-root[data-ly-layout="f-pattern"]) {
987
+ --ly-personality-wrapper-max: 92rem;
988
+ --ly-profile-gap: var(--ly-space-4);
989
+ --ly-grid-min: 14rem;
1319
990
  --ly-recipe-rail: 16rem;
1320
991
  --ly-recipe-aside: 18rem;
1321
- --ly-grid-columns: 6;
1322
- --ly-grid-min: 14rem;
1323
- --ly-personality-wrapper-max: 92rem;
1324
-
1325
- container-name: ly-personality;
1326
- container-type: inline-size;
1327
- min-inline-size: 0;
1328
- }
1329
-
1330
- @container (min-width: 48rem) {
1331
- :where(.ly-root[data-ly-layout="f-pattern"])
1332
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1333
- grid-template-columns: minmax(min(100%, 16rem), 0.3fr) minmax(0, 1fr);
1334
- }
1335
- }
1336
-
1337
- @container (min-width: 56rem) {
1338
- :where(.ly-root[data-ly-layout="f-pattern"]) .ly-grid > :nth-child(3n + 1) {
1339
- grid-column: span 2;
1340
- }
1341
-
1342
- :where(.ly-root[data-ly-layout="f-pattern"])
1343
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
1344
- grid-template-columns: minmax(0, 1.35fr) minmax(0, 0.65fr);
1345
- }
1346
- }
1347
-
1348
- /* The three-track shell waits for a locally feasible allocation. */
1349
- @container (min-width: 64rem) {
1350
- :where(.ly-root[data-ly-layout="f-pattern"])
1351
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1352
- grid-template-areas:
1353
- "sidebar header header"
1354
- "sidebar main aside"
1355
- "sidebar footer aside";
1356
- grid-template-rows: auto minmax(0, 1fr) auto;
1357
- grid-template-columns:
1358
- minmax(min(100%, 16rem), 0.26fr)
1359
- minmax(0, 1.35fr)
1360
- minmax(min(100%, 18rem), 0.65fr);
1361
- }
992
+ --ly-app-shell-wide-areas:
993
+ "sidebar header header"
994
+ "sidebar main aside"
995
+ "sidebar footer footer";
996
+ --ly-app-shell-wide-columns:
997
+ minmax(min(100%, var(--ly-recipe-rail)), 0.26fr)
998
+ minmax(0, 1.35fr)
999
+ minmax(min(100%, var(--ly-recipe-aside)), 0.65fr);
1000
+ --ly-split-hero-wide-columns:
1001
+ minmax(0, 1.8fr)
1002
+ minmax(0, 0.8fr);
1362
1003
  }
1363
1004
  }
1364
1005
 
1365
1006
  /* personalities/z-pattern.css */
1366
- /* Layout style: z-pattern. A right rail closes a diagonal reading progression. */
1367
-
1368
- @layer ly.personalities.z_pattern {
1007
+ @layer ly.personalities.z-pattern {
1369
1008
  :where(.ly-root[data-ly-layout="z-pattern"]) {
1009
+ --ly-personality-wrapper-max: 108rem;
1010
+ --ly-profile-gap: var(--ly-space-5);
1011
+ --ly-grid-min: 14rem;
1370
1012
  --ly-recipe-rail: 17rem;
1371
1013
  --ly-recipe-aside: 19rem;
1372
- --ly-grid-columns: 8;
1373
- --ly-grid-min: 14rem;
1374
- --ly-personality-wrapper-max: 108rem;
1375
-
1376
- container-name: ly-personality;
1377
- container-type: inline-size;
1378
- min-inline-size: 0;
1379
- }
1380
-
1381
- @container (min-width: 48rem) {
1382
- :where(.ly-root[data-ly-layout="z-pattern"])
1383
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1384
- grid-template-columns: minmax(min(100%, 17rem), 0.3fr) minmax(0, 1fr);
1385
- }
1386
- }
1387
-
1388
- @container (min-width: 60rem) {
1389
- :where(.ly-root[data-ly-layout="z-pattern"]) .ly-grid > :nth-child(4n + 2) {
1390
- grid-column: span 2;
1391
- align-self: end;
1392
- }
1393
-
1394
- :where(.ly-root[data-ly-layout="z-pattern"])
1395
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
1396
- grid-template-columns: minmax(0, 1.5fr) minmax(0, 0.5fr);
1397
- }
1398
- }
1399
-
1400
- /* The three-track shell waits for a locally feasible allocation. */
1401
- @container (min-width: 64rem) {
1402
- :where(.ly-root[data-ly-layout="z-pattern"])
1403
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1404
- grid-template-areas:
1405
- "header header sidebar"
1406
- "main aside sidebar"
1407
- "footer aside sidebar";
1408
- grid-template-rows: auto minmax(0, 1fr) auto;
1409
- grid-template-columns:
1410
- minmax(0, 1.45fr)
1411
- minmax(min(100%, 19rem), 0.55fr)
1412
- minmax(min(100%, 17rem), 0.3fr);
1413
- }
1014
+ --ly-app-shell-wide-areas:
1015
+ "header header sidebar"
1016
+ "main aside sidebar"
1017
+ "footer aside sidebar";
1018
+ --ly-app-shell-wide-columns:
1019
+ minmax(0, 1.45fr)
1020
+ minmax(min(100%, var(--ly-recipe-aside)), 0.55fr)
1021
+ minmax(min(100%, var(--ly-recipe-rail)), 0.3fr);
1022
+ --ly-split-hero-wide-columns:
1023
+ minmax(0, 1.5fr)
1024
+ minmax(0, 0.5fr);
1414
1025
  }
1415
1026
  }
1416
1027
 
1417
1028
  /* personalities/split-screen.css */
1418
- /* Layout style: split-screen. Equal tracks keep two primary experiences in balance. */
1419
-
1420
- @layer ly.personalities.split_screen {
1029
+ @layer ly.personalities.split-screen {
1421
1030
  :where(.ly-root[data-ly-layout="split-screen"]) {
1422
- --ly-grid-columns: 2;
1423
- --ly-grid-min: 20rem;
1424
1031
  --ly-personality-wrapper-max: 100%;
1425
- --ly-split-primary: 1fr;
1426
- --ly-split-secondary: 1fr;
1427
-
1428
- container-name: ly-personality;
1429
- container-type: inline-size;
1430
- min-inline-size: 0;
1431
- }
1432
-
1433
- @container (min-width: 48rem) {
1434
- :where(.ly-root[data-ly-layout="split-screen"])
1435
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1436
- grid-template-areas:
1437
- "header header"
1438
- "main sidebar"
1439
- "aside sidebar"
1440
- "footer footer";
1441
- grid-template-rows: auto minmax(0, 1fr) auto auto;
1442
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1443
- }
1444
-
1445
- :where(.ly-root[data-ly-layout="split-screen"])
1446
- :where(
1447
- .ly-split,
1448
- .ly-split-hero,
1449
- [data-ly-recipe="split-hero"],
1450
- .ly-list-detail,
1451
- [data-ly-recipe="list-detail"]
1452
- ) {
1453
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1454
- }
1032
+ --ly-profile-gap: var(--ly-space-4);
1033
+ --ly-grid-min: 20rem;
1034
+ /*
1035
+ Fixed preferred halves leave a shrink-safe center track in recipes that
1036
+ retain the shared three-column dashboard topology.
1037
+ */
1038
+ --ly-recipe-rail: 24rem;
1039
+ --ly-recipe-aside: 24rem;
1040
+ --ly-app-shell-wide-areas:
1041
+ "header header"
1042
+ "main sidebar"
1043
+ "aside sidebar"
1044
+ "footer footer";
1045
+ --ly-app-shell-wide-columns:
1046
+ minmax(0, 1fr)
1047
+ minmax(0, 1fr);
1048
+ --ly-split-hero-wide-columns:
1049
+ minmax(0, 1fr)
1050
+ minmax(0, 1fr);
1051
+ --ly-list-detail-wide-columns:
1052
+ minmax(0, 1fr)
1053
+ minmax(0, 1fr);
1455
1054
  }
1456
1055
  }
1457
1056
 
1458
1057
  /* personalities/mondrian.css */
1459
- /* Layout style: mondrian. Unequal zones and spanning blocks create a strict mosaic. */
1460
-
1461
1058
  @layer ly.personalities.mondrian {
1462
1059
  :where(.ly-root[data-ly-layout="mondrian"]) {
1060
+ --ly-personality-wrapper-max: 112rem;
1061
+ --ly-profile-gap: var(--ly-space-3);
1062
+ --ly-grid-min: 11rem;
1463
1063
  --ly-recipe-rail: 13rem;
1464
1064
  --ly-recipe-aside: 18rem;
1465
- --ly-grid-columns: 10;
1466
- --ly-grid-min: 11rem;
1467
- --ly-personality-wrapper-max: 112rem;
1468
-
1469
- container-name: ly-personality;
1470
- container-type: inline-size;
1471
- min-inline-size: 0;
1472
- }
1473
-
1474
- @container (min-width: 48rem) {
1475
- :where(.ly-root[data-ly-layout="mondrian"])
1476
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1477
- grid-template-columns: minmax(min(100%, 13rem), 0.3fr) minmax(0, 1fr);
1478
- }
1479
- }
1480
-
1481
- @container (min-width: 52rem) {
1482
- :where(.ly-root[data-ly-layout="mondrian"]) .ly-grid > :nth-child(5n + 1) {
1483
- grid-column: span 2;
1484
- grid-row: span 2;
1485
- }
1486
- }
1487
-
1488
- /* The three-track shell waits for a locally feasible allocation. */
1489
- @container (min-width: 64rem) {
1490
- :where(.ly-root[data-ly-layout="mondrian"])
1491
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1492
- grid-template-areas:
1493
- "sidebar header header"
1494
- "sidebar main aside"
1495
- "footer footer aside";
1496
- grid-template-rows: auto minmax(0, 1fr) auto;
1497
- grid-template-columns:
1498
- minmax(min(100%, 13rem), 0.22fr)
1499
- minmax(0, 1.45fr)
1500
- minmax(min(100%, 18rem), 0.55fr);
1501
- }
1065
+ --ly-app-shell-wide-areas:
1066
+ "sidebar header header"
1067
+ "sidebar main aside"
1068
+ "footer footer aside";
1069
+ --ly-app-shell-wide-columns:
1070
+ minmax(min(100%, var(--ly-recipe-rail)), 0.22fr)
1071
+ minmax(0, 1.45fr)
1072
+ minmax(min(100%, var(--ly-recipe-aside)), 0.55fr);
1502
1073
  }
1503
1074
  }
1504
1075
 
1505
1076
  /* personalities/synthwave.css */
1506
- /* Layout style: synthwave. A cinematic center stage sits between support zones. */
1507
-
1508
1077
  @layer ly.personalities.synthwave {
1509
1078
  :where(.ly-root[data-ly-layout="synthwave"]) {
1079
+ --ly-personality-wrapper-max: 112rem;
1080
+ --ly-profile-gap: var(--ly-space-6);
1081
+ --ly-grid-min: 14rem;
1510
1082
  --ly-recipe-rail: 16rem;
1511
1083
  --ly-recipe-aside: 20rem;
1512
- --ly-grid-columns: 12;
1513
- --ly-grid-min: 14rem;
1514
- --ly-reel-item-max: 34rem;
1515
- --ly-personality-wrapper-max: 112rem;
1516
-
1517
- container-name: ly-personality;
1518
- container-type: inline-size;
1519
- min-inline-size: 0;
1520
- }
1521
-
1522
- @container (min-width: 48rem) {
1523
- :where(.ly-root[data-ly-layout="synthwave"])
1524
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1525
- grid-template-columns: minmax(min(100%, 16rem), 0.3fr) minmax(0, 1fr);
1526
- }
1527
- }
1528
-
1529
- @container (min-width: 64rem) {
1530
- :where(.ly-root[data-ly-layout="synthwave"])
1531
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1532
- grid-template-areas:
1533
- "header header header"
1534
- "sidebar main aside"
1535
- "footer footer footer";
1536
- grid-template-rows: auto minmax(0, 1fr) auto;
1537
- grid-template-columns:
1538
- minmax(min(100%, 16rem), 0.28fr)
1539
- minmax(0, 1fr)
1540
- minmax(min(100%, 20rem), 0.34fr);
1541
- }
1542
-
1543
- :where(.ly-root[data-ly-layout="synthwave"]) .ly-grid > :nth-child(4n + 1) {
1544
- grid-column: span 3;
1545
- }
1546
-
1547
- :where(.ly-root[data-ly-layout="synthwave"]) .ly-reel {
1548
- grid-auto-columns: minmax(min(100%, 20rem), var(--ly-reel-item-max));
1549
- }
1084
+ --ly-app-shell-wide-areas:
1085
+ "header header header"
1086
+ "sidebar main aside"
1087
+ "footer footer footer";
1088
+ --ly-app-shell-wide-columns:
1089
+ minmax(min(100%, var(--ly-recipe-rail)), 0.28fr)
1090
+ minmax(0, 1fr)
1091
+ minmax(min(100%, var(--ly-recipe-aside)), 0.34fr);
1092
+ --ly-reel-item-min: 20rem;
1550
1093
  }
1551
1094
  }