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
@@ -0,0 +1,69 @@
1
+ # Release And Publishing
2
+
3
+ This page is the release checklist for `layout-style-css@1.1.2`.
4
+
5
+ ## Version Contract
6
+
7
+ - `package.json` version is `1.1.2`.
8
+ - `package-lock.json` is synchronized with `1.1.2`.
9
+ - `CHANGELOG.md` contains a `1.1.2` entry.
10
+ - README and wiki docs link to the current public API.
11
+
12
+ ## Verification
13
+
14
+ Run:
15
+
16
+ ```bash
17
+ npm run build
18
+ npm run lint
19
+ npm test
20
+ npm run check
21
+ npm run release:verify
22
+ npm audit --audit-level=moderate
23
+ git diff --check
24
+ ```
25
+
26
+ Expected result: every command exits with status `0`. `git diff --check` may print line-ending warnings on Windows, but it must not report whitespace errors.
27
+
28
+ ## Publish
29
+
30
+ Before publishing, confirm npm does not already have the target version:
31
+
32
+ ```bash
33
+ npm view layout-style-css@1.1.2 version --json
34
+ ```
35
+
36
+ Publish:
37
+
38
+ ```bash
39
+ npm login
40
+ npm publish --access public
41
+ ```
42
+
43
+ Verify:
44
+
45
+ ```bash
46
+ npm view layout-style-css@1.1.2
47
+ ```
48
+
49
+ ## Tag
50
+
51
+ Tag the release:
52
+
53
+ ```bash
54
+ git tag v1.1.2
55
+ git push origin v1.1.2
56
+ ```
57
+
58
+ The npm publish workflow runs when the `v1.1.2` GitHub release is published. If the release event needs to be replayed, run the `Node.js Package` workflow manually from the default branch with `release_tag` set to `v1.1.2`.
59
+
60
+ ## GitHub Wiki Mirror
61
+
62
+ If the repository wiki is enabled, mirror `docs/wiki/*.md` into:
63
+
64
+ ```txt
65
+ https://github.com/Foscat/Layout-Style-CSS.wiki.git
66
+ ```
67
+
68
+ The wiki remote was not available during local preparation, so the versioned source remains the authoritative documentation until the remote is initialized.
69
+
@@ -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.2",
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
+ }