layout-style-css 1.1.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +81 -44
  2. package/CONTRIBUTING.md +55 -50
  3. package/LICENSE +21 -21
  4. package/README.md +236 -636
  5. package/SECURITY.md +50 -45
  6. package/demo/assets/apple-touch-icon.svg +7 -7
  7. package/demo/assets/favicon.svg +7 -7
  8. package/demo/browserconfig.xml +9 -9
  9. package/demo/demo.css +523 -0
  10. package/demo/demo.js +605 -0
  11. package/demo/index.html +325 -976
  12. package/demo/robots.txt +4 -4
  13. package/demo/site.webmanifest +23 -23
  14. package/demo/sitemap.xml +9 -9
  15. package/dist/core.css +6 -0
  16. package/{styles/layout-ui-style-kit-bridge.css → dist/integrations/ui-style-kit.css} +175 -170
  17. package/dist/layout-style-css.css +1473 -1903
  18. package/dist/layout-style-css.min.css +1 -1
  19. package/dist/legacy.css +787 -0
  20. package/dist/personalities/bauhaus.css +46 -0
  21. package/dist/personalities/bento.css +43 -0
  22. package/dist/personalities/brutalism.css +36 -0
  23. package/dist/personalities/cyberpunk.css +36 -0
  24. package/dist/personalities/f-pattern.css +48 -0
  25. package/dist/personalities/maximalist.css +51 -0
  26. package/dist/personalities/minimal-saas.css +37 -0
  27. package/dist/personalities/mondrian.css +44 -0
  28. package/dist/personalities/neumorphism.css +46 -0
  29. package/dist/personalities/retro-glass.css +44 -0
  30. package/dist/personalities/retrofuturism.css +36 -0
  31. package/dist/personalities/split-screen.css +41 -0
  32. package/dist/personalities/synthwave.css +48 -0
  33. package/dist/personalities/tactile.css +39 -0
  34. package/dist/personalities/y2k.css +36 -0
  35. package/dist/personalities/z-pattern.css +49 -0
  36. package/dist/personalities.css +18 -0
  37. package/dist/primitives.css +219 -0
  38. package/dist/recipes.css +270 -0
  39. package/dist/utilities.css +162 -0
  40. package/dist/wrappers.css +174 -0
  41. package/docs/wiki/Contributing.md +36 -30
  42. package/docs/wiki/Demo-And-GitHub-Pages.md +53 -39
  43. package/docs/wiki/Getting-Started.md +51 -68
  44. package/docs/wiki/Home.md +33 -48
  45. package/docs/wiki/Installation-And-CDN.md +72 -58
  46. package/docs/wiki/Layout-Primitives.md +48 -57
  47. package/docs/wiki/Layout-Recipes.md +49 -80
  48. package/docs/wiki/Layout-Styles.md +33 -43
  49. package/docs/wiki/Migrating-To-2.0.md +186 -0
  50. package/docs/wiki/Release-And-Publishing.md +77 -69
  51. package/docs/wiki/Security-And-Support.md +36 -34
  52. package/docs/wiki/UI-Style-Kit-Compatibility.md +49 -54
  53. package/docs/wiki/_Sidebar.md +15 -14
  54. package/package.json +98 -107
  55. package/styles/core.css +6 -0
  56. package/{dist/layout-ui-style-kit-bridge.css → styles/integrations/ui-style-kit.css} +175 -170
  57. package/styles/legacy.css +173 -0
  58. package/styles/personalities/bauhaus.css +46 -0
  59. package/styles/personalities/bento.css +43 -0
  60. package/styles/personalities/brutalism.css +36 -0
  61. package/styles/personalities/cyberpunk.css +36 -0
  62. package/styles/personalities/f-pattern.css +48 -0
  63. package/styles/personalities/maximalist.css +51 -0
  64. package/styles/personalities/minimal-saas.css +37 -0
  65. package/styles/personalities/mondrian.css +44 -0
  66. package/styles/personalities/neumorphism.css +46 -0
  67. package/styles/personalities/retro-glass.css +44 -0
  68. package/styles/personalities/retrofuturism.css +36 -0
  69. package/styles/personalities/split-screen.css +41 -0
  70. package/styles/personalities/synthwave.css +48 -0
  71. package/styles/personalities/tactile.css +39 -0
  72. package/styles/personalities/y2k.css +36 -0
  73. package/styles/personalities/z-pattern.css +49 -0
  74. package/styles/personalities.css +18 -0
  75. package/styles/primitives.css +219 -0
  76. package/styles/recipes.css +270 -0
  77. package/styles/utilities.css +162 -0
  78. package/styles/wrappers.css +174 -0
  79. package/dist/layout-all-with-ui-kit-and-interactive-surface.css +0 -3
  80. package/dist/layout-all-with-ui-kit.css +0 -2
  81. package/dist/layout-all.css +0 -18
  82. package/dist/layout-base.css +0 -539
  83. package/dist/layout-style-bauhaus.css +0 -70
  84. package/dist/layout-style-bento.css +0 -76
  85. package/dist/layout-style-brutalism.css +0 -70
  86. package/dist/layout-style-cyberpunk.css +0 -70
  87. package/dist/layout-style-f-pattern.css +0 -76
  88. package/dist/layout-style-maximalist.css +0 -93
  89. package/dist/layout-style-minimal-saas.css +0 -67
  90. package/dist/layout-style-mondrian.css +0 -77
  91. package/dist/layout-style-neumorphism.css +0 -72
  92. package/dist/layout-style-retro-glass.css +0 -82
  93. package/dist/layout-style-retrofuturism.css +0 -71
  94. package/dist/layout-style-split-screen.css +0 -62
  95. package/dist/layout-style-synthwave.css +0 -88
  96. package/dist/layout-style-tactile.css +0 -70
  97. package/dist/layout-style-y2k.css +0 -72
  98. package/dist/layout-style-z-pattern.css +0 -76
  99. package/styles/layout-base.css +0 -539
  100. package/styles/layout-style-bauhaus.css +0 -70
  101. package/styles/layout-style-bento.css +0 -76
  102. package/styles/layout-style-brutalism.css +0 -70
  103. package/styles/layout-style-cyberpunk.css +0 -70
  104. package/styles/layout-style-f-pattern.css +0 -76
  105. package/styles/layout-style-maximalist.css +0 -93
  106. package/styles/layout-style-minimal-saas.css +0 -67
  107. package/styles/layout-style-mondrian.css +0 -77
  108. package/styles/layout-style-neumorphism.css +0 -72
  109. package/styles/layout-style-retro-glass.css +0 -82
  110. package/styles/layout-style-retrofuturism.css +0 -71
  111. package/styles/layout-style-split-screen.css +0 -62
  112. package/styles/layout-style-synthwave.css +0 -88
  113. package/styles/layout-style-tactile.css +0 -70
  114. package/styles/layout-style-y2k.css +0 -72
  115. package/styles/layout-style-z-pattern.css +0 -76
@@ -1,1938 +1,1508 @@
1
- /* layout-style-css bundle. Generated from styles/ by scripts/build.mjs. */
2
-
3
- /* layout-base.css */
4
- /*
5
- Layout Style Library base primitives.
6
- This file owns spatial composition only. Visual paint, typography, borders,
7
- shadows, and theme color are intentionally delegated to ui-style-kit-css.
8
- */
9
-
10
- @layer ly.tokens {
11
- :where(.ly-root) {
12
- --ly-space-0: 0;
13
- --ly-space-1: 0.25rem;
14
- --ly-space-2: 0.5rem;
15
- --ly-space-3: 0.75rem;
16
- --ly-space-4: 1rem;
17
- --ly-space-5: 1.5rem;
18
- --ly-space-6: 2rem;
19
- --ly-space-7: 3rem;
20
- --ly-space-8: 4rem;
21
- --ly-space-9: 6rem;
22
-
23
- --ly-container-sm: 40rem;
24
- --ly-container-md: 56rem;
25
- --ly-container-lg: 72rem;
26
- --ly-container-xl: 88rem;
27
- --ly-container-wide: 112rem;
28
- --ly-container-max: var(--ly-container-lg);
29
- --ly-content-readable: 68ch;
30
-
31
- --ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
32
- --ly-section-padding-block: clamp(3rem, 7vw, 6rem);
33
- --ly-gap: var(--ly-space-5);
34
- --ly-grid-gap: var(--ly-gap);
35
- --ly-stack-gap: var(--ly-space-4);
36
- --ly-cluster-gap: var(--ly-space-3);
37
-
38
- --ly-grid-columns: 12;
39
- --ly-grid-min: 16rem;
40
- --ly-card-grid-min: 16rem;
41
- --ly-card-size-sm: 10rem;
42
- --ly-card-size-md: 14rem;
43
- --ly-card-size-lg: 18rem;
44
- --ly-gallery-min: 12rem;
45
- --ly-carousel-item-min: 16rem;
46
- --ly-carousel-item-max: 28rem;
47
- --ly-sidebar-min: 14rem;
48
- --ly-sidebar-width: 18rem;
49
- --ly-sidebar-max: 22rem;
50
- --ly-pane-fixed: 22rem;
51
- --ly-header-height: 4.5rem;
52
-
53
- --ly-radius-sm: 0.5rem;
54
- --ly-radius: 0.875rem;
55
- --ly-radius-lg: 1.5rem;
56
- --ly-radius-xl: 2.25rem;
57
-
58
- --ly-z-header: 20;
59
- --ly-z-sidebar: 10;
60
- }
61
- }
62
-
63
- @layer ly.reset {
64
- :where(.ly-root),
65
- :where(.ly-root *) {
66
- box-sizing: border-box;
67
- }
68
-
69
- :where(.ly-root) {
70
- min-width: 0;
71
- margin: 0;
72
- }
73
-
74
- :where(.ly-root img),
75
- :where(.ly-root svg),
76
- :where(.ly-root video),
77
- :where(.ly-root canvas) {
78
- max-width: 100%;
79
- }
80
- }
81
-
82
- @layer ly.layout {
83
- .ly-page {
84
- min-height: 100svh;
85
- }
86
-
87
- .ly-header,
88
- .ly-footer,
89
- .ly-main,
90
- .ly-wrapper,
91
- .ly-section,
92
- .ly-surface {
93
- min-width: 0;
94
- }
95
-
96
- .ly-header {
97
- min-height: var(--ly-header-height);
98
- }
99
-
100
- .ly-header--sticky {
101
- position: sticky;
102
- top: 0;
103
- z-index: var(--ly-z-header);
104
- }
105
-
106
- .ly-container,
107
- .ly-wrapper {
108
- /* Keep wrappers resilient during viewport resizing without owning visual paint. */
109
- width: min(100% - (var(--ly-page-padding-inline) * 2), var(--ly-container-max));
110
- margin-inline: auto;
111
- }
112
-
113
- .ly-container--sm,
114
- .ly-wrapper--sm {
115
- --ly-container-max: var(--ly-container-sm);
116
- }
117
-
118
- .ly-container--md,
119
- .ly-wrapper--md {
120
- --ly-container-max: var(--ly-container-md);
121
- }
122
-
123
- .ly-container--lg,
124
- .ly-wrapper--lg {
125
- --ly-container-max: var(--ly-container-lg);
126
- }
127
-
128
- .ly-container--xl,
129
- .ly-wrapper--xl {
130
- --ly-container-max: var(--ly-container-xl);
131
- }
132
-
133
- .ly-container--wide,
134
- .ly-wrapper--wide {
135
- --ly-container-max: var(--ly-container-wide);
136
- }
137
-
138
- .ly-container--fluid,
139
- .ly-wrapper--fluid {
140
- width: 100%;
141
- max-width: none;
142
- padding-inline: var(--ly-page-padding-inline);
143
- }
144
-
145
- .ly-wrapper--readable {
146
- --ly-container-max: var(--ly-content-readable);
147
- }
148
-
149
- .ly-readable {
150
- max-width: var(--ly-content-readable);
151
- }
152
-
153
- .ly-section {
154
- padding-block: var(--ly-section-padding-block);
155
- }
156
-
157
- .ly-section--compact {
158
- --ly-section-padding-block: var(--ly-space-7);
159
- }
160
-
161
- .ly-section--flush {
162
- --ly-section-padding-block: 0;
163
- }
164
-
165
- .ly-stack {
166
- display: flex;
167
- flex-direction: column;
168
- gap: var(--ly-stack-gap);
169
- }
170
-
171
- .ly-cluster {
172
- display: flex;
173
- flex-wrap: wrap;
174
- align-items: center;
175
- gap: var(--ly-cluster-gap);
176
- }
177
-
178
- .ly-button-group {
179
- /* Button groups provide flow only; UI libraries keep button paint and states. */
180
- display: flex;
181
- flex-wrap: wrap;
182
- align-items: center;
183
- gap: var(--ly-cluster-gap);
184
- }
185
-
186
- .ly-button-group > * {
187
- flex: 0 1 auto;
188
- min-width: min(100%, var(--ly-button-min, 8rem));
189
- }
190
-
191
- .ly-grid {
192
- display: grid;
193
- grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
194
- gap: var(--ly-grid-gap);
195
- }
196
-
197
- .ly-grid--auto {
198
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
199
- }
200
-
201
- .ly-card-grid {
202
- display: grid;
203
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-card-grid-min)), 1fr));
204
- gap: var(--ly-grid-gap);
205
- }
206
-
207
- .ly-card-grid > * {
208
- min-width: 0;
209
- }
210
-
211
- .ly-card-sm {
212
- min-block-size: var(--ly-card-size-sm);
213
- }
214
-
215
- .ly-card-md {
216
- min-block-size: var(--ly-card-size-md);
217
- }
218
-
219
- .ly-card-lg {
220
- min-block-size: var(--ly-card-size-lg);
221
- }
222
-
223
- .ly-gallery {
224
- display: grid;
225
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-gallery-min)), 1fr));
226
- gap: var(--ly-grid-gap);
227
- }
228
-
229
- .ly-gallery > * {
230
- min-width: 0;
231
- }
232
-
233
- .ly-carousel {
234
- display: grid;
235
- grid-auto-flow: column;
236
- grid-auto-columns: minmax(min(100%, var(--ly-carousel-item-min)), var(--ly-carousel-item-max));
237
- gap: var(--ly-grid-gap);
238
- overflow-x: auto;
239
- overscroll-behavior-inline: contain;
240
- scroll-snap-type: x proximity;
241
- }
242
-
243
- .ly-carousel > * {
244
- min-width: 0;
245
- scroll-snap-align: start;
246
- }
247
-
248
- .ly-row {
249
- display: flex;
250
- flex-wrap: wrap;
251
- margin-inline: calc(var(--ly-gutter, var(--ly-gap)) * -0.5);
252
- }
253
-
254
- .ly-col {
255
- flex: 1 1 0;
256
- min-width: 0;
257
- padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5);
258
- }
259
-
260
- .ly-sidebar-layout {
261
- display: grid;
262
- grid-template-columns: 1fr;
263
- gap: var(--ly-gap);
264
- }
265
-
266
- .ly-sidebar-layout > * {
267
- min-width: 0;
268
- }
269
-
270
- .ly-sidebar {
271
- min-width: 0;
272
- }
273
-
274
- .ly-content {
275
- min-width: 0;
276
- }
277
-
278
- .ly-split {
279
- display: grid;
280
- grid-template-columns: 1fr;
281
- gap: var(--ly-gap);
282
- align-items: var(--ly-split-align, center);
283
- }
284
-
285
- .ly-split > * {
286
- min-width: 0;
287
- }
288
-
289
- .ly-panes {
290
- display: grid;
291
- grid-template-columns: 1fr;
292
- gap: var(--ly-gap);
293
- }
294
-
295
- .ly-panes > * {
296
- min-width: 0;
297
- }
298
-
299
- .ly-surface {
300
- border-radius: var(--ly-radius);
301
- }
302
-
303
- .ly-surface--raised {
304
- border-radius: var(--ly-radius-lg);
305
- }
306
-
307
- .ly-divider {
308
- min-height: 1px;
309
- margin-block: var(--ly-space-5);
310
- }
311
-
312
- .ly-frame {
313
- aspect-ratio: var(--ly-frame-ratio, 16 / 9);
314
- overflow: hidden;
315
- }
316
-
317
- .ly-frame > * {
318
- width: 100%;
319
- height: 100%;
320
- object-fit: cover;
321
- }
322
-
323
- .ly-scroll-area {
324
- min-height: 0;
325
- overflow: auto;
326
- }
327
-
328
- .ly-app-shell {
329
- min-height: 100svh;
330
- display: grid;
331
- grid-template-areas:
332
- "header"
333
- "main";
334
- grid-template-columns: minmax(0, 1fr);
335
- grid-template-rows: auto minmax(0, 1fr);
336
- }
337
-
338
- .ly-app-header {
339
- grid-area: header;
340
- min-width: 0;
341
- }
342
-
343
- .ly-app-sidebar {
344
- grid-area: sidebar;
345
- display: none;
346
- min-width: 0;
347
- }
348
-
349
- .ly-app-main {
350
- grid-area: main;
351
- min-width: 0;
352
- }
353
-
354
- .ly-visually-hidden {
355
- position: absolute !important;
356
- width: 1px !important;
357
- height: 1px !important;
358
- padding: 0 !important;
359
- margin: -1px !important;
360
- overflow: hidden !important;
361
- clip: rect(0, 0, 0, 0) !important;
362
- clip-path: inset(50%) !important;
363
- white-space: nowrap !important;
364
- }
365
- }
366
-
367
- @layer ly.responsive {
368
- @media (min-width: 48rem) {
369
- /*
370
- Fixed support tracks are capped against their container so nested layouts
371
- can compress instead of forcing horizontal page overflow.
372
- */
373
- .ly-app-shell {
374
- grid-template-areas:
375
- "sidebar header"
376
- "sidebar main";
377
- grid-template-columns: minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-width)) minmax(0, 1fr);
378
- }
379
-
380
- .ly-app-sidebar {
381
- display: block;
382
- position: sticky;
383
- top: 0;
384
- z-index: var(--ly-z-sidebar);
385
- height: 100svh;
386
- overflow: auto;
387
- }
388
-
389
- .ly-sidebar-layout {
390
- grid-template-columns: minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-max)) minmax(0, 1fr);
391
- align-items: start;
392
- }
393
-
394
- .ly-sidebar-layout--right {
395
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-max));
396
- }
397
-
398
- .ly-split {
399
- grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
400
- }
401
-
402
- .ly-panes--two {
403
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-pane-fixed)), 0.7fr);
404
- }
405
- }
406
-
407
- @media (min-width: 64rem) {
408
- .ly-panes--three {
409
- grid-template-columns: minmax(min(100%, 14rem), 0.35fr) minmax(0, 1fr) minmax(min(100%, 14rem), 0.35fr);
410
- }
411
- }
412
- }
413
-
414
- @layer ly.utilities {
415
- .ly-cols-1 { --ly-grid-columns: 1; }
416
- .ly-cols-2 { --ly-grid-columns: 2; }
417
- .ly-cols-3 { --ly-grid-columns: 3; }
418
- .ly-cols-4 { --ly-grid-columns: 4; }
419
- .ly-cols-5 { --ly-grid-columns: 5; }
420
- .ly-cols-6 { --ly-grid-columns: 6; }
421
- .ly-cols-7 { --ly-grid-columns: 7; }
422
- .ly-cols-8 { --ly-grid-columns: 8; }
423
- .ly-cols-9 { --ly-grid-columns: 9; }
424
- .ly-cols-10 { --ly-grid-columns: 10; }
425
- .ly-cols-11 { --ly-grid-columns: 11; }
426
- .ly-cols-12 { --ly-grid-columns: 12; }
427
- .ly-cols-16 { --ly-grid-columns: 16; }
428
-
429
- .ly-span-1 { grid-column: span 1; }
430
- .ly-span-2 { grid-column: span 2; }
431
- .ly-span-3 { grid-column: span 3; }
432
- .ly-span-4 { grid-column: span 4; }
433
- .ly-span-5 { grid-column: span 5; }
434
- .ly-span-6 { grid-column: span 6; }
435
- .ly-span-7 { grid-column: span 7; }
436
- .ly-span-8 { grid-column: span 8; }
437
- .ly-span-9 { grid-column: span 9; }
438
- .ly-span-10 { grid-column: span 10; }
439
- .ly-span-11 { grid-column: span 11; }
440
- .ly-span-12 { grid-column: span 12; }
441
- .ly-span-13 { grid-column: span 13; }
442
- .ly-span-14 { grid-column: span 14; }
443
- .ly-span-15 { grid-column: span 15; }
444
- .ly-span-16 { grid-column: span 16; }
445
- .ly-span-full { grid-column: 1 / -1; }
446
-
447
- .ly-col-1 { flex: 0 0 auto; width: 8.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
448
- .ly-col-2 { flex: 0 0 auto; width: 16.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
449
- .ly-col-3 { flex: 0 0 auto; width: 25%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
450
- .ly-col-4 { flex: 0 0 auto; width: 33.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
451
- .ly-col-5 { flex: 0 0 auto; width: 41.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
452
- .ly-col-6 { flex: 0 0 auto; width: 50%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
453
- .ly-col-7 { flex: 0 0 auto; width: 58.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
454
- .ly-col-8 { flex: 0 0 auto; width: 66.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
455
- .ly-col-9 { flex: 0 0 auto; width: 75%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
456
- .ly-col-10 { flex: 0 0 auto; width: 83.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
457
- .ly-col-11 { flex: 0 0 auto; width: 91.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
458
- .ly-col-12 { flex: 0 0 auto; width: 100%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
459
-
460
- .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); }
461
- .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); }
462
- .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); }
463
- .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); }
464
- .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); }
465
- .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); }
466
- .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); }
467
- .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); }
468
- .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); }
469
- .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); }
470
-
471
- .ly-pad-0 { padding: var(--ly-space-0); }
472
- .ly-pad-1 { padding: var(--ly-space-1); }
473
- .ly-pad-2 { padding: var(--ly-space-2); }
474
- .ly-pad-3 { padding: var(--ly-space-3); }
475
- .ly-pad-4 { padding: var(--ly-space-4); }
476
- .ly-pad-5 { padding: var(--ly-space-5); }
477
- .ly-pad-6 { padding: var(--ly-space-6); }
478
- .ly-pad-7 { padding: var(--ly-space-7); }
479
- .ly-pad-8 { padding: var(--ly-space-8); }
480
- .ly-pad-9 { padding: var(--ly-space-9); }
481
-
482
- .ly-px-4 { padding-inline: var(--ly-space-4); }
483
- .ly-px-6 { padding-inline: var(--ly-space-6); }
484
- .ly-px-8 { padding-inline: var(--ly-space-8); }
485
- .ly-py-4 { padding-block: var(--ly-space-4); }
486
- .ly-py-6 { padding-block: var(--ly-space-6); }
487
- .ly-py-8 { padding-block: var(--ly-space-8); }
488
-
489
- .ly-mx-auto { margin-inline: auto; }
490
- .ly-w-full { width: 100%; }
491
- .ly-h-full { height: 100%; }
492
- .ly-min-h-screen { min-height: 100svh; }
493
- .ly-bleed { width: 100vw; margin-inline: calc(50% - 50vw); }
494
- .ly-overflow-auto { overflow: auto; }
495
- .ly-overflow-hidden { overflow: hidden; }
496
-
497
- .ly-items-start { align-items: flex-start; }
498
- .ly-items-center { align-items: center; }
499
- .ly-items-end { align-items: flex-end; }
500
- .ly-items-stretch { align-items: stretch; }
501
- .ly-justify-start { justify-content: flex-start; }
502
- .ly-justify-center { justify-content: center; }
503
- .ly-justify-end { justify-content: flex-end; }
504
- .ly-justify-between { justify-content: space-between; }
505
-
506
- .ly-frame-1x1 { --ly-frame-ratio: 1 / 1; }
507
- .ly-frame-2x1 { --ly-frame-ratio: 2 / 1; }
508
- .ly-frame-3x2 { --ly-frame-ratio: 3 / 2; }
509
- .ly-frame-4x3 { --ly-frame-ratio: 4 / 3; }
510
- .ly-frame-16x9 { --ly-frame-ratio: 16 / 9; }
511
- .ly-frame-21x9 { --ly-frame-ratio: 21 / 9; }
512
-
513
- .ly-hidden { display: none !important; }
514
- .ly-show-md-up,
515
- .ly-show-lg-up {
516
- display: none !important;
517
- }
518
-
519
- @media (min-width: 48rem) {
520
- .ly-md-cols-1 { --ly-grid-columns: 1; }
521
- .ly-md-cols-2 { --ly-grid-columns: 2; }
522
- .ly-md-cols-3 { --ly-grid-columns: 3; }
523
- .ly-md-cols-4 { --ly-grid-columns: 4; }
524
- .ly-md-cols-6 { --ly-grid-columns: 6; }
525
- .ly-md-cols-8 { --ly-grid-columns: 8; }
526
- .ly-md-cols-12 { --ly-grid-columns: 12; }
527
- .ly-md-cols-16 { --ly-grid-columns: 16; }
528
- .ly-show-md-up { display: revert !important; }
529
- }
530
-
531
- @media (min-width: 64rem) {
532
- .ly-lg-cols-1 { --ly-grid-columns: 1; }
533
- .ly-lg-cols-2 { --ly-grid-columns: 2; }
534
- .ly-lg-cols-3 { --ly-grid-columns: 3; }
535
- .ly-lg-cols-4 { --ly-grid-columns: 4; }
536
- .ly-lg-cols-6 { --ly-grid-columns: 6; }
537
- .ly-lg-cols-8 { --ly-grid-columns: 8; }
538
- .ly-lg-cols-12 { --ly-grid-columns: 12; }
539
- .ly-lg-cols-16 { --ly-grid-columns: 16; }
540
- .ly-show-lg-up { display: revert !important; }
541
- }
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* layout-style-css bundle. Generated from focused styles/ modules by scripts/build.mjs. */
4
+
5
+ /* wrappers.css */
6
+ /*
7
+ Shared structural tokens and wrapper geometry. Theme, type, borders, shadows,
8
+ and interactive states remain outside Layout Style's ownership boundary.
9
+ */
10
+
11
+ @layer ly.tokens {
12
+ :where(.ly-root) {
13
+ --ly-space-0: 0;
14
+ --ly-space-1: 0.25rem;
15
+ --ly-space-2: 0.5rem;
16
+ --ly-space-3: 0.75rem;
17
+ --ly-space-4: 1rem;
18
+ --ly-space-5: 1.5rem;
19
+ --ly-space-6: 2rem;
20
+ --ly-space-7: 3rem;
21
+ --ly-space-8: 4rem;
22
+ --ly-space-9: 6rem;
23
+
24
+ --ly-wrapper-compact: 40rem;
25
+ --ly-wrapper-prose: 68ch;
26
+ --ly-wrapper-content: 72rem;
27
+ --ly-wrapper-wide: 112rem;
28
+ --ly-wrapper-max: var(--ly-wrapper-content);
29
+ --ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
30
+ --ly-safe-area-inline: max(
31
+ env(safe-area-inset-left, 0px),
32
+ env(safe-area-inset-right, 0px)
33
+ );
34
+ --ly-wrapper-gutter: max(var(--ly-page-padding-inline), var(--ly-safe-area-inline));
35
+
36
+ --ly-section-padding-block: clamp(3rem, 7vw, 6rem);
37
+ --ly-gap: var(--ly-space-5);
38
+ --ly-grid-gap: var(--ly-gap);
39
+ --ly-stack-gap: var(--ly-space-4);
40
+ --ly-cluster-gap: var(--ly-space-3);
41
+ --ly-cover-min: 100svh;
42
+ --ly-switcher-threshold: 42rem;
43
+ --ly-sidebar-size: 18rem;
44
+ --ly-sidebar-content-min: 50%;
45
+ --ly-grid-columns: 12;
46
+ --ly-grid-min: 16rem;
47
+ --ly-pane-size: 22rem;
48
+ --ly-media-size: 14rem;
49
+ --ly-reel-item-min: 16rem;
50
+ --ly-reel-item-max: 28rem;
51
+ --ly-scroll-max: 70svh;
52
+ --ly-frame-ratio: 16 / 9;
53
+
54
+ --ly-recipe-rail: 18rem;
55
+ --ly-recipe-aside: 22rem;
56
+ --ly-card-grid-min: 16rem;
57
+ --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;
79
+ }
542
80
  }
543
81
 
544
- /* layout-ui-style-kit-bridge.css */
545
- /*
546
- Compatibility bridge for ui-style-kit-css.
547
- This bridge intentionally does not map color, type, border, or shadow tokens.
548
- ui-style-kit-css owns those visuals; layout-style-library owns structure.
549
- */
550
-
551
- @layer ly.bridge {
552
- :where(.ly-root[data-ui][data-theme][data-mode], [data-ui][data-theme][data-mode] .ly-root) {
553
- --ly-ui-style-kit-bridge: 1;
554
-
555
- /*
556
- Normalize UI kit root background geometry without redefining its paint.
557
- Patterned theme layers should fill the viewport once instead of tiling.
558
- */
559
- min-block-size: 100svh;
560
- background-attachment: fixed;
561
- background-position: center;
562
- background-repeat: no-repeat;
563
- background-size: 100% 100%;
564
- }
565
-
566
- :where(.ly-root[data-ui="minimal-saas"], [data-ui="minimal-saas"] .ly-root) {
567
- --ly-ui-style-kit-bridge-style: minimal-saas;
568
- }
569
-
570
- :where(.ly-root[data-ui="bento"], [data-ui="bento"] .ly-root) {
571
- --ly-ui-style-kit-bridge-style: bento;
572
- }
573
-
574
- :where(.ly-root[data-ui="maximalist"], [data-ui="maximalist"] .ly-root) {
575
- --ly-ui-style-kit-bridge-style: maximalist;
576
- }
577
-
578
- :where(.ly-root[data-ui="bauhaus"], [data-ui="bauhaus"] .ly-root) {
579
- --ly-ui-style-kit-bridge-style: bauhaus;
580
- }
581
-
582
- :where(.ly-root[data-ui="tactile"], [data-ui="tactile"] .ly-root) {
583
- --ly-ui-style-kit-bridge-style: tactile;
584
- }
585
-
586
- :where(.ly-root[data-ui="neumorphism"], [data-ui="neumorphism"] .ly-root) {
587
- --ly-ui-style-kit-bridge-style: neumorphism;
588
- }
589
-
590
- :where(.ly-root[data-ui="retrofuturism"], [data-ui="retrofuturism"] .ly-root) {
591
- --ly-ui-style-kit-bridge-style: retrofuturism;
592
- }
593
-
594
- :where(.ly-root[data-ui="brutalism"], [data-ui="brutalism"] .ly-root) {
595
- --ly-ui-style-kit-bridge-style: brutalism;
596
- }
597
-
598
- :where(.ly-root[data-ui="cyberpunk"], [data-ui="cyberpunk"] .ly-root) {
599
- --ly-ui-style-kit-bridge-style: cyberpunk;
600
- }
601
-
602
- :where(.ly-root[data-ui="y2k"], [data-ui="y2k"] .ly-root) {
603
- --ly-ui-style-kit-bridge-style: y2k;
604
- }
605
-
606
- :where(.ly-root[data-ui="retro-glass"], [data-ui="retro-glass"] .ly-root) {
607
- --ly-ui-style-kit-bridge-style: retro-glass;
608
- }
609
-
610
- :where(.saas-container, .bento-container, .max-container, .bau-container, .tactile-container, .neo-container, .retro-container, .brutal-container, .cyber-container, .y2k-container, .rg-container) {
611
- /* UI Style Kit naming can opt into layout sizing without taking over visual paint. */
612
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
613
- margin-inline: auto;
614
- }
615
-
616
- :where(.saas-section, .bento-section, .max-section, .bau-section, .tactile-section, .neo-section, .retro-section, .brutal-section, .cyber-section, .y2k-section, .rg-section) {
617
- padding-block: var(--ly-section-padding-block);
618
- }
619
-
620
- :where(.saas-stack, .bento-stack, .max-stack, .bau-stack, .tactile-stack, .neo-stack, .retro-stack, .brutal-stack, .cyber-stack, .y2k-stack, .rg-stack) {
621
- display: flex;
622
- flex-direction: column;
623
- gap: var(--ly-stack-gap);
624
- }
625
-
626
- :where(.saas-cluster, .bento-cluster, .max-cluster, .bau-cluster, .tactile-cluster, .neo-cluster, .retro-cluster, .brutal-cluster, .cyber-cluster, .y2k-cluster, .rg-cluster) {
627
- display: flex;
628
- flex-wrap: wrap;
629
- align-items: center;
630
- gap: var(--ly-cluster-gap);
631
- }
632
-
633
- :where(.saas-grid, .bento-grid, .max-grid, .bau-grid, .tactile-grid, .neo-grid, .retro-grid, .brutal-grid, .cyber-grid, .y2k-grid, .rg-grid) {
634
- display: grid;
635
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
636
- gap: var(--ly-grid-gap);
637
- }
638
-
639
- :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) {
640
- display: grid;
641
- grid-template-columns: 1fr;
642
- gap: var(--ly-gap);
643
- align-items: var(--ly-split-align, center);
644
- }
645
-
646
- :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) > * {
647
- min-width: 0;
648
- }
649
-
650
- :where(.saas-button-group, .bento-button-group, .max-button-group, .bau-button-group, .tactile-button-group, .neo-button-group, .retro-button-group, .brutal-button-group, .cyber-button-group, .y2k-button-group, .rg-button-group) {
651
- display: flex;
652
- flex-wrap: wrap;
653
- align-items: center;
654
- gap: var(--ly-cluster-gap);
655
- }
656
-
657
- :where(.saas-button-group, .bento-button-group, .max-button-group, .bau-button-group, .tactile-button-group, .neo-button-group, .retro-button-group, .brutal-button-group, .cyber-button-group, .y2k-button-group, .rg-button-group) > * {
658
- flex: 0 1 auto;
659
- min-width: min(100%, var(--ly-button-min, 8rem));
660
- }
661
-
662
- :where(.saas-card-grid, .bento-card-grid, .max-card-grid, .bau-card-grid, .tactile-card-grid, .neo-card-grid, .retro-card-grid, .brutal-card-grid, .cyber-card-grid, .y2k-card-grid, .rg-card-grid) {
663
- display: grid;
664
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-card-grid-min)), 1fr));
665
- gap: var(--ly-grid-gap);
666
- }
667
-
668
- :where(.saas-card-grid, .bento-card-grid, .max-card-grid, .bau-card-grid, .tactile-card-grid, .neo-card-grid, .retro-card-grid, .brutal-card-grid, .cyber-card-grid, .y2k-card-grid, .rg-card-grid) > * {
669
- min-width: 0;
670
- }
671
-
672
- :where(.saas-card-sm, .bento-card-sm, .max-card-sm, .bau-card-sm, .tactile-card-sm, .neo-card-sm, .retro-card-sm, .brutal-card-sm, .cyber-card-sm, .y2k-card-sm, .rg-card-sm) {
673
- min-block-size: var(--ly-card-size-sm);
674
- }
675
-
676
- :where(.saas-card-md, .bento-card-md, .max-card-md, .bau-card-md, .tactile-card-md, .neo-card-md, .retro-card-md, .brutal-card-md, .cyber-card-md, .y2k-card-md, .rg-card-md) {
677
- min-block-size: var(--ly-card-size-md);
678
- }
679
-
680
- :where(.saas-card-lg, .bento-card-lg, .max-card-lg, .bau-card-lg, .tactile-card-lg, .neo-card-lg, .retro-card-lg, .brutal-card-lg, .cyber-card-lg, .y2k-card-lg, .rg-card-lg) {
681
- min-block-size: var(--ly-card-size-lg);
682
- }
683
-
684
- :where(.saas-gallery, .bento-gallery, .max-gallery, .bau-gallery, .tactile-gallery, .neo-gallery, .retro-gallery, .brutal-gallery, .cyber-gallery, .y2k-gallery, .rg-gallery) {
685
- display: grid;
686
- grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-gallery-min)), 1fr));
687
- gap: var(--ly-grid-gap);
688
- }
689
-
690
- :where(.saas-gallery, .bento-gallery, .max-gallery, .bau-gallery, .tactile-gallery, .neo-gallery, .retro-gallery, .brutal-gallery, .cyber-gallery, .y2k-gallery, .rg-gallery) > * {
691
- min-width: 0;
692
- }
693
-
694
- :where(.saas-carousel, .bento-carousel, .max-carousel, .bau-carousel, .tactile-carousel, .neo-carousel, .retro-carousel, .brutal-carousel, .cyber-carousel, .y2k-carousel, .rg-carousel) {
695
- display: grid;
696
- grid-auto-flow: column;
697
- grid-auto-columns: minmax(min(100%, var(--ly-carousel-item-min)), var(--ly-carousel-item-max));
698
- gap: var(--ly-grid-gap);
699
- overflow-x: auto;
700
- overscroll-behavior-inline: contain;
701
- scroll-snap-type: x proximity;
702
- }
703
-
704
- :where(.saas-carousel, .bento-carousel, .max-carousel, .bau-carousel, .tactile-carousel, .neo-carousel, .retro-carousel, .brutal-carousel, .cyber-carousel, .y2k-carousel, .rg-carousel) > * {
705
- min-width: 0;
706
- scroll-snap-align: start;
707
- }
708
-
709
- @media (min-width: 48rem) {
710
- :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) {
711
- grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
712
- }
713
- }
82
+ @layer ly.reset {
83
+ :where(.ly-root),
84
+ :where(.ly-root *) {
85
+ box-sizing: border-box;
86
+ }
87
+
88
+ :where(.ly-root) {
89
+ min-inline-size: 0;
90
+ margin: 0;
91
+ }
92
+
93
+ :where(.ly-root img),
94
+ :where(.ly-root svg),
95
+ :where(.ly-root video),
96
+ :where(.ly-root canvas) {
97
+ max-inline-size: 100%;
98
+ }
714
99
  }
715
100
 
716
- /* layout-style-minimal-saas.css */
717
- /*
718
- Layout style: minimal-saas.
719
- Steady left-rail SaaS shell with conservative content widths and predictable
720
- workspace rhythm. Visual identity remains owned by ui-style-kit-css.
721
- */
722
-
723
- @layer ly.styles.minimal_saas {
724
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) {
725
- --ly-container-max: 88rem;
726
- --ly-page-padding-inline: clamp(1rem, 3vw, 2.5rem);
727
- --ly-section-padding-block: clamp(2rem, 5vw, 4rem);
728
- --ly-sidebar-width: clamp(15rem, 18vw, 19rem);
729
- --ly-grid-min: 16rem;
730
- --ly-gap: clamp(1rem, 2vw, 1.75rem);
731
- --ly-grid-gap: var(--ly-gap);
732
- --ly-stack-gap: clamp(0.875rem, 1.6vw, 1.35rem);
733
- }
734
-
735
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-app-main {
736
- padding-block: clamp(1rem, 2vw, 2rem);
737
- }
738
-
739
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-container,
740
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-wrapper {
741
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
742
- }
743
-
744
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-section {
745
- padding-block: var(--ly-section-padding-block);
746
- }
747
-
748
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-grid--auto {
749
- grid-auto-rows: minmax(8rem, auto);
750
- }
751
-
752
- @media (min-width: 48rem) {
753
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-app-shell {
754
- grid-template-areas:
755
- "sidebar header"
756
- "sidebar main";
757
- grid-template-columns: minmax(min(100%, 14rem), var(--ly-sidebar-width)) minmax(0, 1fr);
758
- }
759
-
760
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-app-sidebar {
761
- display: block;
762
- position: sticky;
763
- top: 0;
764
- height: 100svh;
765
- overflow: auto;
766
- }
767
-
768
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-sidebar-layout {
769
- grid-template-columns: minmax(min(100%, 14rem), 0.24fr) minmax(0, 1fr);
770
- }
771
-
772
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-split,
773
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-panes--two {
774
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 18rem), 0.44fr);
775
- }
776
- }
777
-
778
- @media (min-width: 80rem) {
779
- :where(.ly-root[data-layout="minimal-saas"], .ly-root[layout-style="minimal-saas"], .ly-root.ly-layout-minimal-saas, .ly-root.ly-style-minimal-saas) .ly-panes--three {
780
- grid-template-columns: minmax(min(100%, 13rem), 0.22fr) minmax(0, 1fr) minmax(min(100%, 16rem), 0.32fr);
781
- }
782
- }
101
+ @layer ly.wrappers {
102
+ .ly-wrapper {
103
+ /* Personalities provide only the plain-wrapper default; explicit variants stay authoritative. */
104
+ --ly-wrapper-max: var(--ly-personality-wrapper-max, var(--ly-wrapper-content));
105
+
106
+ /* Symmetric safe-area compensation keeps logical gutters stable in either direction. */
107
+ container-name: ly-wrapper;
108
+ container-type: inline-size;
109
+ inline-size: min(100%, calc(var(--ly-wrapper-max) + (var(--ly-wrapper-gutter) * 2)));
110
+ margin-inline: auto;
111
+ padding-inline: var(--ly-wrapper-gutter);
112
+ }
113
+
114
+ .ly-wrapper--compact {
115
+ --ly-wrapper-max: 40rem;
116
+ }
117
+
118
+ .ly-wrapper--prose {
119
+ --ly-wrapper-max: 68ch;
120
+ }
121
+
122
+ .ly-wrapper--content {
123
+ --ly-wrapper-max: 72rem;
124
+ }
125
+
126
+ .ly-wrapper--wide {
127
+ --ly-wrapper-max: 112rem;
128
+ }
129
+
130
+ .ly-wrapper--full {
131
+ --ly-wrapper-max: 100%;
132
+ }
133
+
134
+ .ly-wrapper--breakout {
135
+ --ly-breakout-content-size: min(
136
+ var(--ly-wrapper-content),
137
+ calc(100% - (var(--ly-wrapper-gutter) * 2))
138
+ );
139
+ --ly-breakout-feature-size: min(
140
+ var(--ly-wrapper-wide),
141
+ calc(100% - (var(--ly-wrapper-gutter) * 2))
142
+ );
143
+
144
+ display: grid;
145
+ grid-template-columns:
146
+ [full-start] minmax(min(100%, var(--ly-wrapper-gutter)), 1fr)
147
+ [feature-start] minmax(
148
+ 0,
149
+ calc((var(--ly-breakout-feature-size) - var(--ly-breakout-content-size)) / 2)
150
+ )
151
+ [content-start] minmax(0, var(--ly-breakout-content-size)) [content-end]
152
+ minmax(
153
+ 0,
154
+ calc((var(--ly-breakout-feature-size) - var(--ly-breakout-content-size)) / 2)
155
+ )
156
+ [feature-end] minmax(min(100%, var(--ly-wrapper-gutter)), 1fr) [full-end];
157
+ inline-size: 100%;
158
+ padding-inline: 0;
159
+ }
160
+
161
+ .ly-wrapper--breakout > * {
162
+ grid-column: content;
163
+ min-inline-size: 0;
164
+ }
165
+
166
+ .ly-wrapper--breakout > :where(.ly-lane--content, [data-ly-lane="content"]) {
167
+ grid-column: content;
168
+ }
169
+
170
+ .ly-wrapper--breakout > :where(.ly-lane--feature, [data-ly-lane="feature"]) {
171
+ grid-column: feature;
172
+ }
173
+
174
+ .ly-wrapper--breakout > :where(.ly-lane--full, [data-ly-lane="full"]) {
175
+ grid-column: full;
176
+ }
783
177
  }
784
178
 
785
- /* layout-style-bento.css */
786
- /*
787
- Layout style: bento.
788
- Modular dashboard shell with staged mosaic zones. Visual identity remains
789
- owned by ui-style-kit-css.
790
- */
791
-
792
- @layer ly.styles.bento {
793
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) {
794
- --ly-container-max: 104rem;
795
- --ly-page-padding-inline: clamp(1rem, 3.5vw, 3rem);
796
- --ly-section-padding-block: clamp(2rem, 6vw, 5rem);
797
- --ly-sidebar-width: clamp(13rem, 16vw, 17rem);
798
- --ly-grid-min: 14rem;
799
- --ly-gap: clamp(1rem, 2.5vw, 2rem);
800
- --ly-grid-gap: var(--ly-gap);
801
- --ly-stack-gap: clamp(1rem, 2vw, 1.75rem);
802
- }
803
-
804
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-app-main {
805
- padding-block: clamp(1rem, 3vw, 2.5rem);
806
- }
807
-
808
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-container,
809
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-wrapper {
810
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
811
- }
812
-
813
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-section {
814
- padding-block: var(--ly-section-padding-block);
815
- }
816
-
817
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-grid--auto {
818
- grid-auto-rows: minmax(9rem, auto);
819
- }
820
-
821
- @media (min-width: 48rem) {
822
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-app-shell {
823
- grid-template-areas:
824
- "sidebar header"
825
- "sidebar main";
826
- grid-template-columns: minmax(min(100%, 13rem), 0.26fr) minmax(0, 1fr);
827
- }
828
-
829
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-app-sidebar {
830
- display: block;
831
- position: sticky;
832
- top: var(--ly-space-3);
833
- height: calc(100svh - (var(--ly-space-3) * 2));
834
- margin: var(--ly-space-3) 0 var(--ly-space-3) var(--ly-space-3);
835
- overflow: auto;
836
- }
837
-
838
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-grid--auto > :nth-child(4n + 1) {
839
- grid-column: span 2;
840
- min-height: 14rem;
841
- }
842
-
843
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-sidebar-layout {
844
- grid-template-columns: minmax(min(100%, 12rem), 0.3fr) minmax(0, 1fr);
845
- }
846
-
847
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-split {
848
- grid-template-columns: minmax(0, 0.78fr) minmax(min(100%, 18rem), 1.22fr);
849
- }
850
-
851
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-panes--two {
852
- grid-template-columns: minmax(0, 1.18fr) minmax(min(100%, 18rem), 0.82fr);
853
- }
854
- }
855
-
856
- @media (min-width: 80rem) {
857
- :where(.ly-root[data-layout="bento"], .ly-root[layout-style="bento"], .ly-root.ly-layout-bento, .ly-root.ly-style-bento) .ly-panes--three {
858
- grid-template-columns: minmax(min(100%, 12rem), 0.6fr) minmax(0, 1.4fr) minmax(min(100%, 14rem), 0.8fr);
859
- }
860
- }
179
+ /* primitives.css */
180
+ /* Reusable composition primitives own flow and sizing only. */
181
+
182
+ @layer ly.primitives {
183
+ .ly-page {
184
+ min-block-size: 100svh;
185
+ }
186
+
187
+ .ly-header,
188
+ .ly-footer,
189
+ .ly-main,
190
+ .ly-section,
191
+ .ly-surface {
192
+ min-inline-size: 0;
193
+ min-block-size: 0;
194
+ }
195
+
196
+ .ly-header {
197
+ min-block-size: var(--ly-header-height);
198
+ }
199
+
200
+ .ly-header--sticky {
201
+ position: sticky;
202
+ inset-block-start: 0;
203
+ z-index: var(--ly-z-header);
204
+ }
205
+
206
+ .ly-section {
207
+ padding-block: var(--ly-section-padding-block);
208
+ }
209
+
210
+ .ly-section--compact {
211
+ --ly-section-padding-block: var(--ly-space-7);
212
+ }
213
+
214
+ .ly-section--flush {
215
+ --ly-section-padding-block: 0;
216
+ }
217
+
218
+ .ly-readable {
219
+ max-inline-size: var(--ly-wrapper-prose);
220
+ }
221
+
222
+ .ly-stack {
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: var(--ly-stack-gap);
226
+ }
227
+
228
+ .ly-cluster {
229
+ display: flex;
230
+ flex-wrap: wrap;
231
+ align-items: center;
232
+ gap: var(--ly-cluster-gap);
233
+ }
234
+
235
+ .ly-center {
236
+ inline-size: min(100%, var(--ly-center-max, var(--ly-wrapper-content)));
237
+ margin-inline: auto;
238
+ }
239
+
240
+ .ly-cover {
241
+ display: flex;
242
+ flex-direction: column;
243
+ min-block-size: var(--ly-cover-min);
244
+ padding-block: var(--ly-cover-padding, var(--ly-space-5));
245
+ }
246
+
247
+ .ly-cover > :where(.ly-cover__center, [data-ly-cover-center]) {
248
+ margin-block: auto;
249
+ }
250
+
251
+ .ly-switcher {
252
+ display: flex;
253
+ flex-wrap: wrap;
254
+ gap: var(--ly-gap);
255
+ }
256
+
257
+ .ly-switcher > * {
258
+ flex-basis: calc((var(--ly-switcher-threshold) - 100%) * 999);
259
+ flex-grow: 1;
260
+ min-inline-size: 0;
261
+ }
262
+
263
+ .ly-sidebar {
264
+ display: flex;
265
+ flex-wrap: wrap;
266
+ gap: var(--ly-gap);
267
+ }
268
+
269
+ .ly-sidebar > :where(.ly-sidebar__side, [data-ly-sidebar="side"]) {
270
+ flex-basis: var(--ly-sidebar-size);
271
+ flex-grow: 1;
272
+ }
273
+
274
+ .ly-sidebar > :where(.ly-sidebar__content, [data-ly-sidebar="content"]) {
275
+ flex-basis: 0;
276
+ flex-grow: 999;
277
+ min-inline-size: min(100%, var(--ly-sidebar-content-min));
278
+ }
279
+
280
+ .ly-grid {
281
+ 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
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
288
+ }
289
+
290
+ .ly-grid > *,
291
+ .ly-split > *,
292
+ .ly-panes > *,
293
+ .ly-media > * {
294
+ min-inline-size: 0;
295
+ }
296
+
297
+ .ly-split {
298
+ display: grid;
299
+ grid-template-columns: minmax(0, 1fr);
300
+ gap: var(--ly-gap);
301
+ align-items: var(--ly-split-align, center);
302
+ }
303
+
304
+ .ly-panes {
305
+ display: grid;
306
+ grid-template-columns: minmax(0, 1fr);
307
+ gap: var(--ly-gap);
308
+ }
309
+
310
+ .ly-media {
311
+ display: grid;
312
+ grid-template-areas:
313
+ "media"
314
+ "content"
315
+ "actions";
316
+ grid-template-columns: minmax(0, 1fr);
317
+ gap: var(--ly-gap);
318
+ align-items: var(--ly-media-align, start);
319
+ }
320
+
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;
327
+ }
328
+
329
+ .ly-media > :where(.ly-media__actions, [data-ly-media="actions"]) {
330
+ grid-area: actions;
331
+ }
332
+
333
+ .ly-reel {
334
+ display: grid;
335
+ grid-auto-flow: column;
336
+ grid-auto-columns: minmax(min(100%, var(--ly-reel-item-min)), var(--ly-reel-item-max));
337
+ gap: var(--ly-grid-gap);
338
+ overflow-x: auto;
339
+ overflow-inline: auto;
340
+ overscroll-behavior-inline: contain;
341
+ scroll-snap-type: inline proximity;
342
+ }
343
+
344
+ .ly-reel > * {
345
+ min-inline-size: 0;
346
+ scroll-snap-align: start;
347
+ }
348
+
349
+ .ly-frame {
350
+ aspect-ratio: var(--ly-frame-ratio);
351
+ overflow: hidden;
352
+ }
353
+
354
+ .ly-frame > * {
355
+ inline-size: 100%;
356
+ block-size: 100%;
357
+ object-fit: cover;
358
+ }
359
+
360
+ .ly-scroll {
361
+ min-block-size: 0;
362
+ 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. */
861
368
  }
862
369
 
863
- /* layout-style-maximalist.css */
864
- /*
865
- Layout style: maximalist.
866
- Editorial shell with oversized hero splits and staggered supporting regions.
867
- Visual identity remains owned by ui-style-kit-css.
868
- */
869
-
870
- @layer ly.styles.maximalist {
871
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) {
872
- --ly-container-max: 102rem;
873
- --ly-page-padding-inline: clamp(1rem, 6vw, 5.5rem);
874
- --ly-section-padding-block: clamp(4rem, 13vw, 10rem);
875
- --ly-sidebar-width: clamp(13rem, 18vw, 20rem);
876
- --ly-grid-min: 14rem;
877
- --ly-gap: clamp(1.25rem, 4vw, 3rem);
878
- --ly-grid-gap: var(--ly-gap);
879
- --ly-stack-gap: clamp(1.5rem, 4vw, 3.5rem);
880
- }
881
-
882
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-app-main {
883
- padding-block: clamp(1rem, 3vw, 3rem);
884
- }
885
-
886
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-container,
887
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-wrapper {
888
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
889
- }
890
-
891
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-section {
892
- padding-block: clamp(3.5rem, 11vw, 8rem);
893
- }
894
-
895
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-split {
896
- align-items: stretch;
897
- }
898
-
899
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-grid--auto {
900
- grid-auto-rows: minmax(10rem, auto);
901
- }
902
-
903
- @media (min-width: 48rem) {
904
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-split {
905
- /* Keep the editorial stage stacked until the wider shell can carry the oversized rhythm. */
906
- grid-template-columns: 1fr;
907
- }
908
-
909
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-grid--auto > :nth-child(5n + 1) {
910
- grid-column: span 2;
911
- min-height: 24rem;
912
- }
913
-
914
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-grid--auto > :nth-child(5n + 3) {
915
- transform: translateY(var(--ly-space-7));
916
- }
917
- }
918
-
919
- @media (min-width: 56rem) {
920
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-app-shell {
921
- grid-template-areas:
922
- "header header"
923
- "main sidebar";
924
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 13rem), 0.28fr);
925
- }
926
-
927
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-app-sidebar {
928
- display: block;
929
- position: sticky;
930
- top: calc(var(--ly-gap) * 1.5);
931
- height: max-content;
932
- margin-block: clamp(2rem, 8vw, 7rem);
933
- transform: translateX(calc(var(--ly-gap) * -0.35));
934
- overflow: auto;
935
- }
936
-
937
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-sidebar-layout {
938
- grid-template-columns: minmax(0, 1.55fr) minmax(min(100%, 15rem), 0.45fr);
939
- }
940
-
941
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-split {
942
- grid-template-columns: minmax(0, 1.62fr) minmax(min(100%, 16rem), 0.54fr);
943
- gap: clamp(1.5rem, 6vw, 5rem);
944
- }
945
-
946
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-panes--two {
947
- grid-template-columns: minmax(min(100%, 16rem), 0.44fr) minmax(0, 1.56fr);
948
- }
949
- }
950
-
951
- @media (min-width: 80rem) {
952
- :where(.ly-root[data-layout="maximalist"], .ly-root[layout-style="maximalist"], .ly-root.ly-layout-maximalist, .ly-root.ly-style-maximalist) .ly-panes--three {
953
- grid-template-columns: minmax(min(100%, 14rem), 0.34fr) minmax(0, 1.28fr) minmax(min(100%, 18rem), 0.58fr);
954
- }
955
- }
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
+ }
395
+ }
956
396
  }
957
397
 
958
- /* layout-style-bauhaus.css */
959
- /*
960
- Layout style: bauhaus.
961
- Strict framed column shell with structural rails and measured offsets. Visual
962
- identity remains owned by ui-style-kit-css.
963
- */
964
-
965
- @layer ly.styles.bauhaus {
966
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) {
967
- --ly-container-max: 92rem;
968
- --ly-page-padding-inline: clamp(1rem, 2vw, 2rem);
969
- --ly-section-padding-block: clamp(2.5rem, 5vw, 4.5rem);
970
- --ly-sidebar-width: clamp(8rem, 12vw, 12rem);
971
- --ly-grid-min: 13rem;
972
- --ly-gap: clamp(0.75rem, 1.6vw, 1.25rem);
973
- --ly-grid-gap: var(--ly-gap);
974
- --ly-stack-gap: clamp(0.75rem, 1.5vw, 1.25rem);
975
- }
976
-
977
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-app-main {
978
- padding-block: clamp(0.75rem, 2vw, 1.5rem);
979
- }
980
-
981
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-container,
982
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-wrapper {
983
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
984
- }
985
-
986
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-section {
987
- padding-block: var(--ly-section-padding-block);
988
- }
989
-
990
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-grid--auto {
991
- grid-auto-rows: minmax(7rem, auto);
992
- }
993
-
994
- @media (min-width: 48rem) {
995
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-app-shell {
996
- grid-template-areas:
997
- "sidebar header"
998
- "sidebar main";
999
- grid-template-columns: minmax(min(100%, 7rem), 0.18fr) minmax(0, 1fr);
1000
- }
1001
-
1002
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-app-sidebar {
1003
- display: block;
1004
- position: sticky;
1005
- top: 0;
1006
- height: 100svh;
1007
- overflow: auto;
1008
- }
1009
-
1010
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-sidebar-layout {
1011
- grid-template-columns: minmax(min(100%, 8rem), 0.22fr) minmax(0, 1fr);
1012
- }
1013
-
1014
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-split {
1015
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1016
- }
1017
-
1018
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-panes--two {
1019
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 12rem), 0.5fr);
1020
- }
1021
- }
1022
-
1023
- @media (min-width: 80rem) {
1024
- :where(.ly-root[data-layout="bauhaus"], .ly-root[layout-style="bauhaus"], .ly-root.ly-layout-bauhaus, .ly-root.ly-style-bauhaus) .ly-panes--three {
1025
- grid-template-columns: minmax(min(100%, 10rem), 0.25fr) minmax(0, 1fr) minmax(min(100%, 10rem), 0.25fr);
1026
- }
1027
- }
398
+ /* recipes.css */
399
+ /*
400
+ Built-in recipes follow semantic mobile DOM order. Wider arrangements use
401
+ named areas so visual placement never changes keyboard or reading order.
402
+ */
403
+
404
+ @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;
413
+ container-type: inline-size;
414
+ min-inline-size: 0;
415
+ }
416
+
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"]) {
422
+ display: grid;
423
+ grid-template-columns: minmax(0, 1fr);
424
+ gap: var(--ly-gap);
425
+ }
426
+
427
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
428
+ min-block-size: 100svh;
429
+ grid-template-areas:
430
+ "header"
431
+ "sidebar"
432
+ "main"
433
+ "aside"
434
+ "footer";
435
+ grid-template-rows: auto auto minmax(0, 1fr) auto auto;
436
+ }
437
+
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"]) {
448
+ grid-template-areas:
449
+ "header"
450
+ "nav"
451
+ "main"
452
+ "aside"
453
+ "footer";
454
+ }
455
+
456
+ :where(.ly-list-detail, [data-ly-recipe="list-detail"]) {
457
+ grid-template-areas:
458
+ "primary"
459
+ "secondary"
460
+ "actions";
461
+ }
462
+
463
+ :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
464
+ grid-template-areas:
465
+ "content"
466
+ "media"
467
+ "actions";
468
+ align-items: var(--ly-split-hero-align, center);
469
+ }
470
+
471
+ :where(.ly-gallery, [data-ly-recipe="gallery"]),
472
+ :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
473
+ display: grid;
474
+ gap: var(--ly-grid-gap);
475
+ }
476
+
477
+ :where(.ly-gallery, [data-ly-recipe="gallery"]) {
478
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-gallery-min)), 1fr));
479
+ }
480
+
481
+ :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
482
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-card-grid-min)), 1fr));
483
+ }
484
+
485
+ :where(.ly-gallery, [data-ly-recipe="gallery"]) > *,
486
+ :where(.ly-card-grid, [data-ly-recipe="card-grid"]) > * {
487
+ min-inline-size: 0;
488
+ }
489
+
490
+ :where(.ly-area--header, [data-ly-area="header"]) {
491
+ grid-area: header;
492
+ min-inline-size: 0;
493
+ }
494
+
495
+ :where(.ly-area--nav, [data-ly-area="nav"]) {
496
+ grid-area: nav;
497
+ min-inline-size: 0;
498
+ }
499
+
500
+ :where(.ly-area--main, [data-ly-area="main"]) {
501
+ grid-area: main;
502
+ min-inline-size: 0;
503
+ }
504
+
505
+ :where(.ly-area--aside, [data-ly-area="aside"]) {
506
+ grid-area: aside;
507
+ min-inline-size: 0;
508
+ }
509
+
510
+ :where(.ly-area--footer, [data-ly-area="footer"]) {
511
+ grid-area: footer;
512
+ min-inline-size: 0;
513
+ }
514
+
515
+ :where(.ly-area--content, [data-ly-area="content"]) {
516
+ grid-area: content;
517
+ min-inline-size: 0;
518
+ }
519
+
520
+ :where(.ly-area--media, [data-ly-area="media"]) {
521
+ grid-area: media;
522
+ min-inline-size: 0;
523
+ }
524
+
525
+ :where(.ly-area--actions, [data-ly-area="actions"]) {
526
+ grid-area: actions;
527
+ min-inline-size: 0;
528
+ }
529
+
530
+ :where(.ly-area--primary, [data-ly-area="primary"]) {
531
+ grid-area: primary;
532
+ min-inline-size: 0;
533
+ }
534
+
535
+ :where(.ly-area--secondary, [data-ly-area="secondary"]) {
536
+ 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
+ }
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;
623
+ }
624
+ }
625
+
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
+ :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);
648
+ }
649
+
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);
652
+ }
653
+
654
+ :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
655
+ grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
656
+ }
657
+
658
+ :where(.ly-gallery, [data-ly-recipe="gallery"]) {
659
+ --ly-gallery-min: 16rem;
660
+ }
661
+
662
+ :where(.ly-card-grid, [data-ly-recipe="card-grid"]) {
663
+ --ly-card-grid-min: 20rem;
664
+ }
665
+ }
1028
666
  }
1029
667
 
1030
- /* layout-style-tactile.css */
1031
- /*
1032
- Layout style: tactile.
1033
- Instrument-panel shell with a heavier support dock and dense controls. Visual
1034
- identity remains owned by ui-style-kit-css.
1035
- */
1036
-
1037
- @layer ly.styles.tactile {
1038
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) {
1039
- --ly-container-max: 98rem;
1040
- --ly-page-padding-inline: clamp(1rem, 3vw, 2.75rem);
1041
- --ly-section-padding-block: clamp(2rem, 5vw, 4rem);
1042
- --ly-sidebar-width: clamp(18rem, 22vw, 24rem);
1043
- --ly-grid-min: 15rem;
1044
- --ly-gap: clamp(1rem, 2.2vw, 1.75rem);
1045
- --ly-grid-gap: var(--ly-gap);
1046
- --ly-stack-gap: clamp(1rem, 2vw, 1.75rem);
1047
- }
1048
-
1049
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-app-main {
1050
- padding-block: clamp(1rem, 2.5vw, 2rem);
1051
- }
1052
-
1053
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-container,
1054
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-wrapper {
1055
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1056
- }
1057
-
1058
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-section {
1059
- padding-block: var(--ly-section-padding-block);
1060
- }
1061
-
1062
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-grid--auto {
1063
- grid-auto-rows: minmax(8rem, auto);
1064
- }
1065
-
1066
- @media (min-width: 48rem) {
1067
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-app-shell {
1068
- grid-template-areas:
1069
- "sidebar header"
1070
- "sidebar main";
1071
- grid-template-columns: minmax(min(100%, 18rem), var(--ly-sidebar-width)) minmax(0, 1fr);
1072
- }
1073
-
1074
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-app-sidebar {
1075
- display: block;
1076
- position: sticky;
1077
- top: 0;
1078
- height: 100svh;
1079
- overflow: auto;
1080
- }
1081
-
1082
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-sidebar-layout {
1083
- grid-template-columns: minmax(min(100%, 18rem), 0.42fr) minmax(0, 1fr);
1084
- }
1085
-
1086
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-split {
1087
- grid-template-columns: minmax(0, 1.18fr) minmax(min(100%, 18rem), 0.82fr);
1088
- }
1089
-
1090
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-panes--two {
1091
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 20rem), 0.62fr);
1092
- }
1093
- }
1094
-
1095
- @media (min-width: 80rem) {
1096
- :where(.ly-root[data-layout="tactile"], .ly-root[layout-style="tactile"], .ly-root.ly-layout-tactile, .ly-root.ly-style-tactile) .ly-panes--three {
1097
- grid-template-columns: minmax(min(100%, 17rem), 0.4fr) minmax(0, 1fr) minmax(min(100%, 18rem), 0.46fr);
1098
- }
1099
- }
668
+ /* utilities.css */
669
+ @layer ly.utilities {
670
+ .ly-cols-1 { --ly-grid-columns: 1; }
671
+ .ly-cols-2 { --ly-grid-columns: 2; }
672
+ .ly-cols-3 { --ly-grid-columns: 3; }
673
+ .ly-cols-4 { --ly-grid-columns: 4; }
674
+ .ly-cols-5 { --ly-grid-columns: 5; }
675
+ .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
+ .ly-cols-12 { --ly-grid-columns: 12; }
682
+ .ly-cols-16 { --ly-grid-columns: 16; }
683
+
684
+ .ly-span-1 { grid-column: span 1; }
685
+ .ly-span-2 { grid-column: span 2; }
686
+ .ly-span-3 { grid-column: span 3; }
687
+ .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
+ .ly-span-full { grid-column: 1 / -1; }
701
+
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); }
712
+
713
+ .ly-pad-0 { padding: var(--ly-space-0); }
714
+ .ly-pad-1 { padding: var(--ly-space-1); }
715
+ .ly-pad-2 { padding: var(--ly-space-2); }
716
+ .ly-pad-3 { padding: var(--ly-space-3); }
717
+ .ly-pad-4 { padding: var(--ly-space-4); }
718
+ .ly-pad-5 { padding: var(--ly-space-5); }
719
+ .ly-pad-6 { padding: var(--ly-space-6); }
720
+ .ly-pad-7 { padding: var(--ly-space-7); }
721
+ .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
+
731
+ .ly-mx-auto { margin-inline: auto; }
732
+ .ly-w-full { inline-size: 100%; }
733
+ .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); }
736
+ .ly-overflow-auto { overflow: auto; }
737
+ .ly-overflow-hidden { overflow: hidden; }
738
+
739
+ .ly-items-start { align-items: flex-start; }
740
+ .ly-items-center { align-items: center; }
741
+ .ly-items-end { align-items: flex-end; }
742
+ .ly-items-stretch { align-items: stretch; }
743
+ .ly-justify-start { justify-content: flex-start; }
744
+ .ly-justify-center { justify-content: center; }
745
+ .ly-justify-end { justify-content: flex-end; }
746
+ .ly-justify-between { justify-content: space-between; }
747
+
748
+ .ly-frame-1x1 { --ly-frame-ratio: 1 / 1; }
749
+ .ly-frame-2x1 { --ly-frame-ratio: 2 / 1; }
750
+ .ly-frame-3x2 { --ly-frame-ratio: 3 / 2; }
751
+ .ly-frame-4x3 { --ly-frame-ratio: 4 / 3; }
752
+ .ly-frame-16x9 { --ly-frame-ratio: 16 / 9; }
753
+ .ly-frame-21x9 { --ly-frame-ratio: 21 / 9; }
754
+
755
+ .ly-hidden { display: none !important; }
756
+
757
+ .ly-show-md-up,
758
+ .ly-show-lg-up {
759
+ display: none !important;
760
+ }
761
+
762
+ .ly-visually-hidden {
763
+ position: absolute !important;
764
+ inline-size: 1px !important;
765
+ block-size: 1px !important;
766
+ padding: 0 !important;
767
+ margin: -1px !important;
768
+ overflow: hidden !important;
769
+ clip: rect(0, 0, 0, 0) !important;
770
+ clip-path: inset(50%) !important;
771
+ white-space: nowrap !important;
772
+ }
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
+ }
829
+
830
+ /* personalities/minimal-saas.css */
831
+ /* Layout style: minimal-saas. A measured left rail keeps work areas predictable. */
832
+
833
+ @layer ly.personalities.minimal_saas {
834
+ :where(.ly-root[data-ly-layout="minimal-saas"]) {
835
+ --ly-recipe-rail: 15rem;
836
+ --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
+ }
864
+ }
865
+ }
866
+
867
+ /* personalities/bento.css */
868
+ /* Layout style: bento. A full-width shell and staggered spans form modular tiles. */
869
+
870
+ @layer ly.personalities.bento {
871
+ :where(.ly-root[data-ly-layout="bento"]) {
872
+ --ly-grid-columns: 6;
873
+ --ly-grid-min: 12rem;
874
+ --ly-card-grid-min: 13rem;
875
+ --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
+ }
907
+ }
908
+ }
909
+
910
+ /* personalities/maximalist.css */
911
+ /* Layout style: maximalist. A full-bleed four-track mosaic favors dramatic spans. */
912
+
913
+ @layer ly.personalities.maximalist {
914
+ :where(.ly-root[data-ly-layout="maximalist"]) {
915
+ --ly-grid-columns: 12;
916
+ --ly-grid-min: 10rem;
917
+ --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
+ }
958
+ }
1100
959
  }
1101
960
 
1102
- /* layout-style-neumorphism.css */
1103
- /*
1104
- Layout style: neumorphism.
1105
- Centered island shell with detached support regions. Visual identity remains
1106
- owned by ui-style-kit-css.
1107
- */
1108
-
1109
- @layer ly.styles.neumorphism {
1110
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) {
1111
- --ly-container-max: 86rem;
1112
- --ly-page-padding-inline: clamp(1.25rem, 5vw, 4rem);
1113
- --ly-section-padding-block: clamp(3rem, 8vw, 6rem);
1114
- --ly-sidebar-width: clamp(16rem, 20vw, 20rem);
1115
- --ly-grid-min: 16rem;
1116
- --ly-gap: clamp(1.25rem, 3vw, 2.5rem);
1117
- --ly-grid-gap: var(--ly-gap);
1118
- --ly-stack-gap: clamp(1.25rem, 2.5vw, 2rem);
1119
- }
1120
-
1121
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-app-main {
1122
- padding-block: clamp(2rem, 5vw, 4rem);
1123
- }
1124
-
1125
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-container,
1126
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-wrapper {
1127
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1128
- }
1129
-
1130
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-section {
1131
- padding-block: var(--ly-section-padding-block);
1132
- }
1133
-
1134
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-grid--auto {
1135
- grid-auto-rows: minmax(9rem, auto);
1136
- }
1137
-
1138
- @media (min-width: 56rem) {
1139
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-app-shell {
1140
- grid-template-areas:
1141
- "header header"
1142
- "main sidebar";
1143
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 16rem), 0.34fr);
1144
- align-items: start;
1145
- }
1146
-
1147
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-app-sidebar {
1148
- display: block;
1149
- position: sticky;
1150
- top: clamp(1rem, 3vw, 2rem);
1151
- max-height: calc(100svh - clamp(2rem, 6vw, 4rem));
1152
- margin: clamp(1rem, 4vw, 3rem) clamp(1rem, 4vw, 3rem) clamp(1rem, 4vw, 3rem) 0;
1153
- overflow: auto;
1154
- }
1155
-
1156
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-sidebar-layout {
1157
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 16rem), 0.42fr);
1158
- }
1159
-
1160
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-split {
1161
- grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
1162
- }
1163
-
1164
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-panes--two {
1165
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.5fr);
1166
- }
1167
- }
1168
-
1169
- @media (min-width: 80rem) {
1170
- :where(.ly-root[data-layout="neumorphism"], .ly-root[layout-style="neumorphism"], .ly-root.ly-layout-neumorphism, .ly-root.ly-style-neumorphism) .ly-panes--three {
1171
- grid-template-columns: minmax(min(100%, 15rem), 0.38fr) minmax(0, 1fr) minmax(min(100%, 15rem), 0.38fr);
1172
- }
1173
- }
961
+ /* personalities/bauhaus.css */
962
+ /* Layout style: bauhaus. A left rail anchors an intentionally asymmetric grid. */
963
+
964
+ @layer ly.personalities.bauhaus {
965
+ :where(.ly-root[data-ly-layout="bauhaus"]) {
966
+ --ly-recipe-rail: 14rem;
967
+ --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
+ }
1004
+ }
1005
+ }
1006
+
1007
+ /* personalities/tactile.css */
1008
+ /* Layout style: tactile. A compact left rail leaves a broad, steady work lane. */
1009
+
1010
+ @layer ly.personalities.tactile {
1011
+ :where(.ly-root[data-ly-layout="tactile"]) {
1012
+ --ly-recipe-rail: 17rem;
1013
+ --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
+ }
1043
+ }
1044
+ }
1045
+
1046
+ /* personalities/neumorphism.css */
1047
+ /* Layout style: neumorphism. A calm right rail preserves a compact workspace. */
1048
+
1049
+ @layer ly.personalities.neumorphism {
1050
+ :where(.ly-root[data-ly-layout="neumorphism"]) {
1051
+ --ly-recipe-rail: 17rem;
1052
+ --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
+ }
1089
+ }
1174
1090
  }
1175
1091
 
1176
- /* layout-style-retrofuturism.css */
1177
- /*
1178
- Layout style: retrofuturism.
1179
- Panoramic bridge shell with symmetric pods and a wide central stage. Visual
1180
- identity remains owned by ui-style-kit-css.
1181
- */
1182
-
1183
- @layer ly.styles.retrofuturism {
1184
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) {
1185
- --ly-container-max: 110rem;
1186
- --ly-page-padding-inline: clamp(1rem, 4vw, 4rem);
1187
- --ly-section-padding-block: clamp(3rem, 8vw, 7rem);
1188
- --ly-sidebar-width: clamp(12rem, 14vw, 16rem);
1189
- --ly-grid-min: 15rem;
1190
- --ly-gap: clamp(1rem, 3vw, 2.5rem);
1191
- --ly-grid-gap: var(--ly-gap);
1192
- --ly-stack-gap: clamp(1rem, 2.4vw, 2rem);
1193
- }
1194
-
1195
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-app-main {
1196
- padding-block: clamp(1.5rem, 4vw, 3rem);
1197
- }
1198
-
1199
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-container,
1200
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-wrapper {
1201
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1202
- }
1203
-
1204
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-section {
1205
- padding-block: var(--ly-section-padding-block);
1206
- }
1207
-
1208
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-grid--auto {
1209
- grid-auto-rows: minmax(8rem, auto);
1210
- }
1211
-
1212
- @media (min-width: 56rem) {
1213
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-app-shell {
1214
- grid-template-areas:
1215
- "header header header"
1216
- "sidebar main main";
1217
- grid-template-columns: minmax(min(100%, 12rem), 0.24fr) minmax(0, 1fr) minmax(min(100%, 12rem), 0.24fr);
1218
- }
1219
-
1220
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-app-sidebar {
1221
- display: block;
1222
- position: sticky;
1223
- top: clamp(1rem, 2vw, 1.5rem);
1224
- height: calc(100svh - clamp(2rem, 4vw, 3rem));
1225
- margin: clamp(1rem, 2vw, 1.5rem) 0 clamp(1rem, 2vw, 1.5rem) clamp(1rem, 2vw, 1.5rem);
1226
- overflow: auto;
1227
- }
1228
-
1229
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-sidebar-layout {
1230
- grid-template-columns: minmax(min(100%, 12rem), 0.32fr) minmax(0, 1fr);
1231
- }
1232
-
1233
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-split {
1234
- grid-template-columns: minmax(0, 1.35fr) minmax(min(100%, 16rem), 0.65fr);
1235
- }
1236
-
1237
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-panes--two {
1238
- grid-template-columns: minmax(min(100%, 14rem), 0.44fr) minmax(0, 1.2fr);
1239
- }
1240
- }
1241
-
1242
- @media (min-width: 80rem) {
1243
- :where(.ly-root[data-layout="retrofuturism"], .ly-root[layout-style="retrofuturism"], .ly-root.ly-layout-retrofuturism, .ly-root.ly-style-retrofuturism) .ly-panes--three {
1244
- grid-template-columns: minmax(min(100%, 12rem), 0.44fr) minmax(0, 1.4fr) minmax(min(100%, 12rem), 0.44fr);
1245
- }
1246
- }
1092
+ /* personalities/retrofuturism.css */
1093
+ /* Layout style: retrofuturism. Twin rails frame a focused central work zone. */
1094
+
1095
+ @layer ly.personalities.retrofuturism {
1096
+ :where(.ly-root[data-ly-layout="retrofuturism"]) {
1097
+ --ly-recipe-rail: 14rem;
1098
+ --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
+ }
1125
+ }
1247
1126
  }
1248
1127
 
1249
- /* layout-style-brutalism.css */
1250
- /*
1251
- Layout style: brutalism.
1252
- Full-bleed slab shell with abrupt section breaks and compressed rails. Visual
1253
- identity remains owned by ui-style-kit-css.
1254
- */
1255
-
1256
- @layer ly.styles.brutalism {
1257
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) {
1258
- --ly-container-max: 100vw;
1259
- --ly-page-padding-inline: clamp(0.75rem, 3vw, 3rem);
1260
- --ly-section-padding-block: clamp(2rem, 6vw, 5rem);
1261
- --ly-sidebar-width: clamp(12rem, 15vw, 16rem);
1262
- --ly-grid-min: 12rem;
1263
- --ly-gap: clamp(0.75rem, 2vw, 1.5rem);
1264
- --ly-grid-gap: var(--ly-gap);
1265
- --ly-stack-gap: clamp(0.75rem, 2vw, 1.5rem);
1266
- }
1267
-
1268
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-app-main {
1269
- padding-block: 0;
1270
- }
1271
-
1272
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-container,
1273
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-wrapper {
1274
- width: min(100%, var(--ly-container-max));
1275
- }
1276
-
1277
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-section {
1278
- padding-block: var(--ly-section-padding-block);
1279
- }
1280
-
1281
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-grid--auto {
1282
- grid-auto-rows: minmax(7rem, auto);
1283
- }
1284
-
1285
- @media (min-width: 48rem) {
1286
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-app-shell {
1287
- grid-template-areas:
1288
- "header header"
1289
- "main sidebar";
1290
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 12rem), 0.22fr);
1291
- }
1292
-
1293
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-app-sidebar {
1294
- display: block;
1295
- position: sticky;
1296
- top: 0;
1297
- height: 100svh;
1298
- overflow: auto;
1299
- }
1300
-
1301
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-sidebar-layout {
1302
- grid-template-columns: minmax(0, 1.55fr) minmax(min(100%, 12rem), 0.45fr);
1303
- }
1304
-
1305
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-split {
1306
- grid-template-columns: minmax(0, 1.7fr) minmax(min(100%, 12rem), 0.3fr);
1307
- }
1308
-
1309
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-panes--two {
1310
- grid-template-columns: minmax(min(100%, 12rem), 0.35fr) minmax(0, 1.65fr);
1311
- }
1312
- }
1313
-
1314
- @media (min-width: 80rem) {
1315
- :where(.ly-root[data-layout="brutalism"], .ly-root[layout-style="brutalism"], .ly-root.ly-layout-brutalism, .ly-root.ly-style-brutalism) .ly-panes--three {
1316
- grid-template-columns: minmax(min(100%, 11rem), 0.28fr) minmax(0, 1.42fr) minmax(min(100%, 14rem), 0.4fr);
1317
- }
1318
- }
1128
+ /* personalities/brutalism.css */
1129
+ /* Layout style: brutalism. A blunt right rail counters a broad primary plane. */
1130
+
1131
+ @layer ly.personalities.brutalism {
1132
+ :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
+ --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
+ }
1161
+ }
1319
1162
  }
1320
1163
 
1321
- /* layout-style-cyberpunk.css */
1322
- /*
1323
- Layout style: cyberpunk.
1324
- Narrow utility rail with dense command workspace and compact gutters. Visual
1325
- identity remains owned by ui-style-kit-css.
1326
- */
1327
-
1328
- @layer ly.styles.cyberpunk {
1329
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) {
1330
- --ly-container-max: 104rem;
1331
- --ly-page-padding-inline: clamp(0.75rem, 2vw, 2rem);
1332
- --ly-section-padding-block: clamp(2rem, 5vw, 4rem);
1333
- --ly-sidebar-width: clamp(10rem, 12vw, 12.5rem);
1334
- --ly-grid-min: 12rem;
1335
- --ly-gap: clamp(0.75rem, 1.8vw, 1.25rem);
1336
- --ly-grid-gap: var(--ly-gap);
1337
- --ly-stack-gap: clamp(0.75rem, 1.5vw, 1.25rem);
1338
- }
1339
-
1340
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-app-main {
1341
- padding-block: clamp(0.75rem, 2vw, 1.5rem);
1342
- }
1343
-
1344
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-container,
1345
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-wrapper {
1346
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1347
- }
1348
-
1349
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-section {
1350
- padding-block: var(--ly-section-padding-block);
1351
- }
1352
-
1353
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-grid--auto {
1354
- grid-auto-rows: minmax(7rem, auto);
1355
- }
1356
-
1357
- @media (min-width: 48rem) {
1358
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-app-shell {
1359
- grid-template-areas:
1360
- "sidebar header"
1361
- "sidebar main";
1362
- grid-template-columns: minmax(min(100%, var(--ly-sidebar-width)), var(--ly-sidebar-width)) minmax(0, 1fr);
1363
- }
1364
-
1365
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-app-sidebar {
1366
- display: block;
1367
- position: sticky;
1368
- top: 0;
1369
- height: 100svh;
1370
- overflow: auto;
1371
- }
1372
-
1373
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-sidebar-layout {
1374
- grid-template-columns: minmax(min(100%, 10rem), 0.24fr) minmax(0, 1fr);
1375
- }
1376
-
1377
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-split {
1378
- grid-template-columns: minmax(0, 1.2fr) minmax(min(100%, 16rem), 0.8fr);
1379
- }
1380
-
1381
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-panes--two {
1382
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 15rem), 0.38fr);
1383
- }
1384
- }
1385
-
1386
- @media (min-width: 80rem) {
1387
- :where(.ly-root[data-layout="cyberpunk"], .ly-root[layout-style="cyberpunk"], .ly-root.ly-layout-cyberpunk, .ly-root.ly-style-cyberpunk) .ly-panes--three {
1388
- grid-template-columns: minmax(min(100%, 10rem), 0.24fr) minmax(0, 1fr) minmax(min(100%, 16rem), 0.38fr);
1389
- }
1390
- }
1164
+ /* personalities/cyberpunk.css */
1165
+ /* Layout style: cyberpunk. A narrow command rail fronts a dense three-lane shell. */
1166
+
1167
+ @layer ly.personalities.cyberpunk {
1168
+ :where(.ly-root[data-ly-layout="cyberpunk"]) {
1169
+ --ly-recipe-rail: 13rem;
1170
+ --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
+ }
1197
+ }
1391
1198
  }
1392
1199
 
1393
- /* layout-style-y2k.css */
1394
- /*
1395
- Layout style: y2k.
1396
- Centered hub shell with floating-window rhythm and in-flow support regions.
1397
- Visual identity remains owned by ui-style-kit-css.
1398
- */
1399
-
1400
- @layer ly.styles.y2k {
1401
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) {
1402
- --ly-container-max: 84rem;
1403
- --ly-page-padding-inline: clamp(1rem, 5vw, 4rem);
1404
- --ly-section-padding-block: clamp(3rem, 8vw, 6rem);
1405
- --ly-sidebar-width: clamp(17rem, 22vw, 21rem);
1406
- --ly-grid-min: 16rem;
1407
- --ly-gap: clamp(1.25rem, 3vw, 2.5rem);
1408
- --ly-grid-gap: var(--ly-gap);
1409
- --ly-stack-gap: clamp(1rem, 2.5vw, 2rem);
1410
- }
1411
-
1412
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-app-main {
1413
- padding-block: clamp(2rem, 6vw, 4rem);
1414
- }
1415
-
1416
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-container,
1417
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-wrapper {
1418
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1419
- }
1420
-
1421
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-section {
1422
- padding-block: var(--ly-section-padding-block);
1423
- }
1424
-
1425
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-grid--auto {
1426
- grid-auto-rows: minmax(8rem, auto);
1427
- }
1428
-
1429
- @media (min-width: 54rem) {
1430
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-app-shell {
1431
- grid-template-areas:
1432
- "header header"
1433
- "main sidebar";
1434
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.34fr);
1435
- align-items: start;
1436
- }
1437
-
1438
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-app-sidebar {
1439
- display: block;
1440
- position: sticky;
1441
- top: clamp(1rem, 4vw, 3rem);
1442
- max-height: calc(100svh - clamp(2rem, 8vw, 6rem));
1443
- margin: clamp(3rem, 8vw, 6rem) clamp(1rem, 5vw, 3rem) clamp(2rem, 6vw, 4rem) 0;
1444
- overflow: auto;
1445
- }
1446
-
1447
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-sidebar-layout {
1448
- grid-template-columns: minmax(0, 0.92fr) minmax(min(100%, 16rem), 1.08fr);
1449
- }
1450
-
1451
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-split {
1452
- grid-template-columns: minmax(0, 0.86fr) minmax(min(100%, 18rem), 1.14fr);
1453
- }
1454
-
1455
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-panes--two {
1456
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.56fr);
1457
- }
1458
- }
1459
-
1460
- @media (min-width: 80rem) {
1461
- :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-panes--three {
1462
- grid-template-columns: minmax(min(100%, 16rem), 0.5fr) minmax(0, 1fr) minmax(min(100%, 16rem), 0.5fr);
1463
- }
1464
- }
1200
+ /* personalities/y2k.css */
1201
+ /* Layout style: y2k. A tall right rail frames a reversed supporting workspace. */
1202
+
1203
+ @layer ly.personalities.y2k {
1204
+ :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
+ --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
+ }
1233
+ }
1465
1234
  }
1466
1235
 
1467
- /* layout-style-retro-glass.css */
1468
- /*
1469
- Layout style: retro-glass.
1470
- Top-framed content shell with a floating right utility rail. Visual identity
1471
- remains owned by ui-style-kit-css.
1472
- */
1473
-
1474
- @layer ly.styles.retro_glass {
1475
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) {
1476
- --ly-container-max: 96rem;
1477
- --ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
1478
- --ly-section-padding-block: clamp(3rem, 8vw, 6rem);
1479
- --ly-sidebar-width: 18rem;
1480
- --ly-grid-min: 15rem;
1481
- --ly-gap: clamp(1rem, 2.6vw, 2rem);
1482
- --ly-grid-gap: var(--ly-gap);
1483
- --ly-stack-gap: clamp(1rem, 2vw, 1.75rem);
1484
- }
1485
-
1486
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-app-main {
1487
- padding: clamp(1rem, 3vw, 2rem);
1488
- }
1489
-
1490
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-container,
1491
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-wrapper {
1492
- width: min(100%, var(--ly-container-max));
1493
- }
1494
-
1495
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-section {
1496
- padding-block: clamp(2rem, 6vw, 5rem);
1497
- }
1498
-
1499
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-split {
1500
- align-items: stretch;
1501
- }
1502
-
1503
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-grid--auto {
1504
- grid-auto-rows: minmax(9rem, auto);
1505
- }
1506
-
1507
- @media (min-width: 48rem) {
1508
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-split {
1509
- /* Keep glass feature panels stacked until the floating rail has enough horizontal room. */
1510
- grid-template-columns: 1fr;
1511
- }
1512
-
1513
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-panes--two {
1514
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 16rem), 0.62fr);
1515
- }
1516
- }
1517
-
1518
- @media (min-width: 56rem) {
1519
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-app-shell {
1520
- grid-template-areas:
1521
- "header header"
1522
- "main sidebar";
1523
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 16rem), var(--ly-sidebar-width));
1524
- }
1525
-
1526
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-app-sidebar {
1527
- display: block;
1528
- position: sticky;
1529
- top: var(--ly-space-4);
1530
- height: calc(100svh - (var(--ly-space-4) * 2));
1531
- margin: var(--ly-space-4) var(--ly-space-4) var(--ly-space-4) 0;
1532
- overflow: auto;
1533
- }
1534
-
1535
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-sidebar-layout {
1536
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 16rem), 0.48fr);
1537
- }
1538
-
1539
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-split {
1540
- grid-template-columns: minmax(0, 1.1fr) minmax(min(100%, 18rem), 0.9fr);
1541
- }
1542
- }
1543
-
1544
- @media (min-width: 78rem) {
1545
- :where(.ly-root[data-layout="retro-glass"], .ly-root[layout-style="retro-glass"], .ly-root.ly-layout-retro-glass, .ly-root.ly-style-retro-glass) .ly-panes--three {
1546
- grid-template-columns: minmax(min(100%, 15rem), 0.4fr) minmax(0, 1fr) minmax(min(100%, 18rem), 0.52fr);
1547
- }
1548
- }
1236
+ /* 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 {
1240
+ :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
+ --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
+ }
1277
+ }
1549
1278
  }
1550
1279
 
1551
- /* layout-style-f-pattern.css */
1552
- /*
1553
- Layout style: f-pattern.
1554
- Top-led scan path with a persistent left rail and heavier early content rows.
1555
- Visual identity remains owned by ui-style-kit-css.
1556
- */
1557
-
1558
- @layer ly.styles.f_pattern {
1559
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) {
1560
- --ly-container-max: 94rem;
1561
- --ly-page-padding-inline: clamp(1rem, 3vw, 2.75rem);
1562
- --ly-section-padding-block: clamp(2rem, 5vw, 4.5rem);
1563
- --ly-sidebar-width: clamp(13rem, 19vw, 20rem);
1564
- --ly-grid-min: 15rem;
1565
- --ly-gap: clamp(1rem, 2.25vw, 1.85rem);
1566
- --ly-grid-gap: var(--ly-gap);
1567
- --ly-stack-gap: clamp(0.875rem, 1.8vw, 1.45rem);
1568
- }
1569
-
1570
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-app-main {
1571
- padding-block: clamp(0.75rem, 2vw, 2rem);
1572
- }
1573
-
1574
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-container,
1575
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-wrapper {
1576
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1577
- }
1578
-
1579
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-section {
1580
- padding-block: var(--ly-section-padding-block);
1581
- }
1582
-
1583
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-grid--auto {
1584
- grid-auto-rows: minmax(8rem, auto);
1585
- }
1586
-
1587
- @media (min-width: 48rem) {
1588
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-app-shell {
1589
- grid-template-areas:
1590
- "header header"
1591
- "sidebar main";
1592
- grid-template-columns: minmax(min(100%, 13rem), 0.3fr) minmax(0, 1fr);
1593
- grid-template-rows: auto 1fr;
1594
- }
1595
-
1596
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-app-sidebar {
1597
- display: block;
1598
- position: sticky;
1599
- top: 0;
1600
- height: 100svh;
1601
- overflow: auto;
1602
- }
1603
-
1604
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-grid--auto > :nth-child(3n + 1) {
1605
- grid-column: span 2;
1606
- min-height: 13rem;
1607
- }
1608
-
1609
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-sidebar-layout {
1610
- grid-template-columns: minmax(min(100%, 14rem), 0.34fr) minmax(0, 1fr);
1611
- }
1612
-
1613
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-split {
1614
- grid-template-columns: minmax(0, 1.35fr) minmax(min(100%, 18rem), 0.65fr);
1615
- }
1616
-
1617
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-panes--two {
1618
- grid-template-columns: minmax(min(100%, 15rem), 0.38fr) minmax(0, 1fr);
1619
- }
1620
- }
1621
-
1622
- @media (min-width: 80rem) {
1623
- :where(.ly-root[data-layout="f-pattern"], .ly-root[layout-style="f-pattern"], .ly-root.ly-layout-f-pattern, .ly-root.ly-style-f-pattern) .ly-panes--three {
1624
- grid-template-columns: minmax(min(100%, 13rem), 0.28fr) minmax(0, 1.28fr) minmax(min(100%, 16rem), 0.44fr);
1625
- }
1626
- }
1280
+ /* 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 {
1284
+ :where(.ly-root[data-ly-layout="f-pattern"]) {
1285
+ --ly-recipe-rail: 16rem;
1286
+ --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
+ }
1325
+ }
1627
1326
  }
1628
1327
 
1629
- /* layout-style-z-pattern.css */
1630
- /*
1631
- Layout style: z-pattern.
1632
- Header-first scan path that moves from broad lead content to a right-side
1633
- support rail. Visual identity remains owned by ui-style-kit-css.
1634
- */
1635
-
1636
- @layer ly.styles.z_pattern {
1637
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) {
1638
- --ly-container-max: 100rem;
1639
- --ly-page-padding-inline: clamp(1rem, 3.4vw, 3rem);
1640
- --ly-section-padding-block: clamp(2rem, 5.5vw, 5rem);
1641
- --ly-sidebar-width: clamp(14rem, 20vw, 21rem);
1642
- --ly-grid-min: 15rem;
1643
- --ly-gap: clamp(1rem, 2.4vw, 2rem);
1644
- --ly-grid-gap: var(--ly-gap);
1645
- --ly-stack-gap: clamp(0.875rem, 1.9vw, 1.5rem);
1646
- }
1647
-
1648
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-app-main {
1649
- padding-block: clamp(1rem, 2.6vw, 2.5rem);
1650
- }
1651
-
1652
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-container,
1653
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-wrapper {
1654
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1655
- }
1656
-
1657
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-section {
1658
- padding-block: var(--ly-section-padding-block);
1659
- }
1660
-
1661
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-grid--auto {
1662
- grid-auto-rows: minmax(8rem, auto);
1663
- }
1664
-
1665
- @media (min-width: 48rem) {
1666
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-app-shell {
1667
- grid-template-areas:
1668
- "header header"
1669
- "main sidebar";
1670
- grid-template-columns: minmax(0, 1.18fr) minmax(min(100%, 15rem), 0.42fr);
1671
- }
1672
-
1673
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-app-sidebar {
1674
- display: block;
1675
- position: sticky;
1676
- top: var(--ly-space-4);
1677
- height: calc(100svh - (var(--ly-space-4) * 2));
1678
- overflow: auto;
1679
- }
1680
-
1681
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-grid--auto > :nth-child(4n + 2) {
1682
- grid-column: span 2;
1683
- min-height: 12rem;
1684
- }
1685
-
1686
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-sidebar-layout {
1687
- grid-template-columns: minmax(0, 1fr) minmax(min(100%, 15rem), 0.36fr);
1688
- }
1689
-
1690
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-split {
1691
- grid-template-columns: minmax(0, 0.92fr) minmax(min(100%, 19rem), 1.08fr);
1692
- align-items: end;
1693
- }
1694
-
1695
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-panes--two {
1696
- grid-template-columns: minmax(0, 1.25fr) minmax(min(100%, 17rem), 0.75fr);
1697
- }
1698
- }
1699
-
1700
- @media (min-width: 80rem) {
1701
- :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-panes--three {
1702
- grid-template-columns: minmax(0, 1.1fr) minmax(min(100%, 15rem), 0.55fr) minmax(min(100%, 14rem), 0.35fr);
1703
- }
1704
- }
1328
+ /* personalities/z-pattern.css */
1329
+ /* Layout style: z-pattern. A right rail closes a diagonal reading progression. */
1330
+
1331
+ @layer ly.personalities.z_pattern {
1332
+ :where(.ly-root[data-ly-layout="z-pattern"]) {
1333
+ --ly-recipe-rail: 17rem;
1334
+ --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
+ }
1374
+ }
1705
1375
  }
1706
1376
 
1707
- /* layout-style-split-screen.css */
1708
- /*
1709
- Layout style: split-screen.
1710
- Equal-weight shell columns for contrasting focal points or side-by-side
1711
- choices. Visual identity remains owned by ui-style-kit-css.
1712
- */
1713
-
1714
- @layer ly.styles.split_screen {
1715
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) {
1716
- --ly-container-max: 100vw;
1717
- --ly-page-padding-inline: clamp(0.875rem, 2.5vw, 2rem);
1718
- --ly-section-padding-block: clamp(1.5rem, 4vw, 3.5rem);
1719
- --ly-sidebar-width: 50vw;
1720
- --ly-grid-min: 14rem;
1721
- --ly-gap: clamp(0.875rem, 2vw, 1.5rem);
1722
- --ly-grid-gap: var(--ly-gap);
1723
- --ly-stack-gap: clamp(0.875rem, 1.6vw, 1.25rem);
1724
- }
1725
-
1726
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-app-main {
1727
- padding-block: 0;
1728
- }
1729
-
1730
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-container,
1731
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-wrapper {
1732
- width: min(100%, var(--ly-container-max));
1733
- }
1734
-
1735
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-section {
1736
- padding-block: var(--ly-section-padding-block);
1737
- }
1738
-
1739
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-grid--auto {
1740
- grid-auto-rows: minmax(9rem, auto);
1741
- }
1742
-
1743
- @media (min-width: 48rem) {
1744
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-app-shell {
1745
- grid-template-areas:
1746
- "header header"
1747
- "main sidebar";
1748
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1749
- }
1750
-
1751
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-app-sidebar {
1752
- display: block;
1753
- min-height: 100%;
1754
- overflow: auto;
1755
- }
1756
-
1757
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-sidebar-layout,
1758
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-split,
1759
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-panes--two {
1760
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1761
- }
1762
- }
1763
-
1764
- @media (min-width: 80rem) {
1765
- :where(.ly-root[data-layout="split-screen"], .ly-root[layout-style="split-screen"], .ly-root.ly-layout-split-screen, .ly-root.ly-style-split-screen) .ly-panes--three {
1766
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
1767
- }
1768
- }
1377
+ /* personalities/split-screen.css */
1378
+ /* Layout style: split-screen. Equal tracks keep two primary experiences in balance. */
1379
+
1380
+ @layer ly.personalities.split_screen {
1381
+ :where(.ly-root[data-ly-layout="split-screen"]) {
1382
+ --ly-grid-columns: 2;
1383
+ --ly-grid-min: 20rem;
1384
+ --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
+ }
1415
+ }
1769
1416
  }
1770
1417
 
1771
- /* layout-style-mondrian.css */
1772
- /*
1773
- Layout style: mondrian.
1774
- Asymmetrical rectangular blocks with staggered spans inspired by Mondrian
1775
- composition. Visual identity remains owned by ui-style-kit-css.
1776
- */
1777
-
1778
- @layer ly.styles.mondrian {
1779
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) {
1780
- --ly-container-max: 108rem;
1781
- --ly-page-padding-inline: clamp(0.75rem, 2.5vw, 2rem);
1782
- --ly-section-padding-block: clamp(1.75rem, 4.5vw, 4rem);
1783
- --ly-sidebar-width: clamp(11rem, 16vw, 17rem);
1784
- --ly-grid-min: 11rem;
1785
- --ly-gap: clamp(0.75rem, 1.6vw, 1.25rem);
1786
- --ly-grid-gap: var(--ly-gap);
1787
- --ly-stack-gap: clamp(0.75rem, 1.5vw, 1.2rem);
1788
- }
1789
-
1790
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-app-main {
1791
- padding-block: clamp(0.75rem, 1.8vw, 1.5rem);
1792
- }
1793
-
1794
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-container,
1795
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-wrapper {
1796
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1797
- }
1798
-
1799
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-section {
1800
- padding-block: var(--ly-section-padding-block);
1801
- }
1802
-
1803
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-grid--auto {
1804
- grid-auto-rows: minmax(7rem, auto);
1805
- }
1806
-
1807
- @media (min-width: 48rem) {
1808
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-app-shell {
1809
- grid-template-areas:
1810
- "sidebar header header"
1811
- "sidebar main main";
1812
- grid-template-columns: minmax(min(100%, 11rem), 0.28fr) minmax(0, 0.86fr) minmax(0, 1.14fr);
1813
- grid-template-rows: auto 1fr;
1814
- }
1815
-
1816
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-app-sidebar {
1817
- display: block;
1818
- position: sticky;
1819
- top: var(--ly-space-3);
1820
- height: calc(100svh - (var(--ly-space-3) * 2));
1821
- overflow: auto;
1822
- }
1823
-
1824
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-grid--auto > :nth-child(5n + 1) {
1825
- grid-column: span 2;
1826
- grid-row: span 2;
1827
- min-height: 15rem;
1828
- }
1829
-
1830
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-sidebar-layout {
1831
- grid-template-columns: minmax(min(100%, 11rem), 0.25fr) minmax(0, 1fr);
1832
- }
1833
-
1834
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-split {
1835
- grid-template-columns: minmax(0, 0.7fr) minmax(min(100%, 20rem), 1.3fr);
1836
- }
1837
-
1838
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-panes--two {
1839
- grid-template-columns: minmax(min(100%, 13rem), 0.46fr) minmax(0, 1.54fr);
1840
- }
1841
- }
1842
-
1843
- @media (min-width: 80rem) {
1844
- :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-panes--three {
1845
- grid-template-columns: minmax(min(100%, 11rem), 0.28fr) minmax(0, 1.44fr) minmax(min(100%, 13rem), 0.28fr);
1846
- }
1847
- }
1418
+ /* personalities/mondrian.css */
1419
+ /* Layout style: mondrian. Unequal zones and spanning blocks create a strict mosaic. */
1420
+
1421
+ @layer ly.personalities.mondrian {
1422
+ :where(.ly-root[data-ly-layout="mondrian"]) {
1423
+ --ly-recipe-rail: 13rem;
1424
+ --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
+ }
1459
+ }
1848
1460
  }
1849
1461
 
1850
- /* layout-style-synthwave.css */
1851
- /*
1852
- Layout style: synthwave.
1853
- Wide stage, dock-like support areas, and cinematic horizontal flow inspired
1854
- by retro-futuristic interface composition. Visual identity remains owned by
1855
- ui-style-kit-css.
1856
- */
1857
-
1858
- @layer ly.styles.synthwave {
1859
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) {
1860
- --ly-container-max: 112rem;
1861
- --ly-page-padding-inline: clamp(1rem, 4vw, 3.5rem);
1862
- --ly-section-padding-block: clamp(2.5rem, 7vw, 6rem);
1863
- --ly-sidebar-width: clamp(14rem, 18vw, 20rem);
1864
- --ly-grid-min: 14rem;
1865
- --ly-gap: clamp(1rem, 2.8vw, 2.25rem);
1866
- --ly-grid-gap: var(--ly-gap);
1867
- --ly-stack-gap: clamp(1rem, 2.2vw, 1.8rem);
1868
- --ly-carousel-item-min: 18rem;
1869
- --ly-carousel-item-max: 34rem;
1870
- }
1871
-
1872
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-main {
1873
- padding-block: clamp(1rem, 3vw, 3rem);
1874
- }
1875
-
1876
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-container,
1877
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-wrapper {
1878
- width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
1879
- }
1880
-
1881
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-section {
1882
- padding-block: var(--ly-section-padding-block);
1883
- }
1884
-
1885
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-grid--auto {
1886
- grid-auto-rows: minmax(9rem, auto);
1887
- }
1888
-
1889
- @media (min-width: 48rem) {
1890
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-shell {
1891
- grid-template-areas:
1892
- "header header"
1893
- "main main"
1894
- "sidebar sidebar";
1895
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1896
- }
1897
-
1898
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-sidebar {
1899
- display: block;
1900
- overflow: auto;
1901
- }
1902
-
1903
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-sidebar-layout {
1904
- grid-template-columns: minmax(0, 1.2fr) minmax(min(100%, 17rem), 0.8fr);
1905
- }
1906
-
1907
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-split {
1908
- grid-template-columns: minmax(0, 1fr);
1909
- }
1910
-
1911
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-panes--two {
1912
- grid-template-columns: minmax(0, 1.35fr) minmax(min(100%, 17rem), 0.65fr);
1913
- }
1914
- }
1915
-
1916
- @media (min-width: 80rem) {
1917
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-shell {
1918
- grid-template-areas:
1919
- "header header"
1920
- "main sidebar";
1921
- grid-template-columns: minmax(0, 1.52fr) minmax(min(100%, 17rem), 0.48fr);
1922
- }
1923
-
1924
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-sidebar {
1925
- position: sticky;
1926
- top: var(--ly-space-5);
1927
- height: calc(100svh - (var(--ly-space-5) * 2));
1928
- }
1929
-
1930
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-split {
1931
- grid-template-columns: minmax(0, 1.42fr) minmax(min(100%, 20rem), 0.58fr);
1932
- }
1933
-
1934
- :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-panes--three {
1935
- grid-template-columns: minmax(min(100%, 14rem), 0.36fr) minmax(0, 1.28fr) minmax(min(100%, 16rem), 0.36fr);
1936
- }
1937
- }
1462
+ /* personalities/synthwave.css */
1463
+ /* Layout style: synthwave. A cinematic center stage sits between support zones. */
1464
+
1465
+ @layer ly.personalities.synthwave {
1466
+ :where(.ly-root[data-ly-layout="synthwave"]) {
1467
+ --ly-recipe-rail: 16rem;
1468
+ --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
+ }
1507
+ }
1938
1508
  }