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.
Files changed (47) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +35 -14
  3. package/dist/core.css +1 -1
  4. package/dist/foundation.css +168 -24
  5. package/dist/layout-style-css.css +486 -159
  6. package/dist/layout-style-css.min.css +1 -1
  7. package/dist/personalities/bauhaus.css +4 -11
  8. package/dist/personalities/bento.css +1 -11
  9. package/dist/personalities/brutalism.css +3 -11
  10. package/dist/personalities/cyberpunk.css +2 -2
  11. package/dist/personalities/data-terminal.css +13 -0
  12. package/dist/personalities/editorial.css +14 -0
  13. package/dist/personalities/f-pattern.css +4 -4
  14. package/dist/personalities/industrial-hmi.css +11 -0
  15. package/dist/personalities/maximalist.css +2 -11
  16. package/dist/personalities/minimal-saas.css +1 -1
  17. package/dist/personalities/mondrian.css +2 -2
  18. package/dist/personalities/neumorphism.css +4 -13
  19. package/dist/personalities/retro-glass.css +11 -11
  20. package/dist/personalities/retrofuturism.css +2 -2
  21. package/dist/personalities/split-screen.css +6 -6
  22. package/dist/personalities/synthwave.css +2 -2
  23. package/dist/personalities/tactile.css +4 -13
  24. package/dist/personalities/technical-blueprint.css +13 -0
  25. package/dist/personalities/y2k.css +9 -9
  26. package/dist/personalities/z-pattern.css +4 -4
  27. package/dist/personalities.css +5 -1
  28. package/dist/primitives.css +122 -4
  29. package/dist/recipes.css +84 -1
  30. package/dist/utilities.css +14 -35
  31. package/dist/wrappers.css +5 -1
  32. package/docs/wiki/Demo-And-GitHub-Pages.md +4 -2
  33. package/docs/wiki/Getting-Started.md +11 -4
  34. package/docs/wiki/Home.md +7 -2
  35. package/docs/wiki/Installation-And-CDN.md +6 -5
  36. package/docs/wiki/Layout-Personality-Reference.md +67 -0
  37. package/docs/wiki/Layout-Primitives.md +16 -3
  38. package/docs/wiki/Layout-Recipes.md +3 -1
  39. package/docs/wiki/Layout-Styles.md +10 -23
  40. package/docs/wiki/Migrating-To-3.1.md +62 -0
  41. package/docs/wiki/Migrating-To-3.2.md +70 -0
  42. package/docs/wiki/Release-And-Publishing.md +6 -6
  43. package/docs/wiki/UI-Style-Kit-Compatibility.md +6 -0
  44. package/docs/wiki/_Sidebar.md +3 -0
  45. package/manifest.json +48 -28
  46. package/package.json +3 -3
  47. package/personalities.json +76 -14
@@ -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
- max-block-size: var(--ly-scroll-max);
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
  }
@@ -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
- --ly-gap: var(--ly-space-0);
21
- --ly-grid-gap: var(--ly-space-0);
22
- --ly-stack-gap: var(--ly-space-0);
23
- --ly-cluster-gap: var(--ly-space-0);
24
- }
25
-
26
- .ly-gap-2 {
27
- --ly-gap: var(--ly-space-2);
28
- --ly-grid-gap: var(--ly-space-2);
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 sixteen personality profiles
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.2` and import the root bundle:
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.2
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.2` is a dependency-free, CSS-only structural system for layouts that adapt to available width and height.
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
- - Sixteen `data-ly-layout` profiles tune one shared responsive engine.
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.2
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.2/dist/layout-style-css.min.css">
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.2/dist/layout-style-css.min.css">
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
- Application styles can override public custom properties without reordering the package modules.
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` is the deliberate bounded vertical-scroll primitive.
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
- In normal use, only `.ly-reel` introduces intentional horizontal scrolling, and only `.ly-scroll` introduces intentional vertical scrolling. Other wrappers, primitives, and recipes clamp to their available inline size.
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 bounded scroll behaviors use `vh` fallbacks followed by dynamic viewport units such as `100dvh`.
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
- App Shell base, medium, and wide topologies own matching row definitions. Header and footer tracks remain intrinsic while the main workspace receives the flexible row, including personality-specific four-row topologies.
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 sixteen `data-ly-layout` values are focused token and topology profiles:
3
+ The twenty `data-ly-layout` values are focused token and topology profiles:
4
4
 
5
- `minimal-saas`, `bauhaus`, `tactile`, `cyberpunk`, `f-pattern`, `brutalism`, `neumorphism`, `y2k`, `retro-glass`, `z-pattern`, `retrofuturism`, `mondrian`, `synthwave`, `bento`, `maximalist`, and `split-screen`.
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 entries are recommendations, never dependencies: `data-ly-layout`, `data-ui`, `data-theme`, and `data-mode` are independently selectable on the same document.
37
-
38
- | Layout personality | Visual pairing guidance |
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