layout-style-css 3.0.2 → 3.2.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.
- package/CHANGELOG.md +42 -0
- package/README.md +35 -14
- package/dist/core.css +1 -1
- package/dist/foundation.css +168 -24
- package/dist/layout-style-css.css +486 -159
- package/dist/layout-style-css.min.css +1 -1
- package/dist/personalities/bauhaus.css +4 -11
- package/dist/personalities/bento.css +1 -11
- package/dist/personalities/brutalism.css +3 -11
- package/dist/personalities/cyberpunk.css +2 -2
- package/dist/personalities/data-terminal.css +13 -0
- package/dist/personalities/editorial.css +14 -0
- package/dist/personalities/f-pattern.css +4 -4
- package/dist/personalities/industrial-hmi.css +11 -0
- package/dist/personalities/maximalist.css +2 -11
- package/dist/personalities/minimal-saas.css +1 -1
- package/dist/personalities/mondrian.css +2 -2
- package/dist/personalities/neumorphism.css +4 -13
- package/dist/personalities/retro-glass.css +11 -11
- package/dist/personalities/retrofuturism.css +2 -2
- package/dist/personalities/split-screen.css +6 -6
- package/dist/personalities/synthwave.css +2 -2
- package/dist/personalities/tactile.css +4 -13
- package/dist/personalities/technical-blueprint.css +13 -0
- package/dist/personalities/y2k.css +9 -9
- package/dist/personalities/z-pattern.css +4 -4
- package/dist/personalities.css +5 -1
- package/dist/primitives.css +122 -4
- package/dist/recipes.css +84 -1
- package/dist/utilities.css +14 -35
- package/dist/wrappers.css +5 -1
- package/docs/wiki/Demo-And-GitHub-Pages.md +4 -2
- package/docs/wiki/Getting-Started.md +11 -4
- package/docs/wiki/Home.md +7 -2
- package/docs/wiki/Installation-And-CDN.md +6 -5
- package/docs/wiki/Layout-Personality-Reference.md +67 -0
- package/docs/wiki/Layout-Primitives.md +16 -3
- package/docs/wiki/Layout-Recipes.md +3 -1
- package/docs/wiki/Layout-Styles.md +10 -23
- package/docs/wiki/Migrating-To-3.1.md +62 -0
- package/docs/wiki/Migrating-To-3.2.md +70 -0
- package/docs/wiki/Release-And-Publishing.md +6 -6
- package/docs/wiki/UI-Style-Kit-Compatibility.md +6 -0
- package/docs/wiki/_Sidebar.md +3 -0
- package/manifest.json +48 -28
- package/package.json +3 -3
- package/personalities.json +76 -14
package/dist/primitives.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
|
|
1
|
+
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.context;
|
|
2
2
|
|
|
3
3
|
/* Composition primitives use intrinsic sizing so their content chooses reflow points. */
|
|
4
4
|
|
|
@@ -115,6 +115,44 @@
|
|
|
115
115
|
grid-template-columns: repeat(var(--ly-grid-columns), minmax(0, 1fr));
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
+
.ly-mosaic {
|
|
119
|
+
display: grid;
|
|
120
|
+
grid-template-columns: minmax(0, 1fr);
|
|
121
|
+
gap: var(--ly-grid-gap);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.ly-mosaic > * {
|
|
125
|
+
min-inline-size: 0;
|
|
126
|
+
min-block-size: 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.ly-action-bar {
|
|
130
|
+
display: flex;
|
|
131
|
+
flex-wrap: wrap;
|
|
132
|
+
align-items: center;
|
|
133
|
+
gap: var(--ly-cluster-gap);
|
|
134
|
+
min-inline-size: 0;
|
|
135
|
+
padding-block-end: var(--ly-safe-area-block-end);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.ly-action-bar > :where([data-ly-actions="start"], [data-ly-actions="end"]) {
|
|
139
|
+
display: flex;
|
|
140
|
+
flex-wrap: wrap;
|
|
141
|
+
align-items: center;
|
|
142
|
+
gap: var(--ly-cluster-gap);
|
|
143
|
+
min-inline-size: 0;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.ly-action-bar > [data-ly-actions="end"] {
|
|
147
|
+
margin-inline-start: auto;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.ly-action-bar--sticky {
|
|
151
|
+
position: var(--ly-sticky-position, sticky);
|
|
152
|
+
inset-block-end: 0;
|
|
153
|
+
z-index: var(--ly-z-header, 20);
|
|
154
|
+
}
|
|
155
|
+
|
|
118
156
|
.ly-split {
|
|
119
157
|
display: grid;
|
|
120
158
|
grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-split-min)), 1fr));
|
|
@@ -175,9 +213,89 @@
|
|
|
175
213
|
|
|
176
214
|
.ly-scroll {
|
|
177
215
|
min-block-size: 0;
|
|
178
|
-
|
|
179
|
-
overflow-x: clip;
|
|
180
|
-
overflow-y: auto;
|
|
216
|
+
overflow: auto;
|
|
181
217
|
overscroll-behavior-block: contain;
|
|
182
218
|
}
|
|
219
|
+
|
|
220
|
+
.ly-scroll--bounded {
|
|
221
|
+
max-block-size: var(--ly-scroll-max);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.ly-scroll--viewport {
|
|
225
|
+
max-block-size: var(--ly-scroll-viewport-max);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
Mosaic span behavior lives in the final structural context layer so it can
|
|
231
|
+
deliberately override the general-purpose span utilities at automatic tiers.
|
|
232
|
+
*/
|
|
233
|
+
@layer ly.context {
|
|
234
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > :where(
|
|
235
|
+
.ly-span-1,
|
|
236
|
+
.ly-span-2,
|
|
237
|
+
.ly-span-3,
|
|
238
|
+
.ly-span-4,
|
|
239
|
+
.ly-span-6,
|
|
240
|
+
.ly-span-full
|
|
241
|
+
) {
|
|
242
|
+
grid-column: 1 / -1;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > :where(
|
|
246
|
+
.ly-row-span-2,
|
|
247
|
+
.ly-row-span-3
|
|
248
|
+
) {
|
|
249
|
+
grid-row: auto;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
@container ly-scope (min-width: 42rem) {
|
|
253
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) {
|
|
254
|
+
grid-template-columns: repeat(
|
|
255
|
+
var(--ly-mosaic-medium-columns),
|
|
256
|
+
minmax(0, 1fr)
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-span-1 {
|
|
261
|
+
grid-column: span 1;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-span-2 {
|
|
265
|
+
grid-column: span 2;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-span-3 {
|
|
269
|
+
grid-column: span 3;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-span-4 {
|
|
273
|
+
grid-column: span 4;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-span-6 {
|
|
277
|
+
grid-column: span 6;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-span-full {
|
|
281
|
+
grid-column: 1 / -1;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-row-span-2 {
|
|
285
|
+
grid-row: span 2;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) > .ly-row-span-3 {
|
|
289
|
+
grid-row: span 3;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
@container ly-scope (min-width: 72rem) {
|
|
294
|
+
.ly-mosaic:not([data-ly-responsive="manual"]) {
|
|
295
|
+
grid-template-columns: repeat(
|
|
296
|
+
var(--ly-mosaic-wide-columns),
|
|
297
|
+
minmax(0, 1fr)
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
183
301
|
}
|
package/dist/recipes.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
|
|
1
|
+
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.context;
|
|
2
2
|
|
|
3
3
|
/*
|
|
4
4
|
Recipes preserve the narrow-screen DOM order. Automatic topology queries
|
|
@@ -194,4 +194,87 @@
|
|
|
194
194
|
grid-template-columns: var(--ly-dashboard-wide-columns);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
Feature-detected presence rules remove absent side tracks without changing
|
|
200
|
+
the canonical area vocabulary or personality-owned both-side topologies.
|
|
201
|
+
*/
|
|
202
|
+
@supports selector(:has(*)) {
|
|
203
|
+
@container ly-scope (min-width: 52rem) {
|
|
204
|
+
[data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]):has(
|
|
205
|
+
> [data-ly-area="sidebar"]
|
|
206
|
+
):not(:has(> [data-ly-area="aside"])) {
|
|
207
|
+
grid-template-areas:
|
|
208
|
+
"header header"
|
|
209
|
+
"sidebar main"
|
|
210
|
+
"footer footer";
|
|
211
|
+
grid-template-columns:
|
|
212
|
+
minmax(min(100%, var(--ly-recipe-rail)), auto)
|
|
213
|
+
minmax(min(100%, var(--ly-recipe-main-min)), 1fr);
|
|
214
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
[data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]):not(
|
|
218
|
+
:has(> [data-ly-area="sidebar"])
|
|
219
|
+
):has(> [data-ly-area="aside"]) {
|
|
220
|
+
grid-template-areas:
|
|
221
|
+
"header header"
|
|
222
|
+
"main aside"
|
|
223
|
+
"footer footer";
|
|
224
|
+
grid-template-columns:
|
|
225
|
+
minmax(min(100%, var(--ly-recipe-main-min)), 1fr)
|
|
226
|
+
minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
|
|
227
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
[data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]):not(
|
|
231
|
+
:has(> [data-ly-area="sidebar"])
|
|
232
|
+
):not(:has(> [data-ly-area="aside"])) {
|
|
233
|
+
grid-template-areas:
|
|
234
|
+
"header"
|
|
235
|
+
"main"
|
|
236
|
+
"footer";
|
|
237
|
+
grid-template-columns:
|
|
238
|
+
minmax(min(100%, var(--ly-recipe-main-min)), 1fr);
|
|
239
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
@container ly-scope (min-width: 72rem) {
|
|
244
|
+
[data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]):has(
|
|
245
|
+
> [data-ly-area="sidebar"]
|
|
246
|
+
):not(:has(> [data-ly-area="aside"])) {
|
|
247
|
+
grid-template-areas:
|
|
248
|
+
"sidebar header"
|
|
249
|
+
"sidebar main"
|
|
250
|
+
"sidebar footer";
|
|
251
|
+
grid-template-columns:
|
|
252
|
+
minmax(min(100%, var(--ly-recipe-rail)), auto)
|
|
253
|
+
minmax(min(100%, var(--ly-recipe-main-min)), 1fr);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
[data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]):not(
|
|
257
|
+
:has(> [data-ly-area="sidebar"])
|
|
258
|
+
):has(> [data-ly-area="aside"]) {
|
|
259
|
+
grid-template-areas:
|
|
260
|
+
"header header"
|
|
261
|
+
"main aside"
|
|
262
|
+
"footer footer";
|
|
263
|
+
grid-template-columns:
|
|
264
|
+
minmax(min(100%, var(--ly-recipe-main-min)), 1fr)
|
|
265
|
+
minmax(min(100%, var(--ly-recipe-aside)), 0.35fr);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
[data-ly-recipe="app-shell"]:not([data-ly-responsive="manual"]):not(
|
|
269
|
+
:has(> [data-ly-area="sidebar"])
|
|
270
|
+
):not(:has(> [data-ly-area="aside"])) {
|
|
271
|
+
grid-template-areas:
|
|
272
|
+
"header"
|
|
273
|
+
"main"
|
|
274
|
+
"footer";
|
|
275
|
+
grid-template-columns:
|
|
276
|
+
minmax(min(100%, var(--ly-recipe-main-min)), 1fr);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
197
280
|
}
|
package/dist/utilities.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
|
|
1
|
+
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.context;
|
|
2
2
|
|
|
3
3
|
/* Optional structural utilities expose direct token overrides without breakpoint tiers. */
|
|
4
4
|
|
|
@@ -14,42 +14,21 @@
|
|
|
14
14
|
.ly-span-2 { grid-column: span 2; }
|
|
15
15
|
.ly-span-3 { grid-column: span 3; }
|
|
16
16
|
.ly-span-4 { grid-column: span 4; }
|
|
17
|
+
.ly-span-6 { grid-column: span 6; }
|
|
17
18
|
.ly-span-full { grid-column: 1 / -1; }
|
|
19
|
+
.ly-row-span-2 { grid-row: span 2; }
|
|
20
|
+
.ly-row-span-3 { grid-row: span 3; }
|
|
18
21
|
|
|
19
|
-
.ly-gap-0 {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.ly-gap-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
--ly-stack-gap: var(--ly-space-2);
|
|
30
|
-
--ly-cluster-gap: var(--ly-space-2);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.ly-gap-4 {
|
|
34
|
-
--ly-gap: var(--ly-space-4);
|
|
35
|
-
--ly-grid-gap: var(--ly-space-4);
|
|
36
|
-
--ly-stack-gap: var(--ly-space-4);
|
|
37
|
-
--ly-cluster-gap: var(--ly-space-4);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.ly-gap-6 {
|
|
41
|
-
--ly-gap: var(--ly-space-6);
|
|
42
|
-
--ly-grid-gap: var(--ly-space-6);
|
|
43
|
-
--ly-stack-gap: var(--ly-space-6);
|
|
44
|
-
--ly-cluster-gap: var(--ly-space-6);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.ly-gap-8 {
|
|
48
|
-
--ly-gap: var(--ly-space-8);
|
|
49
|
-
--ly-grid-gap: var(--ly-space-8);
|
|
50
|
-
--ly-stack-gap: var(--ly-space-8);
|
|
51
|
-
--ly-cluster-gap: var(--ly-space-8);
|
|
52
|
-
}
|
|
22
|
+
.ly-gap-0 { gap: var(--ly-space-0); }
|
|
23
|
+
.ly-gap-1 { gap: var(--ly-space-1); }
|
|
24
|
+
.ly-gap-2 { gap: var(--ly-space-2); }
|
|
25
|
+
.ly-gap-3 { gap: var(--ly-space-3); }
|
|
26
|
+
.ly-gap-4 { gap: var(--ly-space-4); }
|
|
27
|
+
.ly-gap-5 { gap: var(--ly-space-5); }
|
|
28
|
+
.ly-gap-6 { gap: var(--ly-space-6); }
|
|
29
|
+
.ly-gap-7 { gap: var(--ly-space-7); }
|
|
30
|
+
.ly-gap-8 { gap: var(--ly-space-8); }
|
|
31
|
+
.ly-gap-9 { gap: var(--ly-space-9); }
|
|
53
32
|
|
|
54
33
|
.ly-pad-0 { padding: var(--ly-space-0); }
|
|
55
34
|
.ly-pad-2 { padding: var(--ly-space-2); }
|
package/dist/wrappers.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities;
|
|
1
|
+
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.context;
|
|
2
2
|
|
|
3
3
|
/* Wrappers provide fluid measures and become the nearest responsive scope. */
|
|
4
4
|
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
--ly-wrapper-max: var(--ly-wrapper-content);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
.ly-wrapper--workspace {
|
|
35
|
+
--ly-wrapper-max: var(--ly-wrapper-workspace);
|
|
36
|
+
}
|
|
37
|
+
|
|
34
38
|
.ly-wrapper--wide {
|
|
35
39
|
--ly-wrapper-max: var(--ly-wrapper-wide);
|
|
36
40
|
}
|
|
@@ -6,7 +6,9 @@ The v3 demo is an intrinsic responsive workbench, not a fixed-device screenshot
|
|
|
6
6
|
|
|
7
7
|
- Independent preview width and height
|
|
8
8
|
- Automatic and manual recipe responsiveness
|
|
9
|
-
- Wrapper, recipe, and all
|
|
9
|
+
- Wrapper, recipe, and all twenty personality profiles sourced from generated metadata
|
|
10
|
+
- Independent recommended and compatible UI-pairing guidance
|
|
11
|
+
- Visible Mosaic, Action Bar, and content-resilience fixtures within the selected preview allocation
|
|
10
12
|
- Layout-only, Layout plus UI, and all-three ecosystem modes
|
|
11
13
|
- Live rendered dimensions and active topology
|
|
12
14
|
- Copy-ready canonical attribute markup
|
|
@@ -30,7 +32,7 @@ npm run test:demo:quick
|
|
|
30
32
|
npm run test:demo:all
|
|
31
33
|
```
|
|
32
34
|
|
|
33
|
-
The full matrix runs in Chromium, Firefox, and WebKit. It checks meaningful DOM, unchanged source/focus order, automatic and manual topologies, nearest-container behavior, short-height escape hatches, zero-width tracks, overlap, and unintended overflow.
|
|
35
|
+
The full matrix runs in Chromium, Firefox, and WebKit. It checks meaningful DOM, unchanged source/focus order, automatic and manual topologies, nearest-container behavior, short-height escape hatches, Mosaic thresholds, Action Bar wrapping/stickiness, reachable two-axis Scroll overflow, zero-width tracks, overlap, and unintended document overflow.
|
|
34
36
|
|
|
35
37
|
## GitHub Pages
|
|
36
38
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Getting Started
|
|
2
2
|
|
|
3
|
-
Install `layout-style-css@3.0
|
|
3
|
+
Install `layout-style-css@3.2.0` and import the root bundle:
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install layout-style-css@3.0
|
|
6
|
+
npm install layout-style-css@3.2.0
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
```js
|
|
@@ -12,7 +12,7 @@ import "layout-style-css";
|
|
|
12
12
|
|
|
13
13
|
## First Automatic Layout
|
|
14
14
|
|
|
15
|
-
The zero-configuration path needs only `.ly-root`, a recipe attribute, and semantic areas:
|
|
15
|
+
The zero-configuration path uses normal density and needs only `.ly-root`, a recipe attribute, and semantic areas:
|
|
16
16
|
|
|
17
17
|
```html
|
|
18
18
|
<body class="ly-root" data-ly-layout="minimal-saas">
|
|
@@ -39,7 +39,11 @@ Use wrappers when a composition needs a named measure or local responsive scope:
|
|
|
39
39
|
</section>
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
Available measures are `.ly-wrapper--compact`, `.ly-wrapper--prose`, `.ly-wrapper--content`, `.ly-wrapper--wide`, `.ly-wrapper--full`, and `.ly-wrapper--breakout`.
|
|
42
|
+
Available measures are `.ly-wrapper--compact`, `.ly-wrapper--prose`, `.ly-wrapper--content`, `.ly-wrapper--workspace`, `.ly-wrapper--wide`, `.ly-wrapper--full`, and `.ly-wrapper--breakout`. Workspace is the `96rem` task-oriented application measure; content is the conventional `72rem` measure.
|
|
43
|
+
|
|
44
|
+
## Optional Density
|
|
45
|
+
|
|
46
|
+
Set `data-ly-density="compact"`, `data-ly-density="normal"`, or `data-ly-density="spacious"` on the root or a nested subtree. Nested contexts intentionally reset inherited spacing.
|
|
43
47
|
|
|
44
48
|
## Manual Topology
|
|
45
49
|
|
|
@@ -60,4 +64,7 @@ Keep mobile DOM order authoritative. The package never changes reading or focus
|
|
|
60
64
|
- [Layout Primitives](Layout-Primitives.md)
|
|
61
65
|
- [Layout Recipes](Layout-Recipes.md)
|
|
62
66
|
- [Layout Styles](Layout-Styles.md)
|
|
67
|
+
- [Layout Personality Reference](Layout-Personality-Reference.md)
|
|
63
68
|
- [Migrating To 3.0](Migrating-To-3.0.md)
|
|
69
|
+
- [Migrating To 3.1](Migrating-To-3.1.md)
|
|
70
|
+
- [Migrating To 3.2](Migrating-To-3.2.md)
|
package/docs/wiki/Home.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# Layout Style CSS v3
|
|
2
2
|
|
|
3
|
-
`layout-style-css@3.0
|
|
3
|
+
`layout-style-css@3.2.0` is the current release candidate. It remains a dependency-free, CSS-only structural system for layouts that adapt to available width and height.
|
|
4
4
|
|
|
5
5
|
## Contract
|
|
6
6
|
|
|
7
7
|
- `.ly-root` is a usable layout and named `ly-scope` container.
|
|
8
8
|
- Wrappers are optional measure and nesting controls.
|
|
9
|
+
- Normal density is the zero-configuration default; compact and spacious contexts can be nested locally.
|
|
9
10
|
- Seven `data-ly-recipe` values enhance a semantic stacked fallback.
|
|
10
11
|
- `data-ly-responsive="manual"` transfers topology ownership to application CSS.
|
|
11
|
-
-
|
|
12
|
+
- Twenty `data-ly-layout` profiles tune one shared responsive engine.
|
|
13
|
+
- Mosaic, Action Bar, area-aware App Shell behavior, and guarded content floors remain structural and CSS-only.
|
|
12
14
|
- `100dvh` behavior and the `44rem`/`30rem` height tiers avoid short-screen traps.
|
|
13
15
|
- The mobile DOM order remains the reading, keyboard, and focus order.
|
|
14
16
|
|
|
@@ -21,7 +23,10 @@ Layout owns structure. UI Style Kit owns paint. Interactive Surface owns interac
|
|
|
21
23
|
- [Layout Primitives](Layout-Primitives.md)
|
|
22
24
|
- [Layout Recipes](Layout-Recipes.md)
|
|
23
25
|
- [Layout Styles](Layout-Styles.md)
|
|
26
|
+
- [Layout Personality Reference](Layout-Personality-Reference.md)
|
|
24
27
|
- [Migrating To 3.0](Migrating-To-3.0.md)
|
|
28
|
+
- [Migrating To 3.1](Migrating-To-3.1.md)
|
|
29
|
+
- [Migrating To 3.2](Migrating-To-3.2.md)
|
|
25
30
|
- [Demo And GitHub Pages](Demo-And-GitHub-Pages.md)
|
|
26
31
|
- [Release And Publishing](Release-And-Publishing.md)
|
|
27
32
|
- [Security And Support](Security-And-Support.md)
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
## Package
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install layout-style-css@3.0
|
|
12
|
+
npm install layout-style-css@3.2.0
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```js
|
|
@@ -36,11 +36,11 @@ Package and bundler defaults (`main`, `style`, and the root export) use the read
|
|
|
36
36
|
## CDN
|
|
37
37
|
|
|
38
38
|
```html
|
|
39
|
-
<link rel="stylesheet" href="https://unpkg.com/layout-style-css@3.0
|
|
39
|
+
<link rel="stylesheet" href="https://unpkg.com/layout-style-css@3.2.0/dist/layout-style-css.min.css">
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
```html
|
|
43
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@3.0
|
|
43
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@3.2.0/dist/layout-style-css.min.css">
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
The CDN paths include `/dist/` because CDN clients address files in the published tarball, while package import maps use the public exports.
|
|
@@ -69,9 +69,10 @@ The module order is:
|
|
|
69
69
|
5. `ly.recipes`
|
|
70
70
|
6. `ly.utilities`
|
|
71
71
|
7. `ly.personalities`
|
|
72
|
+
8. `ly.context`
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
The final context layer lets explicit density profiles override personality defaults. Unlayered application styles remain stronger than every package layer and can override public custom properties without reordering modules.
|
|
74
75
|
|
|
75
76
|
## Clean-Break Note
|
|
76
77
|
|
|
77
|
-
v3 does not export a compatibility bundle, legacy aliases, the deprecated structural bridge, extensionless aliases, or responsive/order utility families. See [Migrating To 3.0](Migrating-To-3.0.md).
|
|
78
|
+
v3 does not export a compatibility bundle, legacy aliases, the deprecated structural bridge, extensionless aliases, or responsive/order utility families. See [Migrating To 3.0](Migrating-To-3.0.md) for the major migration and [Migrating To 3.1](Migrating-To-3.1.md) for current behavioral refinements.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Layout Personality Reference
|
|
2
|
+
|
|
3
|
+
Layout Style CSS v3.2 publishes twenty `data-ly-layout` personalities. Each one is a structural token profile consumed by the shared responsive engine; it does not own color, type, borders, shadows, interaction state, or an independent breakpoint system.
|
|
4
|
+
|
|
5
|
+
Layout owns structure. UI Style Kit owns paint. Interactive Surface owns interaction styling.
|
|
6
|
+
|
|
7
|
+
## Geometry Targets
|
|
8
|
+
|
|
9
|
+
These are the canonical release values. Preferred wrapper refers to the default `.ly-wrapper` measure selected by the personality.
|
|
10
|
+
|
|
11
|
+
| Layout | Preferred wrapper | Profile gap | Grid min | Rail | Aside | Other required behavior |
|
|
12
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
13
|
+
| Minimal SaaS | `88rem` | `--ly-space-5` (1.5rem) | `16rem` | `15rem` | `16rem` | Keep split `1.05fr / 0.95fr`; conservative shared topology |
|
|
14
|
+
| Bento | `112rem` | `--ly-space-4` (1rem) | `12rem` | `14rem` | `18rem` | Keep card `14rem`, gallery `11rem`; remove old four-track shell; canonical Mosaic consumer |
|
|
15
|
+
| Maximalist | `100%` | `--ly-space-3` (0.75rem) | `10rem` | `15rem` | `18rem` | Keep card `13rem`, gallery `10rem`; remove old four-track shell |
|
|
16
|
+
| Bauhaus | `96rem` | `--ly-space-2` (0.5rem) | `13rem` | `14rem` | `18rem` | Remove old four-track shell; set split bias `0.7fr / 1.3fr`; canonical Mosaic consumer |
|
|
17
|
+
| Tactile | `96rem` | `--ly-space-4` (1rem) | `15rem` | `17rem` | `20rem` | Preserve List Detail bias `0.5fr / 0.9fr`; remove left sidebar/aside stacking topology |
|
|
18
|
+
| Neumorphism | `84rem` | `--ly-space-6` (2rem) | `17rem` | `17rem` | `22rem` | Remove persistent-right-sidebar topology; preserve List Detail `1.1fr / 0.7fr` |
|
|
19
|
+
| Retrofuturism | `106rem` | `--ly-space-5` (1.5rem) | `14rem` | `14rem` | `17rem` | Preserve current dual-rail wide topology |
|
|
20
|
+
| Brutalism | `100%` | `--ly-space-1` (0.25rem) | `14rem` | `16rem` | `18rem` | Remove persistent-right-sidebar topology; canonical Mosaic consumer |
|
|
21
|
+
| Cyberpunk | `112rem` | `--ly-space-4` (1rem) | `12rem` | `13rem` | `19rem` | Preserve current wide topology |
|
|
22
|
+
| Y2K | `100%` | `--ly-space-2` (0.5rem) | `13rem` | `18rem` | `16rem` | Wide shell uses global header/footer with persistent dual rails; Mosaic consumer |
|
|
23
|
+
| Retro Glass | `100%` | `--ly-space-2` (0.5rem) | `15rem` | `16rem` | `17rem` | Wide shell uses global header/footer with dual-rail desktop workbench; Mosaic consumer |
|
|
24
|
+
| F-pattern | `92rem` | `--ly-space-4` (1rem) | `14rem` | `16rem` | `18rem` | Preserve Split Hero `1.8fr / 0.8fr` |
|
|
25
|
+
| Z-pattern | `108rem` | `--ly-space-5` (1.5rem) | `14rem` | `17rem` | `19rem` | Preserve Split Hero `1.5fr / 0.5fr` and current directional weighting |
|
|
26
|
+
| Split Screen | `100%` | `--ly-space-4` (1rem) | `20rem` | `24rem` | `24rem` | Preserve equal-half App Shell, Split Hero, and List Detail behavior |
|
|
27
|
+
| Mondrian | `112rem` | `--ly-space-3` (0.75rem) | `11rem` | `13rem` | `18rem` | Preserve asymmetric wide composition |
|
|
28
|
+
| Synthwave | `112rem` | `--ly-space-6` (2rem) | `14rem` | `16rem` | `20rem` | Preserve three-zone wide shell and `20rem` Reel item minimum |
|
|
29
|
+
| Technical Blueprint | `100%` | `--ly-space-1` (0.25rem) | `10rem` | `11rem` | `26rem` | Split bias `2.2fr / 0.8fr`; technical-canvas-dominant; Mosaic consumer |
|
|
30
|
+
| Data Terminal | `100%` | `--ly-space-1` (0.25rem) | `10rem` | `12rem` | `18rem` | Band-dense command/data composition; card/gallery mins `10rem`; no new Band primitive in 3.2 |
|
|
31
|
+
| Industrial HMI | `100%` | `--ly-space-2` (0.5rem) | `11rem` | `7rem` | `32rem` | Narrow persistent nav + dominant process canvas + large controls rail |
|
|
32
|
+
| Editorial | `108rem` | `--ly-space-6` (2rem) | `16rem` | `10rem` | `18rem` | Split bias `1.65fr / 0.75fr`; default Frame ratio `4 / 5`; publication-first composition |
|
|
33
|
+
|
|
34
|
+
## Purpose, Responsive Intent, and Pairing
|
|
35
|
+
|
|
36
|
+
Narrow layouts preserve semantic DOM order as a single stack. Medium layouts use the shared recipe thresholds. Wide behavior below describes each personality's defining enhancement. “Canonical” means Mosaic is a primary expression of the personality; “useful” means it is supported but optional.
|
|
37
|
+
|
|
38
|
+
| Layout | Purpose and canonical spatial model | Wide intent | Recommended UI | Compatible UI | Mosaic | Action Bar |
|
|
39
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
40
|
+
| Minimal SaaS | Content-first application shell with conservative whitespace | Shared rail/content/aside topology | `minimal-saas` | `organic-modern` | Optional | Useful for forms |
|
|
41
|
+
| Bento | Heterogeneous modular tile dashboard | Shared shell with compact intrinsic tile grids | `bento` | None listed | Canonical | Useful |
|
|
42
|
+
| Maximalist | Maximum content density rather than maximum whitespace | Shared shell with dense card and gallery tracks | `maximalist` | None listed | Useful | Common |
|
|
43
|
+
| Bauhaus | Low-gap geometric asymmetry | Shared shell; media-biased Split | `bauhaus` | `art-deco` | Canonical | Useful |
|
|
44
|
+
| Tactile | Broad task workspace with physical grouping | Shared shell; secondary-biased List Detail | `tactile` | `clay` | Optional | Common |
|
|
45
|
+
| Neumorphism | Bounded configuration and readiness workspace | Shared shell; primary-biased List Detail | `neumorphism` | None listed | Optional | Common |
|
|
46
|
+
| Retrofuturism | Dual-rail workstation | Persistent navigation and settings rails | `retrofuturism` | None listed | Useful | Common |
|
|
47
|
+
| Brutalism | Near-zero-gap operational control grid | Shared area-aware shell at full width | `brutalism` | None listed | Canonical | Common |
|
|
48
|
+
| Cyberpunk | Broad operational shell with compact navigation and substantial settings rail | Preserved asymmetric operational topology | `cyberpunk` | None listed | Useful | Common |
|
|
49
|
+
| Y2K | Dense portal with persistent dual rails | Global header/footer around sidebar, main, and aside | `y2k` | None listed | Useful | Common |
|
|
50
|
+
| Retro Glass | Desktop workbench with global chrome and dual rails | Global header/footer around sidebar, main, and aside | `retro-glass` | None listed | Useful | Common |
|
|
51
|
+
| F-pattern | Strong top-left and primary-content reading priority | Content-biased Split Hero | Any visual preset | None listed | Optional | Useful |
|
|
52
|
+
| Z-pattern | Deliberate diagonal attention path | Strong directional Split Hero weighting | Any visual preset | None listed | Optional | Useful |
|
|
53
|
+
| Split Screen | Equal-priority dual workspaces | Equal halves across shell, hero, and detail | Any visual preset | None listed | Optional | Common |
|
|
54
|
+
| Mondrian | Asymmetric modular blocks | Preserved asymmetric wide composition | Any visual preset | None listed | Useful | Useful |
|
|
55
|
+
| Synthwave | Neon workstation geometry independent of paint | Preserved three-zone shell and broad Reel items | `cyberpunk`, `retrofuturism` | None listed | Useful | Common |
|
|
56
|
+
| Technical Blueprint | Engineering sheet and canvas workspace | Dominant technical canvas with supporting inspector | `technical-blueprint` | None listed | Canonical | Common |
|
|
57
|
+
| Data Terminal | Horizontal telemetry and command bands | Dense full-width data composition | `data-terminal` | `neo-noir` | Useful | Common |
|
|
58
|
+
| Industrial HMI | Supervisory process canvas with instrument rail | Narrow persistent navigation and large controls aside | `industrial-utility` | None listed | Useful | Common |
|
|
59
|
+
| Editorial | Publication composition with readable text and dominant media | Asymmetric editorial Split and portrait Frame | `editorial-luxe`, `paper-editorial` | None listed | Optional | Useful |
|
|
60
|
+
|
|
61
|
+
## Area-Aware Shells
|
|
62
|
+
|
|
63
|
+
Automatic App Shell enhancement removes an absent sidebar or aside instead of reserving an empty track. Technical Blueprint, Data Terminal, Editorial, Neumorphism, and Brutalism use this shared behavior when a reference omits a side region. Y2K and Retro Glass keep global header/footer rows with both rails when all areas are present. `data-ly-responsive="manual"` remains a stacked, application-owned fallback.
|
|
64
|
+
|
|
65
|
+
## Pairing Is Advisory
|
|
66
|
+
|
|
67
|
+
`layout-style-css/personalities.json` is the machine-readable source for `recommendedVisualPresets` and `compatibleVisualPresets`. Layout selection never changes `data-ui`, `data-theme`, or `data-mode`. UI-only presets such as `clay`, `neo-noir`, `art-deco`, `organic-modern`, `industrial-utility`, `editorial-luxe`, and `paper-editorial` are not layout personality IDs.
|
|
@@ -13,6 +13,7 @@ Wrappers are optional local responsive scopes:
|
|
|
13
13
|
- `.ly-wrapper--compact`
|
|
14
14
|
- `.ly-wrapper--prose`
|
|
15
15
|
- `.ly-wrapper--content`
|
|
16
|
+
- `.ly-wrapper--workspace`
|
|
16
17
|
- `.ly-wrapper--wide`
|
|
17
18
|
- `.ly-wrapper--full`
|
|
18
19
|
- `.ly-wrapper--breakout`
|
|
@@ -21,6 +22,8 @@ Breakout children select clamped lanes with `data-ly-lane="content"`, `data-ly-l
|
|
|
21
22
|
|
|
22
23
|
`--ly-page-padding-inline` supplies the default `--ly-wrapper-gutter` value. `--ly-wrapper-gutter` controls rendered Wrapper padding at the scope where it is overridden, while the Wrapper applies safe-area compensation once at its outer edge.
|
|
23
24
|
|
|
25
|
+
Use content for conventional page content and workspace for task-oriented application layouts that need the `96rem` measure.
|
|
26
|
+
|
|
24
27
|
## Flow
|
|
25
28
|
|
|
26
29
|
- `.ly-stack` creates vertical flow.
|
|
@@ -33,21 +36,27 @@ Breakout children select clamped lanes with `data-ly-lane="content"`, `data-ly-l
|
|
|
33
36
|
- `.ly-switcher` wraps when its intrinsic threshold is no longer feasible.
|
|
34
37
|
- `.ly-sidebar` keeps a preferred rail while the content can meet its minimum.
|
|
35
38
|
- `.ly-grid` uses auto-fit tracks and `--ly-grid-min`.
|
|
39
|
+
- `.ly-mosaic` uses one column by default, six columns at `42rem`, and twelve columns at `72rem`; span and row-span utilities activate only at supported tiers.
|
|
36
40
|
- `.ly-split` creates balanced intrinsic regions.
|
|
37
41
|
- `.ly-panes` creates a preferred workspace rail and flexible pane.
|
|
38
42
|
- `.ly-media` wraps media and content without a viewport breakpoint.
|
|
43
|
+
- `.ly-action-bar` wraps start/end workflow groups in DOM order; `.ly-action-bar--sticky` uses height-aware sticky behavior and safe-area padding.
|
|
39
44
|
|
|
40
45
|
## Frame And Overflow
|
|
41
46
|
|
|
42
47
|
- `.ly-frame` keeps a configurable aspect ratio.
|
|
43
48
|
- `.ly-reel` is the deliberate horizontal-flow primitive.
|
|
44
|
-
- `.ly-scroll`
|
|
49
|
+
- `.ly-scroll` owns horizontal and vertical overflow without imposing a height cap.
|
|
50
|
+
- `.ly-scroll--bounded` applies the stable `--ly-scroll-max` cap.
|
|
51
|
+
- `.ly-scroll--viewport` applies the height-aware `--ly-scroll-viewport-max` cap.
|
|
52
|
+
|
|
53
|
+
In normal use, only `.ly-reel` and `.ly-scroll` introduce intentional horizontal scrolling, and only `.ly-scroll` and its modifiers introduce intentional vertical scrolling. Other wrappers, primitives, and recipes clamp to their available inline size.
|
|
45
54
|
|
|
46
|
-
|
|
55
|
+
Mosaic never uses `grid-auto-flow: dense`; visual spans do not change reading or focus order. Action Bar groups also wrap without visual reordering.
|
|
47
56
|
|
|
48
57
|
## Height Behavior
|
|
49
58
|
|
|
50
|
-
Page, cover, and
|
|
59
|
+
Page, cover, and viewport-relative Scroll behaviors use `vh` fallbacks followed by dynamic viewport units such as `100dvh`. Bounded Scroll remains application-controlled across viewport tiers.
|
|
51
60
|
|
|
52
61
|
At `44rem` viewport height or less, gaps and scroll maxima tighten. At `30rem` or less, forced cover/shell minimums and recipe-owned sticky positioning are removed. Required regions remain in normal document flow.
|
|
53
62
|
|
|
@@ -64,3 +73,7 @@ Advanced consumers can override stable custom properties for:
|
|
|
64
73
|
- shell, cover, and bounded-scroll sizing
|
|
65
74
|
|
|
66
75
|
These tokens tune behavior without creating a second breakpoint system.
|
|
76
|
+
|
|
77
|
+
## Local Gap Utilities
|
|
78
|
+
|
|
79
|
+
`.ly-gap-0` through `.ly-gap-9` set `gap` only on the element carrying the class. Nested primitives keep their own default gaps. For an intentionally inherited spacing context, set `--ly-gap`, `--ly-grid-gap`, `--ly-stack-gap`, or `--ly-cluster-gap` on the shared ancestor instead.
|
|
@@ -16,7 +16,9 @@ Recipes are attribute-only semantic layouts. The mobile DOM order is authoritati
|
|
|
16
16
|
|
|
17
17
|
Recipe roots also establish `ly-scope`, so child compositions can respond without extra setup.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
`manifest.json` publishes the same ownership under `thresholds.recipes`, in addition to the generic `containerMinWidths` and `viewportMaxHeights` arrays. The release gate checks those mappings against authored queries and verifies public-token liveness.
|
|
20
|
+
|
|
21
|
+
App Shell base, medium, and wide topologies own matching row definitions. Automatic enhancement is area-aware: a missing direct-child sidebar, aside, or both removes the corresponding empty track. Full-area personality shells keep their approved topology, and manual responsiveness remains stacked. Header and footer tracks remain intrinsic while the guarded main workspace consumes `--ly-recipe-main-min: 20rem`.
|
|
20
22
|
|
|
21
23
|
## Areas
|
|
22
24
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Layout Styles
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The twenty `data-ly-layout` values are focused token and topology profiles:
|
|
4
4
|
|
|
5
|
-
`minimal-saas`, `bauhaus`, `tactile`, `
|
|
5
|
+
`minimal-saas`, `bento`, `maximalist`, `bauhaus`, `tactile`, `neumorphism`, `retrofuturism`, `brutalism`, `cyberpunk`, `y2k`, `retro-glass`, `f-pattern`, `z-pattern`, `split-screen`, `mondrian`, `synthwave`, `technical-blueprint`, `data-terminal`, `industrial-hmi`, and `editorial`.
|
|
6
6
|
|
|
7
7
|
```html
|
|
8
8
|
<body class="ly-root" data-ly-layout="bento">
|
|
@@ -23,7 +23,11 @@ Every profile feeds the same wrapper, primitive, and recipe engine. Profiles tun
|
|
|
23
23
|
|
|
24
24
|
A profile must remain visibly distinct through at least two spatial characteristics. Personality files may not declare their own `@container`, viewport, or orientation breakpoint systems.
|
|
25
25
|
|
|
26
|
-
When a profile supplies an App Shell area template, its matching row definition must contain the same number of rows and keep the main workspace on the flexible track.
|
|
26
|
+
When a profile supplies an App Shell area template, its matching row definition must contain the same number of rows and keep the main workspace on the flexible track. Other profiles inherit the shared area-aware App Shell, which removes absent direct-child side tracks without changing DOM order.
|
|
27
|
+
|
|
28
|
+
## Density Contexts
|
|
29
|
+
|
|
30
|
+
Normal density is the zero-configuration default. `data-ly-density="compact"`, `data-ly-density="normal"`, and `data-ly-density="spacious"` override personality spacing at the root or on a nested layout subtree. A nested density context intentionally resets inherited gap and section tokens while leaving the selected personality unchanged.
|
|
27
31
|
|
|
28
32
|
## Ownership
|
|
29
33
|
|
|
@@ -33,26 +37,9 @@ The personality name does not promise colors, typography, borders, shadows, or i
|
|
|
33
37
|
|
|
34
38
|
## Visual Pairing Guidance
|
|
35
39
|
|
|
36
|
-
[`layout-style-css/personalities.json`](../../personalities.json) is the public, machine-readable pairing source used by the demo. Its
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
| --- | --- |
|
|
40
|
-
| Minimal SaaS | Native match: `minimal-saas` |
|
|
41
|
-
| Bento | Native match: `bento` |
|
|
42
|
-
| Maximalist | Native match: `maximalist` |
|
|
43
|
-
| Bauhaus | Native match: `bauhaus` |
|
|
44
|
-
| Tactile | Native match: `tactile` |
|
|
45
|
-
| Neumorphism | Native match: `neumorphism` |
|
|
46
|
-
| Retrofuturism | Native match: `retrofuturism` |
|
|
47
|
-
| Brutalism | Native match: `brutalism` |
|
|
48
|
-
| Cyberpunk | Native match: `cyberpunk` |
|
|
49
|
-
| Y2K | Native match: `y2k` |
|
|
50
|
-
| Retro Glass | Native match: `retro-glass` |
|
|
51
|
-
| F-pattern | Any visual preset; this is structure only |
|
|
52
|
-
| Z-pattern | Any visual preset; this is structure only |
|
|
53
|
-
| Split Screen | Any visual preset; this is structure only |
|
|
54
|
-
| Mondrian | Any visual preset; this is structure only |
|
|
55
|
-
| Synthwave | Recommended: `cyberpunk` or `retrofuturism`; the browser contract verifies each preset's distinct rendered article shadow while retaining `data-ly-layout="synthwave"` |
|
|
40
|
+
[`layout-style-css/personalities.json`](../../personalities.json) is the public, machine-readable pairing source used by the demo. Its recommended and compatible arrays are guidance, never dependencies: `data-ly-layout`, `data-ly-density`, `data-ui`, `data-theme`, and `data-mode` are independently selectable on the same document.
|
|
41
|
+
|
|
42
|
+
See the [Layout Personality Reference](Layout-Personality-Reference.md) for the canonical 20-profile geometry, responsive intent, Mosaic role, and full pairing matrix.
|
|
56
43
|
|
|
57
44
|
## Customization
|
|
58
45
|
|