layout-style-css 1.0.0 → 1.1.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.
Files changed (37) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/CONTRIBUTING.md +50 -0
  3. package/README.md +205 -16
  4. package/SECURITY.md +45 -0
  5. package/demo/assets/social-card.png +0 -0
  6. package/demo/index.html +358 -82
  7. package/dist/layout-all.css +5 -0
  8. package/dist/layout-base.css +67 -0
  9. package/dist/layout-style-css.css +571 -0
  10. package/dist/layout-style-css.min.css +1 -1
  11. package/dist/layout-style-f-pattern.css +76 -0
  12. package/dist/layout-style-mondrian.css +77 -0
  13. package/dist/layout-style-split-screen.css +62 -0
  14. package/dist/layout-style-synthwave.css +88 -0
  15. package/dist/layout-style-z-pattern.css +76 -0
  16. package/dist/layout-ui-style-kit-bridge.css +115 -0
  17. package/docs/wiki/Contributing.md +30 -0
  18. package/docs/wiki/Demo-And-GitHub-Pages.md +39 -0
  19. package/docs/wiki/Getting-Started.md +68 -0
  20. package/docs/wiki/Home.md +48 -0
  21. package/docs/wiki/Installation-And-CDN.md +58 -0
  22. package/docs/wiki/Layout-Primitives.md +57 -0
  23. package/docs/wiki/Layout-Recipes.md +80 -0
  24. package/docs/wiki/Layout-Styles.md +43 -0
  25. package/docs/wiki/Release-And-Publishing.md +69 -0
  26. package/docs/wiki/Security-And-Support.md +34 -0
  27. package/docs/wiki/UI-Style-Kit-Compatibility.md +54 -0
  28. package/docs/wiki/_Sidebar.md +14 -0
  29. package/package.json +12 -2
  30. package/styles/layout-base.css +67 -0
  31. package/styles/layout-style-f-pattern.css +76 -0
  32. package/styles/layout-style-mondrian.css +77 -0
  33. package/styles/layout-style-split-screen.css +62 -0
  34. package/styles/layout-style-synthwave.css +88 -0
  35. package/styles/layout-style-z-pattern.css +76 -0
  36. package/styles/layout-ui-style-kit-bridge.css +115 -0
  37. package/demo/assets/social-card.svg +0 -17
@@ -0,0 +1,76 @@
1
+ /*
2
+ Layout style: z-pattern.
3
+ Header-first scan path that moves from broad lead content to a right-side
4
+ support rail. Visual identity remains owned by ui-style-kit-css.
5
+ */
6
+
7
+ @layer ly.styles.z_pattern {
8
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) {
9
+ --ly-container-max: 100rem;
10
+ --ly-page-padding-inline: clamp(1rem, 3.4vw, 3rem);
11
+ --ly-section-padding-block: clamp(2rem, 5.5vw, 5rem);
12
+ --ly-sidebar-width: clamp(14rem, 20vw, 21rem);
13
+ --ly-grid-min: 15rem;
14
+ --ly-gap: clamp(1rem, 2.4vw, 2rem);
15
+ --ly-grid-gap: var(--ly-gap);
16
+ --ly-stack-gap: clamp(0.875rem, 1.9vw, 1.5rem);
17
+ }
18
+
19
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-app-main {
20
+ padding-block: clamp(1rem, 2.6vw, 2.5rem);
21
+ }
22
+
23
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-container,
24
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-wrapper {
25
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
26
+ }
27
+
28
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-section {
29
+ padding-block: var(--ly-section-padding-block);
30
+ }
31
+
32
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-grid--auto {
33
+ grid-auto-rows: minmax(8rem, auto);
34
+ }
35
+
36
+ @media (min-width: 48rem) {
37
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-app-shell {
38
+ grid-template-areas:
39
+ "header header"
40
+ "main sidebar";
41
+ grid-template-columns: minmax(0, 1.18fr) minmax(min(100%, 15rem), 0.42fr);
42
+ }
43
+
44
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-app-sidebar {
45
+ display: block;
46
+ position: sticky;
47
+ top: var(--ly-space-4);
48
+ height: calc(100svh - (var(--ly-space-4) * 2));
49
+ overflow: auto;
50
+ }
51
+
52
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-grid--auto > :nth-child(4n + 2) {
53
+ grid-column: span 2;
54
+ min-height: 12rem;
55
+ }
56
+
57
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-sidebar-layout {
58
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, 15rem), 0.36fr);
59
+ }
60
+
61
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-split {
62
+ grid-template-columns: minmax(0, 0.92fr) minmax(min(100%, 19rem), 1.08fr);
63
+ align-items: end;
64
+ }
65
+
66
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-panes--two {
67
+ grid-template-columns: minmax(0, 1.25fr) minmax(min(100%, 17rem), 0.75fr);
68
+ }
69
+ }
70
+
71
+ @media (min-width: 80rem) {
72
+ :where(.ly-root[data-layout="z-pattern"], .ly-root[layout-style="z-pattern"], .ly-root.ly-layout-z-pattern, .ly-root.ly-style-z-pattern) .ly-panes--three {
73
+ grid-template-columns: minmax(0, 1.1fr) minmax(min(100%, 15rem), 0.55fr) minmax(min(100%, 14rem), 0.35fr);
74
+ }
75
+ }
76
+ }
@@ -7,6 +7,16 @@
7
7
  @layer ly.bridge {
8
8
  :where(.ly-root[data-ui][data-theme][data-mode], [data-ui][data-theme][data-mode] .ly-root) {
9
9
  --ly-ui-style-kit-bridge: 1;
10
+
11
+ /*
12
+ Normalize UI kit root background geometry without redefining its paint.
13
+ Patterned theme layers should fill the viewport once instead of tiling.
14
+ */
15
+ min-block-size: 100svh;
16
+ background-attachment: fixed;
17
+ background-position: center;
18
+ background-repeat: no-repeat;
19
+ background-size: 100% 100%;
10
20
  }
11
21
 
12
22
  :where(.ly-root[data-ui="minimal-saas"], [data-ui="minimal-saas"] .ly-root) {
@@ -52,4 +62,109 @@
52
62
  :where(.ly-root[data-ui="retro-glass"], [data-ui="retro-glass"] .ly-root) {
53
63
  --ly-ui-style-kit-bridge-style: retro-glass;
54
64
  }
65
+
66
+ :where(.saas-container, .bento-container, .max-container, .bau-container, .tactile-container, .neo-container, .retro-container, .brutal-container, .cyber-container, .y2k-container, .rg-container) {
67
+ /* UI Style Kit naming can opt into layout sizing without taking over visual paint. */
68
+ width: min(100% - var(--ly-page-padding-inline), var(--ly-container-max));
69
+ margin-inline: auto;
70
+ }
71
+
72
+ :where(.saas-section, .bento-section, .max-section, .bau-section, .tactile-section, .neo-section, .retro-section, .brutal-section, .cyber-section, .y2k-section, .rg-section) {
73
+ padding-block: var(--ly-section-padding-block);
74
+ }
75
+
76
+ :where(.saas-stack, .bento-stack, .max-stack, .bau-stack, .tactile-stack, .neo-stack, .retro-stack, .brutal-stack, .cyber-stack, .y2k-stack, .rg-stack) {
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: var(--ly-stack-gap);
80
+ }
81
+
82
+ :where(.saas-cluster, .bento-cluster, .max-cluster, .bau-cluster, .tactile-cluster, .neo-cluster, .retro-cluster, .brutal-cluster, .cyber-cluster, .y2k-cluster, .rg-cluster) {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ align-items: center;
86
+ gap: var(--ly-cluster-gap);
87
+ }
88
+
89
+ :where(.saas-grid, .bento-grid, .max-grid, .bau-grid, .tactile-grid, .neo-grid, .retro-grid, .brutal-grid, .cyber-grid, .y2k-grid, .rg-grid) {
90
+ display: grid;
91
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-grid-min)), 1fr));
92
+ gap: var(--ly-grid-gap);
93
+ }
94
+
95
+ :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) {
96
+ display: grid;
97
+ grid-template-columns: 1fr;
98
+ gap: var(--ly-gap);
99
+ align-items: var(--ly-split-align, center);
100
+ }
101
+
102
+ :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) > * {
103
+ min-width: 0;
104
+ }
105
+
106
+ :where(.saas-button-group, .bento-button-group, .max-button-group, .bau-button-group, .tactile-button-group, .neo-button-group, .retro-button-group, .brutal-button-group, .cyber-button-group, .y2k-button-group, .rg-button-group) {
107
+ display: flex;
108
+ flex-wrap: wrap;
109
+ align-items: center;
110
+ gap: var(--ly-cluster-gap);
111
+ }
112
+
113
+ :where(.saas-button-group, .bento-button-group, .max-button-group, .bau-button-group, .tactile-button-group, .neo-button-group, .retro-button-group, .brutal-button-group, .cyber-button-group, .y2k-button-group, .rg-button-group) > * {
114
+ flex: 0 1 auto;
115
+ min-width: min(100%, var(--ly-button-min, 8rem));
116
+ }
117
+
118
+ :where(.saas-card-grid, .bento-card-grid, .max-card-grid, .bau-card-grid, .tactile-card-grid, .neo-card-grid, .retro-card-grid, .brutal-card-grid, .cyber-card-grid, .y2k-card-grid, .rg-card-grid) {
119
+ display: grid;
120
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-card-grid-min)), 1fr));
121
+ gap: var(--ly-grid-gap);
122
+ }
123
+
124
+ :where(.saas-card-grid, .bento-card-grid, .max-card-grid, .bau-card-grid, .tactile-card-grid, .neo-card-grid, .retro-card-grid, .brutal-card-grid, .cyber-card-grid, .y2k-card-grid, .rg-card-grid) > * {
125
+ min-width: 0;
126
+ }
127
+
128
+ :where(.saas-card-sm, .bento-card-sm, .max-card-sm, .bau-card-sm, .tactile-card-sm, .neo-card-sm, .retro-card-sm, .brutal-card-sm, .cyber-card-sm, .y2k-card-sm, .rg-card-sm) {
129
+ min-block-size: var(--ly-card-size-sm);
130
+ }
131
+
132
+ :where(.saas-card-md, .bento-card-md, .max-card-md, .bau-card-md, .tactile-card-md, .neo-card-md, .retro-card-md, .brutal-card-md, .cyber-card-md, .y2k-card-md, .rg-card-md) {
133
+ min-block-size: var(--ly-card-size-md);
134
+ }
135
+
136
+ :where(.saas-card-lg, .bento-card-lg, .max-card-lg, .bau-card-lg, .tactile-card-lg, .neo-card-lg, .retro-card-lg, .brutal-card-lg, .cyber-card-lg, .y2k-card-lg, .rg-card-lg) {
137
+ min-block-size: var(--ly-card-size-lg);
138
+ }
139
+
140
+ :where(.saas-gallery, .bento-gallery, .max-gallery, .bau-gallery, .tactile-gallery, .neo-gallery, .retro-gallery, .brutal-gallery, .cyber-gallery, .y2k-gallery, .rg-gallery) {
141
+ display: grid;
142
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ly-gallery-min)), 1fr));
143
+ gap: var(--ly-grid-gap);
144
+ }
145
+
146
+ :where(.saas-gallery, .bento-gallery, .max-gallery, .bau-gallery, .tactile-gallery, .neo-gallery, .retro-gallery, .brutal-gallery, .cyber-gallery, .y2k-gallery, .rg-gallery) > * {
147
+ min-width: 0;
148
+ }
149
+
150
+ :where(.saas-carousel, .bento-carousel, .max-carousel, .bau-carousel, .tactile-carousel, .neo-carousel, .retro-carousel, .brutal-carousel, .cyber-carousel, .y2k-carousel, .rg-carousel) {
151
+ display: grid;
152
+ grid-auto-flow: column;
153
+ grid-auto-columns: minmax(min(100%, var(--ly-carousel-item-min)), var(--ly-carousel-item-max));
154
+ gap: var(--ly-grid-gap);
155
+ overflow-x: auto;
156
+ overscroll-behavior-inline: contain;
157
+ scroll-snap-type: x proximity;
158
+ }
159
+
160
+ :where(.saas-carousel, .bento-carousel, .max-carousel, .bau-carousel, .tactile-carousel, .neo-carousel, .retro-carousel, .brutal-carousel, .cyber-carousel, .y2k-carousel, .rg-carousel) > * {
161
+ min-width: 0;
162
+ scroll-snap-align: start;
163
+ }
164
+
165
+ @media (min-width: 48rem) {
166
+ :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) {
167
+ grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
168
+ }
169
+ }
55
170
  }
@@ -0,0 +1,30 @@
1
+ # Contributing
2
+
3
+ Contribution work should preserve the package boundary: `layout-style-css` owns structure, `ui-style-kit-css` owns visual styling.
4
+
5
+ ## Workflow
6
+
7
+ ```bash
8
+ npm install
9
+ npm run build
10
+ npm run lint
11
+ npm test
12
+ ```
13
+
14
+ Use `npm run release:verify` before release-facing changes are merged.
15
+
16
+ ## CSS Guidelines
17
+
18
+ - Keep source CSS in `styles/`.
19
+ - Regenerate dist files with `npm run build`.
20
+ - Prefix public layout classes with `ly-`.
21
+ - Prefer layout variables and recipes before introducing new public classes.
22
+ - Keep new grid tracks mobile-safe with `minmax(0, 1fr)` or guarded fixed floors.
23
+ - Do not add colors, shadows, borders, typography, focus styling, or native control styling.
24
+
25
+ ## Documentation Guidelines
26
+
27
+ Update README and wiki pages whenever a public export, selector, layout recipe, package file, release command, or deployment behavior changes.
28
+
29
+ Update `CHANGELOG.md` for every release-facing change.
30
+
@@ -0,0 +1,39 @@
1
+ # Demo And GitHub Pages
2
+
3
+ The demo lives at `demo/index.html` and is packaged with the library. GitHub Pages deployment uses a generated root artifact so Pages can serve `index.html` from the site root.
4
+
5
+ ## Local Demo
6
+
7
+ Run the demo through the test suite:
8
+
9
+ ```bash
10
+ npm test
11
+ ```
12
+
13
+ The Playwright smoke checks verify responsive behavior across mobile portrait, mobile landscape, tablet, and desktop conditions.
14
+
15
+ ## Pages Artifact
16
+
17
+ Build the artifact:
18
+
19
+ ```bash
20
+ npm run pages:build
21
+ ```
22
+
23
+ The artifact is written to `output/github-pages/` and contains:
24
+
25
+ - root `index.html`
26
+ - copied assets and metadata
27
+ - generated `dist/` CSS
28
+ - `.nojekyll`
29
+
30
+ ## Repository Settings
31
+
32
+ Before deployment, enable GitHub Pages in repository settings and select GitHub Actions as the source.
33
+
34
+ The workflow verifies the package, builds the Pages artifact, uploads it, and deploys from `main` or `workflow_dispatch`.
35
+
36
+ ## Mobile Header Contract
37
+
38
+ The demo header should remain compact on mobile. Controls are exposed through the drawer toggle rather than an always-expanded stack of full-width controls.
39
+
@@ -0,0 +1,68 @@
1
+ # Getting Started
2
+
3
+ Use `layout-style-css` when an application needs predictable page structure without duplicating a visual design system.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install layout-style-css ui-style-kit-css@2.0.1
9
+ ```
10
+
11
+ Optional Interactive Surface pairing:
12
+
13
+ ```bash
14
+ npm install interactive-surface-css@1.2.5
15
+ ```
16
+
17
+ ## First Import
18
+
19
+ Use the layout-only package entry when the app already imports UI styles:
20
+
21
+ ```js
22
+ import "ui-style-kit-css/dist/ui-style-kit.css";
23
+ import "layout-style-css";
24
+ ```
25
+
26
+ Use the aggregate import when the project wants UI Style Kit and all layouts from one package entry:
27
+
28
+ ```js
29
+ import "layout-style-css/all-with-ui-kit.css";
30
+ ```
31
+
32
+ ## First Shell
33
+
34
+ ```html
35
+ <body class="ly-root" data-ui="minimal-saas" data-layout="minimal-saas" data-theme="arctic-indigo" data-mode="light">
36
+ <div class="ly-app-shell">
37
+ <aside class="ly-app-sidebar ly-pad-6">Navigation</aside>
38
+ <header class="ly-app-header ly-pad-4">Toolbar</header>
39
+ <main class="ly-app-main">
40
+ <section class="ly-wrapper ly-wrapper--wide ly-section ly-stack">
41
+ <h1>Workspace</h1>
42
+ <div class="ly-card-grid">
43
+ <article class="ly-surface ly-card-md ly-pad-6">Metric</article>
44
+ <article class="ly-surface ly-card-md ly-pad-6">Metric</article>
45
+ <article class="ly-surface ly-card-md ly-pad-6">Metric</article>
46
+ </div>
47
+ </section>
48
+ </main>
49
+ </div>
50
+ </body>
51
+ ```
52
+
53
+ ## Switch Layout Personality
54
+
55
+ Layout styles are selected independently from UI styles:
56
+
57
+ ```js
58
+ const root = document.body;
59
+
60
+ root.dataset.ui = "cyberpunk";
61
+ root.dataset.layout = "synthwave";
62
+ root.setAttribute("layout-style", "synthwave");
63
+ root.dataset.theme = "cyber-lime";
64
+ root.dataset.mode = "dark";
65
+ ```
66
+
67
+ This lets a product test different spatial systems without rewriting the component paint layer.
68
+
@@ -0,0 +1,48 @@
1
+ # Layout Style CSS Wiki
2
+
3
+ Version 1.1.2 documents the professional library contract for `layout-style-css`: install paths, package exports, layout primitives, recipes, UI Style Kit compatibility, demo deployment, security, and release workflow.
4
+
5
+ ## Start Here
6
+
7
+ | Page | Purpose |
8
+ | --- | --- |
9
+ | [Getting Started](Getting-Started.md) | First install, first shell, and switching layout personalities. |
10
+ | [Installation And CDN](Installation-And-CDN.md) | npm, bundler, CDN, and export guidance. |
11
+ | [Layout Primitives](Layout-Primitives.md) | Core `ly-*` wrappers, grids, panes, frames, and utilities. |
12
+ | [Layout Recipes](Layout-Recipes.md) | Copyable patterns for common application surfaces. |
13
+ | [Layout Styles](Layout-Styles.md) | All layout personalities and when to use them. |
14
+ | [UI Style Kit Compatibility](UI-Style-Kit-Compatibility.md) | Prefix aliases and ownership boundaries. |
15
+ | [Demo And GitHub Pages](Demo-And-GitHub-Pages.md) | Demo QA and Pages deployment. |
16
+ | [Release And Publishing](Release-And-Publishing.md) | npm v1.1.2 verification and publish checklist. |
17
+ | [Security And Support](Security-And-Support.md) | Security model, supported versions, and reporting path. |
18
+ | [Contributing](Contributing.md) | Contribution workflow and review expectations. |
19
+
20
+ ## Library Positioning
21
+
22
+ `layout-style-css` is the spatial layer for front-end products. It owns wrappers, spacing, shells, grids, split views, panes, layout recipes, and switchable layout personalities. It does not own paint, typography, component borders, shadows, native controls, focus states, themes, or modes.
23
+
24
+ The recommended pairing is:
25
+
26
+ ```js
27
+ import "ui-style-kit-css/with-bridge.css";
28
+ import "layout-style-css/all.css";
29
+ ```
30
+
31
+ Use the three-library path only when a project also needs Interactive Surface behavior:
32
+
33
+ ```js
34
+ import "layout-style-css/all-with-ui-kit-and-interactive-surface.css";
35
+ ```
36
+
37
+ ## Wiki Source
38
+
39
+ This `docs/wiki` directory is the versioned source for the GitHub Wiki. Keeping it in the main repository makes docs reviewable with code changes and keeps npm package documentation aligned with the release.
40
+
41
+ When GitHub Wiki is enabled, mirror these files into the wiki repository:
42
+
43
+ ```bash
44
+ git clone https://github.com/Foscat/Layout-Style-CSS.wiki.git layout-style-css-wiki
45
+ ```
46
+
47
+ Copy the Markdown files from `docs/wiki/`, commit, and push from the wiki clone.
48
+
@@ -0,0 +1,58 @@
1
+ # Installation And CDN
2
+
3
+ This package ships authored source files, generated dist files, and importable entrypoints for bundlers and CDNs.
4
+
5
+ ## npm
6
+
7
+ ```bash
8
+ npm install layout-style-css ui-style-kit-css@2.0.1
9
+ ```
10
+
11
+ The default entry is the full flattened layout-only CSS:
12
+
13
+ ```js
14
+ import "layout-style-css";
15
+ ```
16
+
17
+ ## Entry Points
18
+
19
+ | Import | Purpose |
20
+ | --- | --- |
21
+ | `layout-style-css` | Full flattened layout-only CSS. |
22
+ | `layout-style-css/min.css` | Minified layout-only CSS. |
23
+ | `layout-style-css/base.css` | Base primitives only. |
24
+ | `layout-style-css/bridge.css` | UI Style Kit naming bridge only. |
25
+ | `layout-style-css/all.css` | Import-based bundle for all layout files. |
26
+ | `layout-style-css/all-with-ui-kit.css` | UI Style Kit plus Layout Style CSS. |
27
+ | `layout-style-css/all-with-ui-kit-and-interactive-surface.css` | UI Style Kit, Interactive Surface, and Layout Style CSS. |
28
+ | `layout-style-css/<layout>.css` | One layout style, such as `layout-style-css/synthwave.css`. |
29
+ | `layout-style-css/dist/*.css` | Direct generated dist files for advanced consumers. |
30
+
31
+ ## CDN
32
+
33
+ Layout-only:
34
+
35
+ ```html
36
+ <link rel="stylesheet" href="https://unpkg.com/layout-style-css@1/dist/layout-style-css.min.css">
37
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layout-style-css@1/dist/layout-style-css.min.css">
38
+ ```
39
+
40
+ Recommended UI Style Kit pairing:
41
+
42
+ ```html
43
+ <link rel="stylesheet" href="https://unpkg.com/ui-style-kit-css@2.0.1/dist/ui-style-kit.with-bridge.min.css">
44
+ <link rel="stylesheet" href="https://unpkg.com/layout-style-css@1/dist/layout-style-css.min.css">
45
+ ```
46
+
47
+ Three-library pairing:
48
+
49
+ ```html
50
+ <link rel="stylesheet" href="https://unpkg.com/ui-style-kit-css@2.0.1/dist/ui-style-kit.with-bridge.min.css">
51
+ <link rel="stylesheet" href="https://unpkg.com/layout-style-css@1/dist/layout-style-css.min.css">
52
+ <link rel="stylesheet" href="https://unpkg.com/interactive-surface-css@1.2.5/dist/interactive-surface.min.css">
53
+ ```
54
+
55
+ ## Package Ownership
56
+
57
+ `styles/` is source. `dist/` is generated by `npm run build`. Consumers should import package entrypoints or dist files, not source files inside `styles/`.
58
+
@@ -0,0 +1,57 @@
1
+ # Layout Primitives
2
+
3
+ Primitives are the stable `ly-*` classes that make the package useful without committing to one layout personality.
4
+
5
+ ## Root And Page
6
+
7
+ | Class | Purpose |
8
+ | --- | --- |
9
+ | `.ly-root` | Scope layout variables and box sizing. |
10
+ | `.ly-page` | Full-height page wrapper. |
11
+ | `.ly-header`, `.ly-footer`, `.ly-main` | Basic document regions. |
12
+
13
+ ## Wrappers
14
+
15
+ Use `.ly-wrapper` for new markup. `.ly-container` remains supported for compatibility.
16
+
17
+ | Class | Purpose |
18
+ | --- | --- |
19
+ | `.ly-wrapper` | Responsive centered content wrapper. |
20
+ | `.ly-wrapper--sm` | Small wrapper. |
21
+ | `.ly-wrapper--md` | Medium wrapper. |
22
+ | `.ly-wrapper--lg` | Large wrapper. |
23
+ | `.ly-wrapper--xl` | Extra-large wrapper. |
24
+ | `.ly-wrapper--wide` | Wide application wrapper. |
25
+ | `.ly-wrapper--fluid` | Full-width wrapper with responsive padding. |
26
+ | `.ly-wrapper--readable` | Readable content wrapper based on line length. |
27
+
28
+ ## Shells And Regions
29
+
30
+ | Class | Purpose |
31
+ | --- | --- |
32
+ | `.ly-app-shell` | Header, sidebar, and main application shell. |
33
+ | `.ly-app-header` | Header region inside the app shell. |
34
+ | `.ly-app-sidebar` | Sidebar region inside the app shell. |
35
+ | `.ly-app-main` | Main content region inside the app shell. |
36
+ | `.ly-sidebar-layout` | Local content plus secondary sidebar. |
37
+ | `.ly-split` | Two-part split layout. |
38
+ | `.ly-panes`, `.ly-panes--two`, `.ly-panes--three` | Adaptive pane layouts. |
39
+
40
+ ## Composition
41
+
42
+ | Class | Purpose |
43
+ | --- | --- |
44
+ | `.ly-section` | Vertical section spacing. |
45
+ | `.ly-stack` | Vertical rhythm. |
46
+ | `.ly-cluster` | Wrapping horizontal group. |
47
+ | `.ly-grid` | Grid foundation. |
48
+ | `.ly-grid--auto` | Responsive auto-fit grid. |
49
+ | `.ly-row`, `.ly-col` | Flex row and column utilities. |
50
+ | `.ly-surface` | Structural surface hook with no visual styling. |
51
+ | `.ly-frame` | Aspect-ratio media or content frame. |
52
+ | `.ly-scroll-area` | Bounded scroll area. |
53
+
54
+ ## Utility Rules
55
+
56
+ Utilities set layout variables, spacing, flow, visibility, overflow, or ratios. They must not introduce color, typography, borders, shadows, theme modes, or component paint.
57
+
@@ -0,0 +1,80 @@
1
+ # Layout Recipes
2
+
3
+ Recipes are stable combinations of primitives. They are intended to be copied into applications and paired with UI Style Kit component classes.
4
+
5
+ ## App Shell
6
+
7
+ ```html
8
+ <div class="ly-app-shell">
9
+ <aside class="ly-app-sidebar ly-pad-6">Navigation</aside>
10
+ <header class="ly-app-header ly-pad-4">Toolbar</header>
11
+ <main class="ly-app-main">
12
+ <section class="ly-wrapper ly-wrapper--wide ly-section">Workspace</section>
13
+ </main>
14
+ </div>
15
+ ```
16
+
17
+ ## Content Wrapper
18
+
19
+ ```html
20
+ <article class="ly-wrapper ly-wrapper--readable ly-section ly-stack">
21
+ <h1>Documentation</h1>
22
+ <p>Readable content stays centered and responsive.</p>
23
+ </article>
24
+ ```
25
+
26
+ ## Split Screen
27
+
28
+ ```html
29
+ <section class="ly-wrapper ly-wrapper--xl ly-section">
30
+ <div class="ly-split">
31
+ <div class="ly-stack">Primary content</div>
32
+ <aside class="ly-frame ly-surface ly-pad-6">Preview</aside>
33
+ </div>
34
+ </section>
35
+ ```
36
+
37
+ ## Button Group
38
+
39
+ ```html
40
+ <div class="ly-button-group">
41
+ <button class="saas-button">Save</button>
42
+ <button class="saas-button-secondary">Preview</button>
43
+ <button class="saas-button-secondary">Export</button>
44
+ </div>
45
+ ```
46
+
47
+ Button groups wrap without forcing every button to full parent width on mobile.
48
+
49
+ ## Card Grid And Card Size
50
+
51
+ ```html
52
+ <div class="ly-card-grid">
53
+ <article class="saas-card ly-card-sm">Compact</article>
54
+ <article class="saas-card ly-card-md">Standard</article>
55
+ <article class="saas-card ly-card-lg">Feature</article>
56
+ </div>
57
+ ```
58
+
59
+ ## Gallery
60
+
61
+ ```html
62
+ <div class="ly-gallery">
63
+ <figure class="ly-frame ly-frame-4x3">Image</figure>
64
+ <figure class="ly-frame ly-frame-4x3">Image</figure>
65
+ <figure class="ly-frame ly-frame-4x3">Image</figure>
66
+ </div>
67
+ ```
68
+
69
+ ## Carousel
70
+
71
+ ```html
72
+ <div class="ly-carousel">
73
+ <article class="ly-surface ly-card-md">Step one</article>
74
+ <article class="ly-surface ly-card-md">Step two</article>
75
+ <article class="ly-surface ly-card-md">Step three</article>
76
+ </div>
77
+ ```
78
+
79
+ The carousel recipe provides horizontal flow and scroll snapping without adding visual chrome.
80
+
@@ -0,0 +1,43 @@
1
+ # Layout Styles
2
+
3
+ Layout styles change spatial behavior without changing UI paint. Select them with `data-layout`, `layout-style`, `.ly-layout-*`, or `.ly-style-*`.
4
+
5
+ ## Available Styles
6
+
7
+ | Style | Best for |
8
+ | --- | --- |
9
+ | `minimal-saas` | Quiet SaaS dashboards, admin tools, and predictable workspaces. |
10
+ | `bento` | Modular dashboards with repeated card surfaces. |
11
+ | `maximalist` | Editorial pages and feature-heavy product screens. |
12
+ | `bauhaus` | Strict modular grids and structured presentation. |
13
+ | `tactile` | Instrument panels and control-heavy interfaces. |
14
+ | `neumorphism` | Centered island layouts and roomy product surfaces. |
15
+ | `retrofuturism` | Panoramic shells and wide staged views. |
16
+ | `brutalism` | Full-bleed slabs and abrupt sectional hierarchy. |
17
+ | `cyberpunk` | Dense command surfaces and narrow utility rails. |
18
+ | `y2k` | Centered hub shells with dock-like support regions. |
19
+ | `retro-glass` | Layered top-frame shells with floating utility rails. |
20
+ | `f-pattern` | Western reading paths with strong top and left scan zones. |
21
+ | `z-pattern` | Landing and promotional flows that move diagonally across the viewport. |
22
+ | `split-screen` | Two competing focal points with equal weight. |
23
+ | `mondrian` | Asymmetric rectangular block compositions. |
24
+ | `synthwave` | Cinematic preview flows and retro-futuristic stage layouts. |
25
+
26
+ ## Selector Contract
27
+
28
+ ```html
29
+ <body data-layout="synthwave" layout-style="synthwave" class="ly-root">
30
+ <main class="ly-layout-synthwave ly-style-synthwave">...</main>
31
+ </body>
32
+ ```
33
+
34
+ Most applications only need `data-layout`. The class and `layout-style` selectors are provided for integration flexibility.
35
+
36
+ ## Mixing UI And Layout
37
+
38
+ ```html
39
+ <body data-ui="cyberpunk" data-layout="synthwave" data-theme="cyber-lime" data-mode="dark">
40
+ ```
41
+
42
+ This is supported because layout styles do not target `data-ui`.
43
+