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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "layout-style-css",
3
- "version": "1.1.2",
4
- "description": "Shell-first CSS layout primitives that complement ui-style-kit-css@2.0.1.",
3
+ "version": "2.0.0",
4
+ "description": "Dependency-free structural CSS for responsive wrappers, composition primitives, recipes, utilities, and layout personalities.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/Foscat/layout-style-css#readme",
@@ -12,6 +12,9 @@
12
12
  "bugs": {
13
13
  "url": "https://github.com/Foscat/layout-style-css/issues"
14
14
  },
15
+ "engines": {
16
+ "node": ">=20"
17
+ },
15
18
  "keywords": [
16
19
  "css",
17
20
  "layout",
@@ -27,30 +30,31 @@
27
30
  "scripts": {
28
31
  "build": "node scripts/build.mjs",
29
32
  "pages:build": "node scripts/build-pages.mjs",
30
- "lint": "stylelint \"styles/**/*.css\"",
31
- "test": "node test/layout-css-contract.test.mjs && node test/demo-smoke.test.mjs && node test/pages-artifact.test.mjs",
32
- "check": "npm run build && npm run lint && npm test && npm run pack:dry-run",
33
+ "lint": "stylelint \"styles/**/*.css\" \"demo/**/*.css\"",
34
+ "check:demo-js": "node --check demo/demo.js",
35
+ "test:static": "node test/layout-css-contract.test.mjs && node test/release-docs-contract.test.mjs",
36
+ "test:demo:quick": "node test/demo-smoke.test.mjs --quick --browser=chromium",
37
+ "test:demo:chromium": "node test/demo-smoke.test.mjs --browser=chromium",
38
+ "test:demo:firefox": "node test/demo-smoke.test.mjs --browser=firefox",
39
+ "test:demo:webkit": "node test/demo-smoke.test.mjs --browser=webkit",
40
+ "test:demo:all": "npm run test:demo:chromium && npm run test:demo:firefox && npm run test:demo:webkit",
41
+ "test:pages": "node test/pages-artifact.test.mjs",
42
+ "test": "npm run test:static && npm run test:demo:quick && npm run test:pages",
43
+ "test:full": "npm run test:static && npm run test:demo:all && npm run test:pages",
44
+ "check": "npm run build && npm run lint && npm run check:demo-js && npm test && npm run pack:dry-run",
45
+ "check:full": "npm run build && npm run lint && npm run check:demo-js && npm run test:full && npm run pack:dry-run",
33
46
  "pack:dry-run": "npm pack --dry-run --ignore-scripts",
34
- "publish:dry-run": "npm publish --dry-run --access public",
35
- "release:verify": "npm run check && npm run publish:dry-run",
36
- "prepack": "npm run check",
37
- "prepublishOnly": "npm run check"
47
+ "publish:dry-run": "npm publish --dry-run --access public --ignore-scripts",
48
+ "release:verify": "npm run check:full && npm audit --audit-level=moderate && npm run publish:dry-run",
49
+ "prepack": "npm run build && npm run test:static",
50
+ "prepublishOnly": "npm run check:full"
38
51
  },
39
52
  "publishConfig": {
40
53
  "access": "public"
41
54
  },
42
- "peerDependencies": {
43
- "interactive-surface-css": "1.2.5",
44
- "ui-style-kit-css": "2.0.1"
45
- },
46
- "peerDependenciesMeta": {
47
- "interactive-surface-css": {
48
- "optional": true
49
- }
50
- },
51
55
  "devDependencies": {
52
56
  "@playwright/test": "1.61.1",
53
- "interactive-surface-css": "1.2.5",
57
+ "interactive-surface-css": "1.4.0",
54
58
  "stylelint": "17.14.0",
55
59
  "ui-style-kit-css": "2.0.1"
56
60
  },
@@ -60,37 +64,24 @@
60
64
  "./css.css": "./dist/layout-style-css.css",
61
65
  "./min": "./dist/layout-style-css.min.css",
62
66
  "./min.css": "./dist/layout-style-css.min.css",
63
- "./dist/*.css": "./dist/*.css",
64
- "./dist/layout-style-css.css": "./dist/layout-style-css.css",
65
- "./dist/layout-style-css.min.css": "./dist/layout-style-css.min.css",
66
- "./base.css": "./dist/layout-base.css",
67
- "./bridge.css": "./dist/layout-ui-style-kit-bridge.css",
68
- "./all.css": "./dist/layout-all.css",
69
- "./all-with-ui-kit.css": "./dist/layout-all-with-ui-kit.css",
70
- "./all-with-ui-kit-and-interactive-surface.css": "./dist/layout-all-with-ui-kit-and-interactive-surface.css",
71
- "./minimal-saas.css": "./dist/layout-style-minimal-saas.css",
72
- "./bento.css": "./dist/layout-style-bento.css",
73
- "./maximalist.css": "./dist/layout-style-maximalist.css",
74
- "./bauhaus.css": "./dist/layout-style-bauhaus.css",
75
- "./tactile.css": "./dist/layout-style-tactile.css",
76
- "./neumorphism.css": "./dist/layout-style-neumorphism.css",
77
- "./retrofuturism.css": "./dist/layout-style-retrofuturism.css",
78
- "./brutalism.css": "./dist/layout-style-brutalism.css",
79
- "./cyberpunk.css": "./dist/layout-style-cyberpunk.css",
80
- "./y2k.css": "./dist/layout-style-y2k.css",
81
- "./retro-glass.css": "./dist/layout-style-retro-glass.css",
82
- "./f-pattern.css": "./dist/layout-style-f-pattern.css",
83
- "./z-pattern.css": "./dist/layout-style-z-pattern.css",
84
- "./split-screen.css": "./dist/layout-style-split-screen.css",
85
- "./mondrian.css": "./dist/layout-style-mondrian.css",
86
- "./synthwave.css": "./dist/layout-style-synthwave.css",
67
+ "./core.css": "./dist/core.css",
68
+ "./wrappers.css": "./dist/wrappers.css",
69
+ "./primitives.css": "./dist/primitives.css",
70
+ "./recipes.css": "./dist/recipes.css",
71
+ "./utilities.css": "./dist/utilities.css",
72
+ "./personalities.css": "./dist/personalities.css",
73
+ "./personalities/*.css": "./dist/personalities/*.css",
74
+ "./integrations/ui-style-kit.css": "./dist/integrations/ui-style-kit.css",
75
+ "./legacy.css": "./dist/legacy.css",
87
76
  "./package.json": "./package.json"
88
77
  },
89
78
  "files": [
90
79
  "dist",
91
80
  "styles",
92
- "docs/wiki",
93
- "demo/index.html",
81
+ "docs/wiki",
82
+ "demo/index.html",
83
+ "demo/demo.css",
84
+ "demo/demo.js",
94
85
  "demo/assets/apple-touch-icon.svg",
95
86
  "demo/assets/favicon.svg",
96
87
  "demo/assets/social-card.png",
@@ -0,0 +1,6 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ @import url("./wrappers.css");
4
+ @import url("./primitives.css");
5
+ @import url("./recipes.css");
6
+ @import url("./utilities.css");
@@ -1,10 +1,12 @@
1
- /*
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /*
2
4
  Compatibility bridge for ui-style-kit-css.
3
5
  This bridge intentionally does not map color, type, border, or shadow tokens.
4
- ui-style-kit-css owns those visuals; layout-style-library owns structure.
6
+ ui-style-kit-css owns those visuals; layout-style-css owns structure.
5
7
  */
6
8
 
7
- @layer ly.bridge {
9
+ @layer ly.integrations.ui_style_kit {
8
10
  :where(.ly-root[data-ui][data-theme][data-mode], [data-ui][data-theme][data-mode] .ly-root) {
9
11
  --ly-ui-style-kit-bridge: 1;
10
12
 
@@ -63,10 +65,13 @@
63
65
  --ly-ui-style-kit-bridge-style: retro-glass;
64
66
  }
65
67
 
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;
68
+ :where(.saas-container, .bento-container, .max-container, .bau-container, .tactile-container, .neo-container, .retro-container, .brutal-container, .cyber-container, .y2k-container, .rg-container) {
69
+ /* UI Style Kit naming can opt into layout sizing without taking over visual paint. */
70
+ container-name: ly-wrapper;
71
+ container-type: inline-size;
72
+ inline-size: min(100%, calc(var(--ly-wrapper-max) + (var(--ly-wrapper-gutter) * 2)));
73
+ margin-inline: auto;
74
+ padding-inline: var(--ly-wrapper-gutter);
70
75
  }
71
76
 
72
77
  :where(.saas-section, .bento-section, .max-section, .bau-section, .tactile-section, .neo-section, .retro-section, .brutal-section, .cyber-section, .y2k-section, .rg-section) {
@@ -162,7 +167,7 @@
162
167
  scroll-snap-align: start;
163
168
  }
164
169
 
165
- @media (min-width: 48rem) {
170
+ @container (min-width: 48rem) {
166
171
  :where(.saas-split, .bento-split, .max-split, .bau-split, .tactile-split, .neo-split, .retro-split, .brutal-split, .cyber-split, .y2k-split, .rg-split) {
167
172
  grid-template-columns: minmax(0, var(--ly-split-primary, 1fr)) minmax(0, var(--ly-split-secondary, 1fr));
168
173
  }
@@ -0,0 +1,173 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ @import url("./layout-style-css.css");
4
+
5
+ @layer ly.legacy {
6
+ /* Preserve v1 wrapper measures while applications migrate to semantic v2 names. */
7
+ .ly-container {
8
+ container-name: ly-wrapper;
9
+ container-type: inline-size;
10
+ width: min(100% - (var(--ly-page-padding-inline) * 2), var(--ly-container-max));
11
+ margin-inline: auto;
12
+ }
13
+
14
+ .ly-container--sm,
15
+ .ly-wrapper--sm {
16
+ --ly-container-max: var(--ly-container-sm);
17
+ --ly-wrapper-max: 40rem;
18
+ }
19
+
20
+ .ly-container--md,
21
+ .ly-wrapper--md {
22
+ --ly-container-max: var(--ly-container-md);
23
+ --ly-wrapper-max: 56rem;
24
+ }
25
+
26
+ .ly-container--lg,
27
+ .ly-wrapper--lg {
28
+ --ly-container-max: var(--ly-container-lg);
29
+ --ly-wrapper-max: 72rem;
30
+ }
31
+
32
+ .ly-container--xl,
33
+ .ly-wrapper--xl {
34
+ --ly-container-max: var(--ly-container-xl);
35
+ --ly-wrapper-max: 88rem;
36
+ }
37
+
38
+ .ly-container--wide {
39
+ --ly-container-max: var(--ly-container-wide);
40
+ }
41
+
42
+ .ly-container--fluid {
43
+ width: 100%;
44
+ max-width: none;
45
+ padding-inline: var(--ly-wrapper-gutter);
46
+ }
47
+
48
+ .ly-wrapper--fluid {
49
+ --ly-wrapper-max: 100%;
50
+ }
51
+
52
+ .ly-wrapper--readable {
53
+ --ly-wrapper-max: 68ch;
54
+ }
55
+
56
+ .ly-row {
57
+ display: flex;
58
+ flex-wrap: wrap;
59
+ /* Outer compensation preserves exact percentage tracks while columns own gutters. */
60
+ margin-inline: calc(var(--ly-gutter, var(--ly-gap)) * -0.5);
61
+ }
62
+
63
+ .ly-col {
64
+ flex: 1 1 0;
65
+ min-inline-size: 0;
66
+ padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5);
67
+ }
68
+
69
+ .ly-col-1 { flex: 0 0 auto; width: 8.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
70
+ .ly-col-2 { flex: 0 0 auto; width: 16.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
71
+ .ly-col-3 { flex: 0 0 auto; width: 25%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
72
+ .ly-col-4 { flex: 0 0 auto; width: 33.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
73
+ .ly-col-5 { flex: 0 0 auto; width: 41.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
74
+ .ly-col-6 { flex: 0 0 auto; width: 50%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
75
+ .ly-col-7 { flex: 0 0 auto; width: 58.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
76
+ .ly-col-8 { flex: 0 0 auto; width: 66.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
77
+ .ly-col-9 { flex: 0 0 auto; width: 75%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
78
+ .ly-col-10 { flex: 0 0 auto; width: 83.333333%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
79
+ .ly-col-11 { flex: 0 0 auto; width: 91.666667%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
80
+ .ly-col-12 { flex: 0 0 auto; width: 100%; padding-inline: calc(var(--ly-gutter, var(--ly-gap)) * 0.5); }
81
+
82
+ .ly-carousel {
83
+ display: grid;
84
+ grid-auto-flow: column;
85
+ grid-auto-columns: minmax(min(100%, var(--ly-reel-item-min)), var(--ly-reel-item-max));
86
+ gap: var(--ly-grid-gap);
87
+ overflow-x: auto;
88
+ overflow-inline: auto;
89
+ overscroll-behavior-inline: contain;
90
+ scroll-snap-type: inline proximity;
91
+ }
92
+
93
+ .ly-carousel > * {
94
+ min-inline-size: 0;
95
+ scroll-snap-align: start;
96
+ }
97
+
98
+ .ly-button-group {
99
+ display: flex;
100
+ flex-wrap: wrap;
101
+ align-items: center;
102
+ gap: var(--ly-cluster-gap);
103
+ }
104
+
105
+ .ly-button-group > * {
106
+ flex: 0 1 auto;
107
+ min-inline-size: min(100%, var(--ly-button-min, 8rem));
108
+ }
109
+
110
+ .ly-sidebar-layout {
111
+ display: grid;
112
+ grid-template-columns: minmax(0, 1fr);
113
+ gap: var(--ly-gap);
114
+ }
115
+
116
+ .ly-sidebar-layout > * {
117
+ min-inline-size: 0;
118
+ }
119
+
120
+ .ly-content {
121
+ min-inline-size: 0;
122
+ }
123
+
124
+ .ly-divider {
125
+ /* V2 preserves separator geometry here; themes remain responsible for visible paint. */
126
+ min-block-size: 1px;
127
+ margin-block: var(--ly-space-5);
128
+ }
129
+
130
+ .ly-card-sm { min-block-size: var(--ly-card-size-sm); }
131
+ .ly-card-md { min-block-size: var(--ly-card-size-md); }
132
+ .ly-card-lg { min-block-size: var(--ly-card-size-lg); }
133
+
134
+ .ly-scroll-area {
135
+ min-block-size: 0;
136
+ max-block-size: var(--ly-scroll-max);
137
+ overflow: auto;
138
+ overscroll-behavior: contain;
139
+ }
140
+
141
+ .ly-app-header { grid-area: header; min-inline-size: 0; }
142
+ .ly-app-sidebar { grid-area: sidebar; min-inline-size: 0; }
143
+ .ly-app-main { grid-area: main; min-inline-size: 0; }
144
+ .ly-app-aside { grid-area: aside; min-inline-size: 0; }
145
+ .ly-app-footer { grid-area: footer; min-inline-size: 0; }
146
+
147
+ /* The build expands canonical personality rules into functional v1 aliases here. */
148
+ /* @generated-personality-aliases */
149
+
150
+ @container (min-width: 48rem) {
151
+ .ly-sidebar-layout {
152
+ grid-template-columns: minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-max)) minmax(0, 1fr);
153
+ align-items: start;
154
+ }
155
+
156
+ .ly-sidebar-layout--right {
157
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-sidebar-min)), var(--ly-sidebar-max));
158
+ }
159
+
160
+ .ly-panes--two {
161
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, var(--ly-pane-size)), 0.7fr);
162
+ }
163
+ }
164
+
165
+ @container (min-width: 64rem) {
166
+ .ly-panes--three {
167
+ grid-template-columns:
168
+ minmax(min(100%, var(--ly-pane-rail, 14rem)), 0.35fr)
169
+ minmax(0, 1fr)
170
+ minmax(min(100%, var(--ly-pane-rail, 14rem)), 0.35fr);
171
+ }
172
+ }
173
+ }
@@ -0,0 +1,46 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: bauhaus. A left rail anchors an intentionally asymmetric grid. */
4
+
5
+ @layer ly.personalities.bauhaus {
6
+ :where(.ly-root[data-ly-layout="bauhaus"]) {
7
+ --ly-recipe-rail: 14rem;
8
+ --ly-recipe-aside: 18rem;
9
+ --ly-grid-columns: 6;
10
+ --ly-grid-min: 13rem;
11
+ --ly-personality-wrapper-max: 96rem;
12
+
13
+ container-name: ly-personality;
14
+ container-type: inline-size;
15
+ min-inline-size: 0;
16
+ }
17
+
18
+ /* Cap the fallback rail until the wider personality template is eligible. */
19
+ @container ly-personality (min-width: 48rem) {
20
+ :where(.ly-root[data-ly-layout="bauhaus"])
21
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
22
+ grid-template-columns: minmax(min(100%, 14rem), 0.3fr) minmax(0, 1fr);
23
+ }
24
+ }
25
+
26
+ @container ly-personality (min-width: 52rem) {
27
+ :where(.ly-root[data-ly-layout="bauhaus"])
28
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
29
+ grid-template-areas:
30
+ "sidebar header header aside"
31
+ "sidebar main main aside"
32
+ "sidebar footer footer footer";
33
+ grid-template-rows: auto minmax(0, 1fr) auto;
34
+ grid-template-columns:
35
+ minmax(min(100%, 14rem), 0.24fr)
36
+ minmax(0, 0.7fr)
37
+ minmax(0, 1.3fr)
38
+ minmax(min(100%, 18rem), 0.3fr);
39
+ }
40
+
41
+ :where(.ly-root[data-ly-layout="bauhaus"]) .ly-grid > :nth-child(3n + 1) {
42
+ grid-column: span 2;
43
+ grid-row: span 2;
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,43 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: bento. A full-width shell and staggered spans form modular tiles. */
4
+
5
+ @layer ly.personalities.bento {
6
+ :where(.ly-root[data-ly-layout="bento"]) {
7
+ --ly-grid-columns: 6;
8
+ --ly-grid-min: 12rem;
9
+ --ly-card-grid-min: 13rem;
10
+ --ly-personality-wrapper-max: 112rem;
11
+
12
+ container-name: ly-personality;
13
+ container-type: inline-size;
14
+ min-inline-size: 0;
15
+ }
16
+
17
+ @container ly-personality (min-width: 48rem) {
18
+ :where(.ly-root[data-ly-layout="bento"])
19
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
20
+ grid-template-areas:
21
+ "header header header"
22
+ "sidebar main main"
23
+ "aside main main"
24
+ "footer footer footer";
25
+ grid-template-rows: auto minmax(0, 1fr) auto auto;
26
+ grid-template-columns:
27
+ minmax(min(100%, 14rem), 0.3fr)
28
+ minmax(0, 1fr)
29
+ minmax(0, 1fr);
30
+ }
31
+
32
+ :where(.ly-root[data-ly-layout="bento"]) .ly-grid > :nth-child(6n + 1) {
33
+ grid-column: span 2;
34
+ grid-row: span 2;
35
+ }
36
+
37
+ :where(.ly-root[data-ly-layout="bento"])
38
+ :where(.ly-card-grid, [data-ly-recipe="card-grid"])
39
+ > :nth-child(6n + 1) {
40
+ grid-column: span 2;
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,36 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: brutalism. A blunt right rail counters a broad primary plane. */
4
+
5
+ @layer ly.personalities.brutalism {
6
+ :where(.ly-root[data-ly-layout="brutalism"]) {
7
+ --ly-recipe-rail: 18rem;
8
+ --ly-recipe-aside: 16rem;
9
+ --ly-grid-columns: 6;
10
+ --ly-grid-min: 14rem;
11
+ --ly-personality-wrapper-max: 100rem;
12
+
13
+ container-name: ly-personality;
14
+ container-type: inline-size;
15
+ min-inline-size: 0;
16
+ }
17
+
18
+ @container ly-personality (min-width: 48rem) {
19
+ :where(.ly-root[data-ly-layout="brutalism"])
20
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
21
+ grid-template-areas:
22
+ "header header sidebar"
23
+ "main aside sidebar"
24
+ "footer footer sidebar";
25
+ grid-template-rows: auto minmax(0, 1fr) auto;
26
+ grid-template-columns:
27
+ minmax(0, 1.3fr)
28
+ minmax(min(100%, 16rem), 0.7fr)
29
+ minmax(min(100%, 18rem), 0.34fr);
30
+ }
31
+
32
+ :where(.ly-root[data-ly-layout="brutalism"]) .ly-grid > :nth-child(3n) {
33
+ grid-column: span 2;
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,36 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: cyberpunk. A narrow command rail fronts a dense three-lane shell. */
4
+
5
+ @layer ly.personalities.cyberpunk {
6
+ :where(.ly-root[data-ly-layout="cyberpunk"]) {
7
+ --ly-recipe-rail: 13rem;
8
+ --ly-recipe-aside: 19rem;
9
+ --ly-grid-columns: 8;
10
+ --ly-grid-min: 12rem;
11
+ --ly-personality-wrapper-max: 112rem;
12
+
13
+ container-name: ly-personality;
14
+ container-type: inline-size;
15
+ min-inline-size: 0;
16
+ }
17
+
18
+ @container ly-personality (min-width: 44rem) {
19
+ :where(.ly-root[data-ly-layout="cyberpunk"])
20
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
21
+ grid-template-areas:
22
+ "sidebar header aside"
23
+ "sidebar main aside"
24
+ "sidebar footer aside";
25
+ grid-template-rows: auto minmax(0, 1fr) auto;
26
+ grid-template-columns:
27
+ minmax(min(100%, 13rem), 0.2fr)
28
+ minmax(0, 1fr)
29
+ minmax(min(100%, 19rem), 0.32fr);
30
+ }
31
+
32
+ :where(.ly-root[data-ly-layout="cyberpunk"]) .ly-grid > :nth-child(4n + 2) {
33
+ grid-column: span 3;
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,48 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: f-pattern. A left rail supports a wide first-reading column. */
4
+
5
+ @layer ly.personalities.f_pattern {
6
+ :where(.ly-root[data-ly-layout="f-pattern"]) {
7
+ --ly-recipe-rail: 16rem;
8
+ --ly-recipe-aside: 18rem;
9
+ --ly-grid-columns: 6;
10
+ --ly-grid-min: 14rem;
11
+ --ly-personality-wrapper-max: 92rem;
12
+
13
+ container-name: ly-personality;
14
+ container-type: inline-size;
15
+ min-inline-size: 0;
16
+ }
17
+
18
+ @container ly-personality (min-width: 48rem) {
19
+ :where(.ly-root[data-ly-layout="f-pattern"])
20
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
21
+ grid-template-columns: minmax(min(100%, 16rem), 0.3fr) minmax(0, 1fr);
22
+ }
23
+ }
24
+
25
+ @container ly-personality (min-width: 56rem) {
26
+ :where(.ly-root[data-ly-layout="f-pattern"])
27
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
28
+ grid-template-areas:
29
+ "sidebar header header"
30
+ "sidebar main aside"
31
+ "sidebar footer aside";
32
+ grid-template-rows: auto minmax(0, 1fr) auto;
33
+ grid-template-columns:
34
+ minmax(min(100%, 16rem), 0.26fr)
35
+ minmax(0, 1.35fr)
36
+ minmax(min(100%, 18rem), 0.65fr);
37
+ }
38
+
39
+ :where(.ly-root[data-ly-layout="f-pattern"]) .ly-grid > :nth-child(3n + 1) {
40
+ grid-column: span 2;
41
+ }
42
+
43
+ :where(.ly-root[data-ly-layout="f-pattern"])
44
+ :where(.ly-split-hero, [data-ly-recipe="split-hero"]) {
45
+ grid-template-columns: minmax(0, 1.35fr) minmax(0, 0.65fr);
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,51 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: maximalist. A full-bleed four-track mosaic favors dramatic spans. */
4
+
5
+ @layer ly.personalities.maximalist {
6
+ :where(.ly-root[data-ly-layout="maximalist"]) {
7
+ --ly-grid-columns: 12;
8
+ --ly-grid-min: 10rem;
9
+ --ly-personality-wrapper-max: 100%;
10
+ --ly-card-grid-min: 12rem;
11
+
12
+ container-name: ly-personality;
13
+ container-type: inline-size;
14
+ min-inline-size: 0;
15
+ }
16
+
17
+ @container ly-personality (min-width: 48rem) {
18
+ :where(.ly-root[data-ly-layout="maximalist"])
19
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
20
+ grid-template-columns: minmax(min(100%, 18rem), 0.3fr) minmax(0, 1fr);
21
+ }
22
+ }
23
+
24
+ @container ly-personality (min-width: 56rem) {
25
+ :where(.ly-root[data-ly-layout="maximalist"])
26
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
27
+ grid-template-areas:
28
+ "header header header header"
29
+ "main main sidebar aside"
30
+ "main main footer footer";
31
+ grid-template-rows: auto minmax(0, 1fr) auto;
32
+ grid-template-columns:
33
+ minmax(0, 1.4fr)
34
+ minmax(0, 0.6fr)
35
+ minmax(min(100%, 15rem), 0.32fr)
36
+ minmax(min(100%, 18rem), 0.38fr);
37
+ }
38
+
39
+ :where(.ly-root[data-ly-layout="maximalist"]) .ly-grid > :nth-child(7n + 1) {
40
+ grid-column: span 3;
41
+ grid-row: span 2;
42
+ }
43
+
44
+ :where(.ly-root[data-ly-layout="maximalist"])
45
+ :where(.ly-gallery, [data-ly-recipe="gallery"])
46
+ > :nth-child(5n + 1) {
47
+ grid-column: span 2;
48
+ grid-row: span 2;
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,37 @@
1
+ @layer ly.reset, ly.tokens, ly.wrappers, ly.primitives, ly.recipes, ly.utilities, ly.personalities, ly.integrations, ly.legacy;
2
+
3
+ /* Layout style: minimal-saas. A measured left rail keeps work areas predictable. */
4
+
5
+ @layer ly.personalities.minimal_saas {
6
+ :where(.ly-root[data-ly-layout="minimal-saas"]) {
7
+ --ly-recipe-rail: 15rem;
8
+ --ly-recipe-aside: 16rem;
9
+ --ly-grid-columns: 4;
10
+ --ly-grid-min: 16rem;
11
+ --ly-personality-wrapper-max: 88rem;
12
+
13
+ container-name: ly-personality;
14
+ container-type: inline-size;
15
+ min-inline-size: 0;
16
+ }
17
+
18
+ /* Named areas rearrange the shell without changing its mobile DOM or focus order. */
19
+ @container ly-personality (min-width: 48rem) {
20
+ :where(.ly-root[data-ly-layout="minimal-saas"])
21
+ :where(.ly-app-shell, [data-ly-recipe="app-shell"]) {
22
+ grid-template-areas:
23
+ "sidebar header header"
24
+ "sidebar main aside"
25
+ "sidebar footer footer";
26
+ grid-template-rows: auto minmax(0, 1fr) auto;
27
+ grid-template-columns:
28
+ minmax(min(100%, 15rem), 0.24fr)
29
+ minmax(0, 1fr)
30
+ minmax(min(100%, 16rem), 0.28fr);
31
+ }
32
+
33
+ :where(.ly-root[data-ly-layout="minimal-saas"]) .ly-grid > :nth-child(4n + 1) {
34
+ grid-column: span 2;
35
+ }
36
+ }
37
+ }