layout-style-css 1.1.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -44
- package/CONTRIBUTING.md +55 -50
- package/LICENSE +21 -21
- package/README.md +236 -636
- package/SECURITY.md +50 -45
- package/demo/assets/apple-touch-icon.svg +7 -7
- package/demo/assets/favicon.svg +7 -7
- package/demo/browserconfig.xml +9 -9
- package/demo/demo.css +523 -0
- package/demo/demo.js +605 -0
- package/demo/index.html +325 -976
- package/demo/robots.txt +4 -4
- package/demo/site.webmanifest +23 -23
- package/demo/sitemap.xml +9 -9
- package/dist/core.css +6 -0
- package/{styles/layout-ui-style-kit-bridge.css → dist/integrations/ui-style-kit.css} +175 -170
- package/dist/layout-style-css.css +1473 -1903
- package/dist/layout-style-css.min.css +1 -1
- package/dist/legacy.css +787 -0
- package/dist/personalities/bauhaus.css +46 -0
- package/dist/personalities/bento.css +43 -0
- package/dist/personalities/brutalism.css +36 -0
- package/dist/personalities/cyberpunk.css +36 -0
- package/dist/personalities/f-pattern.css +48 -0
- package/dist/personalities/maximalist.css +51 -0
- package/dist/personalities/minimal-saas.css +37 -0
- package/dist/personalities/mondrian.css +44 -0
- package/dist/personalities/neumorphism.css +46 -0
- package/dist/personalities/retro-glass.css +44 -0
- package/dist/personalities/retrofuturism.css +36 -0
- package/dist/personalities/split-screen.css +41 -0
- package/dist/personalities/synthwave.css +48 -0
- package/dist/personalities/tactile.css +39 -0
- package/dist/personalities/y2k.css +36 -0
- package/dist/personalities/z-pattern.css +49 -0
- package/dist/personalities.css +18 -0
- package/dist/primitives.css +219 -0
- package/dist/recipes.css +270 -0
- package/dist/utilities.css +162 -0
- package/dist/wrappers.css +174 -0
- package/docs/wiki/Contributing.md +36 -30
- package/docs/wiki/Demo-And-GitHub-Pages.md +53 -39
- package/docs/wiki/Getting-Started.md +51 -68
- package/docs/wiki/Home.md +33 -48
- package/docs/wiki/Installation-And-CDN.md +72 -58
- package/docs/wiki/Layout-Primitives.md +48 -57
- package/docs/wiki/Layout-Recipes.md +49 -80
- package/docs/wiki/Layout-Styles.md +33 -43
- package/docs/wiki/Migrating-To-2.0.md +186 -0
- package/docs/wiki/Release-And-Publishing.md +77 -69
- package/docs/wiki/Security-And-Support.md +36 -34
- package/docs/wiki/UI-Style-Kit-Compatibility.md +49 -54
- package/docs/wiki/_Sidebar.md +15 -14
- package/package.json +98 -107
- package/styles/core.css +6 -0
- package/{dist/layout-ui-style-kit-bridge.css → styles/integrations/ui-style-kit.css} +175 -170
- package/styles/legacy.css +173 -0
- package/styles/personalities/bauhaus.css +46 -0
- package/styles/personalities/bento.css +43 -0
- package/styles/personalities/brutalism.css +36 -0
- package/styles/personalities/cyberpunk.css +36 -0
- package/styles/personalities/f-pattern.css +48 -0
- package/styles/personalities/maximalist.css +51 -0
- package/styles/personalities/minimal-saas.css +37 -0
- package/styles/personalities/mondrian.css +44 -0
- package/styles/personalities/neumorphism.css +46 -0
- package/styles/personalities/retro-glass.css +44 -0
- package/styles/personalities/retrofuturism.css +36 -0
- package/styles/personalities/split-screen.css +41 -0
- package/styles/personalities/synthwave.css +48 -0
- package/styles/personalities/tactile.css +39 -0
- package/styles/personalities/y2k.css +36 -0
- package/styles/personalities/z-pattern.css +49 -0
- package/styles/personalities.css +18 -0
- package/styles/primitives.css +219 -0
- package/styles/recipes.css +270 -0
- package/styles/utilities.css +162 -0
- package/styles/wrappers.css +174 -0
- package/dist/layout-all-with-ui-kit-and-interactive-surface.css +0 -3
- package/dist/layout-all-with-ui-kit.css +0 -2
- package/dist/layout-all.css +0 -18
- package/dist/layout-base.css +0 -539
- package/dist/layout-style-bauhaus.css +0 -70
- package/dist/layout-style-bento.css +0 -76
- package/dist/layout-style-brutalism.css +0 -70
- package/dist/layout-style-cyberpunk.css +0 -70
- package/dist/layout-style-f-pattern.css +0 -76
- package/dist/layout-style-maximalist.css +0 -93
- package/dist/layout-style-minimal-saas.css +0 -67
- package/dist/layout-style-mondrian.css +0 -77
- package/dist/layout-style-neumorphism.css +0 -72
- package/dist/layout-style-retro-glass.css +0 -82
- package/dist/layout-style-retrofuturism.css +0 -71
- package/dist/layout-style-split-screen.css +0 -62
- package/dist/layout-style-synthwave.css +0 -88
- package/dist/layout-style-tactile.css +0 -70
- package/dist/layout-style-y2k.css +0 -72
- package/dist/layout-style-z-pattern.css +0 -76
- package/styles/layout-base.css +0 -539
- package/styles/layout-style-bauhaus.css +0 -70
- package/styles/layout-style-bento.css +0 -76
- package/styles/layout-style-brutalism.css +0 -70
- package/styles/layout-style-cyberpunk.css +0 -70
- package/styles/layout-style-f-pattern.css +0 -76
- package/styles/layout-style-maximalist.css +0 -93
- package/styles/layout-style-minimal-saas.css +0 -67
- package/styles/layout-style-mondrian.css +0 -77
- package/styles/layout-style-neumorphism.css +0 -72
- package/styles/layout-style-retro-glass.css +0 -82
- package/styles/layout-style-retrofuturism.css +0 -71
- package/styles/layout-style-split-screen.css +0 -62
- package/styles/layout-style-synthwave.css +0 -88
- package/styles/layout-style-tactile.css +0 -70
- package/styles/layout-style-y2k.css +0 -72
- package/styles/layout-style-z-pattern.css +0 -76
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
|
|
2
|
+
|
|
3
|
+
@layer ly.utilities {
|
|
4
|
+
.ly-cols-1 { --ly-grid-columns: 1; }
|
|
5
|
+
.ly-cols-2 { --ly-grid-columns: 2; }
|
|
6
|
+
.ly-cols-3 { --ly-grid-columns: 3; }
|
|
7
|
+
.ly-cols-4 { --ly-grid-columns: 4; }
|
|
8
|
+
.ly-cols-5 { --ly-grid-columns: 5; }
|
|
9
|
+
.ly-cols-6 { --ly-grid-columns: 6; }
|
|
10
|
+
.ly-cols-7 { --ly-grid-columns: 7; }
|
|
11
|
+
.ly-cols-8 { --ly-grid-columns: 8; }
|
|
12
|
+
.ly-cols-9 { --ly-grid-columns: 9; }
|
|
13
|
+
.ly-cols-10 { --ly-grid-columns: 10; }
|
|
14
|
+
.ly-cols-11 { --ly-grid-columns: 11; }
|
|
15
|
+
.ly-cols-12 { --ly-grid-columns: 12; }
|
|
16
|
+
.ly-cols-16 { --ly-grid-columns: 16; }
|
|
17
|
+
|
|
18
|
+
.ly-span-1 { grid-column: span 1; }
|
|
19
|
+
.ly-span-2 { grid-column: span 2; }
|
|
20
|
+
.ly-span-3 { grid-column: span 3; }
|
|
21
|
+
.ly-span-4 { grid-column: span 4; }
|
|
22
|
+
.ly-span-5 { grid-column: span 5; }
|
|
23
|
+
.ly-span-6 { grid-column: span 6; }
|
|
24
|
+
.ly-span-7 { grid-column: span 7; }
|
|
25
|
+
.ly-span-8 { grid-column: span 8; }
|
|
26
|
+
.ly-span-9 { grid-column: span 9; }
|
|
27
|
+
.ly-span-10 { grid-column: span 10; }
|
|
28
|
+
.ly-span-11 { grid-column: span 11; }
|
|
29
|
+
.ly-span-12 { grid-column: span 12; }
|
|
30
|
+
.ly-span-13 { grid-column: span 13; }
|
|
31
|
+
.ly-span-14 { grid-column: span 14; }
|
|
32
|
+
.ly-span-15 { grid-column: span 15; }
|
|
33
|
+
.ly-span-16 { grid-column: span 16; }
|
|
34
|
+
.ly-span-full { grid-column: 1 / -1; }
|
|
35
|
+
|
|
36
|
+
.ly-gap-0 { --ly-gap: var(--ly-space-0); --ly-grid-gap: var(--ly-space-0); --ly-stack-gap: var(--ly-space-0); --ly-cluster-gap: var(--ly-space-0); }
|
|
37
|
+
.ly-gap-1 { --ly-gap: var(--ly-space-1); --ly-grid-gap: var(--ly-space-1); --ly-stack-gap: var(--ly-space-1); --ly-cluster-gap: var(--ly-space-1); }
|
|
38
|
+
.ly-gap-2 { --ly-gap: var(--ly-space-2); --ly-grid-gap: var(--ly-space-2); --ly-stack-gap: var(--ly-space-2); --ly-cluster-gap: var(--ly-space-2); }
|
|
39
|
+
.ly-gap-3 { --ly-gap: var(--ly-space-3); --ly-grid-gap: var(--ly-space-3); --ly-stack-gap: var(--ly-space-3); --ly-cluster-gap: var(--ly-space-3); }
|
|
40
|
+
.ly-gap-4 { --ly-gap: var(--ly-space-4); --ly-grid-gap: var(--ly-space-4); --ly-stack-gap: var(--ly-space-4); --ly-cluster-gap: var(--ly-space-4); }
|
|
41
|
+
.ly-gap-5 { --ly-gap: var(--ly-space-5); --ly-grid-gap: var(--ly-space-5); --ly-stack-gap: var(--ly-space-5); --ly-cluster-gap: var(--ly-space-5); }
|
|
42
|
+
.ly-gap-6 { --ly-gap: var(--ly-space-6); --ly-grid-gap: var(--ly-space-6); --ly-stack-gap: var(--ly-space-6); --ly-cluster-gap: var(--ly-space-6); }
|
|
43
|
+
.ly-gap-7 { --ly-gap: var(--ly-space-7); --ly-grid-gap: var(--ly-space-7); --ly-stack-gap: var(--ly-space-7); --ly-cluster-gap: var(--ly-space-7); }
|
|
44
|
+
.ly-gap-8 { --ly-gap: var(--ly-space-8); --ly-grid-gap: var(--ly-space-8); --ly-stack-gap: var(--ly-space-8); --ly-cluster-gap: var(--ly-space-8); }
|
|
45
|
+
.ly-gap-9 { --ly-gap: var(--ly-space-9); --ly-grid-gap: var(--ly-space-9); --ly-stack-gap: var(--ly-space-9); --ly-cluster-gap: var(--ly-space-9); }
|
|
46
|
+
|
|
47
|
+
.ly-pad-0 { padding: var(--ly-space-0); }
|
|
48
|
+
.ly-pad-1 { padding: var(--ly-space-1); }
|
|
49
|
+
.ly-pad-2 { padding: var(--ly-space-2); }
|
|
50
|
+
.ly-pad-3 { padding: var(--ly-space-3); }
|
|
51
|
+
.ly-pad-4 { padding: var(--ly-space-4); }
|
|
52
|
+
.ly-pad-5 { padding: var(--ly-space-5); }
|
|
53
|
+
.ly-pad-6 { padding: var(--ly-space-6); }
|
|
54
|
+
.ly-pad-7 { padding: var(--ly-space-7); }
|
|
55
|
+
.ly-pad-8 { padding: var(--ly-space-8); }
|
|
56
|
+
.ly-pad-9 { padding: var(--ly-space-9); }
|
|
57
|
+
|
|
58
|
+
.ly-px-4 { padding-inline: var(--ly-space-4); }
|
|
59
|
+
.ly-px-6 { padding-inline: var(--ly-space-6); }
|
|
60
|
+
.ly-px-8 { padding-inline: var(--ly-space-8); }
|
|
61
|
+
.ly-py-4 { padding-block: var(--ly-space-4); }
|
|
62
|
+
.ly-py-6 { padding-block: var(--ly-space-6); }
|
|
63
|
+
.ly-py-8 { padding-block: var(--ly-space-8); }
|
|
64
|
+
|
|
65
|
+
.ly-mx-auto { margin-inline: auto; }
|
|
66
|
+
.ly-w-full { inline-size: 100%; }
|
|
67
|
+
.ly-h-full { block-size: 100%; }
|
|
68
|
+
.ly-min-h-screen { min-block-size: 100svh; }
|
|
69
|
+
.ly-bleed { inline-size: 100vw; margin-inline: calc(50% - 50vw); }
|
|
70
|
+
.ly-overflow-auto { overflow: auto; }
|
|
71
|
+
.ly-overflow-hidden { overflow: hidden; }
|
|
72
|
+
|
|
73
|
+
.ly-items-start { align-items: flex-start; }
|
|
74
|
+
.ly-items-center { align-items: center; }
|
|
75
|
+
.ly-items-end { align-items: flex-end; }
|
|
76
|
+
.ly-items-stretch { align-items: stretch; }
|
|
77
|
+
.ly-justify-start { justify-content: flex-start; }
|
|
78
|
+
.ly-justify-center { justify-content: center; }
|
|
79
|
+
.ly-justify-end { justify-content: flex-end; }
|
|
80
|
+
.ly-justify-between { justify-content: space-between; }
|
|
81
|
+
|
|
82
|
+
.ly-frame-1x1 { --ly-frame-ratio: 1 / 1; }
|
|
83
|
+
.ly-frame-2x1 { --ly-frame-ratio: 2 / 1; }
|
|
84
|
+
.ly-frame-3x2 { --ly-frame-ratio: 3 / 2; }
|
|
85
|
+
.ly-frame-4x3 { --ly-frame-ratio: 4 / 3; }
|
|
86
|
+
.ly-frame-16x9 { --ly-frame-ratio: 16 / 9; }
|
|
87
|
+
.ly-frame-21x9 { --ly-frame-ratio: 21 / 9; }
|
|
88
|
+
|
|
89
|
+
.ly-hidden { display: none !important; }
|
|
90
|
+
|
|
91
|
+
.ly-show-md-up,
|
|
92
|
+
.ly-show-lg-up {
|
|
93
|
+
display: none !important;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.ly-visually-hidden {
|
|
97
|
+
position: absolute !important;
|
|
98
|
+
inline-size: 1px !important;
|
|
99
|
+
block-size: 1px !important;
|
|
100
|
+
padding: 0 !important;
|
|
101
|
+
margin: -1px !important;
|
|
102
|
+
overflow: hidden !important;
|
|
103
|
+
clip: rect(0, 0, 0, 0) !important;
|
|
104
|
+
clip-path: inset(50%) !important;
|
|
105
|
+
white-space: nowrap !important;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Explicit escape hatches require consumers to verify focus and reading order. */
|
|
109
|
+
.ly-order-first { order: -1; }
|
|
110
|
+
.ly-order-normal { order: 0; }
|
|
111
|
+
.ly-order-last { order: 999; }
|
|
112
|
+
.ly-order-1 { order: 1; }
|
|
113
|
+
.ly-order-2 { order: 2; }
|
|
114
|
+
.ly-order-3 { order: 3; }
|
|
115
|
+
.ly-order-4 { order: 4; }
|
|
116
|
+
.ly-order-5 { order: 5; }
|
|
117
|
+
.ly-order-6 { order: 6; }
|
|
118
|
+
|
|
119
|
+
@container (min-width: 48rem) {
|
|
120
|
+
.ly-md-cols-1 { --ly-grid-columns: 1; }
|
|
121
|
+
.ly-md-cols-2 { --ly-grid-columns: 2; }
|
|
122
|
+
.ly-md-cols-3 { --ly-grid-columns: 3; }
|
|
123
|
+
.ly-md-cols-4 { --ly-grid-columns: 4; }
|
|
124
|
+
.ly-md-cols-6 { --ly-grid-columns: 6; }
|
|
125
|
+
.ly-md-cols-8 { --ly-grid-columns: 8; }
|
|
126
|
+
.ly-md-cols-12 { --ly-grid-columns: 12; }
|
|
127
|
+
.ly-md-cols-16 { --ly-grid-columns: 16; }
|
|
128
|
+
.ly-show-md-up { display: revert !important; }
|
|
129
|
+
|
|
130
|
+
.ly-md-order-first { order: -1; }
|
|
131
|
+
.ly-md-order-normal { order: 0; }
|
|
132
|
+
.ly-md-order-last { order: 999; }
|
|
133
|
+
.ly-md-order-1 { order: 1; }
|
|
134
|
+
.ly-md-order-2 { order: 2; }
|
|
135
|
+
.ly-md-order-3 { order: 3; }
|
|
136
|
+
.ly-md-order-4 { order: 4; }
|
|
137
|
+
.ly-md-order-5 { order: 5; }
|
|
138
|
+
.ly-md-order-6 { order: 6; }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@container (min-width: 64rem) {
|
|
142
|
+
.ly-lg-cols-1 { --ly-grid-columns: 1; }
|
|
143
|
+
.ly-lg-cols-2 { --ly-grid-columns: 2; }
|
|
144
|
+
.ly-lg-cols-3 { --ly-grid-columns: 3; }
|
|
145
|
+
.ly-lg-cols-4 { --ly-grid-columns: 4; }
|
|
146
|
+
.ly-lg-cols-6 { --ly-grid-columns: 6; }
|
|
147
|
+
.ly-lg-cols-8 { --ly-grid-columns: 8; }
|
|
148
|
+
.ly-lg-cols-12 { --ly-grid-columns: 12; }
|
|
149
|
+
.ly-lg-cols-16 { --ly-grid-columns: 16; }
|
|
150
|
+
.ly-show-lg-up { display: revert !important; }
|
|
151
|
+
|
|
152
|
+
.ly-lg-order-first { order: -1; }
|
|
153
|
+
.ly-lg-order-normal { order: 0; }
|
|
154
|
+
.ly-lg-order-last { order: 999; }
|
|
155
|
+
.ly-lg-order-1 { order: 1; }
|
|
156
|
+
.ly-lg-order-2 { order: 2; }
|
|
157
|
+
.ly-lg-order-3 { order: 3; }
|
|
158
|
+
.ly-lg-order-4 { order: 4; }
|
|
159
|
+
.ly-lg-order-5 { order: 5; }
|
|
160
|
+
.ly-lg-order-6 { order: 6; }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
@layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
Shared structural tokens and wrapper geometry. Theme, type, borders, shadows,
|
|
5
|
+
and interactive states remain outside Layout Style's ownership boundary.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
@layer ly.tokens {
|
|
9
|
+
:where(.ly-root) {
|
|
10
|
+
--ly-space-0: 0;
|
|
11
|
+
--ly-space-1: 0.25rem;
|
|
12
|
+
--ly-space-2: 0.5rem;
|
|
13
|
+
--ly-space-3: 0.75rem;
|
|
14
|
+
--ly-space-4: 1rem;
|
|
15
|
+
--ly-space-5: 1.5rem;
|
|
16
|
+
--ly-space-6: 2rem;
|
|
17
|
+
--ly-space-7: 3rem;
|
|
18
|
+
--ly-space-8: 4rem;
|
|
19
|
+
--ly-space-9: 6rem;
|
|
20
|
+
|
|
21
|
+
--ly-wrapper-compact: 40rem;
|
|
22
|
+
--ly-wrapper-prose: 68ch;
|
|
23
|
+
--ly-wrapper-content: 72rem;
|
|
24
|
+
--ly-wrapper-wide: 112rem;
|
|
25
|
+
--ly-wrapper-max: var(--ly-wrapper-content);
|
|
26
|
+
--ly-page-padding-inline: clamp(1rem, 4vw, 3rem);
|
|
27
|
+
--ly-safe-area-inline: max(
|
|
28
|
+
env(safe-area-inset-left, 0px),
|
|
29
|
+
env(safe-area-inset-right, 0px)
|
|
30
|
+
);
|
|
31
|
+
--ly-wrapper-gutter: max(var(--ly-page-padding-inline), var(--ly-safe-area-inline));
|
|
32
|
+
|
|
33
|
+
--ly-section-padding-block: clamp(3rem, 7vw, 6rem);
|
|
34
|
+
--ly-gap: var(--ly-space-5);
|
|
35
|
+
--ly-grid-gap: var(--ly-gap);
|
|
36
|
+
--ly-stack-gap: var(--ly-space-4);
|
|
37
|
+
--ly-cluster-gap: var(--ly-space-3);
|
|
38
|
+
--ly-cover-min: 100svh;
|
|
39
|
+
--ly-switcher-threshold: 42rem;
|
|
40
|
+
--ly-sidebar-size: 18rem;
|
|
41
|
+
--ly-sidebar-content-min: 50%;
|
|
42
|
+
--ly-grid-columns: 12;
|
|
43
|
+
--ly-grid-min: 16rem;
|
|
44
|
+
--ly-pane-size: 22rem;
|
|
45
|
+
--ly-media-size: 14rem;
|
|
46
|
+
--ly-reel-item-min: 16rem;
|
|
47
|
+
--ly-reel-item-max: 28rem;
|
|
48
|
+
--ly-scroll-max: 70svh;
|
|
49
|
+
--ly-frame-ratio: 16 / 9;
|
|
50
|
+
|
|
51
|
+
--ly-recipe-rail: 18rem;
|
|
52
|
+
--ly-recipe-aside: 22rem;
|
|
53
|
+
--ly-card-grid-min: 16rem;
|
|
54
|
+
--ly-gallery-min: 12rem;
|
|
55
|
+
--ly-card-size-sm: 10rem;
|
|
56
|
+
--ly-card-size-md: 14rem;
|
|
57
|
+
--ly-card-size-lg: 18rem;
|
|
58
|
+
--ly-header-height: 4.5rem;
|
|
59
|
+
--ly-z-header: 20;
|
|
60
|
+
|
|
61
|
+
/* V1 token aliases remain available so legacy selectors can preserve sizing. */
|
|
62
|
+
--ly-container-sm: var(--ly-wrapper-compact);
|
|
63
|
+
--ly-container-md: 56rem;
|
|
64
|
+
--ly-container-lg: var(--ly-wrapper-content);
|
|
65
|
+
--ly-container-xl: 88rem;
|
|
66
|
+
--ly-container-wide: var(--ly-wrapper-wide);
|
|
67
|
+
--ly-container-max: var(--ly-container-lg);
|
|
68
|
+
--ly-content-readable: var(--ly-wrapper-prose);
|
|
69
|
+
--ly-carousel-item-min: var(--ly-reel-item-min);
|
|
70
|
+
--ly-carousel-item-max: var(--ly-reel-item-max);
|
|
71
|
+
--ly-sidebar-min: 14rem;
|
|
72
|
+
--ly-sidebar-width: var(--ly-recipe-rail);
|
|
73
|
+
--ly-sidebar-max: var(--ly-recipe-aside);
|
|
74
|
+
--ly-pane-fixed: var(--ly-pane-size);
|
|
75
|
+
--ly-z-sidebar: 10;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@layer ly.reset {
|
|
80
|
+
:where(.ly-root),
|
|
81
|
+
:where(.ly-root *) {
|
|
82
|
+
box-sizing: border-box;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
:where(.ly-root) {
|
|
86
|
+
min-inline-size: 0;
|
|
87
|
+
margin: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:where(.ly-root img),
|
|
91
|
+
:where(.ly-root svg),
|
|
92
|
+
:where(.ly-root video),
|
|
93
|
+
:where(.ly-root canvas) {
|
|
94
|
+
max-inline-size: 100%;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@layer ly.wrappers {
|
|
99
|
+
.ly-wrapper {
|
|
100
|
+
/* Personalities provide only the plain-wrapper default; explicit variants stay authoritative. */
|
|
101
|
+
--ly-wrapper-max: var(--ly-personality-wrapper-max, var(--ly-wrapper-content));
|
|
102
|
+
|
|
103
|
+
/* Symmetric safe-area compensation keeps logical gutters stable in either direction. */
|
|
104
|
+
container-name: ly-wrapper;
|
|
105
|
+
container-type: inline-size;
|
|
106
|
+
inline-size: min(100%, calc(var(--ly-wrapper-max) + (var(--ly-wrapper-gutter) * 2)));
|
|
107
|
+
margin-inline: auto;
|
|
108
|
+
padding-inline: var(--ly-wrapper-gutter);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.ly-wrapper--compact {
|
|
112
|
+
--ly-wrapper-max: 40rem;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.ly-wrapper--prose {
|
|
116
|
+
--ly-wrapper-max: 68ch;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.ly-wrapper--content {
|
|
120
|
+
--ly-wrapper-max: 72rem;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.ly-wrapper--wide {
|
|
124
|
+
--ly-wrapper-max: 112rem;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.ly-wrapper--full {
|
|
128
|
+
--ly-wrapper-max: 100%;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.ly-wrapper--breakout {
|
|
132
|
+
--ly-breakout-content-size: min(
|
|
133
|
+
var(--ly-wrapper-content),
|
|
134
|
+
calc(100% - (var(--ly-wrapper-gutter) * 2))
|
|
135
|
+
);
|
|
136
|
+
--ly-breakout-feature-size: min(
|
|
137
|
+
var(--ly-wrapper-wide),
|
|
138
|
+
calc(100% - (var(--ly-wrapper-gutter) * 2))
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
display: grid;
|
|
142
|
+
grid-template-columns:
|
|
143
|
+
[full-start] minmax(min(100%, var(--ly-wrapper-gutter)), 1fr)
|
|
144
|
+
[feature-start] minmax(
|
|
145
|
+
0,
|
|
146
|
+
calc((var(--ly-breakout-feature-size) - var(--ly-breakout-content-size)) / 2)
|
|
147
|
+
)
|
|
148
|
+
[content-start] minmax(0, var(--ly-breakout-content-size)) [content-end]
|
|
149
|
+
minmax(
|
|
150
|
+
0,
|
|
151
|
+
calc((var(--ly-breakout-feature-size) - var(--ly-breakout-content-size)) / 2)
|
|
152
|
+
)
|
|
153
|
+
[feature-end] minmax(min(100%, var(--ly-wrapper-gutter)), 1fr) [full-end];
|
|
154
|
+
inline-size: 100%;
|
|
155
|
+
padding-inline: 0;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.ly-wrapper--breakout > * {
|
|
159
|
+
grid-column: content;
|
|
160
|
+
min-inline-size: 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.ly-wrapper--breakout > :where(.ly-lane--content, [data-ly-lane="content"]) {
|
|
164
|
+
grid-column: content;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.ly-wrapper--breakout > :where(.ly-lane--feature, [data-ly-lane="feature"]) {
|
|
168
|
+
grid-column: feature;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.ly-wrapper--breakout > :where(.ly-lane--full, [data-ly-lane="full"]) {
|
|
172
|
+
grid-column: full;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -1,30 +1,36 @@
|
|
|
1
|
-
# Contributing
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Workflow
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm
|
|
9
|
-
npm run build
|
|
10
|
-
npm run lint
|
|
11
|
-
npm
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Contributions must preserve the package boundary: Layout Style owns structure, UI Style Kit owns visual paint, and Interactive Surface owns interaction states.
|
|
4
|
+
|
|
5
|
+
## Workflow
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm ci
|
|
9
|
+
npm run build
|
|
10
|
+
npm run lint
|
|
11
|
+
npm run check:demo-js
|
|
12
|
+
npm test
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Use `npm run test:demo:all` for rendered layout changes and `npm run release:verify` before release-facing work is merged.
|
|
16
|
+
|
|
17
|
+
## Source And Generated Files
|
|
18
|
+
|
|
19
|
+
- Edit authored modules in `styles/`.
|
|
20
|
+
- Regenerate `dist/` with `npm run build`.
|
|
21
|
+
- Keep the shared cascade-layer prelude in every public entry.
|
|
22
|
+
- Never hand-edit generated CSS or Pages output.
|
|
23
|
+
- Use professional comments for containment, accessibility, cascade, or build-safety decisions.
|
|
24
|
+
|
|
25
|
+
## Layout Rules
|
|
26
|
+
|
|
27
|
+
- Prefix public classes with `ly-`.
|
|
28
|
+
- Keep the mobile DOM, reading, and focus order authoritative.
|
|
29
|
+
- Use named areas in built-in recipes; never use `order` there.
|
|
30
|
+
- Test nested containers below and above `48rem` and `64rem`.
|
|
31
|
+
- Use `minmax(0, 1fr)` or guarded floors for tracks that receive application content.
|
|
32
|
+
- Do not add colors, typography, borders, shadows, component paint, focus styles, or native control styles.
|
|
33
|
+
|
|
34
|
+
## Documentation
|
|
35
|
+
|
|
36
|
+
Update README, migration guide, wiki, changelog, demo metadata, and contract tests whenever an export, selector, recipe, compatibility rule, browser baseline, or release command changes.
|
|
@@ -1,39 +1,53 @@
|
|
|
1
|
-
# Demo And GitHub Pages
|
|
2
|
-
|
|
3
|
-
The
|
|
4
|
-
|
|
5
|
-
## Local
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm test
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
# Demo And GitHub Pages
|
|
2
|
+
|
|
3
|
+
The interactive layout lab lives in `demo/index.html`, `demo/demo.css`, and `demo/demo.js`. GitHub Pages serves a generated artifact from `output/github-pages/`.
|
|
4
|
+
|
|
5
|
+
## Local Gates
|
|
6
|
+
|
|
7
|
+
The quick gate uses Chromium and a representative rendered matrix:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run test:demo:quick
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Run one complete engine matrix:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run test:demo:chromium
|
|
17
|
+
npm run test:demo:firefox
|
|
18
|
+
npm run test:demo:webkit
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Run all supported engines:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm run test:demo:all
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The full matrix exercises current evergreen Chromium, Firefox, and WebKit at 375px, 768px, 1280px, and 1440px, plus nested containers around the `48rem` and `64rem` core thresholds and the personality-specific signatures.
|
|
28
|
+
|
|
29
|
+
## Rendered Contracts
|
|
30
|
+
|
|
31
|
+
The smoke suite verifies:
|
|
32
|
+
|
|
33
|
+
- all wrappers, recipes, and personalities
|
|
34
|
+
- stable DOM and keyboard focus order
|
|
35
|
+
- named-area transitions at both container thresholds
|
|
36
|
+
- no meaningful horizontal overflow
|
|
37
|
+
- bounded scrolling
|
|
38
|
+
- accessible mobile controls
|
|
39
|
+
- layout-only, Layout plus UI, and all-three ecosystem modes
|
|
40
|
+
- pinned `ui-style-kit-css@2.1.0` visual, token bridge, and manifest behavior plus released `interactive-surface-css@1.5.0`
|
|
41
|
+
|
|
42
|
+
The demo query parser uses explicit allowlists and writes generated imports and markup with `textContent`.
|
|
43
|
+
|
|
44
|
+
## Pages Artifact
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm run pages:build
|
|
48
|
+
node test/pages-artifact.test.mjs
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The generated root contains the demo, metadata assets, `.nojekyll`, and `dist/`. The build rewrites only known parent-relative Layout Style paths, preserving external companion URLs and canonical metadata.
|
|
52
|
+
|
|
53
|
+
The Pages workflow installs Chromium, runs the quick package gate, builds and tests the artifact, then uploads it. Repository Pages must be enabled with GitHub Actions as the source before deployment.
|
|
@@ -1,68 +1,51 @@
|
|
|
1
|
-
# Getting Started
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
Layout Style CSS 2.0 provides structural layout without prescribing theme or component paint.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Node.js 20 or newer is required for development scripts.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install layout-style-css@2.1.0
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Import
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
import "layout-style-css";
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The package is dependency-free. Optional UI and interaction layers are installed and imported explicitly; see [Installation And CDN](Installation-And-CDN.md).
|
|
20
|
+
|
|
21
|
+
## First Recipe
|
|
22
|
+
|
|
23
|
+
Place the recipe inside a `.ly-wrapper`. The wrapper supplies inline-size containment, fluid logical gutters, and safe-area compensation.
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<body class="ly-root" data-ly-layout="minimal-saas">
|
|
27
|
+
<div class="ly-wrapper ly-wrapper--wide">
|
|
28
|
+
<section class="ly-dashboard" data-ly-recipe="dashboard">
|
|
29
|
+
<header data-ly-area="header">Dashboard</header>
|
|
30
|
+
<nav data-ly-area="nav" aria-label="Dashboard">Navigation</nav>
|
|
31
|
+
<main data-ly-area="main">Workspace</main>
|
|
32
|
+
<aside data-ly-area="aside">Details</aside>
|
|
33
|
+
<footer data-ly-area="footer">Status</footer>
|
|
34
|
+
</section>
|
|
35
|
+
</div>
|
|
36
|
+
</body>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The single-column DOM order is authoritative for mobile reading and keyboard focus. Core named grid areas rearrange at `48rem` and `64rem` container widths without changing source order; a selected personality may apply its own personality-specific enhancement threshold.
|
|
40
|
+
|
|
41
|
+
## Switch Personality
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
document.querySelector(".ly-root").dataset.lyLayout = "synthwave";
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`data-ly-layout` accepts one of the sixteen values listed in [Layout Styles](Layout-Styles.md). UI attributes such as `data-ui`, `data-theme`, and `data-mode` remain independent.
|
|
48
|
+
|
|
49
|
+
## Migrate Existing Markup
|
|
50
|
+
|
|
51
|
+
Do not copy v1 root hooks or size-based wrappers into new code. Follow [Migrating To 2.0](Migrating-To-2.0.md), or use `layout-style-css/legacy.css` temporarily while converting an application.
|