layout-style-css 1.0.0 → 1.1.1

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 +46 -0
  2. package/CONTRIBUTING.md +50 -0
  3. package/README.md +208 -19
  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 +561 -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 +105 -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 +105 -0
  37. package/demo/assets/social-card.svg +0 -17
@@ -0,0 +1,34 @@
1
+ # Security And Support
2
+
3
+ `layout-style-css` is a CSS-only package. The package does not execute runtime JavaScript, call external services, read secrets, or process user input.
4
+
5
+ ## Supported Versions
6
+
7
+ | Version | Supported |
8
+ | --- | --- |
9
+ | `1.1.x` | Yes |
10
+ | `1.0.x` | Security fixes only when practical |
11
+
12
+ ## Report A Security Issue
13
+
14
+ Use GitHub security advisories when available. If advisories are not enabled, open a minimal GitHub issue that requests a private coordination path and avoids public exploit details.
15
+
16
+ Include:
17
+
18
+ - affected version
19
+ - affected package export or CSS selector
20
+ - reproduction steps
21
+ - expected impact
22
+ - whether the issue affects package consumers, the demo, or GitHub Pages deployment
23
+
24
+ ## Security Checks
25
+
26
+ Before release:
27
+
28
+ ```bash
29
+ npm audit --audit-level=moderate
30
+ npm run release:verify
31
+ ```
32
+
33
+ The package contract tests check package exports, README import examples, npm tarball contents, generated CSS, demo smoke behavior, and GitHub Pages artifact structure.
34
+
@@ -0,0 +1,54 @@
1
+ # UI Style Kit Compatibility
2
+
3
+ `layout-style-css` is built to pair with `ui-style-kit-css@2.0.1` while keeping each package responsible for one layer.
4
+
5
+ ## Ownership Boundary
6
+
7
+ | Package | Owns |
8
+ | --- | --- |
9
+ | `ui-style-kit-css` | colors, typography, borders, shadows, native controls, component paint, focus states, themes, modes |
10
+ | `layout-style-css` | wrappers, shells, grid behavior, panes, sidebars, spacing, layout recipes, layout personalities |
11
+
12
+ ## One Import Pairing
13
+
14
+ ```js
15
+ import "layout-style-css/all-with-ui-kit.css";
16
+ ```
17
+
18
+ This imports UI Style Kit and all layout files. Use `layout-style-css/all-with-ui-kit-and-interactive-surface.css` when Interactive Surface is also required.
19
+
20
+ ## Prefix Aliases
21
+
22
+ The bridge maps UI-style structural names to layout primitives for these prefixes:
23
+
24
+ ```txt
25
+ saas, bento, max, bau, tactile, neo, retro, brutal, cyber, y2k, rg
26
+ ```
27
+
28
+ | Alias pattern | Layout primitive |
29
+ | --- | --- |
30
+ | `<prefix>-container` | `.ly-wrapper` |
31
+ | `<prefix>-section` | `.ly-section` |
32
+ | `<prefix>-stack` | `.ly-stack` |
33
+ | `<prefix>-cluster` | `.ly-cluster` |
34
+ | `<prefix>-grid` | `.ly-grid` |
35
+ | `<prefix>-split` | `.ly-split` |
36
+ | `<prefix>-button-group` | `.ly-button-group` |
37
+ | `<prefix>-card-grid` | `.ly-card-grid` |
38
+ | `<prefix>-card-sm`, `<prefix>-card-md`, `<prefix>-card-lg` | `.ly-card-sm`, `.ly-card-md`, `.ly-card-lg` |
39
+ | `<prefix>-gallery` | `.ly-gallery` |
40
+ | `<prefix>-carousel` | `.ly-carousel` |
41
+
42
+ Visual component aliases such as `<prefix>-button`, `<prefix>-card`, and `<prefix>-panel` remain owned by UI Style Kit.
43
+
44
+ ## Integration Example
45
+
46
+ ```html
47
+ <section class="saas-container saas-section">
48
+ <div class="saas-card-grid">
49
+ <article class="saas-card saas-card-md">Plan</article>
50
+ <article class="saas-card saas-card-md">Plan</article>
51
+ </div>
52
+ </section>
53
+ ```
54
+
@@ -0,0 +1,14 @@
1
+ # Wiki Navigation
2
+
3
+ - [Home](Home.md)
4
+ - [Getting Started](Getting-Started.md)
5
+ - [Installation And CDN](Installation-And-CDN.md)
6
+ - [Layout Primitives](Layout-Primitives.md)
7
+ - [Layout Recipes](Layout-Recipes.md)
8
+ - [Layout Styles](Layout-Styles.md)
9
+ - [UI Style Kit Compatibility](UI-Style-Kit-Compatibility.md)
10
+ - [Demo And GitHub Pages](Demo-And-GitHub-Pages.md)
11
+ - [Release And Publishing](Release-And-Publishing.md)
12
+ - [Security And Support](Security-And-Support.md)
13
+ - [Contributing](Contributing.md)
14
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "layout-style-css",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Shell-first CSS layout primitives that complement ui-style-kit-css@2.0.1.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -60,6 +60,7 @@
60
60
  "./css.css": "./dist/layout-style-css.css",
61
61
  "./min": "./dist/layout-style-css.min.css",
62
62
  "./min.css": "./dist/layout-style-css.min.css",
63
+ "./dist/*.css": "./dist/*.css",
63
64
  "./dist/layout-style-css.css": "./dist/layout-style-css.css",
64
65
  "./dist/layout-style-css.min.css": "./dist/layout-style-css.min.css",
65
66
  "./base.css": "./dist/layout-base.css",
@@ -78,20 +79,29 @@
78
79
  "./cyberpunk.css": "./dist/layout-style-cyberpunk.css",
79
80
  "./y2k.css": "./dist/layout-style-y2k.css",
80
81
  "./retro-glass.css": "./dist/layout-style-retro-glass.css",
82
+ "./f-pattern.css": "./dist/layout-style-f-pattern.css",
83
+ "./z-pattern.css": "./dist/layout-style-z-pattern.css",
84
+ "./split-screen.css": "./dist/layout-style-split-screen.css",
85
+ "./mondrian.css": "./dist/layout-style-mondrian.css",
86
+ "./synthwave.css": "./dist/layout-style-synthwave.css",
81
87
  "./package.json": "./package.json"
82
88
  },
83
89
  "files": [
84
90
  "dist",
85
91
  "styles",
92
+ "docs/wiki",
86
93
  "demo/index.html",
87
94
  "demo/assets/apple-touch-icon.svg",
88
95
  "demo/assets/favicon.svg",
89
- "demo/assets/social-card.svg",
96
+ "demo/assets/social-card.png",
90
97
  "demo/browserconfig.xml",
91
98
  "demo/robots.txt",
92
99
  "demo/site.webmanifest",
93
100
  "demo/sitemap.xml",
94
101
  "README.md",
102
+ "CHANGELOG.md",
103
+ "CONTRIBUTING.md",
104
+ "SECURITY.md",
95
105
  "LICENSE"
96
106
  ]
97
107
  }
@@ -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;
@@ -0,0 +1,76 @@
1
+ /*
2
+ Layout style: f-pattern.
3
+ Top-led scan path with a persistent left rail and heavier early content rows.
4
+ Visual identity remains owned by ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.styles.f_pattern {
8
+ :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) {
9
+ --ly-container-max: 94rem;
10
+ --ly-page-padding-inline: clamp(1rem, 3vw, 2.75rem);
11
+ --ly-section-padding-block: clamp(2rem, 5vw, 4.5rem);
12
+ --ly-sidebar-width: clamp(13rem, 19vw, 20rem);
13
+ --ly-grid-min: 15rem;
14
+ --ly-gap: clamp(1rem, 2.25vw, 1.85rem);
15
+ --ly-grid-gap: var(--ly-gap);
16
+ --ly-stack-gap: clamp(0.875rem, 1.8vw, 1.45rem);
17
+ }
18
+
19
+ :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 {
20
+ padding-block: clamp(0.75rem, 2vw, 2rem);
21
+ }
22
+
23
+ :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,
24
+ :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 {
25
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
26
+ }
27
+
28
+ :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 {
29
+ padding-block: var(--ly-section-padding-block);
30
+ }
31
+
32
+ :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 {
33
+ grid-auto-rows: minmax(8rem, auto);
34
+ }
35
+
36
+ @media (min-width: 48rem) {
37
+ :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 {
38
+ grid-template-areas:
39
+ "header header"
40
+ "sidebar main";
41
+ grid-template-columns: minmax(min(100%, 13rem), 0.3fr) minmax(0, 1fr);
42
+ grid-template-rows: auto 1fr;
43
+ }
44
+
45
+ :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 {
46
+ display: block;
47
+ position: sticky;
48
+ top: 0;
49
+ height: 100svh;
50
+ overflow: auto;
51
+ }
52
+
53
+ :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) {
54
+ grid-column: span 2;
55
+ min-height: 13rem;
56
+ }
57
+
58
+ :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 {
59
+ grid-template-columns: minmax(min(100%, 14rem), 0.34fr) minmax(0, 1fr);
60
+ }
61
+
62
+ :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 {
63
+ grid-template-columns: minmax(0, 1.35fr) minmax(min(100%, 18rem), 0.65fr);
64
+ }
65
+
66
+ :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 {
67
+ grid-template-columns: minmax(min(100%, 15rem), 0.38fr) minmax(0, 1fr);
68
+ }
69
+ }
70
+
71
+ @media (min-width: 80rem) {
72
+ :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 {
73
+ grid-template-columns: minmax(min(100%, 13rem), 0.28fr) minmax(0, 1.28fr) minmax(min(100%, 16rem), 0.44fr);
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,77 @@
1
+ /*
2
+ Layout style: mondrian.
3
+ Asymmetrical rectangular blocks with staggered spans inspired by Mondrian
4
+ composition. Visual identity remains owned by ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.styles.mondrian {
8
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) {
9
+ --ly-container-max: 108rem;
10
+ --ly-page-padding-inline: clamp(0.75rem, 2.5vw, 2rem);
11
+ --ly-section-padding-block: clamp(1.75rem, 4.5vw, 4rem);
12
+ --ly-sidebar-width: clamp(11rem, 16vw, 17rem);
13
+ --ly-grid-min: 11rem;
14
+ --ly-gap: clamp(0.75rem, 1.6vw, 1.25rem);
15
+ --ly-grid-gap: var(--ly-gap);
16
+ --ly-stack-gap: clamp(0.75rem, 1.5vw, 1.2rem);
17
+ }
18
+
19
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-app-main {
20
+ padding-block: clamp(0.75rem, 1.8vw, 1.5rem);
21
+ }
22
+
23
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-container,
24
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-wrapper {
25
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
26
+ }
27
+
28
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-section {
29
+ padding-block: var(--ly-section-padding-block);
30
+ }
31
+
32
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-grid--auto {
33
+ grid-auto-rows: minmax(7rem, auto);
34
+ }
35
+
36
+ @media (min-width: 48rem) {
37
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-app-shell {
38
+ grid-template-areas:
39
+ "sidebar header header"
40
+ "sidebar main main";
41
+ grid-template-columns: minmax(min(100%, 11rem), 0.28fr) minmax(0, 0.86fr) minmax(0, 1.14fr);
42
+ grid-template-rows: auto 1fr;
43
+ }
44
+
45
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-app-sidebar {
46
+ display: block;
47
+ position: sticky;
48
+ top: var(--ly-space-3);
49
+ height: calc(100svh - (var(--ly-space-3) * 2));
50
+ overflow: auto;
51
+ }
52
+
53
+ :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) {
54
+ grid-column: span 2;
55
+ grid-row: span 2;
56
+ min-height: 15rem;
57
+ }
58
+
59
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-sidebar-layout {
60
+ grid-template-columns: minmax(min(100%, 11rem), 0.25fr) minmax(0, 1fr);
61
+ }
62
+
63
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-split {
64
+ grid-template-columns: minmax(0, 0.7fr) minmax(min(100%, 20rem), 1.3fr);
65
+ }
66
+
67
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-panes--two {
68
+ grid-template-columns: minmax(min(100%, 13rem), 0.46fr) minmax(0, 1.54fr);
69
+ }
70
+ }
71
+
72
+ @media (min-width: 80rem) {
73
+ :where(.ly-root[data-layout="mondrian"], .ly-root[layout-style="mondrian"], .ly-root.ly-layout-mondrian, .ly-root.ly-style-mondrian) .ly-panes--three {
74
+ grid-template-columns: minmax(min(100%, 11rem), 0.28fr) minmax(0, 1.44fr) minmax(min(100%, 13rem), 0.28fr);
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,62 @@
1
+ /*
2
+ Layout style: split-screen.
3
+ Equal-weight shell columns for contrasting focal points or side-by-side
4
+ choices. Visual identity remains owned by ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.styles.split_screen {
8
+ :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) {
9
+ --ly-container-max: 100vw;
10
+ --ly-page-padding-inline: clamp(0.875rem, 2.5vw, 2rem);
11
+ --ly-section-padding-block: clamp(1.5rem, 4vw, 3.5rem);
12
+ --ly-sidebar-width: 50vw;
13
+ --ly-grid-min: 14rem;
14
+ --ly-gap: clamp(0.875rem, 2vw, 1.5rem);
15
+ --ly-grid-gap: var(--ly-gap);
16
+ --ly-stack-gap: clamp(0.875rem, 1.6vw, 1.25rem);
17
+ }
18
+
19
+ :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 {
20
+ padding-block: 0;
21
+ }
22
+
23
+ :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,
24
+ :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 {
25
+ width: min(100%, var(--ly-container-max));
26
+ }
27
+
28
+ :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 {
29
+ padding-block: var(--ly-section-padding-block);
30
+ }
31
+
32
+ :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 {
33
+ grid-auto-rows: minmax(9rem, auto);
34
+ }
35
+
36
+ @media (min-width: 48rem) {
37
+ :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 {
38
+ grid-template-areas:
39
+ "header header"
40
+ "main sidebar";
41
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
42
+ }
43
+
44
+ :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 {
45
+ display: block;
46
+ min-height: 100%;
47
+ overflow: auto;
48
+ }
49
+
50
+ :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,
51
+ :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,
52
+ :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 {
53
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
54
+ }
55
+ }
56
+
57
+ @media (min-width: 80rem) {
58
+ :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 {
59
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,88 @@
1
+ /*
2
+ Layout style: synthwave.
3
+ Wide stage, dock-like support areas, and cinematic horizontal flow inspired
4
+ by retro-futuristic interface composition. Visual identity remains owned by
5
+ ui-style-kit-css.
6
+ */
7
+
8
+ @layer ly.styles.synthwave {
9
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) {
10
+ --ly-container-max: 112rem;
11
+ --ly-page-padding-inline: clamp(1rem, 4vw, 3.5rem);
12
+ --ly-section-padding-block: clamp(2.5rem, 7vw, 6rem);
13
+ --ly-sidebar-width: clamp(14rem, 18vw, 20rem);
14
+ --ly-grid-min: 14rem;
15
+ --ly-gap: clamp(1rem, 2.8vw, 2.25rem);
16
+ --ly-grid-gap: var(--ly-gap);
17
+ --ly-stack-gap: clamp(1rem, 2.2vw, 1.8rem);
18
+ --ly-carousel-item-min: 18rem;
19
+ --ly-carousel-item-max: 34rem;
20
+ }
21
+
22
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-main {
23
+ padding-block: clamp(1rem, 3vw, 3rem);
24
+ }
25
+
26
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-container,
27
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-wrapper {
28
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
29
+ }
30
+
31
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-section {
32
+ padding-block: var(--ly-section-padding-block);
33
+ }
34
+
35
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-grid--auto {
36
+ grid-auto-rows: minmax(9rem, auto);
37
+ }
38
+
39
+ @media (min-width: 48rem) {
40
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-shell {
41
+ grid-template-areas:
42
+ "header header"
43
+ "main main"
44
+ "sidebar sidebar";
45
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
46
+ }
47
+
48
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-sidebar {
49
+ display: block;
50
+ overflow: auto;
51
+ }
52
+
53
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-sidebar-layout {
54
+ grid-template-columns: minmax(0, 1.2fr) minmax(min(100%, 17rem), 0.8fr);
55
+ }
56
+
57
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-split {
58
+ grid-template-columns: minmax(0, 1fr);
59
+ }
60
+
61
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-panes--two {
62
+ grid-template-columns: minmax(0, 1.35fr) minmax(min(100%, 17rem), 0.65fr);
63
+ }
64
+ }
65
+
66
+ @media (min-width: 80rem) {
67
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-shell {
68
+ grid-template-areas:
69
+ "header header"
70
+ "main sidebar";
71
+ grid-template-columns: minmax(0, 1.52fr) minmax(min(100%, 17rem), 0.48fr);
72
+ }
73
+
74
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-app-sidebar {
75
+ position: sticky;
76
+ top: var(--ly-space-5);
77
+ height: calc(100svh - (var(--ly-space-5) * 2));
78
+ }
79
+
80
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-split {
81
+ grid-template-columns: minmax(0, 1.42fr) minmax(min(100%, 20rem), 0.58fr);
82
+ }
83
+
84
+ :where(.ly-root[data-layout="synthwave"], .ly-root[layout-style="synthwave"], .ly-root.ly-layout-synthwave, .ly-root.ly-style-synthwave) .ly-panes--three {
85
+ grid-template-columns: minmax(min(100%, 14rem), 0.36fr) minmax(0, 1.28fr) minmax(min(100%, 16rem), 0.36fr);
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,76 @@
1
+ /*
2
+ Layout style: z-pattern.
3
+ Header-first scan path that moves from broad lead content to a right-side
4
+ support rail. Visual identity remains owned by ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.styles.z_pattern {
8
+ :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) {
9
+ --ly-container-max: 100rem;
10
+ --ly-page-padding-inline: clamp(1rem, 3.4vw, 3rem);
11
+ --ly-section-padding-block: clamp(2rem, 5.5vw, 5rem);
12
+ --ly-sidebar-width: clamp(14rem, 20vw, 21rem);
13
+ --ly-grid-min: 15rem;
14
+ --ly-gap: clamp(1rem, 2.4vw, 2rem);
15
+ --ly-grid-gap: var(--ly-gap);
16
+ --ly-stack-gap: clamp(0.875rem, 1.9vw, 1.5rem);
17
+ }
18
+
19
+ :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 {
20
+ padding-block: clamp(1rem, 2.6vw, 2.5rem);
21
+ }
22
+
23
+ :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,
24
+ :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 {
25
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
26
+ }
27
+
28
+ :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 {
29
+ padding-block: var(--ly-section-padding-block);
30
+ }
31
+
32
+ :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 {
33
+ grid-auto-rows: minmax(8rem, auto);
34
+ }
35
+
36
+ @media (min-width: 48rem) {
37
+ :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 {
38
+ grid-template-areas:
39
+ "header header"
40
+ "main sidebar";
41
+ grid-template-columns: minmax(0, 1.18fr) minmax(min(100%, 15rem), 0.42fr);
42
+ }
43
+
44
+ :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 {
45
+ display: block;
46
+ position: sticky;
47
+ top: var(--ly-space-4);
48
+ height: calc(100svh - (var(--ly-space-4) * 2));
49
+ overflow: auto;
50
+ }
51
+
52
+ :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) {
53
+ grid-column: span 2;
54
+ min-height: 12rem;
55
+ }
56
+
57
+ :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 {
58
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, 15rem), 0.36fr);
59
+ }
60
+
61
+ :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 {
62
+ grid-template-columns: minmax(0, 0.92fr) minmax(min(100%, 19rem), 1.08fr);
63
+ align-items: end;
64
+ }
65
+
66
+ :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 {
67
+ grid-template-columns: minmax(0, 1.25fr) minmax(min(100%, 17rem), 0.75fr);
68
+ }
69
+ }
70
+
71
+ @media (min-width: 80rem) {
72
+ :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 {
73
+ grid-template-columns: minmax(0, 1.1fr) minmax(min(100%, 15rem), 0.55fr) minmax(min(100%, 14rem), 0.35fr);
74
+ }
75
+ }
76
+ }