layout-style-css 2.1.0 → 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 -941
  5. package/dist/layout-style-css.min.css +1 -1
  6. package/dist/personalities/bauhaus.css +13 -39
  7. package/dist/personalities/bento.css +16 -37
  8. package/dist/personalities/brutalism.css +13 -30
  9. package/dist/personalities/cyberpunk.css +12 -29
  10. package/dist/personalities/f-pattern.css +16 -42
  11. package/dist/personalities/maximalist.css +16 -45
  12. package/dist/personalities/minimal-saas.css +7 -31
  13. package/dist/personalities/mondrian.css +12 -37
  14. package/dist/personalities/neumorphism.css +15 -39
  15. package/dist/personalities/retro-glass.css +14 -39
  16. package/dist/personalities/retrofuturism.css +12 -29
  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 -30
  21. package/dist/personalities/z-pattern.css +16 -43
  22. package/dist/personalities.css +1 -1
  23. package/dist/primitives.css +27 -63
  24. package/dist/recipes.css +92 -167
  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 -90
  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 -787
  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 -46
  60. package/styles/personalities/bento.css +0 -43
  61. package/styles/personalities/brutalism.css +0 -36
  62. package/styles/personalities/cyberpunk.css +0 -36
  63. package/styles/personalities/f-pattern.css +0 -48
  64. package/styles/personalities/maximalist.css +0 -51
  65. package/styles/personalities/minimal-saas.css +0 -37
  66. package/styles/personalities/mondrian.css +0 -44
  67. package/styles/personalities/neumorphism.css +0 -46
  68. package/styles/personalities/retro-glass.css +0 -44
  69. package/styles/personalities/retrofuturism.css +0 -36
  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 -36
  74. package/styles/personalities/z-pattern.css +0 -49
  75. package/styles/personalities.css +0 -18
  76. package/styles/primitives.css +0 -219
  77. package/styles/recipes.css +0 -270
  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,271 +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
- }
549
-
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
623
  }
569
624
 
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);
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);
636
636
  }
637
+ }
637
638
 
638
- :where(.ly-dashboard, [data-ly-recipe="dashboard"]),
639
- :where(.ly-docs, [data-ly-recipe="docs"]) {
640
- grid-template-areas:
641
- "nav header header"
642
- "nav main aside"
643
- "nav footer footer";
644
- grid-template-columns:
645
- minmax(min(100%, var(--ly-recipe-rail)), auto)
646
- minmax(0, 1fr)
647
- minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
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);
648
643
  }
644
+ }
649
645
 
650
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
651
- 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);
652
650
  }
653
651
 
654
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
655
- 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);
656
655
  }
656
+ }
657
657
 
658
- :where(.ly-gallery, [data-ly-recipe="gallery"]) {
659
- --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);
660
662
  }
661
663
 
662
- :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
663
- --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);
664
667
  }
665
668
  }
666
669
  }
667
670
 
668
671
  /* utilities.css */
672
+ /* Optional structural utilities expose direct token overrides without breakpoint tiers. */
673
+
669
674
  @layer ly.utilities {
670
675
  .ly-cols-1 { --ly-grid-columns: 1; }
671
676
  .ly-cols-2 { --ly-grid-columns: 2; }
672
677
  .ly-cols-3 { --ly-grid-columns: 3; }
673
678
  .ly-cols-4 { --ly-grid-columns: 4; }
674
- .ly-cols-5 { --ly-grid-columns: 5; }
675
679
  .ly-cols-6 { --ly-grid-columns: 6; }
676
- .ly-cols-7 { --ly-grid-columns: 7; }
677
- .ly-cols-8 { --ly-grid-columns: 8; }
678
- .ly-cols-9 { --ly-grid-columns: 9; }
679
- .ly-cols-10 { --ly-grid-columns: 10; }
680
- .ly-cols-11 { --ly-grid-columns: 11; }
681
680
  .ly-cols-12 { --ly-grid-columns: 12; }
682
- .ly-cols-16 { --ly-grid-columns: 16; }
683
681
 
684
682
  .ly-span-1 { grid-column: span 1; }
685
683
  .ly-span-2 { grid-column: span 2; }
686
684
  .ly-span-3 { grid-column: span 3; }
687
685
  .ly-span-4 { grid-column: span 4; }
688
- .ly-span-5 { grid-column: span 5; }
689
- .ly-span-6 { grid-column: span 6; }
690
- .ly-span-7 { grid-column: span 7; }
691
- .ly-span-8 { grid-column: span 8; }
692
- .ly-span-9 { grid-column: span 9; }
693
- .ly-span-10 { grid-column: span 10; }
694
- .ly-span-11 { grid-column: span 11; }
695
- .ly-span-12 { grid-column: span 12; }
696
- .ly-span-13 { grid-column: span 13; }
697
- .ly-span-14 { grid-column: span 14; }
698
- .ly-span-15 { grid-column: span 15; }
699
- .ly-span-16 { grid-column: span 16; }
700
686
  .ly-span-full { grid-column: 1 / -1; }
701
687
 
702
- .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); }
703
- .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); }
704
- .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); }
705
- .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); }
706
- .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); }
707
- .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); }
708
- .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); }
709
- .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); }
710
- .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); }
711
- .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
+ }
712
722
 
713
723
  .ly-pad-0 { padding: var(--ly-space-0); }
714
- .ly-pad-1 { padding: var(--ly-space-1); }
715
724
  .ly-pad-2 { padding: var(--ly-space-2); }
716
- .ly-pad-3 { padding: var(--ly-space-3); }
717
725
  .ly-pad-4 { padding: var(--ly-space-4); }
718
- .ly-pad-5 { padding: var(--ly-space-5); }
719
726
  .ly-pad-6 { padding: var(--ly-space-6); }
720
- .ly-pad-7 { padding: var(--ly-space-7); }
721
727
  .ly-pad-8 { padding: var(--ly-space-8); }
722
- .ly-pad-9 { padding: var(--ly-space-9); }
723
-
724
- .ly-px-4 { padding-inline: var(--ly-space-4); }
725
- .ly-px-6 { padding-inline: var(--ly-space-6); }
726
- .ly-px-8 { padding-inline: var(--ly-space-8); }
727
- .ly-py-4 { padding-block: var(--ly-space-4); }
728
- .ly-py-6 { padding-block: var(--ly-space-6); }
729
- .ly-py-8 { padding-block: var(--ly-space-8); }
730
728
 
731
729
  .ly-mx-auto { margin-inline: auto; }
732
730
  .ly-w-full { inline-size: 100%; }
733
731
  .ly-h-full { block-size: 100%; }
734
- .ly-min-h-screen { min-block-size: 100svh; }
735
- .ly-bleed { inline-size: 100vw; margin-inline: calc(50% - 50vw); }
732
+ .ly-min-h-screen { min-block-size: 100vh; min-block-size: 100dvh; }
736
733
  .ly-overflow-auto { overflow: auto; }
737
734
  .ly-overflow-hidden { overflow: hidden; }
738
735
 
@@ -746,16 +743,12 @@
746
743
  .ly-justify-between { justify-content: space-between; }
747
744
 
748
745
  .ly-frame-1x1 { --ly-frame-ratio: 1 / 1; }
749
- .ly-frame-2x1 { --ly-frame-ratio: 2 / 1; }
750
746
  .ly-frame-3x2 { --ly-frame-ratio: 3 / 2; }
751
747
  .ly-frame-4x3 { --ly-frame-ratio: 4 / 3; }
752
748
  .ly-frame-16x9 { --ly-frame-ratio: 16 / 9; }
753
749
  .ly-frame-21x9 { --ly-frame-ratio: 21 / 9; }
754
750
 
755
- .ly-hidden { display: none !important; }
756
-
757
- .ly-show-md-up,
758
- .ly-show-lg-up {
751
+ .ly-hidden {
759
752
  display: none !important;
760
753
  }
761
754
 
@@ -770,739 +763,332 @@
770
763
  clip-path: inset(50%) !important;
771
764
  white-space: nowrap !important;
772
765
  }
773
-
774
- /* Explicit escape hatches require consumers to verify focus and reading order. */
775
- .ly-order-first { order: -1; }
776
- .ly-order-normal { order: 0; }
777
- .ly-order-last { order: 999; }
778
- .ly-order-1 { order: 1; }
779
- .ly-order-2 { order: 2; }
780
- .ly-order-3 { order: 3; }
781
- .ly-order-4 { order: 4; }
782
- .ly-order-5 { order: 5; }
783
- .ly-order-6 { order: 6; }
784
-
785
- @container (min-width: 48rem) {
786
- .ly-md-cols-1 { --ly-grid-columns: 1; }
787
- .ly-md-cols-2 { --ly-grid-columns: 2; }
788
- .ly-md-cols-3 { --ly-grid-columns: 3; }
789
- .ly-md-cols-4 { --ly-grid-columns: 4; }
790
- .ly-md-cols-6 { --ly-grid-columns: 6; }
791
- .ly-md-cols-8 { --ly-grid-columns: 8; }
792
- .ly-md-cols-12 { --ly-grid-columns: 12; }
793
- .ly-md-cols-16 { --ly-grid-columns: 16; }
794
- .ly-show-md-up { display: revert !important; }
795
-
796
- .ly-md-order-first { order: -1; }
797
- .ly-md-order-normal { order: 0; }
798
- .ly-md-order-last { order: 999; }
799
- .ly-md-order-1 { order: 1; }
800
- .ly-md-order-2 { order: 2; }
801
- .ly-md-order-3 { order: 3; }
802
- .ly-md-order-4 { order: 4; }
803
- .ly-md-order-5 { order: 5; }
804
- .ly-md-order-6 { order: 6; }
805
- }
806
-
807
- @container (min-width: 64rem) {
808
- .ly-lg-cols-1 { --ly-grid-columns: 1; }
809
- .ly-lg-cols-2 { --ly-grid-columns: 2; }
810
- .ly-lg-cols-3 { --ly-grid-columns: 3; }
811
- .ly-lg-cols-4 { --ly-grid-columns: 4; }
812
- .ly-lg-cols-6 { --ly-grid-columns: 6; }
813
- .ly-lg-cols-8 { --ly-grid-columns: 8; }
814
- .ly-lg-cols-12 { --ly-grid-columns: 12; }
815
- .ly-lg-cols-16 { --ly-grid-columns: 16; }
816
- .ly-show-lg-up { display: revert !important; }
817
-
818
- .ly-lg-order-first { order: -1; }
819
- .ly-lg-order-normal { order: 0; }
820
- .ly-lg-order-last { order: 999; }
821
- .ly-lg-order-1 { order: 1; }
822
- .ly-lg-order-2 { order: 2; }
823
- .ly-lg-order-3 { order: 3; }
824
- .ly-lg-order-4 { order: 4; }
825
- .ly-lg-order-5 { order: 5; }
826
- .ly-lg-order-6 { order: 6; }
827
- }
828
766
  }
829
767
 
830
768
  /* personalities/minimal-saas.css */
831
- /* Layout style: minimal-saas. A measured left rail keeps work areas predictable. */
832
-
833
- @layer ly.personalities.minimal_saas {
769
+ @layer ly.personalities.minimal-saas {
834
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;
835
774
  --ly-recipe-rail: 15rem;
836
775
  --ly-recipe-aside: 16rem;
837
- --ly-grid-columns: 4;
838
- --ly-grid-min: 16rem;
839
- --ly-personality-wrapper-max: 88rem;
840
-
841
- container-name: ly-personality;
842
- container-type: inline-size;
843
- min-inline-size: 0;
844
- }
845
-
846
- /* Named areas rearrange the shell without changing its mobile DOM or focus order. */
847
- @container ly-personality (min-width: 48rem) {
848
- :where(.ly-root[data-ly-layout="minimal-saas"])
849
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
850
- grid-template-areas:
851
- "sidebar header header"
852
- "sidebar main aside"
853
- "sidebar footer footer";
854
- grid-template-rows: auto minmax(0, 1fr) auto;
855
- grid-template-columns:
856
- minmax(min(100%, 15rem), 0.24fr)
857
- minmax(0, 1fr)
858
- minmax(min(100%, 16rem), 0.28fr);
859
- }
860
-
861
- :where(.ly-root[data-ly-layout="minimal-saas"]) .ly-grid > :nth-child(4n + 1) {
862
- grid-column: span 2;
863
- }
776
+ --ly-split-primary: 1.05fr;
777
+ --ly-split-secondary: 0.95fr;
864
778
  }
865
779
  }
866
780
 
867
781
  /* personalities/bento.css */
868
- /* Layout style: bento. A full-width shell and staggered spans form modular tiles. */
869
-
870
782
  @layer ly.personalities.bento {
871
783
  :where(.ly-root[data-ly-layout="bento"]) {
872
- --ly-grid-columns: 6;
873
- --ly-grid-min: 12rem;
874
- --ly-card-grid-min: 13rem;
875
784
  --ly-personality-wrapper-max: 112rem;
876
-
877
- container-name: ly-personality;
878
- container-type: inline-size;
879
- min-inline-size: 0;
880
- }
881
-
882
- @container ly-personality (min-width: 48rem) {
883
- :where(.ly-root[data-ly-layout="bento"])
884
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
885
- grid-template-areas:
886
- "header header header"
887
- "sidebar main main"
888
- "aside main main"
889
- "footer footer footer";
890
- grid-template-rows: auto minmax(0, 1fr) auto auto;
891
- grid-template-columns:
892
- minmax(min(100%, 14rem), 0.3fr)
893
- minmax(0, 1fr)
894
- minmax(0, 1fr);
895
- }
896
-
897
- :where(.ly-root[data-ly-layout="bento"]) .ly-grid > :nth-child(6n + 1) {
898
- grid-column: span 2;
899
- grid-row: span 2;
900
- }
901
-
902
- :where(.ly-root[data-ly-layout="bento"])
903
- :where(.ly-card-grid, [data-ly-recipe="card-grid"])
904
- > :nth-child(6n + 1) {
905
- grid-column: span 2;
906
- }
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);
907
800
  }
908
801
  }
909
802
 
910
803
  /* personalities/maximalist.css */
911
- /* Layout style: maximalist. A full-bleed four-track mosaic favors dramatic spans. */
912
-
913
804
  @layer ly.personalities.maximalist {
914
805
  :where(.ly-root[data-ly-layout="maximalist"]) {
915
- --ly-grid-columns: 12;
916
- --ly-grid-min: 10rem;
917
806
  --ly-personality-wrapper-max: 100%;
918
- --ly-card-grid-min: 12rem;
919
-
920
- container-name: ly-personality;
921
- container-type: inline-size;
922
- min-inline-size: 0;
923
- }
924
-
925
- @container ly-personality (min-width: 48rem) {
926
- :where(.ly-root[data-ly-layout="maximalist"])
927
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
928
- grid-template-columns: minmax(min(100%, 18rem), 0.3fr) minmax(0, 1fr);
929
- }
930
- }
931
-
932
- @container ly-personality (min-width: 56rem) {
933
- :where(.ly-root[data-ly-layout="maximalist"])
934
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
935
- grid-template-areas:
936
- "header header header header"
937
- "main main sidebar aside"
938
- "main main footer footer";
939
- grid-template-rows: auto minmax(0, 1fr) auto;
940
- grid-template-columns:
941
- minmax(0, 1.4fr)
942
- minmax(0, 0.6fr)
943
- minmax(min(100%, 15rem), 0.32fr)
944
- minmax(min(100%, 18rem), 0.38fr);
945
- }
946
-
947
- :where(.ly-root[data-ly-layout="maximalist"]) .ly-grid > :nth-child(7n + 1) {
948
- grid-column: span 3;
949
- grid-row: span 2;
950
- }
951
-
952
- :where(.ly-root[data-ly-layout="maximalist"])
953
- :where(.ly-gallery, [data-ly-recipe="gallery"])
954
- > :nth-child(5n + 1) {
955
- grid-column: span 2;
956
- grid-row: span 2;
957
- }
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);
958
822
  }
959
823
  }
960
824
 
961
825
  /* personalities/bauhaus.css */
962
- /* Layout style: bauhaus. A left rail anchors an intentionally asymmetric grid. */
963
-
964
826
  @layer ly.personalities.bauhaus {
965
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;
966
831
  --ly-recipe-rail: 14rem;
967
832
  --ly-recipe-aside: 18rem;
968
- --ly-grid-columns: 6;
969
- --ly-grid-min: 13rem;
970
- --ly-personality-wrapper-max: 96rem;
971
-
972
- container-name: ly-personality;
973
- container-type: inline-size;
974
- min-inline-size: 0;
975
- }
976
-
977
- /* Cap the fallback rail until the wider personality template is eligible. */
978
- @container ly-personality (min-width: 48rem) {
979
- :where(.ly-root[data-ly-layout="bauhaus"])
980
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
981
- grid-template-columns: minmax(min(100%, 14rem), 0.3fr) minmax(0, 1fr);
982
- }
983
- }
984
-
985
- @container ly-personality (min-width: 52rem) {
986
- :where(.ly-root[data-ly-layout="bauhaus"])
987
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
988
- grid-template-areas:
989
- "sidebar header header aside"
990
- "sidebar main main aside"
991
- "sidebar footer footer footer";
992
- grid-template-rows: auto minmax(0, 1fr) auto;
993
- grid-template-columns:
994
- minmax(min(100%, 14rem), 0.24fr)
995
- minmax(0, 0.7fr)
996
- minmax(0, 1.3fr)
997
- minmax(min(100%, 18rem), 0.3fr);
998
- }
999
-
1000
- :where(.ly-root[data-ly-layout="bauhaus"]) .ly-grid > :nth-child(3n + 1) {
1001
- grid-column: span 2;
1002
- grid-row: span 2;
1003
- }
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);
1004
842
  }
1005
843
  }
1006
844
 
1007
845
  /* personalities/tactile.css */
1008
- /* Layout style: tactile. A compact left rail leaves a broad, steady work lane. */
1009
-
1010
846
  @layer ly.personalities.tactile {
1011
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;
1012
851
  --ly-recipe-rail: 17rem;
1013
852
  --ly-recipe-aside: 20rem;
1014
- --ly-grid-columns: 5;
1015
- --ly-grid-min: 15rem;
1016
- --ly-personality-wrapper-max: 82rem;
1017
-
1018
- container-name: ly-personality;
1019
- container-type: inline-size;
1020
- min-inline-size: 0;
1021
- }
1022
-
1023
- @container ly-personality (min-width: 48rem) {
1024
- :where(.ly-root[data-ly-layout="tactile"])
1025
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1026
- grid-template-areas:
1027
- "sidebar header"
1028
- "sidebar main"
1029
- "sidebar aside"
1030
- "sidebar footer";
1031
- grid-template-rows: auto minmax(0, 1fr) auto auto;
1032
- grid-template-columns: minmax(min(100%, 17rem), 0.28fr) minmax(0, 1fr);
1033
- }
1034
-
1035
- :where(.ly-root[data-ly-layout="tactile"]) .ly-grid > :nth-child(5n + 2) {
1036
- grid-column: span 2;
1037
- }
1038
-
1039
- :where(.ly-root[data-ly-layout="tactile"])
1040
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
1041
- grid-template-columns: minmax(min(100%, 20rem), 0.42fr) minmax(0, 0.58fr);
1042
- }
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);
1043
864
  }
1044
865
  }
1045
866
 
1046
867
  /* personalities/neumorphism.css */
1047
- /* Layout style: neumorphism. A calm right rail preserves a compact workspace. */
1048
-
1049
868
  @layer ly.personalities.neumorphism {
1050
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;
1051
873
  --ly-recipe-rail: 17rem;
1052
874
  --ly-recipe-aside: 19rem;
1053
- --ly-grid-columns: 4;
1054
- --ly-grid-min: 17rem;
1055
- --ly-personality-wrapper-max: 84rem;
1056
-
1057
- container-name: ly-personality;
1058
- container-type: inline-size;
1059
- min-inline-size: 0;
1060
- }
1061
-
1062
- @container ly-personality (min-width: 48rem) {
1063
- :where(.ly-root[data-ly-layout="neumorphism"])
1064
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1065
- grid-template-columns: minmax(min(100%, 17rem), 0.3fr) minmax(0, 1fr);
1066
- }
1067
- }
1068
-
1069
- @container ly-personality (min-width: 52rem) {
1070
- :where(.ly-root[data-ly-layout="neumorphism"])
1071
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1072
- grid-template-areas:
1073
- "header sidebar"
1074
- "main sidebar"
1075
- "aside sidebar"
1076
- "footer sidebar";
1077
- grid-template-rows: auto minmax(0, 1fr) auto auto;
1078
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.3fr);
1079
- }
1080
-
1081
- :where(.ly-root[data-ly-layout="neumorphism"]) .ly-grid > :nth-child(4n + 1) {
1082
- grid-column: span 2;
1083
- }
1084
-
1085
- :where(.ly-root[data-ly-layout="neumorphism"])
1086
- :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
1087
- grid-template-columns: minmax(0, 0.58fr) minmax(min(100%, 19rem), 0.42fr);
1088
- }
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);
1089
886
  }
1090
887
  }
1091
888
 
1092
889
  /* personalities/retrofuturism.css */
1093
- /* Layout style: retrofuturism. Twin rails frame a focused central work zone. */
1094
-
1095
890
  @layer ly.personalities.retrofuturism {
1096
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;
1097
895
  --ly-recipe-rail: 14rem;
1098
896
  --ly-recipe-aside: 17rem;
1099
- --ly-grid-columns: 6;
1100
- --ly-grid-min: 14rem;
1101
- --ly-personality-wrapper-max: 106rem;
1102
-
1103
- container-name: ly-personality;
1104
- container-type: inline-size;
1105
- min-inline-size: 0;
1106
- }
1107
-
1108
- @container ly-personality (min-width: 48rem) {
1109
- :where(.ly-root[data-ly-layout="retrofuturism"])
1110
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1111
- grid-template-areas:
1112
- "sidebar header aside"
1113
- "sidebar main aside"
1114
- "sidebar footer aside";
1115
- grid-template-rows: auto minmax(0, 1fr) auto;
1116
- grid-template-columns:
1117
- minmax(min(100%, 14rem), 0.24fr)
1118
- minmax(0, 1fr)
1119
- minmax(min(100%, 17rem), 0.3fr);
1120
- }
1121
-
1122
- :where(.ly-root[data-ly-layout="retrofuturism"]) .ly-grid > :nth-child(6n + 1) {
1123
- grid-column: span 2;
1124
- }
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);
1125
905
  }
1126
906
  }
1127
907
 
1128
908
  /* personalities/brutalism.css */
1129
- /* Layout style: brutalism. A blunt right rail counters a broad primary plane. */
1130
-
1131
909
  @layer ly.personalities.brutalism {
1132
910
  :where(.ly-root[data-ly-layout="brutalism"]) {
1133
- --ly-recipe-rail: 18rem;
1134
- --ly-recipe-aside: 16rem;
1135
- --ly-grid-columns: 6;
1136
- --ly-grid-min: 14rem;
1137
911
  --ly-personality-wrapper-max: 100rem;
1138
-
1139
- container-name: ly-personality;
1140
- container-type: inline-size;
1141
- min-inline-size: 0;
1142
- }
1143
-
1144
- @container ly-personality (min-width: 48rem) {
1145
- :where(.ly-root[data-ly-layout="brutalism"])
1146
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1147
- grid-template-areas:
1148
- "header header sidebar"
1149
- "main aside sidebar"
1150
- "footer footer sidebar";
1151
- grid-template-rows: auto minmax(0, 1fr) auto;
1152
- grid-template-columns:
1153
- minmax(0, 1.3fr)
1154
- minmax(min(100%, 16rem), 0.7fr)
1155
- minmax(min(100%, 18rem), 0.34fr);
1156
- }
1157
-
1158
- :where(.ly-root[data-ly-layout="brutalism"]) .ly-grid > :nth-child(3n) {
1159
- grid-column: span 2;
1160
- }
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);
1161
924
  }
1162
925
  }
1163
926
 
1164
927
  /* personalities/cyberpunk.css */
1165
- /* Layout style: cyberpunk. A narrow command rail fronts a dense three-lane shell. */
1166
-
1167
928
  @layer ly.personalities.cyberpunk {
1168
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;
1169
933
  --ly-recipe-rail: 13rem;
1170
934
  --ly-recipe-aside: 19rem;
1171
- --ly-grid-columns: 8;
1172
- --ly-grid-min: 12rem;
1173
- --ly-personality-wrapper-max: 112rem;
1174
-
1175
- container-name: ly-personality;
1176
- container-type: inline-size;
1177
- min-inline-size: 0;
1178
- }
1179
-
1180
- @container ly-personality (min-width: 44rem) {
1181
- :where(.ly-root[data-ly-layout="cyberpunk"])
1182
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1183
- grid-template-areas:
1184
- "sidebar header aside"
1185
- "sidebar main aside"
1186
- "sidebar footer aside";
1187
- grid-template-rows: auto minmax(0, 1fr) auto;
1188
- grid-template-columns:
1189
- minmax(min(100%, 13rem), 0.2fr)
1190
- minmax(0, 1fr)
1191
- minmax(min(100%, 19rem), 0.32fr);
1192
- }
1193
-
1194
- :where(.ly-root[data-ly-layout="cyberpunk"]) .ly-grid > :nth-child(4n + 2) {
1195
- grid-column: span 3;
1196
- }
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);
1197
943
  }
1198
944
  }
1199
945
 
1200
946
  /* personalities/y2k.css */
1201
- /* Layout style: y2k. A tall right rail frames a reversed supporting workspace. */
1202
-
1203
947
  @layer ly.personalities.y2k {
1204
948
  :where(.ly-root[data-ly-layout="y2k"]) {
1205
- --ly-recipe-rail: 16rem;
1206
- --ly-recipe-aside: 18rem;
1207
- --ly-grid-columns: 5;
1208
- --ly-grid-min: 13rem;
1209
949
  --ly-personality-wrapper-max: 90rem;
1210
-
1211
- container-name: ly-personality;
1212
- container-type: inline-size;
1213
- min-inline-size: 0;
1214
- }
1215
-
1216
- @container ly-personality (min-width: 48rem) {
1217
- :where(.ly-root[data-ly-layout="y2k"])
1218
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1219
- grid-template-areas:
1220
- "header header sidebar"
1221
- "aside main sidebar"
1222
- "footer footer sidebar";
1223
- grid-template-rows: auto minmax(0, 1fr) auto;
1224
- grid-template-columns:
1225
- minmax(min(100%, 18rem), 0.34fr)
1226
- minmax(0, 1fr)
1227
- minmax(min(100%, 16rem), 0.28fr);
1228
- }
1229
-
1230
- :where(.ly-root[data-ly-layout="y2k"]) .ly-grid > :nth-child(5n + 1) {
1231
- grid-column: span 3;
1232
- }
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);
1233
962
  }
1234
963
  }
1235
964
 
1236
965
  /* personalities/retro-glass.css */
1237
- /* Layout style: retro-glass. A stepped right rail floats beside a wide stage. */
1238
-
1239
- @layer ly.personalities.retro_glass {
966
+ @layer ly.personalities.retro-glass {
1240
967
  :where(.ly-root[data-ly-layout="retro-glass"]) {
1241
- --ly-recipe-rail: 18rem;
1242
- --ly-recipe-aside: 20rem;
1243
- --ly-grid-columns: 8;
1244
- --ly-grid-min: 15rem;
1245
968
  --ly-personality-wrapper-max: 104rem;
1246
-
1247
- container-name: ly-personality;
1248
- container-type: inline-size;
1249
- min-inline-size: 0;
1250
- }
1251
-
1252
- @container ly-personality (min-width: 48rem) {
1253
- :where(.ly-root[data-ly-layout="retro-glass"])
1254
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1255
- grid-template-columns: minmax(min(100%, 18rem), 0.3fr) minmax(0, 1fr);
1256
- }
1257
- }
1258
-
1259
- @container ly-personality (min-width: 56rem) {
1260
- :where(.ly-root[data-ly-layout="retro-glass"])
1261
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1262
- grid-template-areas:
1263
- "header header sidebar"
1264
- "main main sidebar"
1265
- "aside footer footer";
1266
- grid-template-rows: auto minmax(0, 1fr) auto;
1267
- grid-template-columns:
1268
- minmax(0, 1.25fr)
1269
- minmax(0, 0.75fr)
1270
- minmax(min(100%, 18rem), 0.32fr);
1271
- }
1272
-
1273
- :where(.ly-root[data-ly-layout="retro-glass"]) .ly-grid > :nth-child(4n) {
1274
- grid-column: span 2;
1275
- grid-row: span 2;
1276
- }
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);
1277
981
  }
1278
982
  }
1279
983
 
1280
984
  /* personalities/f-pattern.css */
1281
- /* Layout style: f-pattern. A left rail supports a wide first-reading column. */
1282
-
1283
- @layer ly.personalities.f_pattern {
985
+ @layer ly.personalities.f-pattern {
1284
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;
1285
990
  --ly-recipe-rail: 16rem;
1286
991
  --ly-recipe-aside: 18rem;
1287
- --ly-grid-columns: 6;
1288
- --ly-grid-min: 14rem;
1289
- --ly-personality-wrapper-max: 92rem;
1290
-
1291
- container-name: ly-personality;
1292
- container-type: inline-size;
1293
- min-inline-size: 0;
1294
- }
1295
-
1296
- @container ly-personality (min-width: 48rem) {
1297
- :where(.ly-root[data-ly-layout="f-pattern"])
1298
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1299
- grid-template-columns: minmax(min(100%, 16rem), 0.3fr) minmax(0, 1fr);
1300
- }
1301
- }
1302
-
1303
- @container ly-personality (min-width: 56rem) {
1304
- :where(.ly-root[data-ly-layout="f-pattern"])
1305
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1306
- grid-template-areas:
1307
- "sidebar header header"
1308
- "sidebar main aside"
1309
- "sidebar footer aside";
1310
- grid-template-rows: auto minmax(0, 1fr) auto;
1311
- grid-template-columns:
1312
- minmax(min(100%, 16rem), 0.26fr)
1313
- minmax(0, 1.35fr)
1314
- minmax(min(100%, 18rem), 0.65fr);
1315
- }
1316
-
1317
- :where(.ly-root[data-ly-layout="f-pattern"]) .ly-grid > :nth-child(3n + 1) {
1318
- grid-column: span 2;
1319
- }
1320
-
1321
- :where(.ly-root[data-ly-layout="f-pattern"])
1322
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
1323
- grid-template-columns: minmax(0, 1.35fr) minmax(0, 0.65fr);
1324
- }
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);
1325
1003
  }
1326
1004
  }
1327
1005
 
1328
1006
  /* personalities/z-pattern.css */
1329
- /* Layout style: z-pattern. A right rail closes a diagonal reading progression. */
1330
-
1331
- @layer ly.personalities.z_pattern {
1007
+ @layer ly.personalities.z-pattern {
1332
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;
1333
1012
  --ly-recipe-rail: 17rem;
1334
1013
  --ly-recipe-aside: 19rem;
1335
- --ly-grid-columns: 8;
1336
- --ly-grid-min: 14rem;
1337
- --ly-personality-wrapper-max: 108rem;
1338
-
1339
- container-name: ly-personality;
1340
- container-type: inline-size;
1341
- min-inline-size: 0;
1342
- }
1343
-
1344
- @container ly-personality (min-width: 48rem) {
1345
- :where(.ly-root[data-ly-layout="z-pattern"])
1346
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1347
- grid-template-columns: minmax(min(100%, 17rem), 0.3fr) minmax(0, 1fr);
1348
- }
1349
- }
1350
-
1351
- @container ly-personality (min-width: 60rem) {
1352
- :where(.ly-root[data-ly-layout="z-pattern"])
1353
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1354
- grid-template-areas:
1355
- "header header sidebar"
1356
- "main aside sidebar"
1357
- "footer aside sidebar";
1358
- grid-template-rows: auto minmax(0, 1fr) auto;
1359
- grid-template-columns:
1360
- minmax(0, 1.45fr)
1361
- minmax(min(100%, 19rem), 0.55fr)
1362
- minmax(min(100%, 17rem), 0.3fr);
1363
- }
1364
-
1365
- :where(.ly-root[data-ly-layout="z-pattern"]) .ly-grid > :nth-child(4n + 2) {
1366
- grid-column: span 2;
1367
- align-self: end;
1368
- }
1369
-
1370
- :where(.ly-root[data-ly-layout="z-pattern"])
1371
- :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
1372
- grid-template-columns: minmax(0, 1.5fr) minmax(0, 0.5fr);
1373
- }
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);
1374
1025
  }
1375
1026
  }
1376
1027
 
1377
1028
  /* personalities/split-screen.css */
1378
- /* Layout style: split-screen. Equal tracks keep two primary experiences in balance. */
1379
-
1380
- @layer ly.personalities.split_screen {
1029
+ @layer ly.personalities.split-screen {
1381
1030
  :where(.ly-root[data-ly-layout="split-screen"]) {
1382
- --ly-grid-columns: 2;
1383
- --ly-grid-min: 20rem;
1384
1031
  --ly-personality-wrapper-max: 100%;
1385
- --ly-split-primary: 1fr;
1386
- --ly-split-secondary: 1fr;
1387
-
1388
- container-name: ly-personality;
1389
- container-type: inline-size;
1390
- min-inline-size: 0;
1391
- }
1392
-
1393
- @container ly-personality (min-width: 48rem) {
1394
- :where(.ly-root[data-ly-layout="split-screen"])
1395
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1396
- grid-template-areas:
1397
- "header header"
1398
- "main sidebar"
1399
- "aside sidebar"
1400
- "footer footer";
1401
- grid-template-rows: auto minmax(0, 1fr) auto auto;
1402
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1403
- }
1404
-
1405
- :where(.ly-root[data-ly-layout="split-screen"])
1406
- :where(
1407
- .ly-split,
1408
- .ly-split-hero,
1409
- [data-ly-recipe="split-hero"],
1410
- .ly-list-detail,
1411
- [data-ly-recipe="list-detail"]
1412
- ) {
1413
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1414
- }
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);
1415
1054
  }
1416
1055
  }
1417
1056
 
1418
1057
  /* personalities/mondrian.css */
1419
- /* Layout style: mondrian. Unequal zones and spanning blocks create a strict mosaic. */
1420
-
1421
1058
  @layer ly.personalities.mondrian {
1422
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;
1423
1063
  --ly-recipe-rail: 13rem;
1424
1064
  --ly-recipe-aside: 18rem;
1425
- --ly-grid-columns: 10;
1426
- --ly-grid-min: 11rem;
1427
- --ly-personality-wrapper-max: 112rem;
1428
-
1429
- container-name: ly-personality;
1430
- container-type: inline-size;
1431
- min-inline-size: 0;
1432
- }
1433
-
1434
- @container ly-personality (min-width: 48rem) {
1435
- :where(.ly-root[data-ly-layout="mondrian"])
1436
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1437
- grid-template-columns: minmax(min(100%, 13rem), 0.3fr) minmax(0, 1fr);
1438
- }
1439
- }
1440
-
1441
- @container ly-personality (min-width: 52rem) {
1442
- :where(.ly-root[data-ly-layout="mondrian"])
1443
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1444
- grid-template-areas:
1445
- "sidebar header header"
1446
- "sidebar main aside"
1447
- "footer footer aside";
1448
- grid-template-rows: auto minmax(0, 1fr) auto;
1449
- grid-template-columns:
1450
- minmax(min(100%, 13rem), 0.22fr)
1451
- minmax(0, 1.45fr)
1452
- minmax(min(100%, 18rem), 0.55fr);
1453
- }
1454
-
1455
- :where(.ly-root[data-ly-layout="mondrian"]) .ly-grid > :nth-child(5n + 1) {
1456
- grid-column: span 2;
1457
- grid-row: span 2;
1458
- }
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);
1459
1073
  }
1460
1074
  }
1461
1075
 
1462
1076
  /* personalities/synthwave.css */
1463
- /* Layout style: synthwave. A cinematic center stage sits between support zones. */
1464
-
1465
1077
  @layer ly.personalities.synthwave {
1466
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;
1467
1082
  --ly-recipe-rail: 16rem;
1468
1083
  --ly-recipe-aside: 20rem;
1469
- --ly-grid-columns: 12;
1470
- --ly-grid-min: 14rem;
1471
- --ly-reel-item-max: 34rem;
1472
- --ly-personality-wrapper-max: 112rem;
1473
-
1474
- container-name: ly-personality;
1475
- container-type: inline-size;
1476
- min-inline-size: 0;
1477
- }
1478
-
1479
- @container ly-personality (min-width: 48rem) {
1480
- :where(.ly-root[data-ly-layout="synthwave"])
1481
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1482
- grid-template-columns: minmax(min(100%, 16rem), 0.3fr) minmax(0, 1fr);
1483
- }
1484
- }
1485
-
1486
- @container ly-personality (min-width: 64rem) {
1487
- :where(.ly-root[data-ly-layout="synthwave"])
1488
- :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
1489
- grid-template-areas:
1490
- "header header header"
1491
- "sidebar main aside"
1492
- "footer footer footer";
1493
- grid-template-rows: auto minmax(0, 1fr) auto;
1494
- grid-template-columns:
1495
- minmax(min(100%, 16rem), 0.28fr)
1496
- minmax(0, 1fr)
1497
- minmax(min(100%, 20rem), 0.34fr);
1498
- }
1499
-
1500
- :where(.ly-root[data-ly-layout="synthwave"]) .ly-grid > :nth-child(4n + 1) {
1501
- grid-column: span 3;
1502
- }
1503
-
1504
- :where(.ly-root[data-ly-layout="synthwave"]) .ly-reel {
1505
- grid-auto-columns: minmax(min(100%, 20rem), var(--ly-reel-item-max));
1506
- }
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;
1507
1093
  }
1508
1094
  }