layout-style-css 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +447 -0
  3. package/demo/assets/apple-touch-icon.svg +7 -0
  4. package/demo/assets/favicon.svg +7 -0
  5. package/demo/assets/social-card.svg +17 -0
  6. package/demo/browserconfig.xml +9 -0
  7. package/demo/index.html +700 -0
  8. package/demo/robots.txt +4 -0
  9. package/demo/site.webmanifest +23 -0
  10. package/demo/sitemap.xml +9 -0
  11. package/dist/layout-all-with-ui-kit-and-interactive-surface.css +3 -0
  12. package/dist/layout-all-with-ui-kit.css +2 -0
  13. package/dist/layout-all.css +13 -0
  14. package/dist/layout-base.css +472 -0
  15. package/dist/layout-style-bauhaus.css +70 -0
  16. package/dist/layout-style-bento.css +76 -0
  17. package/dist/layout-style-brutalism.css +70 -0
  18. package/dist/layout-style-css.css +1367 -0
  19. package/dist/layout-style-css.min.css +1 -0
  20. package/dist/layout-style-cyberpunk.css +70 -0
  21. package/dist/layout-style-maximalist.css +93 -0
  22. package/dist/layout-style-minimal-saas.css +67 -0
  23. package/dist/layout-style-neumorphism.css +72 -0
  24. package/dist/layout-style-retro-glass.css +82 -0
  25. package/dist/layout-style-retrofuturism.css +71 -0
  26. package/dist/layout-style-tactile.css +70 -0
  27. package/dist/layout-style-y2k.css +72 -0
  28. package/dist/layout-ui-style-kit-bridge.css +55 -0
  29. package/package.json +97 -0
  30. package/styles/layout-base.css +472 -0
  31. package/styles/layout-style-bauhaus.css +70 -0
  32. package/styles/layout-style-bento.css +76 -0
  33. package/styles/layout-style-brutalism.css +70 -0
  34. package/styles/layout-style-cyberpunk.css +70 -0
  35. package/styles/layout-style-maximalist.css +93 -0
  36. package/styles/layout-style-minimal-saas.css +67 -0
  37. package/styles/layout-style-neumorphism.css +72 -0
  38. package/styles/layout-style-retro-glass.css +82 -0
  39. package/styles/layout-style-retrofuturism.css +71 -0
  40. package/styles/layout-style-tactile.css +70 -0
  41. package/styles/layout-style-y2k.css +72 -0
  42. package/styles/layout-ui-style-kit-bridge.css +55 -0
@@ -0,0 +1,72 @@
1
+ /*
2
+ Layout style: y2k.
3
+ Centered hub shell with floating-window rhythm and in-flow support regions.
4
+ Visual identity remains owned by ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.styles.y2k {
8
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) {
9
+ --ly-container-max: 84rem;
10
+ --ly-page-padding-inline: clamp(1rem, 5vw, 4rem);
11
+ --ly-section-padding-block: clamp(3rem, 8vw, 6rem);
12
+ --ly-sidebar-width: clamp(17rem, 22vw, 21rem);
13
+ --ly-grid-min: 16rem;
14
+ --ly-gap: clamp(1.25rem, 3vw, 2.5rem);
15
+ --ly-grid-gap: var(--ly-gap);
16
+ --ly-stack-gap: clamp(1rem, 2.5vw, 2rem);
17
+ }
18
+
19
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-app-main {
20
+ padding-block: clamp(2rem, 6vw, 4rem);
21
+ }
22
+
23
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-container,
24
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-wrapper {
25
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
26
+ }
27
+
28
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-section {
29
+ padding-block: var(--ly-section-padding-block);
30
+ }
31
+
32
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-grid--auto {
33
+ grid-auto-rows: minmax(8rem, auto);
34
+ }
35
+
36
+ @media (min-width: 54rem) {
37
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-app-shell {
38
+ grid-template-areas:
39
+ "header header"
40
+ "main sidebar";
41
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.34fr);
42
+ align-items: start;
43
+ }
44
+
45
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-app-sidebar {
46
+ display: block;
47
+ position: sticky;
48
+ top: clamp(1rem, 4vw, 3rem);
49
+ max-height: calc(100svh - clamp(2rem, 8vw, 6rem));
50
+ margin: clamp(3rem, 8vw, 6rem) clamp(1rem, 5vw, 3rem) clamp(2rem, 6vw, 4rem) 0;
51
+ overflow: auto;
52
+ }
53
+
54
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-sidebar-layout {
55
+ grid-template-columns: minmax(0, 0.92fr) minmax(min(100%, 16rem), 1.08fr);
56
+ }
57
+
58
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-split {
59
+ grid-template-columns: minmax(0, 0.86fr) minmax(min(100%, 18rem), 1.14fr);
60
+ }
61
+
62
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-panes--two {
63
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, 17rem), 0.56fr);
64
+ }
65
+ }
66
+
67
+ @media (min-width: 80rem) {
68
+ :where(.ly-root[data-layout="y2k"], .ly-root[layout-style="y2k"], .ly-root.ly-layout-y2k, .ly-root.ly-style-y2k) .ly-panes--three {
69
+ grid-template-columns: minmax(min(100%, 16rem), 0.5fr) minmax(0, 1fr) minmax(min(100%, 16rem), 0.5fr);
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,55 @@
1
+ /*
2
+ Compatibility bridge for ui-style-kit-css.
3
+ This bridge intentionally does not map color, type, border, or shadow tokens.
4
+ ui-style-kit-css owns those visuals; layout-style-library owns structure.
5
+ */
6
+
7
+ @layer ly.bridge {
8
+ :where(.ly-root[data-ui][data-theme][data-mode], [data-ui][data-theme][data-mode] .ly-root) {
9
+ --ly-ui-style-kit-bridge: 1;
10
+ }
11
+
12
+ :where(.ly-root[data-ui="minimal-saas"], [data-ui="minimal-saas"] .ly-root) {
13
+ --ly-ui-style-kit-bridge-style: minimal-saas;
14
+ }
15
+
16
+ :where(.ly-root[data-ui="bento"], [data-ui="bento"] .ly-root) {
17
+ --ly-ui-style-kit-bridge-style: bento;
18
+ }
19
+
20
+ :where(.ly-root[data-ui="maximalist"], [data-ui="maximalist"] .ly-root) {
21
+ --ly-ui-style-kit-bridge-style: maximalist;
22
+ }
23
+
24
+ :where(.ly-root[data-ui="bauhaus"], [data-ui="bauhaus"] .ly-root) {
25
+ --ly-ui-style-kit-bridge-style: bauhaus;
26
+ }
27
+
28
+ :where(.ly-root[data-ui="tactile"], [data-ui="tactile"] .ly-root) {
29
+ --ly-ui-style-kit-bridge-style: tactile;
30
+ }
31
+
32
+ :where(.ly-root[data-ui="neumorphism"], [data-ui="neumorphism"] .ly-root) {
33
+ --ly-ui-style-kit-bridge-style: neumorphism;
34
+ }
35
+
36
+ :where(.ly-root[data-ui="retrofuturism"], [data-ui="retrofuturism"] .ly-root) {
37
+ --ly-ui-style-kit-bridge-style: retrofuturism;
38
+ }
39
+
40
+ :where(.ly-root[data-ui="brutalism"], [data-ui="brutalism"] .ly-root) {
41
+ --ly-ui-style-kit-bridge-style: brutalism;
42
+ }
43
+
44
+ :where(.ly-root[data-ui="cyberpunk"], [data-ui="cyberpunk"] .ly-root) {
45
+ --ly-ui-style-kit-bridge-style: cyberpunk;
46
+ }
47
+
48
+ :where(.ly-root[data-ui="y2k"], [data-ui="y2k"] .ly-root) {
49
+ --ly-ui-style-kit-bridge-style: y2k;
50
+ }
51
+
52
+ :where(.ly-root[data-ui="retro-glass"], [data-ui="retro-glass"] .ly-root) {
53
+ --ly-ui-style-kit-bridge-style: retro-glass;
54
+ }
55
+ }
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "layout-style-css",
3
+ "version": "1.0.0",
4
+ "description": "Shell-first CSS layout primitives that complement ui-style-kit-css@2.0.1.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/Foscat/layout-style-css#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Foscat/layout-style-css.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Foscat/layout-style-css/issues"
14
+ },
15
+ "keywords": [
16
+ "css",
17
+ "layout",
18
+ "design-system",
19
+ "ui-style-kit-css",
20
+ "responsive-layout",
21
+ "shell-layouts"
22
+ ],
23
+ "main": "dist/layout-style-css.css",
24
+ "style": "dist/layout-style-css.min.css",
25
+ "unpkg": "dist/layout-style-css.min.css",
26
+ "jsdelivr": "dist/layout-style-css.min.css",
27
+ "scripts": {
28
+ "build": "node scripts/build.mjs",
29
+ "pages:build": "node scripts/build-pages.mjs",
30
+ "lint": "stylelint \"styles/**/*.css\"",
31
+ "test": "node test/layout-css-contract.test.mjs && node test/demo-smoke.test.mjs && node test/pages-artifact.test.mjs",
32
+ "check": "npm run build && npm run lint && npm test && npm run pack:dry-run",
33
+ "pack:dry-run": "npm pack --dry-run --ignore-scripts",
34
+ "publish:dry-run": "npm publish --dry-run --access public",
35
+ "release:verify": "npm run check && npm run publish:dry-run",
36
+ "prepack": "npm run check",
37
+ "prepublishOnly": "npm run check"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "peerDependencies": {
43
+ "interactive-surface-css": "1.2.5",
44
+ "ui-style-kit-css": "2.0.1"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "interactive-surface-css": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "devDependencies": {
52
+ "@playwright/test": "1.61.1",
53
+ "interactive-surface-css": "1.2.5",
54
+ "stylelint": "17.14.0",
55
+ "ui-style-kit-css": "2.0.1"
56
+ },
57
+ "exports": {
58
+ ".": "./dist/layout-style-css.css",
59
+ "./css": "./dist/layout-style-css.css",
60
+ "./css.css": "./dist/layout-style-css.css",
61
+ "./min": "./dist/layout-style-css.min.css",
62
+ "./min.css": "./dist/layout-style-css.min.css",
63
+ "./dist/layout-style-css.css": "./dist/layout-style-css.css",
64
+ "./dist/layout-style-css.min.css": "./dist/layout-style-css.min.css",
65
+ "./base.css": "./dist/layout-base.css",
66
+ "./bridge.css": "./dist/layout-ui-style-kit-bridge.css",
67
+ "./all.css": "./dist/layout-all.css",
68
+ "./all-with-ui-kit.css": "./dist/layout-all-with-ui-kit.css",
69
+ "./all-with-ui-kit-and-interactive-surface.css": "./dist/layout-all-with-ui-kit-and-interactive-surface.css",
70
+ "./minimal-saas.css": "./dist/layout-style-minimal-saas.css",
71
+ "./bento.css": "./dist/layout-style-bento.css",
72
+ "./maximalist.css": "./dist/layout-style-maximalist.css",
73
+ "./bauhaus.css": "./dist/layout-style-bauhaus.css",
74
+ "./tactile.css": "./dist/layout-style-tactile.css",
75
+ "./neumorphism.css": "./dist/layout-style-neumorphism.css",
76
+ "./retrofuturism.css": "./dist/layout-style-retrofuturism.css",
77
+ "./brutalism.css": "./dist/layout-style-brutalism.css",
78
+ "./cyberpunk.css": "./dist/layout-style-cyberpunk.css",
79
+ "./y2k.css": "./dist/layout-style-y2k.css",
80
+ "./retro-glass.css": "./dist/layout-style-retro-glass.css",
81
+ "./package.json": "./package.json"
82
+ },
83
+ "files": [
84
+ "dist",
85
+ "styles",
86
+ "demo/index.html",
87
+ "demo/assets/apple-touch-icon.svg",
88
+ "demo/assets/favicon.svg",
89
+ "demo/assets/social-card.svg",
90
+ "demo/browserconfig.xml",
91
+ "demo/robots.txt",
92
+ "demo/site.webmanifest",
93
+ "demo/sitemap.xml",
94
+ "README.md",
95
+ "LICENSE"
96
+ ]
97
+ }
@@ -0,0 +1,472 @@
1
+ /*
2
+ Layout Style Library base primitives.
3
+ This file owns spatial composition only. Visual paint, typography, borders,
4
+ shadows, and theme color are intentionally delegated to ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.tokens {
8
+ :where(.ly-root) {
9
+ --ly-space-0: 0;
10
+ --ly-space-1: 0.25rem;
11
+ --ly-space-2: 0.5rem;
12
+ --ly-space-3: 0.75rem;
13
+ --ly-space-4: 1rem;
14
+ --ly-space-5: 1.5rem;
15
+ --ly-space-6: 2rem;
16
+ --ly-space-7: 3rem;
17
+ --ly-space-8: 4rem;
18
+ --ly-space-9: 6rem;
19
+
20
+ --ly-container-sm: 40rem;
21
+ --ly-container-md: 56rem;
22
+ --ly-container-lg: 72rem;
23
+ --ly-container-xl: 88rem;
24
+ --ly-container-wide: 112rem;
25
+ --ly-container-max: var(--ly-container-lg);
26
+ --ly-content-readable: 68ch;
27
+
28
+ --ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
29
+ --ly-section-padding-block: clamp(3rem, 7vw, 6rem);
30
+ --ly-gap: var(--ly-space-5);
31
+ --ly-grid-gap: var(--ly-gap);
32
+ --ly-stack-gap: var(--ly-space-4);
33
+ --ly-cluster-gap: var(--ly-space-3);
34
+
35
+ --ly-grid-columns: 12;
36
+ --ly-grid-min: 16rem;
37
+ --ly-sidebar-min: 14rem;
38
+ --ly-sidebar-width: 18rem;
39
+ --ly-sidebar-max: 22rem;
40
+ --ly-pane-fixed: 22rem;
41
+ --ly-header-height: 4.5rem;
42
+
43
+ --ly-radius-sm: 0.5rem;
44
+ --ly-radius: 0.875rem;
45
+ --ly-radius-lg: 1.5rem;
46
+ --ly-radius-xl: 2.25rem;
47
+
48
+ --ly-z-header: 20;
49
+ --ly-z-sidebar: 10;
50
+ }
51
+ }
52
+
53
+ @layer ly.reset {
54
+ :where(.ly-root),
55
+ :where(.ly-root *) {
56
+ box-sizing: border-box;
57
+ }
58
+
59
+ :where(.ly-root) {
60
+ min-width: 0;
61
+ margin: 0;
62
+ }
63
+
64
+ :where(.ly-root img),
65
+ :where(.ly-root svg),
66
+ :where(.ly-root video),
67
+ :where(.ly-root canvas) {
68
+ max-width: 100%;
69
+ }
70
+ }
71
+
72
+ @layer ly.layout {
73
+ .ly-page {
74
+ min-height: 100svh;
75
+ }
76
+
77
+ .ly-header,
78
+ .ly-footer,
79
+ .ly-main,
80
+ .ly-wrapper,
81
+ .ly-section,
82
+ .ly-surface {
83
+ min-width: 0;
84
+ }
85
+
86
+ .ly-header {
87
+ min-height: var(--ly-header-height);
88
+ }
89
+
90
+ .ly-header--sticky {
91
+ position: sticky;
92
+ top: 0;
93
+ z-index: var(--ly-z-header);
94
+ }
95
+
96
+ .ly-container,
97
+ .ly-wrapper {
98
+ /* Keep wrappers resilient during viewport resizing without owning visual paint. */
99
+ width: min(100% - (var(--ly-page-padding-inline) * 2), var(--ly-container-max));
100
+ margin-inline: auto;
101
+ }
102
+
103
+ .ly-container--sm,
104
+ .ly-wrapper--sm {
105
+ --ly-container-max: var(--ly-container-sm);
106
+ }
107
+
108
+ .ly-container--md,
109
+ .ly-wrapper--md {
110
+ --ly-container-max: var(--ly-container-md);
111
+ }
112
+
113
+ .ly-container--lg,
114
+ .ly-wrapper--lg {
115
+ --ly-container-max: var(--ly-container-lg);
116
+ }
117
+
118
+ .ly-container--xl,
119
+ .ly-wrapper--xl {
120
+ --ly-container-max: var(--ly-container-xl);
121
+ }
122
+
123
+ .ly-container--wide,
124
+ .ly-wrapper--wide {
125
+ --ly-container-max: var(--ly-container-wide);
126
+ }
127
+
128
+ .ly-container--fluid,
129
+ .ly-wrapper--fluid {
130
+ width: 100%;
131
+ max-width: none;
132
+ padding-inline: var(--ly-page-padding-inline);
133
+ }
134
+
135
+ .ly-wrapper--readable {
136
+ --ly-container-max: var(--ly-content-readable);
137
+ }
138
+
139
+ .ly-readable {
140
+ max-width: var(--ly-content-readable);
141
+ }
142
+
143
+ .ly-section {
144
+ padding-block: var(--ly-section-padding-block);
145
+ }
146
+
147
+ .ly-section--compact {
148
+ --ly-section-padding-block: var(--ly-space-7);
149
+ }
150
+
151
+ .ly-section--flush {
152
+ --ly-section-padding-block: 0;
153
+ }
154
+
155
+ .ly-stack {
156
+ display: flex;
157
+ flex-direction: column;
158
+ gap: var(--ly-stack-gap);
159
+ }
160
+
161
+ .ly-cluster {
162
+ display: flex;
163
+ flex-wrap: wrap;
164
+ align-items: center;
165
+ gap: var(--ly-cluster-gap);
166
+ }
167
+
168
+ .ly-grid {
169
+ display: grid;
170
+ grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
171
+ gap: var(--ly-grid-gap);
172
+ }
173
+
174
+ .ly-grid--auto {
175
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
176
+ }
177
+
178
+ .ly-row {
179
+ display: flex;
180
+ flex-wrap: wrap;
181
+ margin-inline: calc(var(--ly-gutter, var(--ly-gap)) * -0.5);
182
+ }
183
+
184
+ .ly-col {
185
+ flex: 1 1 0;
186
+ min-width: 0;
187
+ padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5);
188
+ }
189
+
190
+ .ly-sidebar-layout {
191
+ display: grid;
192
+ grid-template-columns: 1fr;
193
+ gap: var(--ly-gap);
194
+ }
195
+
196
+ .ly-sidebar-layout > * {
197
+ min-width: 0;
198
+ }
199
+
200
+ .ly-sidebar {
201
+ min-width: 0;
202
+ }
203
+
204
+ .ly-content {
205
+ min-width: 0;
206
+ }
207
+
208
+ .ly-split {
209
+ display: grid;
210
+ grid-template-columns: 1fr;
211
+ gap: var(--ly-gap);
212
+ align-items: var(--ly-split-align, center);
213
+ }
214
+
215
+ .ly-split > * {
216
+ min-width: 0;
217
+ }
218
+
219
+ .ly-panes {
220
+ display: grid;
221
+ grid-template-columns: 1fr;
222
+ gap: var(--ly-gap);
223
+ }
224
+
225
+ .ly-panes > * {
226
+ min-width: 0;
227
+ }
228
+
229
+ .ly-surface {
230
+ border-radius: var(--ly-radius);
231
+ }
232
+
233
+ .ly-surface--raised {
234
+ border-radius: var(--ly-radius-lg);
235
+ }
236
+
237
+ .ly-divider {
238
+ min-height: 1px;
239
+ margin-block: var(--ly-space-5);
240
+ }
241
+
242
+ .ly-frame {
243
+ aspect-ratio: var(--ly-frame-ratio, 16 / 9);
244
+ overflow: hidden;
245
+ }
246
+
247
+ .ly-frame > * {
248
+ width: 100%;
249
+ height: 100%;
250
+ object-fit: cover;
251
+ }
252
+
253
+ .ly-scroll-area {
254
+ min-height: 0;
255
+ overflow: auto;
256
+ }
257
+
258
+ .ly-app-shell {
259
+ min-height: 100svh;
260
+ display: grid;
261
+ grid-template-areas:
262
+ "header"
263
+ "main";
264
+ grid-template-columns: minmax(0, 1fr);
265
+ grid-template-rows: auto minmax(0, 1fr);
266
+ }
267
+
268
+ .ly-app-header {
269
+ grid-area: header;
270
+ min-width: 0;
271
+ }
272
+
273
+ .ly-app-sidebar {
274
+ grid-area: sidebar;
275
+ display: none;
276
+ min-width: 0;
277
+ }
278
+
279
+ .ly-app-main {
280
+ grid-area: main;
281
+ min-width: 0;
282
+ }
283
+
284
+ .ly-visually-hidden {
285
+ position: absolute !important;
286
+ width: 1px !important;
287
+ height: 1px !important;
288
+ padding: 0 !important;
289
+ margin: -1px !important;
290
+ overflow: hidden !important;
291
+ clip: rect(0, 0, 0, 0) !important;
292
+ clip-path: inset(50%) !important;
293
+ white-space: nowrap !important;
294
+ }
295
+ }
296
+
297
+ @layer ly.responsive {
298
+ @media (min-width: 48rem) {
299
+ /*
300
+ Fixed support tracks are capped against their container so nested layouts
301
+ can compress instead of forcing horizontal page overflow.
302
+ */
303
+ .ly-app-shell {
304
+ grid-template-areas:
305
+ "sidebar header"
306
+ "sidebar main";
307
+ grid-template-columns: minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-width)) minmax(0, 1fr);
308
+ }
309
+
310
+ .ly-app-sidebar {
311
+ display: block;
312
+ position: sticky;
313
+ top: 0;
314
+ z-index: var(--ly-z-sidebar);
315
+ height: 100svh;
316
+ overflow: auto;
317
+ }
318
+
319
+ .ly-sidebar-layout {
320
+ grid-template-columns: minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-max)) minmax(0, 1fr);
321
+ align-items: start;
322
+ }
323
+
324
+ .ly-sidebar-layout--right {
325
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-max));
326
+ }
327
+
328
+ .ly-split {
329
+ grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
330
+ }
331
+
332
+ .ly-panes--two {
333
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-pane-fixed)), 0.7fr);
334
+ }
335
+ }
336
+
337
+ @media (min-width: 64rem) {
338
+ .ly-panes--three {
339
+ grid-template-columns: minmax(min(100%, 14rem), 0.35fr) minmax(0, 1fr) minmax(min(100%, 14rem), 0.35fr);
340
+ }
341
+ }
342
+ }
343
+
344
+ @layer ly.utilities {
345
+ .ly-cols-1 { --ly-grid-columns: 1; }
346
+ .ly-cols-2 { --ly-grid-columns: 2; }
347
+ .ly-cols-3 { --ly-grid-columns: 3; }
348
+ .ly-cols-4 { --ly-grid-columns: 4; }
349
+ .ly-cols-5 { --ly-grid-columns: 5; }
350
+ .ly-cols-6 { --ly-grid-columns: 6; }
351
+ .ly-cols-7 { --ly-grid-columns: 7; }
352
+ .ly-cols-8 { --ly-grid-columns: 8; }
353
+ .ly-cols-9 { --ly-grid-columns: 9; }
354
+ .ly-cols-10 { --ly-grid-columns: 10; }
355
+ .ly-cols-11 { --ly-grid-columns: 11; }
356
+ .ly-cols-12 { --ly-grid-columns: 12; }
357
+ .ly-cols-16 { --ly-grid-columns: 16; }
358
+
359
+ .ly-span-1 { grid-column: span 1; }
360
+ .ly-span-2 { grid-column: span 2; }
361
+ .ly-span-3 { grid-column: span 3; }
362
+ .ly-span-4 { grid-column: span 4; }
363
+ .ly-span-5 { grid-column: span 5; }
364
+ .ly-span-6 { grid-column: span 6; }
365
+ .ly-span-7 { grid-column: span 7; }
366
+ .ly-span-8 { grid-column: span 8; }
367
+ .ly-span-9 { grid-column: span 9; }
368
+ .ly-span-10 { grid-column: span 10; }
369
+ .ly-span-11 { grid-column: span 11; }
370
+ .ly-span-12 { grid-column: span 12; }
371
+ .ly-span-13 { grid-column: span 13; }
372
+ .ly-span-14 { grid-column: span 14; }
373
+ .ly-span-15 { grid-column: span 15; }
374
+ .ly-span-16 { grid-column: span 16; }
375
+ .ly-span-full { grid-column: 1 / -1; }
376
+
377
+ .ly-col-1 { flex: 0 0 auto; width: 8.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
378
+ .ly-col-2 { flex: 0 0 auto; width: 16.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
379
+ .ly-col-3 { flex: 0 0 auto; width: 25%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
380
+ .ly-col-4 { flex: 0 0 auto; width: 33.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
381
+ .ly-col-5 { flex: 0 0 auto; width: 41.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
382
+ .ly-col-6 { flex: 0 0 auto; width: 50%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
383
+ .ly-col-7 { flex: 0 0 auto; width: 58.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
384
+ .ly-col-8 { flex: 0 0 auto; width: 66.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
385
+ .ly-col-9 { flex: 0 0 auto; width: 75%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
386
+ .ly-col-10 { flex: 0 0 auto; width: 83.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
387
+ .ly-col-11 { flex: 0 0 auto; width: 91.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
388
+ .ly-col-12 { flex: 0 0 auto; width: 100%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
389
+
390
+ .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); }
391
+ .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); }
392
+ .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); }
393
+ .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); }
394
+ .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); }
395
+ .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); }
396
+ .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); }
397
+ .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); }
398
+ .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); }
399
+ .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); }
400
+
401
+ .ly-pad-0 { padding: var(--ly-space-0); }
402
+ .ly-pad-1 { padding: var(--ly-space-1); }
403
+ .ly-pad-2 { padding: var(--ly-space-2); }
404
+ .ly-pad-3 { padding: var(--ly-space-3); }
405
+ .ly-pad-4 { padding: var(--ly-space-4); }
406
+ .ly-pad-5 { padding: var(--ly-space-5); }
407
+ .ly-pad-6 { padding: var(--ly-space-6); }
408
+ .ly-pad-7 { padding: var(--ly-space-7); }
409
+ .ly-pad-8 { padding: var(--ly-space-8); }
410
+ .ly-pad-9 { padding: var(--ly-space-9); }
411
+
412
+ .ly-px-4 { padding-inline: var(--ly-space-4); }
413
+ .ly-px-6 { padding-inline: var(--ly-space-6); }
414
+ .ly-px-8 { padding-inline: var(--ly-space-8); }
415
+ .ly-py-4 { padding-block: var(--ly-space-4); }
416
+ .ly-py-6 { padding-block: var(--ly-space-6); }
417
+ .ly-py-8 { padding-block: var(--ly-space-8); }
418
+
419
+ .ly-mx-auto { margin-inline: auto; }
420
+ .ly-w-full { width: 100%; }
421
+ .ly-h-full { height: 100%; }
422
+ .ly-min-h-screen { min-height: 100svh; }
423
+ .ly-bleed { width: 100vw; margin-inline: calc(50% - 50vw); }
424
+ .ly-overflow-auto { overflow: auto; }
425
+ .ly-overflow-hidden { overflow: hidden; }
426
+
427
+ .ly-items-start { align-items: flex-start; }
428
+ .ly-items-center { align-items: center; }
429
+ .ly-items-end { align-items: flex-end; }
430
+ .ly-items-stretch { align-items: stretch; }
431
+ .ly-justify-start { justify-content: flex-start; }
432
+ .ly-justify-center { justify-content: center; }
433
+ .ly-justify-end { justify-content: flex-end; }
434
+ .ly-justify-between { justify-content: space-between; }
435
+
436
+ .ly-frame-1x1 { --ly-frame-ratio: 1 / 1; }
437
+ .ly-frame-2x1 { --ly-frame-ratio: 2 / 1; }
438
+ .ly-frame-3x2 { --ly-frame-ratio: 3 / 2; }
439
+ .ly-frame-4x3 { --ly-frame-ratio: 4 / 3; }
440
+ .ly-frame-16x9 { --ly-frame-ratio: 16 / 9; }
441
+ .ly-frame-21x9 { --ly-frame-ratio: 21 / 9; }
442
+
443
+ .ly-hidden { display: none !important; }
444
+ .ly-show-md-up,
445
+ .ly-show-lg-up {
446
+ display: none !important;
447
+ }
448
+
449
+ @media (min-width: 48rem) {
450
+ .ly-md-cols-1 { --ly-grid-columns: 1; }
451
+ .ly-md-cols-2 { --ly-grid-columns: 2; }
452
+ .ly-md-cols-3 { --ly-grid-columns: 3; }
453
+ .ly-md-cols-4 { --ly-grid-columns: 4; }
454
+ .ly-md-cols-6 { --ly-grid-columns: 6; }
455
+ .ly-md-cols-8 { --ly-grid-columns: 8; }
456
+ .ly-md-cols-12 { --ly-grid-columns: 12; }
457
+ .ly-md-cols-16 { --ly-grid-columns: 16; }
458
+ .ly-show-md-up { display: revert !important; }
459
+ }
460
+
461
+ @media (min-width: 64rem) {
462
+ .ly-lg-cols-1 { --ly-grid-columns: 1; }
463
+ .ly-lg-cols-2 { --ly-grid-columns: 2; }
464
+ .ly-lg-cols-3 { --ly-grid-columns: 3; }
465
+ .ly-lg-cols-4 { --ly-grid-columns: 4; }
466
+ .ly-lg-cols-6 { --ly-grid-columns: 6; }
467
+ .ly-lg-cols-8 { --ly-grid-columns: 8; }
468
+ .ly-lg-cols-12 { --ly-grid-columns: 12; }
469
+ .ly-lg-cols-16 { --ly-grid-columns: 16; }
470
+ .ly-show-lg-up { display: revert !important; }
471
+ }
472
+ }