layout-style-css 1.1.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +81 -44
  2. package/CONTRIBUTING.md +55 -50
  3. package/LICENSE +21 -21
  4. package/README.md +236 -636
  5. package/SECURITY.md +50 -45
  6. package/demo/assets/apple-touch-icon.svg +7 -7
  7. package/demo/assets/favicon.svg +7 -7
  8. package/demo/browserconfig.xml +9 -9
  9. package/demo/demo.css +523 -0
  10. package/demo/demo.js +605 -0
  11. package/demo/index.html +325 -976
  12. package/demo/robots.txt +4 -4
  13. package/demo/site.webmanifest +23 -23
  14. package/demo/sitemap.xml +9 -9
  15. package/dist/core.css +6 -0
  16. package/{styles/layout-ui-style-kit-bridge.css → dist/integrations/ui-style-kit.css} +175 -170
  17. package/dist/layout-style-css.css +1473 -1903
  18. package/dist/layout-style-css.min.css +1 -1
  19. package/dist/legacy.css +787 -0
  20. package/dist/personalities/bauhaus.css +46 -0
  21. package/dist/personalities/bento.css +43 -0
  22. package/dist/personalities/brutalism.css +36 -0
  23. package/dist/personalities/cyberpunk.css +36 -0
  24. package/dist/personalities/f-pattern.css +48 -0
  25. package/dist/personalities/maximalist.css +51 -0
  26. package/dist/personalities/minimal-saas.css +37 -0
  27. package/dist/personalities/mondrian.css +44 -0
  28. package/dist/personalities/neumorphism.css +46 -0
  29. package/dist/personalities/retro-glass.css +44 -0
  30. package/dist/personalities/retrofuturism.css +36 -0
  31. package/dist/personalities/split-screen.css +41 -0
  32. package/dist/personalities/synthwave.css +48 -0
  33. package/dist/personalities/tactile.css +39 -0
  34. package/dist/personalities/y2k.css +36 -0
  35. package/dist/personalities/z-pattern.css +49 -0
  36. package/dist/personalities.css +18 -0
  37. package/dist/primitives.css +219 -0
  38. package/dist/recipes.css +270 -0
  39. package/dist/utilities.css +162 -0
  40. package/dist/wrappers.css +174 -0
  41. package/docs/wiki/Contributing.md +36 -30
  42. package/docs/wiki/Demo-And-GitHub-Pages.md +53 -39
  43. package/docs/wiki/Getting-Started.md +51 -68
  44. package/docs/wiki/Home.md +33 -48
  45. package/docs/wiki/Installation-And-CDN.md +72 -58
  46. package/docs/wiki/Layout-Primitives.md +48 -57
  47. package/docs/wiki/Layout-Recipes.md +49 -80
  48. package/docs/wiki/Layout-Styles.md +33 -43
  49. package/docs/wiki/Migrating-To-2.0.md +186 -0
  50. package/docs/wiki/Release-And-Publishing.md +77 -69
  51. package/docs/wiki/Security-And-Support.md +36 -34
  52. package/docs/wiki/UI-Style-Kit-Compatibility.md +49 -54
  53. package/docs/wiki/_Sidebar.md +15 -14
  54. package/package.json +98 -107
  55. package/styles/core.css +6 -0
  56. package/{dist/layout-ui-style-kit-bridge.css → styles/integrations/ui-style-kit.css} +175 -170
  57. package/styles/legacy.css +173 -0
  58. package/styles/personalities/bauhaus.css +46 -0
  59. package/styles/personalities/bento.css +43 -0
  60. package/styles/personalities/brutalism.css +36 -0
  61. package/styles/personalities/cyberpunk.css +36 -0
  62. package/styles/personalities/f-pattern.css +48 -0
  63. package/styles/personalities/maximalist.css +51 -0
  64. package/styles/personalities/minimal-saas.css +37 -0
  65. package/styles/personalities/mondrian.css +44 -0
  66. package/styles/personalities/neumorphism.css +46 -0
  67. package/styles/personalities/retro-glass.css +44 -0
  68. package/styles/personalities/retrofuturism.css +36 -0
  69. package/styles/personalities/split-screen.css +41 -0
  70. package/styles/personalities/synthwave.css +48 -0
  71. package/styles/personalities/tactile.css +39 -0
  72. package/styles/personalities/y2k.css +36 -0
  73. package/styles/personalities/z-pattern.css +49 -0
  74. package/styles/personalities.css +18 -0
  75. package/styles/primitives.css +219 -0
  76. package/styles/recipes.css +270 -0
  77. package/styles/utilities.css +162 -0
  78. package/styles/wrappers.css +174 -0
  79. package/dist/layout-all-with-ui-kit-and-interactive-surface.css +0 -3
  80. package/dist/layout-all-with-ui-kit.css +0 -2
  81. package/dist/layout-all.css +0 -18
  82. package/dist/layout-base.css +0 -539
  83. package/dist/layout-style-bauhaus.css +0 -70
  84. package/dist/layout-style-bento.css +0 -76
  85. package/dist/layout-style-brutalism.css +0 -70
  86. package/dist/layout-style-cyberpunk.css +0 -70
  87. package/dist/layout-style-f-pattern.css +0 -76
  88. package/dist/layout-style-maximalist.css +0 -93
  89. package/dist/layout-style-minimal-saas.css +0 -67
  90. package/dist/layout-style-mondrian.css +0 -77
  91. package/dist/layout-style-neumorphism.css +0 -72
  92. package/dist/layout-style-retro-glass.css +0 -82
  93. package/dist/layout-style-retrofuturism.css +0 -71
  94. package/dist/layout-style-split-screen.css +0 -62
  95. package/dist/layout-style-synthwave.css +0 -88
  96. package/dist/layout-style-tactile.css +0 -70
  97. package/dist/layout-style-y2k.css +0 -72
  98. package/dist/layout-style-z-pattern.css +0 -76
  99. package/styles/layout-base.css +0 -539
  100. package/styles/layout-style-bauhaus.css +0 -70
  101. package/styles/layout-style-bento.css +0 -76
  102. package/styles/layout-style-brutalism.css +0 -70
  103. package/styles/layout-style-cyberpunk.css +0 -70
  104. package/styles/layout-style-f-pattern.css +0 -76
  105. package/styles/layout-style-maximalist.css +0 -93
  106. package/styles/layout-style-minimal-saas.css +0 -67
  107. package/styles/layout-style-mondrian.css +0 -77
  108. package/styles/layout-style-neumorphism.css +0 -72
  109. package/styles/layout-style-retro-glass.css +0 -82
  110. package/styles/layout-style-retrofuturism.css +0 -71
  111. package/styles/layout-style-split-screen.css +0 -62
  112. package/styles/layout-style-synthwave.css +0 -88
  113. package/styles/layout-style-tactile.css +0 -70
  114. package/styles/layout-style-y2k.css +0 -72
  115. package/styles/layout-style-z-pattern.css +0 -76
package/SECURITY.md CHANGED
@@ -1,45 +1,50 @@
1
- # Security Policy
2
-
3
- `layout-style-css` is a CSS-only layout package. It does not execute JavaScript at runtime, make network requests, process user input, store credentials, or read secrets.
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
- ## Reporting A Vulnerability
13
-
14
- Use GitHub security advisories for private reports when available. If advisories are not enabled, open a minimal GitHub issue that avoids public exploit details and asks for a private coordination path.
15
-
16
- Please include:
17
-
18
- - affected version and package entrypoint
19
- - affected selector, file, or demo behavior
20
- - reproduction steps
21
- - expected impact
22
- - whether the issue affects package consumers, the demo, or GitHub Pages deployment
23
-
24
- ## Security Model
25
-
26
- The primary security risks for this package are supply-chain and documentation risks:
27
-
28
- - incorrect package exports that make consumers import unexpected files
29
- - malformed CDN examples that point to wrong assets
30
- - accidental runtime JavaScript or network behavior in docs or demo code
31
- - package contents that include secrets, build caches, or unrelated local files
32
- - CSS that hides important controls or breaks keyboard-visible flows in the demo
33
-
34
- The release gate verifies package contents, README imports, documentation links, CSS contracts, rendered demo behavior, and GitHub Pages artifact structure.
35
-
36
- ## Dependency Checks
37
-
38
- Run the local dependency audit before publishing:
39
-
40
- ```bash
41
- npm audit --audit-level=moderate
42
- ```
43
-
44
- The package also uses `npm run release:verify` to run build, lint, tests, pack dry-run, and publish dry-run checks.
45
-
1
+ # Security Policy
2
+
3
+ `layout-style-css` is a CSS-only layout package. It does not execute JavaScript at runtime, make network requests, process user input, store credentials, or read secrets.
4
+
5
+ ## Supported Versions
6
+
7
+ | Version | Supported |
8
+ | --- | --- |
9
+ | `2.x` | Yes |
10
+ | `1.1.x` | Migration support only |
11
+ | `1.0.x` | No |
12
+
13
+ ## Reporting A Vulnerability
14
+
15
+ Use GitHub security advisories for private reports when available. If advisories are not enabled, open a minimal GitHub issue that avoids public exploit details and asks for a private coordination path.
16
+
17
+ Please include:
18
+
19
+ - affected version and package entrypoint
20
+ - affected selector, file, or demo behavior
21
+ - reproduction steps
22
+ - expected impact
23
+ - whether the issue affects package consumers, the demo, or GitHub Pages deployment
24
+
25
+ ## Security Model
26
+
27
+ The primary security risks for this package are supply-chain and documentation risks:
28
+
29
+ - incorrect package exports that make consumers import unexpected files
30
+ - malformed CDN examples that point to wrong assets
31
+ - accidental runtime JavaScript or network behavior in docs or demo code
32
+ - package contents that include secrets, build caches, or unrelated local files
33
+ - CSS that hides important controls or breaks keyboard-visible flows in the demo
34
+
35
+ The release gate verifies package contents, README imports, documentation links, CSS contracts, GitHub Pages artifact structure, and rendered behavior in Chromium, Firefox, and WebKit.
36
+
37
+ ## Dependency Checks
38
+
39
+ Run the local dependency audit before publishing:
40
+
41
+ ```bash
42
+ npm audit --audit-level=moderate
43
+ ```
44
+
45
+ The package also uses `npm run release:verify` to run build, lint, static, Pages, cross-browser, pack dry-run, and publish dry-run checks.
46
+
47
+ The npm workflow validates a strict tag, exact peeled commit, protected-main ancestry, and package version before dependency lifecycle code runs. Publishing requires the protected `npm` GitHub Environment, emits npm provenance, and exposes `NODE_AUTH_TOKEN` only to the publish step. npm trusted publishing and immutable commit SHA pins for GitHub Actions remain follow-up hardening work.
48
+
49
+ The demo's two exact-version companion CDN fixtures use SHA-384 subresource integrity with anonymous CORS. Their hashes are derived from the pinned local development fixtures and enforced by the rendered smoke contract.
50
+
@@ -1,7 +1,7 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180" role="img" aria-labelledby="title">
2
- <title id="title">layout-style-css app icon</title>
3
- <rect width="180" height="180" rx="40" fill="#111827"/>
4
- <rect x="30" y="34" width="40" height="112" rx="12" fill="#7dd3fc"/>
5
- <rect x="88" y="34" width="62" height="44" rx="12" fill="#fbbf24"/>
6
- <rect x="88" y="100" width="62" height="46" rx="12" fill="#f472b6"/>
7
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180" role="img" aria-labelledby="title">
2
+ <title id="title">layout-style-css app icon</title>
3
+ <rect width="180" height="180" rx="40" fill="#111827"/>
4
+ <rect x="30" y="34" width="40" height="112" rx="12" fill="#7dd3fc"/>
5
+ <rect x="88" y="34" width="62" height="44" rx="12" fill="#fbbf24"/>
6
+ <rect x="88" y="100" width="62" height="46" rx="12" fill="#f472b6"/>
7
+ </svg>
@@ -1,7 +1,7 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
2
- <title id="title">layout-style-css favicon</title>
3
- <rect width="64" height="64" rx="14" fill="#111827"/>
4
- <rect x="10" y="12" width="14" height="40" rx="4" fill="#7dd3fc"/>
5
- <rect x="30" y="12" width="24" height="16" rx="4" fill="#fbbf24"/>
6
- <rect x="30" y="36" width="24" height="16" rx="4" fill="#f472b6"/>
7
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
2
+ <title id="title">layout-style-css favicon</title>
3
+ <rect width="64" height="64" rx="14" fill="#111827"/>
4
+ <rect x="10" y="12" width="14" height="40" rx="4" fill="#7dd3fc"/>
5
+ <rect x="30" y="12" width="24" height="16" rx="4" fill="#fbbf24"/>
6
+ <rect x="30" y="36" width="24" height="16" rx="4" fill="#f472b6"/>
7
+ </svg>
@@ -1,9 +1,9 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <browserconfig>
3
- <msapplication>
4
- <tile>
5
- <square150x150logo src="./assets/apple-touch-icon.svg"/>
6
- <TileColor>#111827</TileColor>
7
- </tile>
8
- </msapplication>
9
- </browserconfig>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <browserconfig>
3
+ <msapplication>
4
+ <tile>
5
+ <square150x150logo src="./assets/apple-touch-icon.svg"/>
6
+ <TileColor>#111827</TileColor>
7
+ </tile>
8
+ </msapplication>
9
+ </browserconfig>
package/demo/demo.css ADDED
@@ -0,0 +1,523 @@
1
+ /*
2
+ Demo paint is intentionally local: the published layout modules continue to
3
+ own structure only, while the lab remains legible in layout-only mode.
4
+ */
5
+
6
+ :root {
7
+ --demo-bg: #f1f5f9;
8
+ --demo-panel: #ffffff;
9
+ --demo-panel-strong: #e2e8f0;
10
+ --demo-text: #172033;
11
+ --demo-muted: #526079;
12
+ --demo-line: #b8c3d3;
13
+ --demo-accent: #4f46e5;
14
+ --demo-accent-soft: #e0e7ff;
15
+ --demo-danger: #b42318;
16
+ --demo-radius: 1rem;
17
+ --demo-shadow: 0 1rem 3rem rgb(15 23 42 / 0.12);
18
+ --demo-density-gap: 1rem;
19
+ --demo-region-padding: 1rem;
20
+ color-scheme: light;
21
+ }
22
+
23
+ body[data-mode="dark"] {
24
+ --demo-bg: #101827;
25
+ --demo-panel: #172033;
26
+ --demo-panel-strong: #273449;
27
+ --demo-text: #f8fafc;
28
+ --demo-muted: #cbd5e1;
29
+ --demo-line: #46556d;
30
+ --demo-accent: #a5b4fc;
31
+ --demo-accent-soft: #312e81;
32
+ --demo-shadow: 0 1rem 3rem rgb(0 0 0 / 0.38);
33
+ color-scheme: dark;
34
+ }
35
+
36
+ body[data-mode="contrast"] {
37
+ --demo-bg: #000000;
38
+ --demo-panel: #000000;
39
+ --demo-panel-strong: #1a1a1a;
40
+ --demo-text: #ffffff;
41
+ --demo-muted: #ffffff;
42
+ --demo-line: #ffffff;
43
+ --demo-accent: #ffeb3b;
44
+ --demo-accent-soft: #322f00;
45
+ color-scheme: dark;
46
+ }
47
+
48
+ body[data-density="compact"] {
49
+ --demo-density-gap: 0.5rem;
50
+ --demo-region-padding: 0.75rem;
51
+ }
52
+
53
+ body[data-density="spacious"] {
54
+ --demo-density-gap: 1.5rem;
55
+ --demo-region-padding: 1.5rem;
56
+ }
57
+
58
+ html {
59
+ min-inline-size: 20rem;
60
+ scroll-behavior: smooth;
61
+ }
62
+
63
+ body {
64
+ min-block-size: 100svh;
65
+ margin: 0;
66
+ overflow-x: clip;
67
+ background: var(--demo-bg);
68
+ color: var(--demo-text);
69
+ font-family:
70
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
71
+ sans-serif;
72
+ line-height: 1.5;
73
+ }
74
+
75
+ body * {
76
+ box-sizing: border-box;
77
+ }
78
+
79
+ button,
80
+ select {
81
+ min-block-size: 2.75rem;
82
+ max-inline-size: 100%;
83
+ font: inherit;
84
+ }
85
+
86
+ button {
87
+ cursor: pointer;
88
+ }
89
+
90
+ button:focus-visible,
91
+ select:focus-visible,
92
+ a:focus-visible {
93
+ outline: 0.1875rem solid var(--demo-accent);
94
+ outline-offset: 0.1875rem;
95
+ }
96
+
97
+ select {
98
+ inline-size: 100%;
99
+ }
100
+
101
+ h1,
102
+ h2,
103
+ h3,
104
+ p,
105
+ pre {
106
+ margin-block: 0;
107
+ }
108
+
109
+ h1,
110
+ h2,
111
+ h3,
112
+ p,
113
+ code,
114
+ strong,
115
+ span,
116
+ label {
117
+ overflow-wrap: anywhere;
118
+ }
119
+
120
+ h1 {
121
+ max-inline-size: 18ch;
122
+ font-size: clamp(2rem, 4vw, 4.5rem);
123
+ line-height: 0.98;
124
+ }
125
+
126
+ h2 {
127
+ font-size: clamp(1.25rem, 2.5vw, 2rem);
128
+ line-height: 1.1;
129
+ }
130
+
131
+ h3 {
132
+ font-size: 1rem;
133
+ }
134
+
135
+ .demo-skip-link {
136
+ position: fixed;
137
+ inset-block-start: 0.5rem;
138
+ inset-inline-start: 0.5rem;
139
+ z-index: 100;
140
+ padding: 0.75rem 1rem;
141
+ translate: 0 -150%;
142
+ background: var(--demo-panel);
143
+ color: var(--demo-text);
144
+ }
145
+
146
+ .demo-skip-link:focus {
147
+ translate: 0;
148
+ }
149
+
150
+ .demo-topbar {
151
+ position: sticky;
152
+ inset-block-start: 0;
153
+ z-index: 20;
154
+ display: flex;
155
+ flex-wrap: wrap;
156
+ align-items: center;
157
+ justify-content: space-between;
158
+ gap: 0.75rem;
159
+ min-block-size: 4.5rem;
160
+ padding:
161
+ max(0.75rem, env(safe-area-inset-top, 0px))
162
+ max(1rem, env(safe-area-inset-right, 0px))
163
+ 0.75rem
164
+ max(1rem, env(safe-area-inset-left, 0px));
165
+ border-block-end: 1px solid var(--demo-line);
166
+ background: color-mix(in srgb, var(--demo-panel) 92%, transparent);
167
+ backdrop-filter: blur(1rem);
168
+ }
169
+
170
+ .demo-brand,
171
+ .demo-controls-heading,
172
+ .demo-section-heading,
173
+ .demo-code-card-heading,
174
+ .demo-topbar-actions {
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: space-between;
178
+ gap: 0.75rem;
179
+ }
180
+
181
+ .demo-brand {
182
+ align-items: flex-start;
183
+ flex-direction: column;
184
+ gap: 0.125rem;
185
+ }
186
+
187
+ .demo-kicker {
188
+ color: var(--demo-muted);
189
+ font-size: 0.75rem;
190
+ font-weight: 750;
191
+ letter-spacing: 0.12em;
192
+ text-transform: uppercase;
193
+ }
194
+
195
+ .demo-status,
196
+ .demo-copy-status,
197
+ #containerReadout {
198
+ color: var(--demo-muted);
199
+ font-size: 0.875rem;
200
+ }
201
+
202
+ .demo-status {
203
+ padding: 0.4rem 0.7rem;
204
+ border: 1px solid var(--demo-line);
205
+ border-radius: 999px;
206
+ background: var(--demo-accent-soft);
207
+ }
208
+
209
+ body[data-ecosystem="layout-only"] .demo-status {
210
+ border-style: dashed;
211
+ background: var(--demo-panel-strong);
212
+ }
213
+
214
+ body[data-ecosystem="all-three"] .demo-status {
215
+ box-shadow: inset 0 0 0 0.125rem color-mix(in srgb, var(--demo-accent) 30%, transparent);
216
+ }
217
+
218
+ .demo-page {
219
+ display: grid;
220
+ inline-size: min(calc(100% - 2rem), 112rem);
221
+ margin-inline: auto;
222
+ padding-block: clamp(1rem, 3vw, 2rem) 4rem;
223
+ }
224
+
225
+ .demo-controls,
226
+ .demo-intro,
227
+ .demo-lab,
228
+ .demo-code-card {
229
+ border: 1px solid var(--demo-line);
230
+ border-radius: var(--demo-radius);
231
+ background: var(--demo-panel);
232
+ box-shadow: var(--demo-shadow);
233
+ }
234
+
235
+ .demo-controls {
236
+ min-inline-size: 0;
237
+ padding: 1rem;
238
+ }
239
+
240
+ .demo-controls-heading {
241
+ margin-block-end: 1rem;
242
+ }
243
+
244
+ .demo-controls-grid {
245
+ display: grid;
246
+ gap: 0.875rem;
247
+ }
248
+
249
+ .demo-controls-grid label {
250
+ display: grid;
251
+ gap: 0.35rem;
252
+ min-inline-size: 0;
253
+ color: var(--demo-muted);
254
+ font-size: 0.8125rem;
255
+ font-weight: 700;
256
+ }
257
+
258
+ .demo-controls-grid select {
259
+ padding-inline: 0.625rem;
260
+ }
261
+
262
+ .demo-main {
263
+ display: grid;
264
+ min-inline-size: 0;
265
+ gap: clamp(1rem, 3vw, 2rem);
266
+ }
267
+
268
+ .demo-intro {
269
+ display: grid;
270
+ grid-template-columns: minmax(0, 1fr);
271
+ gap: 1.5rem;
272
+ padding: clamp(1.25rem, 4vw, 3rem);
273
+ }
274
+
275
+ .demo-intro > div:first-child {
276
+ display: grid;
277
+ gap: 1rem;
278
+ }
279
+
280
+ .demo-intro p {
281
+ max-inline-size: 68ch;
282
+ color: var(--demo-muted);
283
+ }
284
+
285
+ .demo-state-panel {
286
+ display: grid;
287
+ align-content: center;
288
+ gap: 0.75rem;
289
+ min-inline-size: 0;
290
+ padding: 1rem;
291
+ border: 1px solid var(--demo-line);
292
+ border-radius: calc(var(--demo-radius) * 0.75);
293
+ background: var(--demo-panel-strong);
294
+ }
295
+
296
+ .demo-lab {
297
+ min-inline-size: 0;
298
+ padding: clamp(1rem, 2vw, 1.5rem);
299
+ }
300
+
301
+ .demo-section-heading {
302
+ flex-wrap: wrap;
303
+ margin-block-end: 1rem;
304
+ }
305
+
306
+ .demo-preview-frame {
307
+ --demo-container-inline-size: 100%;
308
+
309
+ container-name: demo-preview;
310
+ container-type: inline-size;
311
+ inline-size: min(100%, var(--demo-container-inline-size));
312
+ min-inline-size: 0;
313
+ margin-inline: auto;
314
+ overflow: clip;
315
+ border: 1px dashed var(--demo-line);
316
+ border-radius: calc(var(--demo-radius) * 0.85);
317
+ background: var(--demo-bg);
318
+ }
319
+
320
+ /* The nested root lets personalities respond to preview width, not viewport width. */
321
+ .demo-preview-root {
322
+ min-block-size: 0;
323
+ min-inline-size: 0;
324
+ padding-block: 0.75rem;
325
+ }
326
+
327
+ .demo-preview-root > .ly-wrapper {
328
+ /* The width control represents the queried content box exactly at 48rem/64rem. */
329
+ --ly-wrapper-gutter: 0px;
330
+
331
+ min-inline-size: 0;
332
+ }
333
+
334
+ .demo-recipe {
335
+ min-block-size: 30rem;
336
+ min-inline-size: 0;
337
+ gap: var(--demo-density-gap);
338
+ }
339
+
340
+ .demo-recipe:is(.ly-gallery, [data-ly-recipe="gallery"]),
341
+ .demo-recipe:is(.ly-card-grid, [data-ly-recipe="card-grid"]) {
342
+ min-block-size: auto;
343
+ }
344
+
345
+ .demo-recipe:is(.ly-app-shell, [data-ly-recipe="app-shell"]) {
346
+ min-block-size: 32rem;
347
+ }
348
+
349
+ .demo-region {
350
+ display: grid;
351
+ align-content: start;
352
+ min-block-size: 5rem;
353
+ min-inline-size: 0;
354
+ gap: 0.75rem;
355
+ padding: var(--demo-region-padding);
356
+ overflow: hidden;
357
+ border: 1px solid var(--demo-line);
358
+ border-radius: calc(var(--demo-radius) * 0.65);
359
+ background: var(--demo-panel);
360
+ }
361
+
362
+ .demo-region[data-ly-area="main"],
363
+ .demo-region[data-ly-area="secondary"],
364
+ .demo-region[data-ly-area="content"] {
365
+ background: var(--demo-accent-soft);
366
+ }
367
+
368
+ .demo-region > button {
369
+ justify-self: start;
370
+ }
371
+
372
+ .demo-grid-item {
373
+ min-block-size: 8rem;
374
+ }
375
+
376
+ .demo-list-scroll {
377
+ --ly-scroll-max: 10rem;
378
+
379
+ display: grid;
380
+ gap: 0.5rem;
381
+ padding-inline-end: 0.25rem;
382
+ }
383
+
384
+ .demo-list-scroll p {
385
+ padding: 0.5rem;
386
+ background: var(--demo-panel-strong);
387
+ }
388
+
389
+ .demo-code-grid {
390
+ display: grid;
391
+ grid-template-columns: minmax(0, 1fr);
392
+ gap: 1rem;
393
+ min-inline-size: 0;
394
+ }
395
+
396
+ .demo-code-heading {
397
+ grid-column: 1 / -1;
398
+ margin-block-end: 0;
399
+ }
400
+
401
+ .demo-code-card {
402
+ display: grid;
403
+ align-content: start;
404
+ min-inline-size: 0;
405
+ gap: 1rem;
406
+ padding: 1rem;
407
+ }
408
+
409
+ .demo-code-card-heading {
410
+ flex-wrap: wrap;
411
+ }
412
+
413
+ .demo-code-card pre {
414
+ max-block-size: 22rem;
415
+ min-inline-size: 0;
416
+ margin: 0;
417
+ padding: 1rem;
418
+ overflow: auto;
419
+ border-radius: calc(var(--demo-radius) * 0.65);
420
+ background: #0f172a;
421
+ color: #e2e8f0;
422
+ font-size: 0.8rem;
423
+ tab-size: 2;
424
+ white-space: pre;
425
+ }
426
+
427
+ .demo-copy-status[data-copy-state="error"] {
428
+ color: var(--demo-danger);
429
+ }
430
+
431
+ .demo-backdrop[hidden],
432
+ .demo-controls[hidden] {
433
+ display: none;
434
+ }
435
+
436
+ @media (min-width: 48rem) {
437
+ .demo-intro {
438
+ grid-template-columns: minmax(0, 1.5fr) minmax(14rem, 0.5fr);
439
+ align-items: end;
440
+ }
441
+
442
+ .demo-code-grid {
443
+ grid-template-columns: repeat(2, minmax(0, 1fr));
444
+ }
445
+ }
446
+
447
+ @media (min-width: 64rem) {
448
+ #demoControlsToggle,
449
+ #demoControlsClose {
450
+ display: none;
451
+ }
452
+
453
+ .demo-page {
454
+ grid-template-columns: minmax(13rem, 14rem) minmax(0, 1fr);
455
+ align-items: start;
456
+ gap: 1.5rem;
457
+ }
458
+
459
+ .demo-controls {
460
+ position: sticky;
461
+ inset-block-start: 6rem;
462
+ display: block;
463
+ max-block-size: calc(100svh - 7rem);
464
+ overflow: auto;
465
+ }
466
+ }
467
+
468
+ @media (max-width: 63.999rem) {
469
+ .demo-page {
470
+ inline-size: min(calc(100% - 1rem), 72rem);
471
+ }
472
+
473
+ .demo-status {
474
+ display: none;
475
+ }
476
+
477
+ .demo-controls {
478
+ position: fixed;
479
+ inset-block: 0;
480
+ inset-inline-end: 0;
481
+ z-index: 40;
482
+ inline-size: min(24rem, calc(100% - 1rem));
483
+ max-block-size: 100svh;
484
+ padding:
485
+ max(1rem, env(safe-area-inset-top, 0px))
486
+ max(1rem, env(safe-area-inset-right, 0px))
487
+ max(1rem, env(safe-area-inset-bottom, 0px))
488
+ 1rem;
489
+ overflow: auto;
490
+ border-radius: var(--demo-radius) 0 0 var(--demo-radius);
491
+ }
492
+
493
+ .demo-backdrop {
494
+ position: fixed;
495
+ inset: 0;
496
+ z-index: 30;
497
+ background: rgb(15 23 42 / 0.72);
498
+ }
499
+ }
500
+
501
+ @media (max-width: 34rem) {
502
+ .demo-topbar-actions,
503
+ #demoControlsToggle {
504
+ inline-size: 100%;
505
+ }
506
+
507
+ .demo-intro,
508
+ .demo-lab {
509
+ border-radius: calc(var(--demo-radius) * 0.75);
510
+ }
511
+
512
+ .demo-section-heading,
513
+ .demo-code-card-heading {
514
+ align-items: flex-start;
515
+ flex-direction: column;
516
+ }
517
+ }
518
+
519
+ @media (prefers-reduced-motion: reduce) {
520
+ html {
521
+ scroll-behavior: auto;
522
+ }
523
+ }