layout-style-css 1.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +33 -8
  2. package/CONTRIBUTING.md +12 -7
  3. package/README.md +231 -636
  4. package/SECURITY.md +11 -6
  5. package/demo/demo.css +523 -0
  6. package/demo/demo.js +520 -0
  7. package/demo/index.html +323 -976
  8. package/demo/site.webmanifest +1 -1
  9. package/demo/sitemap.xml +1 -1
  10. package/dist/core.css +6 -0
  11. package/dist/{layout-ui-style-kit-bridge.css → integrations/ui-style-kit.css} +13 -8
  12. package/dist/layout-style-css.css +1473 -1903
  13. package/dist/layout-style-css.min.css +1 -1
  14. package/dist/legacy.css +787 -0
  15. package/dist/personalities/bauhaus.css +46 -0
  16. package/dist/personalities/bento.css +43 -0
  17. package/dist/personalities/brutalism.css +36 -0
  18. package/dist/personalities/cyberpunk.css +36 -0
  19. package/dist/personalities/f-pattern.css +48 -0
  20. package/dist/personalities/maximalist.css +51 -0
  21. package/dist/personalities/minimal-saas.css +37 -0
  22. package/dist/personalities/mondrian.css +44 -0
  23. package/dist/personalities/neumorphism.css +46 -0
  24. package/dist/personalities/retro-glass.css +44 -0
  25. package/dist/personalities/retrofuturism.css +36 -0
  26. package/dist/personalities/split-screen.css +41 -0
  27. package/dist/personalities/synthwave.css +48 -0
  28. package/dist/personalities/tactile.css +39 -0
  29. package/dist/personalities/y2k.css +36 -0
  30. package/dist/personalities/z-pattern.css +49 -0
  31. package/dist/personalities.css +18 -0
  32. package/dist/primitives.css +219 -0
  33. package/dist/recipes.css +270 -0
  34. package/dist/utilities.css +162 -0
  35. package/dist/wrappers.css +174 -0
  36. package/docs/wiki/Contributing.md +36 -30
  37. package/docs/wiki/Demo-And-GitHub-Pages.md +53 -39
  38. package/docs/wiki/Getting-Started.md +51 -68
  39. package/docs/wiki/Home.md +33 -48
  40. package/docs/wiki/Installation-And-CDN.md +73 -58
  41. package/docs/wiki/Layout-Primitives.md +48 -57
  42. package/docs/wiki/Layout-Recipes.md +49 -80
  43. package/docs/wiki/Layout-Styles.md +33 -43
  44. package/docs/wiki/Migrating-To-2.0.md +186 -0
  45. package/docs/wiki/Release-And-Publishing.md +75 -69
  46. package/docs/wiki/Security-And-Support.md +36 -34
  47. package/docs/wiki/UI-Style-Kit-Compatibility.md +50 -54
  48. package/docs/wiki/_Sidebar.md +15 -14
  49. package/package.json +36 -45
  50. package/styles/core.css +6 -0
  51. package/styles/{layout-ui-style-kit-bridge.css → integrations/ui-style-kit.css} +13 -8
  52. package/styles/legacy.css +173 -0
  53. package/styles/personalities/bauhaus.css +46 -0
  54. package/styles/personalities/bento.css +43 -0
  55. package/styles/personalities/brutalism.css +36 -0
  56. package/styles/personalities/cyberpunk.css +36 -0
  57. package/styles/personalities/f-pattern.css +48 -0
  58. package/styles/personalities/maximalist.css +51 -0
  59. package/styles/personalities/minimal-saas.css +37 -0
  60. package/styles/personalities/mondrian.css +44 -0
  61. package/styles/personalities/neumorphism.css +46 -0
  62. package/styles/personalities/retro-glass.css +44 -0
  63. package/styles/personalities/retrofuturism.css +36 -0
  64. package/styles/personalities/split-screen.css +41 -0
  65. package/styles/personalities/synthwave.css +48 -0
  66. package/styles/personalities/tactile.css +39 -0
  67. package/styles/personalities/y2k.css +36 -0
  68. package/styles/personalities/z-pattern.css +49 -0
  69. package/styles/personalities.css +18 -0
  70. package/styles/primitives.css +219 -0
  71. package/styles/recipes.css +270 -0
  72. package/styles/utilities.css +162 -0
  73. package/styles/wrappers.css +174 -0
  74. package/dist/layout-all-with-ui-kit-and-interactive-surface.css +0 -3
  75. package/dist/layout-all-with-ui-kit.css +0 -2
  76. package/dist/layout-all.css +0 -18
  77. package/dist/layout-base.css +0 -539
  78. package/dist/layout-style-bauhaus.css +0 -70
  79. package/dist/layout-style-bento.css +0 -76
  80. package/dist/layout-style-brutalism.css +0 -70
  81. package/dist/layout-style-cyberpunk.css +0 -70
  82. package/dist/layout-style-f-pattern.css +0 -76
  83. package/dist/layout-style-maximalist.css +0 -93
  84. package/dist/layout-style-minimal-saas.css +0 -67
  85. package/dist/layout-style-mondrian.css +0 -77
  86. package/dist/layout-style-neumorphism.css +0 -72
  87. package/dist/layout-style-retro-glass.css +0 -82
  88. package/dist/layout-style-retrofuturism.css +0 -71
  89. package/dist/layout-style-split-screen.css +0 -62
  90. package/dist/layout-style-synthwave.css +0 -88
  91. package/dist/layout-style-tactile.css +0 -70
  92. package/dist/layout-style-y2k.css +0 -72
  93. package/dist/layout-style-z-pattern.css +0 -76
  94. package/styles/layout-base.css +0 -539
  95. package/styles/layout-style-bauhaus.css +0 -70
  96. package/styles/layout-style-bento.css +0 -76
  97. package/styles/layout-style-brutalism.css +0 -70
  98. package/styles/layout-style-cyberpunk.css +0 -70
  99. package/styles/layout-style-f-pattern.css +0 -76
  100. package/styles/layout-style-maximalist.css +0 -93
  101. package/styles/layout-style-minimal-saas.css +0 -67
  102. package/styles/layout-style-mondrian.css +0 -77
  103. package/styles/layout-style-neumorphism.css +0 -72
  104. package/styles/layout-style-retro-glass.css +0 -82
  105. package/styles/layout-style-retrofuturism.css +0 -71
  106. package/styles/layout-style-split-screen.css +0 -62
  107. package/styles/layout-style-synthwave.css +0 -88
  108. package/styles/layout-style-tactile.css +0 -70
  109. package/styles/layout-style-y2k.css +0 -72
  110. 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
- 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
-
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 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
-
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.0.1` and `interactive-surface-css@1.4.0` fixture behavior
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
- 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
-
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.0.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.