layout-style-css 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,186 @@
1
+ # Migrating To 2.0
2
+
3
+ Version 2.0 rebuilds Layout Style CSS as a container-first, dependency-free structural layout system. This guide maps the complete 1.x public surface to v2 and identifies the compatibility window.
4
+
5
+ ## Runtime And Tooling Contract
6
+
7
+ - Development and release scripts require Node.js 20 or newer.
8
+ - The package has no runtime dependencies and no peer dependencies.
9
+ - `ui-style-kit-css@2.1.0` and `interactive-surface-css@1.5.0` are released registry fixtures; neither is a consumer dependency.
10
+ - Current evergreen Chromium, Firefox, and WebKit are supported.
11
+ - Responsive recipes use core thresholds at `48rem` and `64rem`; personalities may add personality-specific thresholds.
12
+
13
+ Install companions explicitly only when the application uses them:
14
+
15
+ ```bash
16
+ npm install layout-style-css@2.1.1
17
+ npm install ui-style-kit-css@2.1.0 interactive-surface-css@1.5.0
18
+ ```
19
+
20
+ Layout Style CSS 2.1 keeps the v2 layout contract and updates the optional companion fixture path to UI Style Kit visual CSS, its Interactive Surface token bridge, and Interactive Surface 1.5 state core.
21
+
22
+ ## Export Changes
23
+
24
+ The v2 package exports are focused and companion-free:
25
+
26
+ | V2 import | Purpose |
27
+ | --- | --- |
28
+ | `layout-style-css` | Default full bundle: core plus all personalities. |
29
+ | `layout-style-css/min.css` | Minified full bundle. |
30
+ | `layout-style-css/core.css` | Wrappers, primitives, recipes, and utilities. |
31
+ | `layout-style-css/wrappers.css` | Tokens, reset, safe-area gutters, and wrappers. |
32
+ | `layout-style-css/primitives.css` | Composition primitives. |
33
+ | `layout-style-css/recipes.css` | Functional recipes and named areas. |
34
+ | `layout-style-css/utilities.css` | Structural and order utilities. |
35
+ | `layout-style-css/personalities.css` | All personalities. |
36
+ | `layout-style-css/personalities/minimal-saas.css` | One personality; replace the filename with any of the sixteen names. |
37
+ | `layout-style-css/integrations/ui-style-kit.css` | Import-free UI Style Kit structural bridge. |
38
+ | `layout-style-css/legacy.css` | Full v2 bundle plus v1 selector aliases. |
39
+
40
+ The following v1 exports were removed from the default contract:
41
+
42
+ - `layout-style-css/base.css` and the old `layout-base.css` dist file
43
+ - `layout-style-css/bridge.css` and `layout-ui-style-kit-bridge.css`
44
+ - `layout-style-css/all.css`
45
+ - `layout-style-css/all-with-ui-kit.css`
46
+ - `layout-style-css/all-with-ui-kit-and-interactive-surface.css`
47
+ - duplicated root personality exports such as `layout-style-css/minimal-saas.css`
48
+ - root dist files named `layout-style-*.css`
49
+
50
+ Replace a root personality import with its `personalities/` path. Replace old aggregates with explicit companion imports and the v2 default or focused core.
51
+
52
+ ## Import Recipes
53
+
54
+ Standalone Layout Style CSS:
55
+
56
+ ```js
57
+ import "layout-style-css";
58
+ ```
59
+
60
+ Layout plus UI Style Kit:
61
+
62
+ ```js
63
+ import "ui-style-kit-css/visual.css";
64
+ import "layout-style-css/integrations/ui-style-kit.css";
65
+ import "layout-style-css";
66
+ ```
67
+
68
+ All three libraries must be imported in this exact order:
69
+
70
+ ```js
71
+ import "ui-style-kit-css/visual.css";
72
+ import "ui-style-kit-css/interactive-surface-theme.css";
73
+ import "interactive-surface-css/state-core.css";
74
+ import "layout-style-css";
75
+ ```
76
+
77
+ The first layer supplies UI paint, the second interaction states, the third structural name mappings, and the fourth the layout system. The Layout integration file contains no package imports.
78
+
79
+ ## Wrapper Mapping
80
+
81
+ V2 wrapper names communicate intent rather than a generic size tier. `.ly-wrapper` now defaults to the `72rem` content measure and establishes an inline-size container. A personality may change that plain-wrapper default, but an explicit compact, prose, content, wide, full, or breakout variant always wins.
82
+
83
+ | 1.x selector | V2 selector | V2 measure or behavior |
84
+ | --- | --- | --- |
85
+ | `.ly-container`, `.ly-wrapper` | `.ly-wrapper` or `.ly-wrapper--content` | Default `72rem` content wrapper |
86
+ | `.ly-container--sm`, `.ly-wrapper--sm` | `.ly-wrapper--compact` | `40rem` |
87
+ | `.ly-container--md`, `.ly-wrapper--md` | Local `--ly-wrapper-max: 56rem` override, or temporary `legacy.css` | No canonical v2 tier |
88
+ | `.ly-wrapper--readable` | `.ly-wrapper--prose` | `68ch` |
89
+ | `.ly-container--lg`, `.ly-wrapper--lg` | `.ly-wrapper--content` | `72rem` |
90
+ | `.ly-container--xl`, `.ly-wrapper--xl` | `.ly-wrapper--wide` | `112rem` in the new semantic scale |
91
+ | `.ly-container--wide`, `.ly-wrapper--wide` | `.ly-wrapper--wide` | `112rem` |
92
+ | `.ly-container--fluid`, `.ly-wrapper--fluid` | `.ly-wrapper--full` | Full available width with safe-area gutters |
93
+ | No v1 equivalent | `.ly-wrapper--breakout` | Content, feature, and full-width lanes |
94
+
95
+ The v1 medium `56rem` and extra-large `88rem` measures do not have canonical v2 names. Use a local `--ly-wrapper-max` override if those exact measures are product requirements, or load `legacy.css` while migrating.
96
+
97
+ Breakout markup defaults to the content lane:
98
+
99
+ ```html
100
+ <div class="ly-wrapper ly-wrapper--breakout">
101
+ <article data-ly-lane="content">Article</article>
102
+ <figure data-ly-lane="feature">Feature media</figure>
103
+ <section data-ly-lane="full">Full-width stage</section>
104
+ </div>
105
+ ```
106
+
107
+ Every wrapper uses fluid logical gutters and safe-area insets. Test the containing element around the `48rem` and `64rem` core thresholds and around any selected personality threshold; viewport width alone no longer determines layout changes.
108
+
109
+ ## Canonical Hooks
110
+
111
+ V2 standardizes three attributes:
112
+
113
+ - `data-ly-layout` selects one of the sixteen personalities.
114
+ - `data-ly-recipe` identifies `app-shell`, `dashboard`, `docs`, `list-detail`, `split-hero`, `gallery`, or `card-grid`.
115
+ - `data-ly-area` identifies `header`, `nav`, `main`, `aside`, `footer`, `content`, `media`, `actions`, `primary`, or `secondary`.
116
+
117
+ Every `data-ly-recipe` value is a complete alternative to its matching recipe class. For example, `data-ly-recipe="dashboard"` works without `.ly-dashboard`; applications may keep the class API, use the attribute API, or include both during migration.
118
+
119
+ ```html
120
+ <body class="ly-root" data-ly-layout="minimal-saas">
121
+ <div class="ly-dashboard" data-ly-recipe="dashboard">
122
+ <header data-ly-area="header">Header</header>
123
+ <nav data-ly-area="nav">Navigation</nav>
124
+ <main data-ly-area="main">Main</main>
125
+ <aside data-ly-area="aside">Aside</aside>
126
+ <footer data-ly-area="footer">Footer</footer>
127
+ </div>
128
+ </body>
129
+ ```
130
+
131
+ The v1 personality hooks `data-layout`, `layout-style`, `.ly-layout-*`, and `.ly-style-*` are legacy-only. Move the personality value to `data-ly-layout` on `.ly-root`.
132
+
133
+ ## Primitive And Recipe Mapping
134
+
135
+ The v2 composition set is stack, cluster, center, cover, switcher, sidebar, grid, split, panes, media, reel, frame, and bounded scroll.
136
+
137
+ | 1.x API | V2 API |
138
+ | --- | --- |
139
+ | `.ly-row` plus `.ly-col-*` | `.ly-grid` plus `.ly-cols-*` and `.ly-span-*`, or `.ly-cluster` for wrapping flow |
140
+ | `.ly-carousel` | `.ly-reel` |
141
+ | `.ly-scroll-area` | `.ly-scroll` |
142
+ | `.ly-sidebar-layout` | `.ly-sidebar` or the `docs` recipe |
143
+ | `.ly-panes--two` | `.ly-panes--2` |
144
+ | `.ly-panes--three` | `.ly-panes--3` |
145
+ | Ad hoc shell class combinations | A matching `data-ly-recipe` root with named `data-ly-area` children |
146
+ | `.ly-button-group` | `.ly-cluster` |
147
+ | `.ly-card-grid` | `data-ly-recipe="card-grid"` or `.ly-card-grid` |
148
+ | `.ly-gallery` | `data-ly-recipe="gallery"` or `.ly-gallery` |
149
+ | `.ly-content` | V2 primitives and recipe areas already apply shrink safety; `legacy.css` preserves the structural `min-inline-size: 0` alias for ad hoc v1 content regions. |
150
+ | `.ly-divider` | Replace spacing with a stack gap or spacing utility and source the visual divider from UI Style Kit or the application theme. `legacy.css` preserves only its `1px` minimum block geometry and block spacing, never paint. |
151
+ | `.ly-surface--raised` | Removed. Raised radius, border, background, and shadow treatment belongs to UI Style Kit or application theme styling, so `legacy.css` intentionally does not restore this selector. |
152
+
153
+ The v1 column, carousel, button-group, sidebar, pane, card-size, app-area, scroll, content, and structural divider aliases remain functional only through `legacy.css`. The paint-owned `.ly-surface--raised` API is removed rather than aliased.
154
+
155
+ ## Mobile Order And Accessibility
156
+
157
+ DOM order is authoritative on mobile and must match the intended reading order and focus order. Built-in recipes never use CSS `order`; they rearrange named grid areas at wider containers without changing source order.
158
+
159
+ V2 provides `.ly-order-first`, `.ly-order-normal`, `.ly-order-last`, and `.ly-order-1` through `.ly-order-6`. Equivalent `ly-md-order-*` and `ly-lg-order-*` utilities activate at the `48rem` and `64rem` container thresholds.
160
+
161
+ These utilities are explicit escape hatches. They can make visual order disagree with assistive-technology reading order or keyboard focus order. Prefer semantic source order. When an escape hatch is unavoidable, test the complete keyboard sequence, screen-reader reading order, and mobile fallback.
162
+
163
+ ## Temporary Legacy Bundle
164
+
165
+ Use one import during an incremental migration:
166
+
167
+ ```js
168
+ import "layout-style-css/legacy.css";
169
+ ```
170
+
171
+ `legacy.css` imports the full v2 bundle and adds functional aliases for old wrapper names, root hooks, layout aliases, 12-column utilities, carousel, button groups, sidebar layouts, pane names, card sizing, app regions, scroll areas, `.ly-content`, and structural `.ly-divider` geometry. It does not restore `.ly-surface--raised`, companion imports, or removed package exports.
172
+
173
+ Legacy compatibility is supported for the v2 line only and is scheduled for removal in v3. Treat it as a transition tool: migrate markup and imports before upgrading to the next major version.
174
+
175
+ ## Migration Checklist
176
+
177
+ 1. Upgrade the development runtime to Node.js 20 or newer.
178
+ 2. Remove companion packages from peer assumptions and install only the layers the application uses.
179
+ 3. Replace removed aggregate and root personality imports with focused v2 exports.
180
+ 4. Change wrapper size names to semantic wrapper names.
181
+ 5. Move personality selection to `data-ly-layout`.
182
+ 6. Add `data-ly-recipe` and `data-ly-area` hooks while preserving correct mobile source order.
183
+ 7. Replace v1 column and recipe aliases, or temporarily switch to `legacy.css`.
184
+ 8. Audit every base, `ly-md-*`, and `ly-lg-*` order utility for reading and focus-order impact.
185
+ 9. Test below and above both core container thresholds and the selected personality threshold in Chromium, Firefox, and WebKit.
186
+ 10. Remove `legacy.css` before the v3 upgrade.
@@ -0,0 +1,205 @@
1
+ # Migrating To 3.0
2
+
3
+ `layout-style-css@3.0.0` is an intentional clean break from v2. There is no compatibility bundle. Migrate markup and imports before upgrading the package.
4
+
5
+ ## Package Imports
6
+
7
+ | Removed v2 surface | v3 replacement |
8
+ | --- | --- |
9
+ | `layout-style-css/legacy.css` | Canonical v3 hooks; `legacy.css` is not shipped |
10
+ | `layout-style-css/integrations/ui-style-kit.css` | Import UI Style Kit paint explicitly; `integrations/ui-style-kit.css` is not shipped |
11
+ | `layout-style-css/bridge.css` | Removed; compose UI Style Kit paint explicitly because `bridge.css` is not shipped |
12
+ | `layout-style-css/css` (`./css`) | `layout-style-css` |
13
+ | `layout-style-css/css.css` (`./css.css`) | `layout-style-css` |
14
+ | `layout-style-css/min` (`./min`) | `layout-style-css/min.css` |
15
+
16
+ Focused exports remain available for `foundation.css`, `wrappers.css`, `primitives.css`, `recipes.css`, `utilities.css`, `personalities.css`, and `personalities/*.css`.
17
+
18
+ ## Recipe Hooks
19
+
20
+ Recipe classes were aliases in v2 and are removed in v3. Replace them with the canonical attribute:
21
+
22
+ | Removed class | Canonical v3 hook |
23
+ | --- | --- |
24
+ | `.ly-app-shell` | `data-ly-recipe="app-shell"` |
25
+ | `.ly-dashboard` | `data-ly-recipe="dashboard"` |
26
+ | `.ly-docs` | `data-ly-recipe="docs"` |
27
+ | `.ly-list-detail` | `data-ly-recipe="list-detail"` |
28
+ | `.ly-split-hero` | `data-ly-recipe="split-hero"` |
29
+ | `.ly-gallery` | `data-ly-recipe="gallery"` |
30
+ | `.ly-card-grid` | `data-ly-recipe="card-grid"` |
31
+
32
+ Before:
33
+
34
+ ```html
35
+ <section class="ly-dashboard" data-ly-recipe="dashboard">...</section>
36
+ ```
37
+
38
+ After:
39
+
40
+ ```html
41
+ <section data-ly-recipe="dashboard">...</section>
42
+ ```
43
+
44
+ Keep canonical `data-ly-area` values on regions. App shell uses `sidebar`; Dashboard and Docs use `nav`.
45
+
46
+ ## Automatic And Manual Responsiveness
47
+
48
+ Missing `data-ly-responsive` means automatic enhancement. To own topology yourself, opt out:
49
+
50
+ ```html
51
+ <section data-ly-recipe="docs" data-ly-responsive="manual">...</section>
52
+ ```
53
+
54
+ ```css
55
+ @container ly-scope (min-width: 56rem) {
56
+ [data-ly-recipe="docs"][data-ly-responsive="manual"] {
57
+ /* Application-owned topology. */
58
+ }
59
+ }
60
+ ```
61
+
62
+ The manual form retains the safe single-column fallback until the application query applies.
63
+
64
+ ## Containers And Wrappers
65
+
66
+ `.ly-root`, every `.ly-wrapper`, and every recipe root now establishes the named `ly-scope` inline-size container. Recipes can be direct children of `.ly-root`; nested recipes respond to the nearest wrapper.
67
+
68
+ The v3 wrapper names remain:
69
+
70
+ - `.ly-wrapper--compact`
71
+ - `.ly-wrapper--prose`
72
+ - `.ly-wrapper--content`
73
+ - `.ly-wrapper--wide`
74
+ - `.ly-wrapper--full`
75
+ - `.ly-wrapper--breakout`
76
+
77
+ Breakout lanes remain `data-ly-lane="content"`, `data-ly-lane="feature"`, and `data-ly-lane="full"`.
78
+
79
+ ## Utilities And Source Order
80
+
81
+ Remove all v2 responsive utility families:
82
+
83
+ - `ly-md-*`
84
+ - `ly-lg-*`
85
+
86
+ Remove all visual-order utilities, including `.ly-order-first`, `.ly-order-normal`, `.ly-order-last`, and numbered order classes. There is no v3 replacement.
87
+
88
+ Fix the DOM instead. The mobile DOM order is the reading and keyboard order; named grid areas enhance presentation without moving focus. Built-in recipes never use Flexbox or Grid ordering.
89
+
90
+ The v3 utility module keeps only stable structural sizing, gap, padding, ratio, alignment, overflow, visibility, span, and column helpers.
91
+
92
+ Remove `.ly-bleed`. Its `100vw` technique could overflow documents with classic scrollbars. Use the clamped `data-ly-lane="feature"` or `data-ly-lane="full"` breakout lanes, or an application-owned technique that accounts for its actual containing block.
93
+
94
+ ## Complete V2 Selector Index
95
+
96
+ This index compares the `2.1.1` default bundle with v3. Selectors not named below remain available with their canonical v3 meaning.
97
+
98
+ ### Structural Aliases
99
+
100
+ Replace application-shell region classes with canonical areas:
101
+
102
+ | Removed classes | v3 replacement |
103
+ | --- | --- |
104
+ | `.ly-app-header`, `.ly-app-sidebar`, `.ly-app-main`, `.ly-app-aside`, `.ly-app-footer` | `data-ly-area="header"`, `data-ly-area="sidebar"`, `data-ly-area="main"`, `data-ly-area="aside"`, `data-ly-area="footer"` |
105
+
106
+ Replace every removed area class with its same-named attribute:
107
+
108
+ - `.ly-area--header` → `data-ly-area="header"`
109
+ - `.ly-area--nav` → `data-ly-area="nav"`
110
+ - `.ly-area--main` → `data-ly-area="main"`
111
+ - `.ly-area--aside` → `data-ly-area="aside"`
112
+ - `.ly-area--footer` → `data-ly-area="footer"`
113
+ - `.ly-area--content` → `data-ly-area="content"`
114
+ - `.ly-area--media` → `data-ly-area="media"`
115
+ - `.ly-area--actions` → `data-ly-area="actions"`
116
+ - `.ly-area--primary` → `data-ly-area="primary"`
117
+ - `.ly-area--secondary` → `data-ly-area="secondary"`
118
+
119
+ `.ly-grid--auto` becomes `.ly-grid`; intrinsic `auto-fit` tracks are now the default. Replace `.ly-panes--2` and `.ly-panes--3` with `.ly-panes`, then tune `--ly-pane-min`, `--ly-pane-size`, or application CSS if an exact fixed topology is required.
120
+
121
+ The removed `.ly-media__asset` and `.ly-media__content` aliases become correctly ordered children of `.ly-media`. Keep `.ly-media__actions` when its existing action sizing is useful; use application-owned hooks if asset and content children need additional semantics.
122
+
123
+ ### Columns And Spans
124
+
125
+ The stable column utilities retained by v3 are `.ly-cols-1`, `.ly-cols-2`, `.ly-cols-3`, `.ly-cols-4`, `.ly-cols-6`, and `.ly-cols-12`. Replace the removed `.ly-cols-5`, `.ly-cols-7`, `.ly-cols-8`, `.ly-cols-9`, `.ly-cols-10`, `.ly-cols-11`, and `.ly-cols-16` with a local `--ly-grid-columns` override:
126
+
127
+ ```css
128
+ .application-grid {
129
+ --ly-grid-columns: 8;
130
+ }
131
+ ```
132
+
133
+ All responsive column aliases are removed:
134
+
135
+ - `.ly-md-cols-1`, `.ly-md-cols-2`, `.ly-md-cols-3`, `.ly-md-cols-4`, `.ly-md-cols-6`, `.ly-md-cols-8`, `.ly-md-cols-12`, `.ly-md-cols-16`
136
+ - `.ly-lg-cols-1`, `.ly-lg-cols-2`, `.ly-lg-cols-3`, `.ly-lg-cols-4`, `.ly-lg-cols-6`, `.ly-lg-cols-8`, `.ly-lg-cols-12`, `.ly-lg-cols-16`
137
+
138
+ Put a retained base utility or `--ly-grid-columns` override inside an application-owned `@container ly-scope` query when a fixed responsive column count is genuinely required.
139
+
140
+ V3 retains `.ly-span-1` through `.ly-span-4` and `.ly-span-full`. Replace `.ly-span-5`, `.ly-span-6`, `.ly-span-7`, `.ly-span-8`, `.ly-span-9`, `.ly-span-10`, `.ly-span-11`, `.ly-span-12`, `.ly-span-13`, `.ly-span-14`, `.ly-span-15`, and `.ly-span-16` with application CSS such as `grid-column: span 8`.
141
+
142
+ ### Spacing And Ratio Utilities
143
+
144
+ V3 keeps the even spacing steps. Replace `.ly-gap-1`, `.ly-gap-3`, `.ly-gap-5`, `.ly-gap-7`, and `.ly-gap-9` with the closest retained utility or set `--ly-gap`, `--ly-grid-gap`, `--ly-stack-gap`, and `--ly-cluster-gap` together in application CSS.
145
+
146
+ Replace `.ly-pad-1`, `.ly-pad-3`, `.ly-pad-5`, `.ly-pad-7`, and `.ly-pad-9` with a retained even padding step or application padding. The directional `.ly-px-4`, `.ly-px-6`, `.ly-px-8`, `.ly-py-4`, `.ly-py-6`, and `.ly-py-8` aliases have no v3 utility; use logical `padding-inline` or `padding-block`.
147
+
148
+ Replace `.ly-frame-2x1` with an application token override:
149
+
150
+ ```css
151
+ .application-frame {
152
+ --ly-frame-ratio: 2 / 1;
153
+ }
154
+ ```
155
+
156
+ ### Responsive Visibility And Visual Order
157
+
158
+ `.ly-show-md-up` and `.ly-show-lg-up` are removed. Prefer content that remains available at every allocation; if conditional rendering is a product requirement, own it in application CSS and preserve an accessible reading experience.
159
+
160
+ All visual-order selectors are removed with no v3 replacement:
161
+
162
+ - `.ly-order-first`, `.ly-order-normal`, `.ly-order-last`, `.ly-order-1`, `.ly-order-2`, `.ly-order-3`, `.ly-order-4`, `.ly-order-5`, `.ly-order-6`
163
+ - `.ly-md-order-first`, `.ly-md-order-normal`, `.ly-md-order-last`, `.ly-md-order-1`, `.ly-md-order-2`, `.ly-md-order-3`, `.ly-md-order-4`, `.ly-md-order-5`, `.ly-md-order-6`
164
+ - `.ly-lg-order-first`, `.ly-lg-order-normal`, `.ly-lg-order-last`, `.ly-lg-order-1`, `.ly-lg-order-2`, `.ly-lg-order-3`, `.ly-lg-order-4`, `.ly-lg-order-5`, `.ly-lg-order-6`
165
+
166
+ ## Vertical Responsiveness
167
+
168
+ v3 adds height-aware defaults:
169
+
170
+ - At `44rem` high or less, spacing, header height, and scroll bounds tighten.
171
+ - At `30rem` high or less, recipe-owned sticky positioning and forced cover/shell heights are removed.
172
+ - `100vh` fallbacks are followed by `100dvh`.
173
+
174
+ Delete application orientation workarounds that existed only to make v2 shells usable in short landscape, then test actual available width and height.
175
+
176
+ ## Personalities
177
+
178
+ All sixteen `data-ly-layout` values remain. Personality files are now token/topology profiles consumed by one shared responsive engine. They do not own independent `@container` or viewport breakpoint systems.
179
+
180
+ If application CSS targeted personality-specific topology thresholds, move that topology to a manual recipe query against `ly-scope`.
181
+
182
+ ## Ecosystem Ownership
183
+
184
+ Layout owns structure. UI Style Kit owns paint. Interactive Surface owns interaction styling.
185
+
186
+ ```js
187
+ import "ui-style-kit-css/visual.css";
188
+ import "ui-style-kit-css/interactive-surface-theme.css";
189
+ import "interactive-surface-css/state-core.css";
190
+ import "layout-style-css";
191
+ ```
192
+
193
+ Do not recreate the removed structural bridge with UI-prefixed aliases. Put canonical Layout hooks in markup and let companion libraries style their own responsibilities.
194
+
195
+ ## Migration Checklist
196
+
197
+ 1. Replace removed package exports.
198
+ 2. Remove recipe class aliases.
199
+ 3. Remove responsive and order utilities.
200
+ 4. Confirm the mobile DOM, reading, keyboard, and focus order.
201
+ 5. Use automatic recipes by default.
202
+ 6. Add `data-ly-responsive="manual"` only where application topology is genuinely required.
203
+ 7. Test all recipes directly in `.ly-root` and inside their nearest wrapper.
204
+ 8. Test narrow, wide, tall, and short-landscape allocations.
205
+ 9. Run `npm run test:full` in Chromium, Firefox, and WebKit.
@@ -0,0 +1,62 @@
1
+ # Release And Publishing
2
+
3
+ This guide describes the release gate for `layout-style-css@3.0.2`. Running verification does not publish, tag, push, create a GitHub Release, or change the npm registry.
4
+
5
+ ## Local Candidate Gate
6
+
7
+ ```bash
8
+ npm ci
9
+ npm run build
10
+ npm run lint
11
+ npm run test:full
12
+ npm run release:verify
13
+ git diff --check
14
+ ```
15
+
16
+ `npm run release:verify` includes `npm audit --audit-level=moderate`, the cross-engine browser matrix, Pages verification, tarball dry-run, publish dry-run, and `npm run release:preflight`. It does not publish.
17
+
18
+ The read-only ecosystem preflight uses the immutable UI fixture in `ecosystem-release-fixture.json`, overrides Layout Style with the candidate tarball, queries npm for every exact documented minimum/current version, resolves all packed exports (including personality modules), validates maintained documentation, and runs the reviewed clean-install matrices. Pull requests execute this same gate without enabling publish, tag, release, or deployment mutations.
19
+
20
+ The package's `prepublishOnly` script runs `npm run release:verify`, so a direct npm publish uses the same full gate.
21
+
22
+ ## Coordinated Bootstrap Sequence
23
+
24
+ The immutable cross-repository pins require this exact remote sequence:
25
+
26
+ 1. Push a stable UI bootstrap ref containing `33e3c834aec62b85650dd14aea9d7d388abef191`.
27
+ 2. Push and merge Interactive Surface CSS and Layout Style CSS with merge commits so their reviewed commit SHAs remain reachable.
28
+ 3. Update and verify the final UI companion pins against those merged companion commits.
29
+ 4. Push the final UI branch, rerun its ecosystem preflight, and merge UI with a merge commit.
30
+ 5. Do not squash, rebase, or delete the only remote refs until every pinned commit is reachable through merged ancestry.
31
+
32
+ The bootstrap SHA is deliberately stable: companion workflows use it to load the reviewed preflight implementation before the final UI commit can reference the companion heads.
33
+
34
+ ## Candidate Inspection
35
+
36
+ Confirm:
37
+
38
+ - package version is `3.0.2`
39
+ - intended tag would be `v3.0.2`
40
+ - runtime and peer dependencies are empty
41
+ - exact exports and tarball files match the v3 contract
42
+ - generated CSS matches authored sources
43
+ - Chromium, Firefox, and WebKit are green
44
+ - `desktop.ini` and other local-only files are absent from the tarball
45
+
46
+ ## Separately Approved Publication
47
+
48
+ Only after explicit approval:
49
+
50
+ 1. Commit the verified candidate.
51
+ 2. Push the intended branch.
52
+ 3. Merge through the repository's normal review policy.
53
+ 4. Create the exact `v3.0.2` tag from the protected release commit.
54
+ 5. Publish the GitHub Release.
55
+ 6. Let the protected npm workflow verify the tag and publish with provenance.
56
+ 7. Confirm the GitHub Release, tag, and npm registry state independently.
57
+
58
+ The npm job uses the protected `npm` environment, required reviewers, least-privilege permissions, strict tag validation, exact tag checkout, main-ancestry verification, and an immutable commit sha. Prefer npm trusted publishing when the registry setup supports it.
59
+
60
+ ## Recovery
61
+
62
+ If verification fails, fix the candidate and rerun the complete gate. Do not move or overwrite an existing release tag. Use a new semantic version when a published artifact must be corrected.
@@ -0,0 +1,32 @@
1
+ # Security And Support
2
+
3
+ ## Supported Lines
4
+
5
+ | Version | Supported |
6
+ | --- | --- |
7
+ | `3.x` | Yes |
8
+ | `2.x` | Security fixes only during the v3 transition |
9
+ | `1.x` | No |
10
+
11
+ v3 is dependency-free at runtime. Development dependencies and release automation remain subject to the repository security policy.
12
+
13
+ ## Reporting
14
+
15
+ Use the private process in the repository [SECURITY.md](../../SECURITY.md). Do not publish exploit details in a public issue before maintainers can assess them.
16
+
17
+ ## Release Trust
18
+
19
+ The npm workflow uses:
20
+
21
+ - a protected npm environment with required reviewers
22
+ - exact `refs/tags/v*` checkout
23
+ - main-branch ancestry verification
24
+ - least-privilege workflow permissions
25
+ - registry provenance
26
+ - an immutable commit sha
27
+
28
+ Use npm trusted publishing when configured. A local green `release:verify` is evidence for a candidate, not authority to publish.
29
+
30
+ ## Structural Security Boundary
31
+
32
+ Layout CSS has no network calls, script execution, runtime dependencies, secrets, or user data processing. Security-sensitive application behavior remains outside this package.
@@ -0,0 +1,40 @@
1
+ # Companion Library Compatibility
2
+
3
+ Layout Style CSS v3 has no bridge, peer dependency, or companion import.
4
+
5
+ ## Ownership
6
+
7
+ Layout owns structure. UI Style Kit owns paint. Interactive Surface owns interaction styling.
8
+
9
+ - Layout: wrappers, containment, measures, flow, tracks, grid areas, ratios, overflow bounds, and responsive topology
10
+ - UI Style Kit: color, typography, borders, radii, shadows, component paint, and theme roles
11
+ - Interactive Surface: hover, focus, pressed, selected, disabled, loading, and other interaction-state styling
12
+
13
+ ## Explicit Imports
14
+
15
+ ```js
16
+ import "ui-style-kit-css/visual.css";
17
+ import "ui-style-kit-css/interactive-surface-theme.css";
18
+ import "interactive-surface-css/state-core.css";
19
+ import "layout-style-css";
20
+ ```
21
+
22
+ Applications may use Layout alone, Layout plus UI Style Kit, or all three. The default Layout bundle never imports or assumes either companion.
23
+
24
+ ## Markup
25
+
26
+ Put canonical structural hooks in markup:
27
+
28
+ ```html
29
+ <body class="ly-root" data-ly-layout="minimal-saas" data-ui="minimal-saas">
30
+ <main class="ly-wrapper" data-ly-recipe="dashboard">
31
+ <header data-ly-area="header" class="saas-card">Dashboard</header>
32
+ </main>
33
+ </body>
34
+ ```
35
+
36
+ The `ly-*` hooks control structure. Companion classes and data attributes can paint or animate the same elements without taking over layout.
37
+
38
+ ## v3 Boundary
39
+
40
+ The deprecated v2 UI-prefixed structural bridge is not shipped. Migrate bridge aliases to canonical Layout hooks; do not copy the bridge into application CSS. See [Migrating To 3.0](Migrating-To-3.0.md).
@@ -0,0 +1,12 @@
1
+ - [Home](Home)
2
+ - [Getting Started](Getting-Started)
3
+ - [Installation And CDN](Installation-And-CDN)
4
+ - [Layout Primitives](Layout-Primitives)
5
+ - [Layout Recipes](Layout-Recipes)
6
+ - [Layout Styles](Layout-Styles)
7
+ - [Companion Compatibility](UI-Style-Kit-Compatibility)
8
+ - [Migrating To 3.0](Migrating-To-3.0)
9
+ - [Demo And GitHub Pages](Demo-And-GitHub-Pages)
10
+ - [Release And Publishing](Release-And-Publishing)
11
+ - [Security And Support](Security-And-Support)
12
+ - [Contributing](Contributing)
package/manifest.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "schemaPolicy": {
4
+ "compatibility": "additive-within-major",
5
+ "breakingChange": "increment-schemaVersion-before-removing-or-renaming-fields"
6
+ },
7
+ "name": "layout-style-css",
8
+ "version": "3.0.2",
9
+ "entrypoints": {
10
+ "default": "./dist/layout-style-css.css",
11
+ "minified": "./dist/layout-style-css.min.css",
12
+ "core": "./dist/core.css",
13
+ "foundation": "./dist/foundation.css",
14
+ "wrappers": "./dist/wrappers.css",
15
+ "primitives": "./dist/primitives.css",
16
+ "recipes": "./dist/recipes.css",
17
+ "utilities": "./dist/utilities.css",
18
+ "personalities": "./dist/personalities.css",
19
+ "personalityModules": "./dist/personalities/*.css",
20
+ "personalityMetadata": "./personalities.json"
21
+ },
22
+ "selectors": {
23
+ "stable": [".ly-root", ".ly-wrapper"],
24
+ "deprecated": []
25
+ },
26
+ "wrappers": ["compact", "prose", "content", "wide", "full", "breakout"],
27
+ "primitives": ["page", "header", "footer", "main", "section", "surface", "readable", "stack", "cluster", "center", "cover", "switcher", "sidebar", "grid", "split", "panes", "media", "reel", "frame", "scroll"],
28
+ "recipes": ["app-shell", "dashboard", "docs", "list-detail", "split-hero", "gallery", "card-grid"],
29
+ "areas": ["header", "nav", "sidebar", "main", "aside", "footer", "content", "media", "actions", "primary", "secondary"],
30
+ "personalities": ["minimal-saas", "bento", "maximalist", "bauhaus", "tactile", "neumorphism", "retrofuturism", "brutalism", "cyberpunk", "y2k", "retro-glass", "f-pattern", "z-pattern", "split-screen", "mondrian", "synthwave"],
31
+ "personalityPairings": [
32
+ { "id": "minimal-saas", "label": "Minimal SaaS", "visualCompatibility": "native", "recommendedVisualPresets": ["minimal-saas"] },
33
+ { "id": "bento", "label": "Bento", "visualCompatibility": "native", "recommendedVisualPresets": ["bento"] },
34
+ { "id": "maximalist", "label": "Maximalist", "visualCompatibility": "native", "recommendedVisualPresets": ["maximalist"] },
35
+ { "id": "bauhaus", "label": "Bauhaus", "visualCompatibility": "native", "recommendedVisualPresets": ["bauhaus"] },
36
+ { "id": "tactile", "label": "Tactile", "visualCompatibility": "native", "recommendedVisualPresets": ["tactile"] },
37
+ { "id": "neumorphism", "label": "Neumorphism", "visualCompatibility": "native", "recommendedVisualPresets": ["neumorphism"] },
38
+ { "id": "retrofuturism", "label": "Retrofuturism", "visualCompatibility": "native", "recommendedVisualPresets": ["retrofuturism"] },
39
+ { "id": "brutalism", "label": "Brutalism", "visualCompatibility": "native", "recommendedVisualPresets": ["brutalism"] },
40
+ { "id": "cyberpunk", "label": "Cyberpunk", "visualCompatibility": "native", "recommendedVisualPresets": ["cyberpunk"] },
41
+ { "id": "y2k", "label": "Y2K", "visualCompatibility": "native", "recommendedVisualPresets": ["y2k"] },
42
+ { "id": "retro-glass", "label": "Retro Glass", "visualCompatibility": "native", "recommendedVisualPresets": ["retro-glass"] },
43
+ { "id": "f-pattern", "label": "F-pattern", "visualCompatibility": "any", "recommendedVisualPresets": [] },
44
+ { "id": "z-pattern", "label": "Z-pattern", "visualCompatibility": "any", "recommendedVisualPresets": [] },
45
+ { "id": "split-screen", "label": "Split Screen", "visualCompatibility": "any", "recommendedVisualPresets": [] },
46
+ { "id": "mondrian", "label": "Mondrian", "visualCompatibility": "any", "recommendedVisualPresets": [] },
47
+ {
48
+ "id": "synthwave",
49
+ "label": "Synthwave",
50
+ "visualCompatibility": "recommended",
51
+ "recommendedVisualPresets": ["cyberpunk", "retrofuturism"],
52
+ "visualVerification": {
53
+ "method": "rendered-computed-style",
54
+ "test": "test/demo-smoke.test.mjs",
55
+ "computedProperties": {
56
+ "cyberpunk": { "boxShadow": "0px 0px 18px" },
57
+ "retrofuturism": { "boxShadow": "0px 10px 30px" }
58
+ },
59
+ "assertion": "A visible browser contract fixture renders each preset's distinct article box-shadow while data-ly-layout remains synthwave."
60
+ }
61
+ }
62
+ ],
63
+ "containers": {
64
+ "names": ["ly-scope"],
65
+ "type": "inline-size"
66
+ },
67
+ "thresholds": {
68
+ "containerMinWidths": ["42rem", "44rem", "48rem", "52rem", "72rem"],
69
+ "viewportMaxHeights": ["44rem", "30rem"]
70
+ },
71
+ "tokens": {
72
+ "geometry": [
73
+ "--ly-space-0", "--ly-space-1", "--ly-space-2", "--ly-space-3", "--ly-space-4",
74
+ "--ly-space-5", "--ly-space-6", "--ly-space-7", "--ly-space-8", "--ly-space-9",
75
+ "--ly-wrapper-compact", "--ly-wrapper-prose", "--ly-wrapper-content", "--ly-wrapper-wide",
76
+ "--ly-page-padding-inline", "--ly-safe-area-inline", "--ly-safe-area-block-start",
77
+ "--ly-safe-area-block-end", "--ly-wrapper-gutter", "--ly-wrapper-max", "--ly-profile-gap",
78
+ "--ly-gap", "--ly-grid-gap", "--ly-stack-gap", "--ly-cluster-gap",
79
+ "--ly-section-padding-block", "--ly-section-padding-block-compact", "--ly-header-height",
80
+ "--ly-sticky-position", "--ly-cover-min",
81
+ "--ly-shell-min", "--ly-scroll-max", "--ly-switcher-threshold", "--ly-sidebar-size",
82
+ "--ly-sidebar-content-min", "--ly-grid-columns", "--ly-grid-min", "--ly-split-min",
83
+ "--ly-pane-min", "--ly-pane-size", "--ly-media-min", "--ly-media-size", "--ly-reel-item-min",
84
+ "--ly-reel-item-max", "--ly-frame-ratio", "--ly-split-primary", "--ly-split-secondary",
85
+ "--ly-recipe-rail", "--ly-recipe-aside", "--ly-gallery-min", "--ly-card-grid-min",
86
+ "--ly-app-shell-medium-areas", "--ly-app-shell-medium-columns", "--ly-app-shell-wide-areas",
87
+ "--ly-app-shell-wide-columns", "--ly-dashboard-medium-areas", "--ly-dashboard-medium-columns",
88
+ "--ly-dashboard-wide-areas", "--ly-dashboard-wide-columns", "--ly-docs-wide-areas",
89
+ "--ly-docs-wide-columns", "--ly-list-detail-wide-areas", "--ly-list-detail-wide-columns",
90
+ "--ly-split-hero-wide-areas", "--ly-split-hero-wide-columns", "--ly-center-max",
91
+ "--ly-cover-padding", "--ly-z-header", "--ly-split-align", "--ly-media-align",
92
+ "--ly-split-hero-align"
93
+ ]
94
+ },
95
+ "companions": {
96
+ "ui-style-kit-css": ">=2.1.0 <3.0.0",
97
+ "interactive-surface-css": ">=1.5.0 <2.0.0"
98
+ }
99
+ }