@astryxdesign/cli 0.6.4-canary.06c8fa3 → 0.6.4-canary.0e1fbdb

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 (254) hide show
  1. package/README.md +49 -40
  2. package/api/build/build.doc.mjs +6 -1
  3. package/api/build/build.test.mjs +22 -0
  4. package/api/build/kit/kit.mjs +44 -5
  5. package/api/component/component.doc.mjs +14 -7
  6. package/api/docs/_adapter.d.mts +8 -3
  7. package/api/docs/_adapter.mjs +14 -6
  8. package/api/docs/docOverlays.test.mjs +27 -1
  9. package/api/docs/docs.doc.mjs +2 -2
  10. package/api/doctor/doctor.doc.mjs +17 -8
  11. package/api/doctor/doctor.type.d.mts +1 -1
  12. package/api/doctor/doctor.type.mjs +1 -1
  13. package/api/gap-report/gap-report.doc.mjs +19 -10
  14. package/api/hook/hook.doc.mjs +6 -3
  15. package/api/index.d.mts +2 -0
  16. package/api/index.mjs +3 -1
  17. package/api/init/init.doc.mjs +17 -12
  18. package/api/integration/add-theme.mjs +22 -1
  19. package/api/integration/add-theme.test.mjs +34 -0
  20. package/api/integration/authoring-checks.mjs +2 -2
  21. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  22. package/api/integration/pack-check.lifecycle-output.test.mjs +2 -0
  23. package/api/integration/pack-check.mjs +54 -6
  24. package/api/integration/pack-check.test.mjs +90 -0
  25. package/api/integration/pack-check.type.mjs +1 -1
  26. package/api/json/assertResponse.doc.mjs +1 -1
  27. package/api/json/index.ts +1 -0
  28. package/api/json/isError.doc.mjs +1 -1
  29. package/api/layout/_adapter.d.mts +34 -0
  30. package/api/layout/_adapter.mjs +148 -0
  31. package/api/layout/check/check.d.mts +16 -0
  32. package/api/layout/check/check.mjs +40 -0
  33. package/api/layout/expand/expand.d.mts +22 -0
  34. package/api/layout/expand/expand.mjs +155 -0
  35. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  36. package/api/layout/grammar/grammar.d.mts +13 -0
  37. package/api/layout/grammar/grammar.mjs +87 -0
  38. package/api/layout/layout.d.mts +6 -0
  39. package/api/layout/layout.mjs +17 -0
  40. package/api/layout/layout.test.mjs +297 -0
  41. package/api/layout/layout.type.d.mts +89 -0
  42. package/api/layout/layout.type.mjs +103 -0
  43. package/api/layout/layoutCheck.doc.d.mts +11 -0
  44. package/api/layout/layoutCheck.doc.mjs +85 -0
  45. package/api/layout/layoutExpand.doc.d.mts +11 -0
  46. package/api/layout/layoutExpand.doc.mjs +107 -0
  47. package/api/layout/layoutGrammar.doc.d.mts +11 -0
  48. package/api/layout/layoutGrammar.doc.mjs +57 -0
  49. package/api/search/search.d.mts +27 -1
  50. package/api/search/search.doc.mjs +2 -2
  51. package/api/search/search.mjs +228 -16
  52. package/api/swizzle/swizzle.doc.mjs +7 -5
  53. package/api/template/copy/copy.mjs +1 -1
  54. package/api/template/copy/copy.test.mjs +9 -0
  55. package/api/template/template-integration.test.mjs +65 -1
  56. package/api/template/template.doc.mjs +2 -1
  57. package/api/template/template.mjs +1 -1
  58. package/api/theme/generateTonalPalette.doc.mjs +1 -2
  59. package/api/theme/listThemes.doc.mjs +1 -1
  60. package/api/theme/themeAdd.doc.mjs +9 -10
  61. package/api/theme/themeBuild.doc.mjs +13 -13
  62. package/api/theme/themeList.doc.mjs +1 -1
  63. package/api/theme/themeListAvailable.doc.mjs +2 -1
  64. package/api/theme/themePaletteGenerate.doc.mjs +15 -8
  65. package/api/theme/themeTargets.doc.mjs +3 -2
  66. package/api/theme/themeTemplate.doc.mjs +2 -1
  67. package/api/upgrade/run/run.mjs +1 -1
  68. package/api/upgrade/upgrade.doc.mjs +24 -22
  69. package/assets/docs/README.md +4 -2
  70. package/assets/docs/browser-support.doc.mjs +11 -11
  71. package/assets/docs/color.doc.mjs +8 -2
  72. package/assets/docs/elevation.doc.mjs +6 -4
  73. package/assets/docs/getting-started.doc.mjs +5 -16
  74. package/assets/docs/icons.doc.mjs +2 -21
  75. package/assets/docs/illustrations.doc.mjs +7 -15
  76. package/assets/docs/layout.doc.dense.mjs +130 -82
  77. package/assets/docs/layout.doc.mjs +133 -77
  78. package/assets/docs/migration.doc.mjs +19 -21
  79. package/assets/docs/motion.doc.mjs +16 -3
  80. package/assets/docs/principles.doc.dense.mjs +5 -5
  81. package/assets/docs/principles.doc.mjs +8 -0
  82. package/assets/docs/principles.doc.zh.mjs +6 -6
  83. package/assets/docs/shape.doc.mjs +8 -3
  84. package/assets/docs/spacing.doc.mjs +7 -2
  85. package/assets/docs/styling-libraries.doc.mjs +6 -2
  86. package/assets/docs/styling.doc.mjs +19 -23
  87. package/assets/docs/theme.doc.dense.mjs +58 -18
  88. package/assets/docs/theme.doc.mjs +56 -46
  89. package/assets/docs/theme.doc.zh.mjs +9 -8
  90. package/assets/docs/tokens.doc.dense.mjs +2 -2
  91. package/assets/docs/tokens.doc.mjs +389 -8
  92. package/assets/docs/tokens.doc.zh.mjs +2 -2
  93. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  94. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  95. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  96. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  97. package/assets/docs/tree/block-template.doc.mjs +130 -0
  98. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  99. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  100. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  101. package/assets/docs/tree/checks.doc.mjs +119 -0
  102. package/assets/docs/tree/codemods.doc.mjs +147 -0
  103. package/assets/docs/tree/component-family.doc.mjs +113 -0
  104. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  105. package/assets/docs/tree/components.doc.mjs +23 -0
  106. package/assets/docs/tree/configuration.doc.mjs +23 -0
  107. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  108. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  109. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  110. package/assets/docs/tree/docs.doc.mjs +21 -0
  111. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  112. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  113. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  114. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  115. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  116. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  117. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  118. package/assets/docs/tree/help.doc.mjs +16 -0
  119. package/assets/docs/tree/integrations.doc.mjs +25 -470
  120. package/assets/docs/tree/links.doc.mjs +98 -0
  121. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  122. package/assets/docs/tree/page-template.doc.mjs +71 -0
  123. package/assets/docs/tree/publishing.doc.mjs +111 -0
  124. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  125. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  126. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  127. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  128. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  129. package/assets/docs/tree/ship.doc.mjs +16 -0
  130. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  131. package/assets/docs/tree/single-component.doc.mjs +165 -0
  132. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  133. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  134. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  135. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  136. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  137. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  138. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  139. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  140. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  141. package/assets/docs/tree/templates.doc.mjs +34 -0
  142. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  143. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  144. package/assets/docs/tree/themes.doc.mjs +39 -0
  145. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  146. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  147. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  148. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  149. package/assets/docs/tree/versioning.doc.mjs +161 -0
  150. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  151. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  152. package/assets/docs/typography.doc.mjs +24 -4
  153. package/assets/docs/working-with-ai.doc.mjs +30 -22
  154. package/authoring/config/config.doc.mjs +2 -2
  155. package/authoring/config/type.ts +2 -2
  156. package/authoring/doctypes/_schema.d.mts +3 -2
  157. package/authoring/doctypes/_schema.mjs +6 -0
  158. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  159. package/authoring/doctypes/base/type.ts +4 -2
  160. package/authoring/doctypes/command/command.doc.mjs +1 -1
  161. package/authoring/doctypes/command/type.ts +1 -1
  162. package/authoring/doctypes/component/component.doc.mjs +6 -0
  163. package/authoring/doctypes/component/type.ts +8 -0
  164. package/authoring/doctypes/reference/reference.doc.mjs +7 -0
  165. package/authoring/doctypes/reference/type.ts +5 -0
  166. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  167. package/authoring/doctypes/template/template.doc.mjs +1 -1
  168. package/authoring/doctypes/template/type.ts +2 -2
  169. package/authoring/integration/integration.doc.mjs +12 -10
  170. package/clients/cli/command-result-coverage.test.mjs +7 -7
  171. package/clients/cli/commands/component.doc.mjs +4 -3
  172. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  173. package/clients/cli/commands/docs.doc.mjs +1 -1
  174. package/clients/cli/commands/docs.mjs +60 -17
  175. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -2
  176. package/clients/cli/commands/doctor-integration.test.mjs +53 -0
  177. package/clients/cli/commands/doctor.doc.mjs +3 -1
  178. package/clients/cli/commands/doctor.mjs +49 -5
  179. package/clients/cli/commands/gap-report.doc.mjs +10 -9
  180. package/clients/cli/commands/init.doc.mjs +9 -6
  181. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  182. package/clients/cli/commands/integration-authoring.test.mjs +61 -10
  183. package/clients/cli/commands/integration-pack.doc.mjs +5 -9
  184. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  185. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  186. package/clients/cli/commands/integration.doc.mjs +4 -4
  187. package/clients/cli/commands/integration.mjs +74 -43
  188. package/clients/cli/commands/layout-check.doc.mjs +65 -0
  189. package/clients/cli/commands/layout-expand.doc.mjs +83 -0
  190. package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
  191. package/clients/cli/commands/layout.doc.mjs +34 -0
  192. package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
  193. package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
  194. package/clients/cli/commands/layout.mjs +275 -0
  195. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  196. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  197. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  198. package/clients/cli/commands/manifest.doc.mjs +1 -1
  199. package/clients/cli/commands/search.doc.mjs +10 -3
  200. package/clients/cli/commands/search.mjs +21 -2
  201. package/clients/cli/commands/search.test.mjs +21 -4
  202. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  203. package/clients/cli/commands/template.doc.mjs +1 -1
  204. package/clients/cli/commands/text-json-parity.test.mjs +24 -1
  205. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  206. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -2
  207. package/clients/cli/commands/theme-palette.doc.mjs +1 -2
  208. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  209. package/clients/cli/commands/theme.doc.mjs +2 -1
  210. package/clients/cli/commands/upgrade.doc.mjs +62 -3
  211. package/clients/cli/index.mjs +32 -6
  212. package/clients/cli/lib/define-command.mjs +28 -4
  213. package/clients/cli/lib/define-command.test.mjs +54 -0
  214. package/clients/cli/lib/exit-codes.test.mjs +25 -2
  215. package/clients/cli/lib/json-shim.test.mjs +20 -6
  216. package/clients/cli/lib/manifest.mjs +23 -5
  217. package/foundation/agent-docs/agent-docs.mjs +1 -1
  218. package/foundation/discovery/authoring-self-docs.test.mjs +6 -2
  219. package/foundation/discovery/cli-self-docs.mjs +16 -2
  220. package/foundation/discovery/cli-self-docs.test.mjs +20 -0
  221. package/foundation/discovery/docs-discovery.mjs +5 -1
  222. package/foundation/discovery/docs-discovery.test.mjs +21 -0
  223. package/foundation/discovery/docs-section-key.d.mts +1 -1
  224. package/foundation/discovery/docs-section-key.mjs +1 -1
  225. package/foundation/discovery/template-adapter.mjs +1 -1
  226. package/foundation/doc-compiler/doc-loads.test.mjs +15 -2
  227. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  228. package/foundation/doc-compiler/tree.d.mts +4 -0
  229. package/foundation/doc-compiler/tree.mjs +6 -1
  230. package/foundation/integrations/cli-requirement.d.mts +26 -6
  231. package/foundation/integrations/cli-requirement.mjs +46 -11
  232. package/foundation/integrations/cli-requirement.test.mjs +7 -2
  233. package/foundation/integrations/contribution-inventory.mjs +1 -1
  234. package/foundation/response/error-codes.doc.mjs +6 -8
  235. package/foundation/response/error-codes.test.mjs +30 -5
  236. package/foundation/response/response-types.doc.d.mts +4 -3
  237. package/foundation/response/response-types.doc.mjs +42 -6
  238. package/foundation/response/response.doc.mjs +11 -10
  239. package/foundation/xle/browser.d.mts +3 -3
  240. package/foundation/xle/browser.mjs +3 -3
  241. package/foundation/xle/expand.mjs +2 -2
  242. package/foundation/xle/parse.mjs +1 -1
  243. package/foundation/xle/print.mjs +2 -2
  244. package/foundation/xle/splice.mjs +1 -1
  245. package/package.json +9 -9
  246. package/api/docs/docs.test.mjs +0 -245
  247. package/api/docs/integration-tree.test.mjs +0 -555
  248. package/api/docs/integrationDocs.test.mjs +0 -314
  249. package/api/search/search.test.mjs +0 -530
  250. package/assets/docs/tree/integrations.test.mjs +0 -62
  251. package/assets/docs/tree/writing-docs.doc.mjs +0 -286
  252. package/clients/cli/commands/docs.test.mjs +0 -323
  253. package/foundation/agent-docs/agent-docs.test.mjs +0 -1159
  254. package/foundation/doc-compiler/tree.test.mjs +0 -606
@@ -34,9 +34,40 @@ export const docs = {
34
34
  ],
35
35
  },
36
36
  {
37
+ id: 'scaffold',
37
38
  title: 'Scaffold',
38
39
  content: [
39
- {type: 'heading', level: 3, text: 'Shell'},
40
+ {
41
+ type: 'prose',
42
+ text: 'Pick the shell, budget each region, and choose navigation, before any content exists. Shell and Navigation cover each step; these rules hold for both.',
43
+ },
44
+ {
45
+ type: 'list',
46
+ style: 'do',
47
+ items: [
48
+ 'Decide the frame, region width budgets, and fill or capped before any content exists',
49
+ 'State the reason for the navigation choice, or inherit the template pairing',
50
+ 'Reserve raw px for structural widths; interior spacing uses tokens',
51
+ ],
52
+ },
53
+ {
54
+ type: 'list',
55
+ style: 'dont',
56
+ items: [
57
+ 'Build content-first and wrap each section in a Card, producing a padded scroll column',
58
+ 'Stretch prose, forms, or lists across a wide region instead of capping with contentWidth',
59
+ 'SideNav when the nav is really filters or controls, or must hold wide elements like breadcrumbs',
60
+ 'TopNav when top-slot ownership is unclear, or the hierarchy is deep or still growing',
61
+ 'Both bars when the ecosystem layer is thin, so the second only wastes space',
62
+ 'Deviate from the template navigation pairing without a stated reason',
63
+ ],
64
+ },
65
+ ],
66
+ },
67
+ {
68
+ id: 'shell',
69
+ title: 'Shell',
70
+ content: [
40
71
  {
41
72
  type: 'prose',
42
73
  text: 'Pick the shell and budget its regions before any content exists. Structural widths are the one place raw px belongs; everything inside them uses the spacing scale.',
@@ -75,8 +106,12 @@ export const docs = {
75
106
  type: 'prose',
76
107
  text: 'Verify: every region has a width budget, a fill-or-capped decision, and a container policy written down before any content exists.',
77
108
  },
78
-
79
- {type: 'heading', level: 3, text: 'Navigation'},
109
+ ],
110
+ },
111
+ {
112
+ id: 'navigation',
113
+ title: 'Navigation',
114
+ content: [
80
115
  {
81
116
  type: 'prose',
82
117
  text: 'When the frame leaves navigation open, default to SideNav: it absorbs destinations you have not planned yet. App type and destination count are guiding indicators, not determining rules.',
@@ -108,35 +143,47 @@ export const docs = {
108
143
  type: 'prose',
109
144
  text: 'Verify: you can state the reason in one sentence, and the choice still holds if the nav doubles in size. `npx astryx build "<idea>"` names the template to start from; scaffold it and the pairing is already wired up.',
110
145
  },
111
-
112
- {type: 'heading', level: 3, text: 'Best practices'},
146
+ ],
147
+ },
148
+ {
149
+ id: 'structure',
150
+ title: 'Structure',
151
+ content: [
152
+ {
153
+ type: 'prose',
154
+ text: 'Rank the content in each region, then pick the weakest container that groups it. Type hierarchy, Card or rows, Headers and footers, and Side panels cover each step; these rules hold for all of them.',
155
+ },
113
156
  {
114
157
  type: 'list',
115
158
  style: 'do',
116
159
  items: [
117
- 'Decide the frame, region width budgets, and fill or capped before any content exists',
118
- 'State the reason for the navigation choice, or inherit the template pairing',
119
- 'Reserve raw px for structural widths; interior spacing uses tokens',
160
+ 'One lead per region; rank with weight and color; one primary action',
161
+ 'Leave body copy at its defaults; demote by weight and color, not size',
162
+ 'Default to Section; use the weakest container that reads as a group',
163
+ 'Render collections as rows (Table or List), edge-to-edge with dividers',
164
+ 'Open a fixed-width side panel on select; let it yield width at narrow sizes',
120
165
  ],
121
166
  },
122
167
  {
123
168
  type: 'list',
124
169
  style: 'dont',
125
170
  items: [
126
- 'Build content-first and wrap each section in a Card, producing a padded scroll column',
127
- 'Stretch prose, forms, or lists across a wide region instead of capping with contentWidth',
128
- 'SideNav when the nav is really filters or controls, or must hold wide elements like breadcrumbs',
129
- 'TopNav when top-slot ownership is unclear, or the hierarchy is deep or still growing',
130
- 'Both bars when the ecosystem layer is thin, so the second only wastes space',
131
- 'Deviate from the template navigation pairing without a stated reason',
171
+ 'Grey and shrink body copy, so a whole region reads as secondary metadata',
172
+ 'The disabled color for content; it fails contrast and is for disabled controls',
173
+ 'Card soup: each record wrapped in its own Card instead of rendered as rows',
174
+ 'Cards inside Cards, or full-width Cards stacked as page structure',
175
+ 'A header or footer rebuilt inside the body, where it scrolls away with the rows',
176
+ 'Flexbox soup: nested ad-hoc flexboxes instead of Grid, Layout, Section, or FormLayout',
177
+ 'Two competing primary actions in one region',
178
+ 'Badge as decoration; use StatusDot or Token for status and metadata',
132
179
  ],
133
180
  },
134
181
  ],
135
182
  },
136
183
  {
137
- title: 'Structure',
184
+ id: 'type-hierarchy',
185
+ title: 'Type hierarchy',
138
186
  content: [
139
- {type: 'heading', level: 3, text: 'Type hierarchy'},
140
187
  {
141
188
  type: 'prose',
142
189
  text: 'Give every region one lead, then rank the rest with weight and color rather than size. Content uses two text colors, primary and secondary, and nothing dimmer: body copy needs no props at all.',
@@ -170,8 +217,12 @@ export const docs = {
170
217
  type: 'prose',
171
218
  text: 'Squint test: blurred, you read lead, then support, then groups, in that order. If everything reads at once, raise contrast with weight and color, not borders and not smaller text.',
172
219
  },
173
-
174
- {type: 'heading', level: 3, text: 'Containers'},
220
+ ],
221
+ },
222
+ {
223
+ id: 'containers',
224
+ title: 'Card or rows',
225
+ content: [
175
226
  {
176
227
  type: 'prose',
177
228
  text: 'Reach for the weakest container that reads as a group, and escalate only when it fails. Weakest to strongest:',
@@ -202,8 +253,12 @@ export const docs = {
202
253
  type: 'prose',
203
254
  text: 'Decision test: records render as rows, Table for columnar and List for single-line; a self-contained widget or hard boundary is a Card; everything else is a Section.',
204
255
  },
205
-
206
- {type: 'heading', level: 3, text: 'Headers and footers'},
256
+ ],
257
+ },
258
+ {
259
+ id: 'headers-and-footers',
260
+ title: 'Headers and footers',
261
+ content: [
207
262
  {
208
263
  type: 'prose',
209
264
  text: 'A region can pin a header or footer while its body scrolls. Both are Layout slots, and padding set once on Layout reaches all three, so header, body, and footer share one content line.',
@@ -235,8 +290,12 @@ export const docs = {
235
290
  type: 'prose',
236
291
  text: 'Verify: scroll the body. The header and footer stay put, their dividers run full-bleed, and all three still share one left content line.',
237
292
  },
238
-
239
- {type: 'heading', level: 3, text: 'Side panels'},
293
+ ],
294
+ },
295
+ {
296
+ id: 'side-panels',
297
+ title: 'Side panels',
298
+ content: [
240
299
  {
241
300
  type: 'prose',
242
301
  text: 'Master-detail: selecting a row opens a fixed-width side panel instead of navigating away.',
@@ -278,41 +337,45 @@ end={
278
337
  },
279
338
  {
280
339
  type: 'prose',
281
- text: 'Verify: at narrow widths the panel yields width instead of squeezing content (see Breakpoints), and only one element between the regions draws a border.',
340
+ text: 'Verify: at narrow widths the panel yields width instead of squeezing content (see Responsive contract), and only one element between the regions draws a border.',
341
+ },
342
+ ],
343
+ },
344
+ {
345
+ id: 'spacing',
346
+ title: 'Spacing',
347
+ content: [
348
+ {
349
+ type: 'prose',
350
+ text: 'Hold one content line per region, then tune gaps and density. Alignment, Rhythm, and Density and size cover each step; these rules hold for all of them.',
282
351
  },
283
-
284
- {type: 'heading', level: 3, text: 'Best practices'},
285
352
  {
286
353
  type: 'list',
287
354
  style: 'do',
288
355
  items: [
289
- 'One lead per region; rank with weight and color; one primary action',
290
- 'Leave body copy at its defaults; demote by weight and color, not size',
291
- 'Default to Section; use the weakest container that reads as a group',
292
- 'Render collections as rows (Table or List), edge-to-edge with dividers',
293
- 'Open a fixed-width side panel on select; let it yield width at narrow sizes',
356
+ 'Let the container own padding; children zero their own margins',
357
+ 'Hold one content line per region: text on the line, hover backgrounds bleed to the edge',
358
+ 'Hold one padding token across a region header, body, and footer',
359
+ 'Contrast tight and generous gaps so grouping reads without borders',
360
+ 'One control size per row; match density to use frequency',
294
361
  ],
295
362
  },
296
363
  {
297
364
  type: 'list',
298
365
  style: 'dont',
299
366
  items: [
300
- 'Grey and shrink body copy, so a whole region reads as secondary metadata',
301
- 'The disabled color for content; it fails contrast and is for disabled controls',
302
- 'Card soup: each record wrapped in its own Card instead of rendered as rows',
303
- 'Cards inside Cards, or full-width Cards stacked as page structure',
304
- 'A header or footer rebuilt inside the body, where it scrolls away with the rows',
305
- 'Flexbox soup: nested ad-hoc flexboxes instead of Grid, Layout, Section, or FormLayout',
306
- 'Two competing primary actions in one region',
307
- 'Badge as decoration; use StatusDot or Token for status and metadata',
367
+ 'Double padding: a component indented past its Section heading (keep one inset owner)',
368
+ 'Raw px for interior spacing; tokens only, px is for structural widths',
369
+ 'One repeated gap everywhere, which flattens grouping',
370
+ 'Mixed control sizes in a single row',
308
371
  ],
309
372
  },
310
373
  ],
311
374
  },
312
375
  {
313
- title: 'Spacing',
376
+ id: 'alignment',
377
+ title: 'Alignment',
314
378
  content: [
315
- {type: 'heading', level: 3, text: 'Alignment'},
316
379
  {
317
380
  type: 'prose',
318
381
  text: 'The container owns padding and child gaps; children zero their margins, and interior spacing is always a token. Pick one content line per region and hold it constant, not the padding: `container_inset = content_line - component_intrinsic_inset`.',
@@ -342,8 +405,12 @@ end={
342
405
  type: 'prose',
343
406
  text: 'Verify: draw one vertical line down the left of the region. Every label touches it; only hover and selected backgrounds cross it.',
344
407
  },
345
-
346
- {type: 'heading', level: 3, text: 'Rhythm'},
408
+ ],
409
+ },
410
+ {
411
+ id: 'rhythm',
412
+ title: 'Rhythm',
413
+ content: [
347
414
  {
348
415
  type: 'prose',
349
416
  text: 'Grouping comes from contrast between tight and generous gaps, not one repeated value. If every gap is the same step, proximity does no work.',
@@ -375,8 +442,12 @@ end={
375
442
  type: 'prose',
376
443
  text: 'Verify: with every border removed, you can still name the groups from spacing alone. If you cannot, the intervals are too uniform. Form fields are the exception: FormLayout owns their spacing.',
377
444
  },
378
-
379
- {type: 'heading', level: 3, text: 'Density and size'},
445
+ ],
446
+ },
447
+ {
448
+ id: 'density',
449
+ title: 'Density and size',
450
+ content: [
380
451
  {
381
452
  type: 'prose',
382
453
  text: 'Match density to how often a region is used, and give every control in a row the same size so heights share a baseline.',
@@ -403,35 +474,40 @@ end={
403
474
  type: 'prose',
404
475
  text: 'Verify: every interactive element in a row shares one size, and that size is paired with the density of the region it sits in.',
405
476
  },
406
-
407
- {type: 'heading', level: 3, text: 'Best practices'},
477
+ ],
478
+ },
479
+ {
480
+ id: 'breakpoints',
481
+ title: 'Breakpoints',
482
+ content: [
483
+ {
484
+ type: 'prose',
485
+ text: 'Decide what each region does as width changes. Responsive contract covers it; these rules hold for every region.',
486
+ },
408
487
  {
409
488
  type: 'list',
410
489
  style: 'do',
411
490
  items: [
412
- 'Let the container own padding; children zero their own margins',
413
- 'Hold one content line per region: text on the line, hover backgrounds bleed to the edge',
414
- 'Hold one padding token across a region header, body, and footer',
415
- 'Contrast tight and generous gaps so grouping reads without borders',
416
- 'One control size per row; match density to use frequency',
491
+ 'Write the contract down for every region before you call the layout done',
492
+ 'Decide per region whether it is revealed, resized, or swapped at each width',
493
+ 'Drop a region rather than let it compete for width it does not have',
417
494
  ],
418
495
  },
419
496
  {
420
497
  type: 'list',
421
498
  style: 'dont',
422
499
  items: [
423
- 'Double padding: a component indented past its Section heading (keep one inset owner)',
424
- 'Raw px for interior spacing; tokens only, px is for structural widths',
425
- 'One repeated gap everywhere, which flattens grouping',
426
- 'Mixed control sizes in a single row',
500
+ 'Hold three regions at a width where none of them has usable space',
501
+ 'Shrink every region uniformly instead of swapping or dropping one',
502
+ 'Wire a breakpoint in CSS that the contract comment never mentions',
427
503
  ],
428
504
  },
429
505
  ],
430
506
  },
431
507
  {
432
- title: 'Breakpoints',
508
+ id: 'responsive-contract',
509
+ title: 'Responsive contract',
433
510
  content: [
434
- {type: 'heading', level: 3, text: 'Responsive contract'},
435
511
  {
436
512
  type: 'prose',
437
513
  text: 'Lock what each region does as width changes, and pair every line of the contract with the prop or hook that enforces it.',
@@ -468,26 +544,6 @@ const isNarrow = useMediaQuery('(max-width: 1024px)');
468
544
  type: 'prose',
469
545
  text: 'Verify: every contract line names a mechanism, so the comment cannot drift from the behavior.',
470
546
  },
471
-
472
- {type: 'heading', level: 3, text: 'Best practices'},
473
- {
474
- type: 'list',
475
- style: 'do',
476
- items: [
477
- 'Write the contract down for every region before you call the layout done',
478
- 'Decide per region whether it is revealed, resized, or swapped at each width',
479
- 'Drop a region rather than let it compete for width it does not have',
480
- ],
481
- },
482
- {
483
- type: 'list',
484
- style: 'dont',
485
- items: [
486
- 'Hold three regions at a width where none of them has usable space',
487
- 'Shrink every region uniformly instead of swapping or dropping one',
488
- 'Wire a breakpoint in CSS that the contract comment never mentions',
489
- ],
490
- },
491
547
  ],
492
548
  },
493
549
  ],
@@ -30,12 +30,12 @@ export const docs = {
30
30
  type: 'list',
31
31
  style: 'ordered',
32
32
  items: [
33
- 'Install the design system and run init so the project has package scripts, theme CSS, and agent docs.',
33
+ 'Install the packages and run `astryx init` for agent docs, then add the reset, `astryx.css`, and theme CSS imports (see Theme and CSS Setup).',
34
34
  'Wrap the app root with Theme and choose the initial light, dark, or system mode behavior.',
35
35
  'Make Tailwind and design system CSS layer order explicit before replacing components.',
36
36
  'Render the foundation smoke test page and confirm primitives keep their padding before migrating any surface.',
37
37
  'Move the persistent frame first: AppShell, TopNav, SideNav, page content, and mobile navigation.',
38
- 'Replace shared primitives: Button, IconButton, TextInput, NumberInput, Switch, CheckboxInput, RadioList, Selector, Tabs, Dialog, AlertDialog, Banner, Toast, Badge, Card, Table, and ListItem.',
38
+ 'Replace shared primitives: Button, IconButton, TextInput, NumberInput, Switch, CheckboxInput, RadioList, Selector, TabList, Dialog, AlertDialog, Banner, Toast, Badge, Card, Table, and ListItem.',
39
39
  'Replace global workflows: command palette, settings popover, theme toggle, search, filters, create flows, and destructive confirmation dialogs.',
40
40
  'Remove legacy Tailwind classes from each completed surface, keeping only token-backed layout utilities or local wrappers that still need to be migrated.',
41
41
  'Verify both light and dark modes, keyboard navigation, responsive layout, and empty/error/loading states before moving to the next route.',
@@ -69,13 +69,13 @@ astryx component TextInput`,
69
69
  },
70
70
  {
71
71
  type: 'prose',
72
- text: 'Use --dense when pasting output into an AI coding tool, and use --json when building automated migration reports.',
72
+ text: 'For a shorter read to paste into an AI coding tool, add `--detail brief` (one line per section) or `--detail compact`. Use `--json` when building automated migration reports.',
73
73
  },
74
74
  {
75
75
  type: 'code',
76
76
  lang: 'bash',
77
- label: 'Dense and JSON modes',
78
- code: `astryx docs migration --dense
77
+ label: 'Short and JSON modes',
78
+ code: `astryx docs migration --full --detail brief
79
79
  astryx component Button --json`,
80
80
  },
81
81
  ],
@@ -110,21 +110,7 @@ export function AppRoot({children}: {children: React.ReactNode}) {
110
110
  },
111
111
  {
112
112
  type: 'prose',
113
- text: 'When Tailwind remains in the app, declare layer order once in the global CSS file. design system reset and theme CSS should load before Tailwind utilities so migrated components keep design system defaults while legacy utility classes still work.',
114
- },
115
- {
116
- type: 'code',
117
- lang: 'css',
118
- label: 'Tailwind v4 coexistence',
119
- code: `@layer reset, theme, base, astryx-base, astryx-theme, components, utilities;
120
-
121
- @import "tailwindcss/theme.css" layer(theme);
122
- @import "tailwindcss/preflight.css" layer(base);
123
- @import "@astryxdesign/core/reset.css";
124
- @import "@astryxdesign/core/astryx.css";
125
- @import "@astryxdesign/theme-neutral/theme.css";
126
- @import "@astryxdesign/core/tailwind-theme.css";
127
- @import "tailwindcss/utilities.css" layer(utilities);`,
113
+ text: 'When Tailwind remains in the app, declare layer order once in the global CSS file. Load the Astryx reset and theme CSS before Tailwind utilities so migrated components keep design system defaults while legacy utility classes still work. On Tailwind v4, use the imports and layer order in the Tailwind section of {@link generic:styling-libraries}.',
128
114
  },
129
115
  {
130
116
  type: 'prose',
@@ -149,7 +135,8 @@ export function AppRoot({children}: {children: React.ReactNode}) {
149
135
  ],
150
136
  },
151
137
  {
152
- title: 'Cascade Layer Safety',
138
+ id: 'cascade-layer-safety',
139
+ title: 'Why resets break cascade layers',
153
140
  content: [
154
141
  {
155
142
  type: 'prose',
@@ -166,6 +153,16 @@ export function AppRoot({children}: {children: React.ReactNode}) {
166
153
  code: `/* was: @import "./legacy-reset.css"; (unlayered: beats every layer) */
167
154
  @import "./legacy-reset.css" layer(reset);`,
168
155
  },
156
+ {
157
+ type: 'prose',
158
+ text: 'Before building screens, check every stylesheet against Cascade layer audit.',
159
+ },
160
+ ],
161
+ },
162
+ {
163
+ id: 'layer-audit',
164
+ title: 'Cascade layer audit',
165
+ content: [
169
166
  {
170
167
  type: 'prose',
171
168
  text: 'Audit the layers around the design system with this checklist before building screens.',
@@ -310,6 +307,7 @@ if (getComputedStyle(button).paddingInline === '0px') {
310
307
  ],
311
308
  },
312
309
  {
310
+ id: 'command-palette',
313
311
  title: 'Command Palette, Settings, and Theme',
314
312
  content: [
315
313
  {
@@ -33,6 +33,10 @@ export const docs = {
33
33
  title: 'Duration',
34
34
  category: 'foundations',
35
35
  content: [
36
+ {
37
+ type: 'prose',
38
+ text: 'Nine duration tokens in fast, medium, and slow bands.',
39
+ },
36
40
  {
37
41
  type: 'token-ref',
38
42
  topic: 'tokens',
@@ -44,6 +48,10 @@ export const docs = {
44
48
  title: 'Easing',
45
49
  category: 'foundations',
46
50
  content: [
51
+ {
52
+ type: 'prose',
53
+ text: 'One easing curve, `--ease-standard`.',
54
+ },
47
55
  {
48
56
  type: 'token-ref',
49
57
  topic: 'tokens',
@@ -101,19 +109,24 @@ export const docs = {
101
109
  content: [
102
110
  {
103
111
  type: 'prose',
104
- text: 'Some users experience motion sensitivity; animation that feels polished to one person can cause discomfort for another. Components should honor the operating system\'s reduced motion setting. When it\'s enabled, replace animations with instant state changes.',
112
+ text: 'Some users experience motion sensitivity; animation that feels polished to one person can cause discomfort for another. Astryx components already switch to instant changes when the OS reduced-motion setting is on. Do the same in your own animations with `@media (prefers-reduced-motion: reduce)`.',
105
113
  },
106
114
  ],
107
115
  },
108
116
  {
109
- title: 'Usage',
117
+ id: 'usage',
118
+ title: 'Animate with motion tokens',
110
119
  category: 'foundations',
111
120
  content: [
121
+ {
122
+ type: 'prose',
123
+ text: 'Set transition durations and easing from the motion tokens, so a theme that retunes motion retunes your animations too.',
124
+ },
112
125
  {
113
126
  type: 'code',
114
127
  lang: 'tsx',
115
128
  label: 'Applying motion tokens',
116
- code: `import {durationVars, easeVars} from '@astryxdesign/core';
129
+ code: `import {durationVars, easeVars} from '@astryxdesign/core/theme/tokens.stylex';
117
130
 
118
131
  const styles = stylex.create({
119
132
  fadeIn: {
@@ -5,10 +5,10 @@
5
5
  export const docsDense = {
6
6
  description: 'core design principles + rules for the design system',
7
7
  sections: [
8
- { section: 'Design Philosophy', title: 'Philosophy', content: [{ type: 'list', items: ['components over primitives', 'semantic tokens over hardcoded values', 'theme-agnostic code', 'open internals'] }] },
9
- { section: 'Rules', title: 'Rules', content: [{ type: 'list', items: ['use components', 'frame-first layout: shell + region budgets before content (astryx docs layout)', 'dense data = rows (Table, List/Item) not Cards; Card = widgets/galleries/settings groups', 'StyleX or Tailwind for styling', 'semantic tokens only', 'CSS vars for colors', 'controlled form inputs', 'useLinkComponent() for navigation'] }] },
10
- { section: 'Styling Approach', title: 'Styling', content: [{ type: 'prose', text: 'xstyle prop for component overrides. StyleX or Tailwind for layout. See astryx docs styling.' }] },
11
- { section: 'Anti-Patterns', title: 'Anti-Patterns', content: [{ type: 'list', items: ['no inline styles on raw elements', 'no hardcoded colors — use tokens or Tailwind semantic classes', 'no hardcoded spacing', 'no hardcoded <a> — use useLinkComponent()', 'no Card-wrapped list items — frame first, rows for dense data (astryx docs layout)', 'no decorative Badge — StatusDot/Token for status', 'read docs before inventing props'] }] },
12
- { section: 'Design Tokens', title: 'Tokens', content: [{ type: 'prose', text: 'run astryx docs tokens for full reference' }] },
8
+ { section: 'Design Philosophy', title: 'Philosophy', content: [{ type: 'prose', text: 'consistency, adaptability, DX. core ideas:' }, { type: 'list', items: ['components over primitives', 'semantic tokens over hardcoded values', 'theme-agnostic code', 'open internals'] }] },
9
+ { section: 'Rules', title: 'Rules', content: [{ type: 'prose', text: '8 rules for on-system app code.' }, { type: 'list', items: ['use components', 'frame-first layout: shell + region budgets before content ({@link generic:layout})', 'dense data = rows (Table, List/Item) not Cards; Card = widgets/galleries/settings groups', 'StyleX or Tailwind for styling ({@link generic:styling})', 'semantic tokens only ({@link generic:tokens})', 'CSS vars for colors', 'controlled form inputs', 'useLinkComponent() for navigation'] }] },
10
+ { section: 'Styling Approach', title: 'Styling', content: [{ type: 'prose', text: 'xstyle prop for component overrides. StyleX or Tailwind for layout.' }, { type: 'prose', text: 'full guide: {@link generic:styling}' }] },
11
+ { section: 'Anti-Patterns', title: 'Anti-Patterns', content: [{ type: 'prose', text: 'what breaks theming, routing, or layout, and the fix.' }, { type: 'list', items: ['no inline styles on raw elements', 'no hardcoded colors — use tokens or Tailwind semantic classes', 'no hardcoded spacing', 'no hardcoded <a> — use useLinkComponent()', 'no Card-wrapped list items — frame first, rows for dense data ({@link generic:layout})', 'no decorative Badge — StatusDot/Token for status', 'read docs before inventing props'] }] },
12
+ { section: 'Design Tokens', title: 'Tokens', content: [{ type: 'prose', text: 'full token reference: {@link generic:tokens}' }] },
13
13
  ],
14
14
  };
@@ -34,6 +34,10 @@ export const docs = {
34
34
  title: 'Rules',
35
35
  category: 'guide',
36
36
  content: [
37
+ {
38
+ type: 'prose',
39
+ text: 'Eight rules that keep app code on-system.',
40
+ },
37
41
  {
38
42
  type: 'list',
39
43
  style: 'ordered',
@@ -68,6 +72,10 @@ export const docs = {
68
72
  title: 'Anti-Patterns',
69
73
  category: 'guide',
70
74
  content: [
75
+ {
76
+ type: 'prose',
77
+ text: 'Patterns that break theming, routing, or layout, and what to use instead.',
78
+ },
71
79
  {
72
80
  type: 'list',
73
81
  style: 'dont',
@@ -3,12 +3,12 @@
3
3
  /** @type {import('@astryxdesign/cli/authoring').ReferenceTranslationDoc} */
4
4
 
5
5
  export const docsZh = {
6
- description: 'XDS 核心设计原则和规则。',
6
+ description: 'Astryx 核心设计原则和规则。',
7
7
  sections: [
8
- { section: 'Design Philosophy', title: '设计哲学', content: [{ type: 'list', items: ['组件优于原始元素 — 优先使用 XDS 组件', '语义化令牌优于硬编码值', '主题无关的代码 — 深色模式自动生效', '开放的内部机制 — 所有基础组件均可导出和组合'] }] },
9
- { section: 'Rules', title: '规则', content: [{ type: 'list', items: ['所有支持的场景都使用 XDS 组件', '布局采用框架优先:先选定外壳并规划区域尺寸,再编写内容(见 astryx docs layout)', '密集数据使用行(Table、List/Item)通栏渲染;Card 用于小部件、画廊和设置分组', '使用 StyleX 或 Tailwind 进行样式设置', '使用语义化令牌,不使用硬编码值', '使用 CSS 变量设置颜色,不使用十六进制值', '表单输入为受控组件(value + onChange)', '使用 useLinkComponent() 进行导航'] }] },
10
- { section: 'Styling Approach', title: '样式方法', content: [{ type: 'prose', text: '组件覆盖使用 xstyle 属性。布局使用 StyleX 或 Tailwind。详见 astryx docs styling。' }] },
11
- { section: 'Anti-Patterns', title: '反模式', content: [{ type: 'list', items: ['不要在原始元素上使用内联样式', '不要硬编码颜色 — 使用令牌或 Tailwind 语义类', '不要硬编码间距', '不要硬编码 <a> 元素 — 使用 useLinkComponent()', '不要把每个列表项都包在 Card 里 — 先定框架,密集数据用行渲染(见 astryx docs layout)', '不要把 Badge 当装饰 — 状态请使用 StatusDot 或 Token', '不要自创属性。先阅读组件文档'] }] },
12
- { section: 'Design Tokens', title: '设计令牌', content: [{ type: 'prose', text: '运行 astryx docs tokens 查看完整参考' }] },
8
+ { section: 'Design Philosophy', title: '设计哲学', content: [{ type: 'prose', text: '一个注重一致性、适应性和开发者体验的设计系统。核心理念:' }, { type: 'list', items: ['组件优于原始元素 — 优先使用 Astryx 组件', '语义化令牌优于硬编码值', '主题无关的代码 — 深色模式自动生效', '开放的内部机制 — 所有基础组件均可导出和组合'] }] },
9
+ { section: 'Rules', title: '规则', content: [{ type: 'prose', text: '让应用代码保持在设计系统之内的八条规则。' }, { type: 'list', items: ['所有支持的场景都使用 Astryx 组件', '布局采用框架优先:先选定外壳并规划区域尺寸,再编写内容(见 {@link generic:layout})', '密集数据使用行(Table、List/Item)通栏渲染;Card 用于小部件、画廊和设置分组', '使用 StyleX 或 Tailwind 进行样式设置(见 {@link generic:styling})', '使用语义化令牌,不使用硬编码值(见 {@link generic:tokens})', '使用 CSS 变量设置颜色,不使用十六进制值', '表单输入为受控组件(value + onChange)', '使用 useLinkComponent() 进行导航'] }] },
10
+ { section: 'Styling Approach', title: '样式方法', content: [{ type: 'prose', text: '组件覆盖使用 xstyle 属性。布局使用 StyleX 或 Tailwind。' }, { type: 'prose', text: '完整指南见 {@link generic:styling}。' }] },
11
+ { section: 'Anti-Patterns', title: '反模式', content: [{ type: 'prose', text: '会破坏主题、路由或布局的写法,以及应改用的做法。' }, { type: 'list', items: ['不要在原始元素上使用内联样式', '不要硬编码颜色 — 使用令牌或 Tailwind 语义类', '不要硬编码间距', '不要硬编码 <a> 元素 — 使用 useLinkComponent()', '不要把每个列表项都包在 Card 里 — 先定框架,密集数据用行渲染(见 {@link generic:layout})', '不要把 Badge 当装饰 — 状态请使用 StatusDot 或 Token', '不要自创属性。先阅读组件文档'] }] },
12
+ { section: 'Design Tokens', title: '设计令牌', content: [{ type: 'prose', text: '完整令牌参考见 {@link generic:tokens}。' }] },
13
13
  ],
14
14
  };
@@ -25,6 +25,10 @@ export const docs = {
25
25
  title: 'Radius Scale',
26
26
  category: 'foundations',
27
27
  content: [
28
+ {
29
+ type: 'prose',
30
+ text: 'Seven radius tokens, from 0px to 9999px.',
31
+ },
28
32
  {
29
33
  type: 'token-ref',
30
34
  topic: 'tokens',
@@ -38,14 +42,15 @@ export const docs = {
38
42
  content: [
39
43
  {
40
44
  type: 'prose',
41
- text: 'When a rounded container has padding, inner elements need a smaller radius to appear concentric. Components like Card handle this automatically; the inner radius is computed as max(0, outerRadius - padding).',
45
+ text: 'Inside a padded, rounded container, give nested elements a radius of outer radius minus padding so the curves stay concentric. Card does not do this for your content.',
42
46
  },
43
47
  {
44
48
  type: 'code',
45
49
  lang: 'css',
46
50
  label: 'Concentric radius formula',
47
- code: `/* Automatic in Astryx Card */
48
- --card-concentric-radius: max(0px, calc(var(--_card-radius) - var(--card-padding)));`,
51
+ code: `.inner {
52
+ border-radius: max(0px, calc(var(--radius-container) - var(--spacing-4)));
53
+ }`,
49
54
  },
50
55
  ],
51
56
  },
@@ -8,6 +8,7 @@ export const docs = {
8
8
  category: 'foundations',
9
9
  description:
10
10
  'Spacing scale tokens for padding, gap, and margin: the rhythmic foundation of design system layouts.',
11
+ keywords: ['padding', 'margin', 'gap'],
11
12
  tokenCategory: 'spacing',
12
13
 
13
14
  sections: [
@@ -25,6 +26,10 @@ export const docs = {
25
26
  title: 'Scale',
26
27
  category: 'foundations',
27
28
  content: [
29
+ {
30
+ type: 'prose',
31
+ text: 'Fifteen spacing tokens, from 0px to 48px.',
32
+ },
28
33
  {
29
34
  type: 'token-ref',
30
35
  topic: 'tokens',
@@ -38,7 +43,7 @@ export const docs = {
38
43
  content: [
39
44
  {
40
45
  type: 'prose',
41
- text: 'Most components accept a `gap` prop using step values (0 through 12). For custom layouts, use the spacing tokens directly in StyleX.',
46
+ text: 'Stack, HStack, VStack, Grid, Toolbar, OverflowList, and ChatMessageList take a `gap` step: 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, or 10 (×4px). Carousel takes the steps from 0 to 4. For custom layouts, use the spacing tokens in StyleX.',
42
47
  },
43
48
  {
44
49
  type: 'code',
@@ -48,7 +53,7 @@ export const docs = {
48
53
  <Stack gap={4}>{/* 16px gap */}</Stack>
49
54
 
50
55
  // Via StyleX tokens (custom layouts)
51
- import {spacingVars} from '@astryxdesign/core';
56
+ import {spacingVars} from '@astryxdesign/core/theme/tokens.stylex';
52
57
 
53
58
  const styles = stylex.create({
54
59
  custom: {