layout-style-css 1.0.0 → 1.1.2

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 (37) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/CONTRIBUTING.md +50 -0
  3. package/README.md +205 -16
  4. package/SECURITY.md +45 -0
  5. package/demo/assets/social-card.png +0 -0
  6. package/demo/index.html +358 -82
  7. package/dist/layout-all.css +5 -0
  8. package/dist/layout-base.css +67 -0
  9. package/dist/layout-style-css.css +571 -0
  10. package/dist/layout-style-css.min.css +1 -1
  11. package/dist/layout-style-f-pattern.css +76 -0
  12. package/dist/layout-style-mondrian.css +77 -0
  13. package/dist/layout-style-split-screen.css +62 -0
  14. package/dist/layout-style-synthwave.css +88 -0
  15. package/dist/layout-style-z-pattern.css +76 -0
  16. package/dist/layout-ui-style-kit-bridge.css +115 -0
  17. package/docs/wiki/Contributing.md +30 -0
  18. package/docs/wiki/Demo-And-GitHub-Pages.md +39 -0
  19. package/docs/wiki/Getting-Started.md +68 -0
  20. package/docs/wiki/Home.md +48 -0
  21. package/docs/wiki/Installation-And-CDN.md +58 -0
  22. package/docs/wiki/Layout-Primitives.md +57 -0
  23. package/docs/wiki/Layout-Recipes.md +80 -0
  24. package/docs/wiki/Layout-Styles.md +43 -0
  25. package/docs/wiki/Release-And-Publishing.md +69 -0
  26. package/docs/wiki/Security-And-Support.md +34 -0
  27. package/docs/wiki/UI-Style-Kit-Compatibility.md +54 -0
  28. package/docs/wiki/_Sidebar.md +14 -0
  29. package/package.json +12 -2
  30. package/styles/layout-base.css +67 -0
  31. package/styles/layout-style-f-pattern.css +76 -0
  32. package/styles/layout-style-mondrian.css +77 -0
  33. package/styles/layout-style-split-screen.css +62 -0
  34. package/styles/layout-style-synthwave.css +88 -0
  35. package/styles/layout-style-z-pattern.css +76 -0
  36. package/styles/layout-ui-style-kit-bridge.css +115 -0
  37. package/demo/assets/social-card.svg +0 -17
@@ -34,6 +34,13 @@
34
34
 
35
35
  --ly-grid-columns: 12;
36
36
  --ly-grid-min: 16rem;
37
+ --ly-card-grid-min: 16rem;
38
+ --ly-card-size-sm: 10rem;
39
+ --ly-card-size-md: 14rem;
40
+ --ly-card-size-lg: 18rem;
41
+ --ly-gallery-min: 12rem;
42
+ --ly-carousel-item-min: 16rem;
43
+ --ly-carousel-item-max: 28rem;
37
44
  --ly-sidebar-min: 14rem;
38
45
  --ly-sidebar-width: 18rem;
39
46
  --ly-sidebar-max: 22rem;
@@ -165,6 +172,19 @@
165
172
  gap: var(--ly-cluster-gap);
166
173
  }
167
174
 
175
+ .ly-button-group {
176
+ /* Button groups provide flow only; UI libraries keep button paint and states. */
177
+ display: flex;
178
+ flex-wrap: wrap;
179
+ align-items: center;
180
+ gap: var(--ly-cluster-gap);
181
+ }
182
+
183
+ .ly-button-group > * {
184
+ flex: 0 1 auto;
185
+ min-width: min(100%, var(--ly-button-min, 8rem));
186
+ }
187
+
168
188
  .ly-grid {
169
189
  display: grid;
170
190
  grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
@@ -175,6 +195,53 @@
175
195
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
176
196
  }
177
197
 
198
+ .ly-card-grid {
199
+ display: grid;
200
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-card-grid-min)), 1fr));
201
+ gap: var(--ly-grid-gap);
202
+ }
203
+
204
+ .ly-card-grid > * {
205
+ min-width: 0;
206
+ }
207
+
208
+ .ly-card-sm {
209
+ min-block-size: var(--ly-card-size-sm);
210
+ }
211
+
212
+ .ly-card-md {
213
+ min-block-size: var(--ly-card-size-md);
214
+ }
215
+
216
+ .ly-card-lg {
217
+ min-block-size: var(--ly-card-size-lg);
218
+ }
219
+
220
+ .ly-gallery {
221
+ display: grid;
222
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-gallery-min)), 1fr));
223
+ gap: var(--ly-grid-gap);
224
+ }
225
+
226
+ .ly-gallery > * {
227
+ min-width: 0;
228
+ }
229
+
230
+ .ly-carousel {
231
+ display: grid;
232
+ grid-auto-flow: column;
233
+ grid-auto-columns: minmax(min(100%, var(--ly-carousel-item-min)), var(--ly-carousel-item-max));
234
+ gap: var(--ly-grid-gap);
235
+ overflow-x: auto;
236
+ overscroll-behavior-inline: contain;
237
+ scroll-snap-type: x proximity;
238
+ }
239
+
240
+ .ly-carousel > * {
241
+ min-width: 0;
242
+ scroll-snap-align: start;
243
+ }
244
+
178
245
  .ly-row {
179
246
  display: flex;
180
247
  flex-wrap: wrap;
@@ -37,6 +37,13 @@
37
37
 
38
38
  --ly-grid-columns: 12;
39
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;
40
47
  --ly-sidebar-min: 14rem;
41
48
  --ly-sidebar-width: 18rem;
42
49
  --ly-sidebar-max: 22rem;
@@ -168,6 +175,19 @@
168
175
  gap: var(--ly-cluster-gap);
169
176
  }
170
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
+
171
191
  .ly-grid {
172
192
  display: grid;
173
193
  grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
@@ -178,6 +198,53 @@
178
198
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
179
199
  }
180
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
+
181
248
  .ly-row {
182
249
  display: flex;
183
250
  flex-wrap: wrap;
@@ -484,6 +551,16 @@
484
551
  @layer ly.bridge {
485
552
  :where(.ly-root[data-ui][data-theme][data-mode], [data-ui][data-theme][data-mode] .ly-root) {
486
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%;
487
564
  }
488
565
 
489
566
  :where(.ly-root[data-ui="minimal-saas"], [data-ui="minimal-saas"] .ly-root) {
@@ -529,6 +606,111 @@
529
606
  :where(.ly-root[data-ui="retro-glass"], [data-ui="retro-glass"] .ly-root) {
530
607
  --ly-ui-style-kit-bridge-style: retro-glass;
531
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
+ }
532
714
  }
533
715
 
534
716
  /* layout-style-minimal-saas.css */
@@ -1365,3 +1547,392 @@
1365
1547
  }
1366
1548
  }
1367
1549
  }
1550
+
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
+ }
1627
+ }
1628
+
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
+ }
1705
+ }
1706
+
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
+ }
1769
+ }
1770
+
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
+ }
1848
+ }
1849
+
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
+ }
1938
+ }