@astryxdesign/cli 0.6.4-canary.f0355e3 → 0.6.4

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 (331) hide show
  1. package/README.md +96 -99
  2. package/api/build/build.doc.mjs +1 -6
  3. package/api/build/build.test.mjs +0 -22
  4. package/api/build/kit/kit.mjs +5 -44
  5. package/api/component/_adapter.d.mts +0 -25
  6. package/api/component/_adapter.mjs +5 -59
  7. package/api/component/component.d.mts +3 -6
  8. package/api/component/component.doc.mjs +17 -37
  9. package/api/component/component.mjs +9 -249
  10. package/api/component/component.type.d.mts +0 -25
  11. package/api/component/component.type.mjs +0 -44
  12. package/api/discover/_adapter.d.mts +6 -114
  13. package/api/discover/_adapter.mjs +17 -372
  14. package/api/discover/detail/detail.d.mts +6 -18
  15. package/api/discover/detail/detail.mjs +13 -67
  16. package/api/discover/detail/detail.test.mjs +0 -85
  17. package/api/discover/discover.d.mts +9 -3
  18. package/api/discover/discover.doc.mjs +18 -61
  19. package/api/discover/discover.mjs +36 -220
  20. package/api/discover/discover.test.mjs +2 -11
  21. package/api/discover/discover.type.d.mts +8 -147
  22. package/api/discover/discover.type.mjs +12 -102
  23. package/api/discover/list/list.d.mts +6 -20
  24. package/api/discover/list/list.mjs +12 -45
  25. package/api/discover/list/list.test.mjs +0 -46
  26. package/api/discover/search/search.d.mts +16 -18
  27. package/api/discover/search/search.mjs +56 -102
  28. package/api/discover/search/search.test.mjs +10 -144
  29. package/api/docs/_adapter.d.mts +3 -8
  30. package/api/docs/_adapter.mjs +6 -14
  31. package/api/docs/docOverlays.test.mjs +1 -27
  32. package/api/docs/docs.doc.mjs +2 -2
  33. package/api/docs/docs.test.mjs +243 -0
  34. package/api/docs/integration-tree.test.mjs +555 -0
  35. package/api/docs/integrationDocs.test.mjs +314 -0
  36. package/api/doctor/doctor.d.mts +3 -8
  37. package/api/doctor/doctor.doc.mjs +8 -17
  38. package/api/doctor/doctor.mjs +9 -90
  39. package/api/doctor/doctor.test.mjs +10 -122
  40. package/api/doctor/doctor.type.d.mts +1 -1
  41. package/api/doctor/doctor.type.mjs +1 -1
  42. package/api/gap-report/gap-report.doc.mjs +10 -19
  43. package/api/hook/hook.doc.mjs +3 -6
  44. package/api/index.d.mts +2 -1
  45. package/api/index.mjs +5 -5
  46. package/api/init/init.doc.mjs +12 -17
  47. package/api/integration/add-helpers.d.mts +2 -5
  48. package/api/integration/add-helpers.mjs +9 -36
  49. package/api/integration/add-theme.mjs +1 -22
  50. package/api/integration/add-theme.test.mjs +0 -34
  51. package/api/integration/authoring-checks.mjs +2 -2
  52. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  53. package/api/integration/pack-check.mjs +9 -82
  54. package/api/integration/pack-check.test.mjs +0 -90
  55. package/api/integration/pack-check.type.mjs +1 -1
  56. package/api/json/assertResponse.doc.mjs +1 -1
  57. package/api/json/index.ts +1 -0
  58. package/api/json/isError.doc.mjs +1 -1
  59. package/api/layout/_adapter.d.mts +34 -0
  60. package/api/layout/_adapter.mjs +148 -0
  61. package/api/layout/check/check.d.mts +16 -0
  62. package/api/layout/check/check.mjs +40 -0
  63. package/api/layout/expand/expand.d.mts +22 -0
  64. package/api/layout/expand/expand.mjs +155 -0
  65. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  66. package/api/layout/grammar/grammar.d.mts +13 -0
  67. package/api/layout/grammar/grammar.mjs +87 -0
  68. package/api/layout/layout.d.mts +6 -0
  69. package/api/layout/layout.mjs +17 -0
  70. package/api/layout/layout.test.mjs +297 -0
  71. package/api/layout/layout.type.d.mts +89 -0
  72. package/api/layout/layout.type.mjs +103 -0
  73. package/api/layout/layoutCheck.doc.d.mts +11 -0
  74. package/api/layout/layoutCheck.doc.mjs +85 -0
  75. package/api/layout/layoutExpand.doc.d.mts +11 -0
  76. package/api/layout/layoutExpand.doc.mjs +107 -0
  77. package/api/layout/layoutGrammar.doc.d.mts +11 -0
  78. package/api/layout/layoutGrammar.doc.mjs +57 -0
  79. package/api/search/search.d.mts +1 -27
  80. package/api/search/search.doc.mjs +2 -2
  81. package/api/search/search.mjs +16 -228
  82. package/api/search/search.test.mjs +512 -0
  83. package/api/swizzle/swizzle.doc.mjs +5 -7
  84. package/api/template/copy/copy.mjs +1 -1
  85. package/api/template/copy/copy.test.mjs +0 -9
  86. package/api/template/template-integration.test.mjs +65 -1
  87. package/api/template/template.doc.mjs +1 -2
  88. package/api/template/template.mjs +1 -1
  89. package/api/theme/add/add.mjs +25 -17
  90. package/api/theme/add/add.staging.test.mjs +23 -40
  91. package/api/theme/build/build.family.test.mjs +12 -7
  92. package/api/theme/build/build.mjs +18 -8
  93. package/api/theme/generateTonalPalette.doc.mjs +2 -1
  94. package/api/theme/listThemes.doc.mjs +1 -1
  95. package/api/theme/themeAdd.doc.mjs +10 -9
  96. package/api/theme/themeBuild.doc.mjs +13 -13
  97. package/api/theme/themeList.doc.mjs +1 -1
  98. package/api/theme/themeListAvailable.doc.mjs +1 -2
  99. package/api/theme/themePaletteGenerate.doc.mjs +8 -15
  100. package/api/theme/themeTargets.doc.mjs +2 -3
  101. package/api/theme/themeTemplate.doc.mjs +1 -2
  102. package/api/upgrade/run/run.mjs +4 -6
  103. package/api/upgrade/upgrade.doc.mjs +22 -24
  104. package/api/upgrade/upgrade.type.mjs +2 -2
  105. package/assets/codemods/__tests__/runner.test.mjs +1 -3
  106. package/assets/codemods/integration-runner.mjs +3 -3
  107. package/assets/codemods/runner.mjs +4 -5
  108. package/assets/docs/README.md +2 -4
  109. package/assets/docs/browser-support.doc.mjs +11 -11
  110. package/assets/docs/color.doc.mjs +2 -8
  111. package/assets/docs/elevation.doc.mjs +4 -6
  112. package/assets/docs/getting-started.doc.mjs +16 -5
  113. package/assets/docs/icons.doc.mjs +21 -2
  114. package/assets/docs/illustrations.doc.mjs +15 -7
  115. package/assets/docs/internationalization.doc.mjs +5 -7
  116. package/assets/docs/layout.doc.dense.mjs +82 -130
  117. package/assets/docs/layout.doc.mjs +77 -133
  118. package/assets/docs/migration.doc.mjs +21 -19
  119. package/assets/docs/motion.doc.mjs +3 -16
  120. package/assets/docs/principles.doc.dense.mjs +5 -5
  121. package/assets/docs/principles.doc.mjs +0 -8
  122. package/assets/docs/principles.doc.zh.mjs +6 -6
  123. package/assets/docs/shape.doc.mjs +3 -8
  124. package/assets/docs/spacing.doc.mjs +2 -7
  125. package/assets/docs/styling-libraries.doc.mjs +2 -6
  126. package/assets/docs/styling.doc.mjs +23 -19
  127. package/assets/docs/theme.doc.dense.mjs +18 -58
  128. package/assets/docs/theme.doc.mjs +46 -56
  129. package/assets/docs/theme.doc.zh.mjs +8 -9
  130. package/assets/docs/tokens.doc.dense.mjs +2 -2
  131. package/assets/docs/tokens.doc.mjs +8 -389
  132. package/assets/docs/tokens.doc.zh.mjs +2 -2
  133. package/assets/docs/tree/integrations.doc.mjs +451 -25
  134. package/assets/docs/tree/integrations.test.mjs +62 -0
  135. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  136. package/assets/docs/typography.doc.mjs +4 -24
  137. package/assets/docs/working-with-ai.doc.mjs +22 -30
  138. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  139. package/authoring/config/config.doc.mjs +2 -10
  140. package/authoring/config/parse.d.mts +0 -2
  141. package/authoring/config/parse.mjs +0 -19
  142. package/authoring/config/parse.test.mjs +0 -8
  143. package/authoring/config/type.ts +2 -13
  144. package/authoring/doctypes/_schema.d.mts +2 -3
  145. package/authoring/doctypes/_schema.mjs +0 -6
  146. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  147. package/authoring/doctypes/base/type.ts +2 -4
  148. package/authoring/doctypes/command/command.doc.mjs +1 -1
  149. package/authoring/doctypes/command/type.ts +1 -1
  150. package/authoring/doctypes/component/component.doc.mjs +0 -6
  151. package/authoring/doctypes/component/type.ts +0 -8
  152. package/authoring/doctypes/reference/reference.doc.mjs +0 -7
  153. package/authoring/doctypes/reference/type.ts +0 -5
  154. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  155. package/authoring/doctypes/template/template.doc.mjs +1 -1
  156. package/authoring/doctypes/template/type.ts +2 -2
  157. package/authoring/index.d.mts +0 -1
  158. package/authoring/index.d.ts +0 -10
  159. package/authoring/index.mjs +0 -1
  160. package/authoring/integration/integration.doc.mjs +10 -12
  161. package/clients/cli/command-result-coverage.test.mjs +7 -7
  162. package/clients/cli/commands/component/index.mjs +55 -152
  163. package/clients/cli/commands/component-ownership.test.mjs +0 -89
  164. package/clients/cli/commands/component.doc.mjs +9 -27
  165. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  166. package/clients/cli/commands/discover.doc.mjs +9 -53
  167. package/clients/cli/commands/discover.mjs +118 -393
  168. package/clients/cli/commands/docs.doc.mjs +1 -1
  169. package/clients/cli/commands/docs.mjs +17 -60
  170. package/clients/cli/commands/docs.test.mjs +294 -0
  171. package/clients/cli/commands/doctor-integration-docs.doc.mjs +2 -3
  172. package/clients/cli/commands/doctor-integration.test.mjs +0 -53
  173. package/clients/cli/commands/doctor.doc.mjs +1 -3
  174. package/clients/cli/commands/doctor.mjs +5 -49
  175. package/clients/cli/commands/gap-report.doc.mjs +9 -10
  176. package/clients/cli/commands/init.doc.mjs +6 -9
  177. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  178. package/clients/cli/commands/integration-authoring.test.mjs +10 -61
  179. package/clients/cli/commands/integration-pack.doc.mjs +9 -5
  180. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  181. package/clients/cli/commands/integration.doc.mjs +4 -4
  182. package/clients/cli/commands/integration.mjs +43 -74
  183. package/clients/cli/commands/layout-check.doc.mjs +65 -0
  184. package/clients/cli/commands/layout-expand.doc.mjs +83 -0
  185. package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
  186. package/clients/cli/commands/layout.doc.mjs +34 -0
  187. package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
  188. package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
  189. package/clients/cli/commands/layout.mjs +275 -0
  190. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  191. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  192. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  193. package/clients/cli/commands/manifest.doc.mjs +1 -1
  194. package/clients/cli/commands/search.doc.mjs +3 -10
  195. package/clients/cli/commands/search.mjs +2 -21
  196. package/clients/cli/commands/search.test.mjs +4 -21
  197. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  198. package/clients/cli/commands/template.doc.mjs +1 -1
  199. package/clients/cli/commands/text-json-parity.test.mjs +16 -5
  200. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  201. package/clients/cli/commands/theme-palette-generate.doc.mjs +2 -3
  202. package/clients/cli/commands/theme-palette.doc.mjs +2 -1
  203. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  204. package/clients/cli/commands/theme.doc.mjs +1 -2
  205. package/clients/cli/commands/upgrade.doc.mjs +3 -62
  206. package/clients/cli/index.mjs +10 -28
  207. package/clients/cli/lib/define-command.mjs +4 -28
  208. package/clients/cli/lib/define-command.test.mjs +0 -54
  209. package/clients/cli/lib/exit-codes.test.mjs +9 -18
  210. package/clients/cli/lib/json-shim.mjs +14 -24
  211. package/clients/cli/lib/json-shim.test.mjs +20 -6
  212. package/clients/cli/lib/manifest.mjs +13 -18
  213. package/clients/cli/lib/manifest.test.mjs +2 -5
  214. package/foundation/agent-docs/agent-docs.mjs +1 -1
  215. package/foundation/agent-docs/agent-docs.test.mjs +1159 -0
  216. package/foundation/discovery/authoring-self-docs.mjs +0 -1
  217. package/foundation/discovery/authoring-self-docs.test.mjs +2 -6
  218. package/foundation/discovery/cli-self-docs.mjs +2 -16
  219. package/foundation/discovery/cli-self-docs.test.mjs +0 -20
  220. package/foundation/discovery/docs-discovery.mjs +1 -5
  221. package/foundation/discovery/docs-discovery.test.mjs +0 -21
  222. package/foundation/discovery/docs-section-key.d.mts +1 -1
  223. package/foundation/discovery/docs-section-key.mjs +1 -1
  224. package/foundation/discovery/template-adapter.mjs +1 -1
  225. package/foundation/doc-compiler/doc-loads.test.mjs +14 -3
  226. package/foundation/doc-compiler/tree.d.mts +0 -4
  227. package/foundation/doc-compiler/tree.mjs +1 -6
  228. package/foundation/doc-compiler/tree.test.mjs +598 -0
  229. package/foundation/integrations/cli-requirement.d.mts +6 -26
  230. package/foundation/integrations/cli-requirement.mjs +11 -46
  231. package/foundation/integrations/cli-requirement.test.mjs +2 -7
  232. package/foundation/integrations/contribution-inventory.mjs +1 -1
  233. package/foundation/integrations/integrations.d.mts +1 -14
  234. package/foundation/integrations/integrations.mjs +1 -41
  235. package/foundation/integrations/integrations.test.mjs +0 -31
  236. package/foundation/response/error-codes.doc.mjs +8 -6
  237. package/foundation/response/error-codes.test.mjs +5 -30
  238. package/foundation/response/response-types.doc.d.mts +3 -4
  239. package/foundation/response/response-types.doc.mjs +27 -40
  240. package/foundation/response/response-types.doc.test.mjs +0 -23
  241. package/foundation/response/response.doc.mjs +10 -11
  242. package/foundation/xle/browser.d.mts +3 -3
  243. package/foundation/xle/browser.mjs +3 -3
  244. package/foundation/xle/expand.mjs +2 -2
  245. package/foundation/xle/parse.mjs +1 -1
  246. package/foundation/xle/print.mjs +2 -2
  247. package/foundation/xle/splice.mjs +1 -1
  248. package/package.json +9 -9
  249. package/api/discover/_adapter.test.mjs +0 -215
  250. package/api/discover/_catalog-view.d.mts +0 -115
  251. package/api/discover/_catalog-view.mjs +0 -203
  252. package/api/discover/_catalog-view.test.mjs +0 -128
  253. package/api/discover/detail/item/item.d.mts +0 -26
  254. package/api/discover/detail/item/item.mjs +0 -78
  255. package/api/discover/detail/item/item.test.mjs +0 -73
  256. package/api/integration/pack-check.lifecycle-output.test.mjs +0 -107
  257. package/api/theme/add/add.rollback.test.mjs +0 -158
  258. package/api/theme/build/build.rollback.test.mjs +0 -148
  259. package/api/upgrade/run/files-changed.test.mjs +0 -111
  260. package/assets/codemods/file-count.test.mjs +0 -163
  261. package/assets/docs/tree/add-a-component.doc.mjs +0 -75
  262. package/assets/docs/tree/add-a-theme.doc.mjs +0 -85
  263. package/assets/docs/tree/add-a-topic.doc.mjs +0 -144
  264. package/assets/docs/tree/agent-guidance.doc.mjs +0 -138
  265. package/assets/docs/tree/block-template.doc.mjs +0 -130
  266. package/assets/docs/tree/build-the-template.doc.mjs +0 -28
  267. package/assets/docs/tree/building-blocks.doc.mjs +0 -46
  268. package/assets/docs/tree/check-your-docs.doc.mjs +0 -137
  269. package/assets/docs/tree/checks.doc.mjs +0 -119
  270. package/assets/docs/tree/codemods.doc.mjs +0 -147
  271. package/assets/docs/tree/component-family.doc.mjs +0 -113
  272. package/assets/docs/tree/component-imports.doc.mjs +0 -69
  273. package/assets/docs/tree/component-lookups.doc.mjs +0 -149
  274. package/assets/docs/tree/components.doc.mjs +0 -23
  275. package/assets/docs/tree/configuration.doc.mjs +0 -23
  276. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +0 -182
  277. package/assets/docs/tree/define-the-theme.doc.mjs +0 -118
  278. package/assets/docs/tree/describe-the-component.doc.mjs +0 -57
  279. package/assets/docs/tree/docs.doc.mjs +0 -21
  280. package/assets/docs/tree/document-the-template.doc.mjs +0 -28
  281. package/assets/docs/tree/document-the-theme.doc.mjs +0 -68
  282. package/assets/docs/tree/export-template-assets.doc.mjs +0 -147
  283. package/assets/docs/tree/extend-or-replace.doc.mjs +0 -103
  284. package/assets/docs/tree/fonts-and-assets.doc.mjs +0 -106
  285. package/assets/docs/tree/generate-a-palette.doc.mjs +0 -66
  286. package/assets/docs/tree/grade-template-with-agent.doc.mjs +0 -105
  287. package/assets/docs/tree/help.doc.mjs +0 -16
  288. package/assets/docs/tree/links.doc.mjs +0 -98
  289. package/assets/docs/tree/package-and-test.doc.mjs +0 -32
  290. package/assets/docs/tree/page-template.doc.mjs +0 -71
  291. package/assets/docs/tree/publishing.doc.mjs +0 -111
  292. package/assets/docs/tree/quick-start.doc.mjs +0 -272
  293. package/assets/docs/tree/replace-a-core-component.doc.mjs +0 -104
  294. package/assets/docs/tree/replace-a-core-template.doc.mjs +0 -172
  295. package/assets/docs/tree/sections-and-placement.doc.mjs +0 -108
  296. package/assets/docs/tree/see-it-in-an-app.doc.mjs +0 -59
  297. package/assets/docs/tree/ship.doc.mjs +0 -16
  298. package/assets/docs/tree/short-and-findable.doc.mjs +0 -108
  299. package/assets/docs/tree/single-component.doc.mjs +0 -165
  300. package/assets/docs/tree/start-a-template.doc.mjs +0 -143
  301. package/assets/docs/tree/subcomponent.doc.mjs +0 -115
  302. package/assets/docs/tree/template-assets.doc.mjs +0 -64
  303. package/assets/docs/tree/template-doc-overview.doc.mjs +0 -109
  304. package/assets/docs/tree/template-fonts.doc.mjs +0 -102
  305. package/assets/docs/tree/template-grading-rubric.doc.mjs +0 -452
  306. package/assets/docs/tree/template-icons.doc.mjs +0 -97
  307. package/assets/docs/tree/template-images-media.doc.mjs +0 -127
  308. package/assets/docs/tree/template-styles.doc.mjs +0 -93
  309. package/assets/docs/tree/templates.doc.mjs +0 -34
  310. package/assets/docs/tree/test-in-an-app.doc.mjs +0 -115
  311. package/assets/docs/tree/test-template-in-app.doc.mjs +0 -128
  312. package/assets/docs/tree/themes.doc.mjs +0 -39
  313. package/assets/docs/tree/troubleshooting.doc.mjs +0 -149
  314. package/assets/docs/tree/upgrading.doc.mjs +0 -103
  315. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +0 -51
  316. package/assets/docs/tree/verify-packed-template.doc.mjs +0 -77
  317. package/assets/docs/tree/versioning.doc.mjs +0 -161
  318. package/assets/docs/tree/write-good-templates.doc.mjs +0 -64
  319. package/assets/docs/tree/write-the-template-file.doc.mjs +0 -154
  320. package/authoring/discover/discover.doc.d.mts +0 -13
  321. package/authoring/discover/discover.doc.mjs +0 -138
  322. package/authoring/discover/parse.d.mts +0 -24
  323. package/authoring/discover/parse.mjs +0 -128
  324. package/authoring/discover/parse.test.mjs +0 -124
  325. package/authoring/discover/type.ts +0 -87
  326. package/clients/cli/commands/component-batch.test.mjs +0 -341
  327. package/clients/cli/commands/discover.sources.test.mjs +0 -267
  328. package/clients/cli/commands/integration-verify.doc.mjs +0 -22
  329. package/clients/cli/lib/parse-error-format.test.mjs +0 -81
  330. package/foundation/response/batch.type.d.mts +0 -33
  331. package/foundation/response/batch.type.mjs +0 -34
@@ -34,40 +34,9 @@ export const docs = {
34
34
  ],
35
35
  },
36
36
  {
37
- id: 'scaffold',
38
37
  title: 'Scaffold',
39
38
  content: [
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: [
39
+ {type: 'heading', level: 3, text: 'Shell'},
71
40
  {
72
41
  type: 'prose',
73
42
  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.',
@@ -106,12 +75,8 @@ export const docs = {
106
75
  type: 'prose',
107
76
  text: 'Verify: every region has a width budget, a fill-or-capped decision, and a container policy written down before any content exists.',
108
77
  },
109
- ],
110
- },
111
- {
112
- id: 'navigation',
113
- title: 'Navigation',
114
- content: [
78
+
79
+ {type: 'heading', level: 3, text: 'Navigation'},
115
80
  {
116
81
  type: 'prose',
117
82
  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.',
@@ -143,47 +108,35 @@ export const docs = {
143
108
  type: 'prose',
144
109
  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.',
145
110
  },
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
- },
111
+
112
+ {type: 'heading', level: 3, text: 'Best practices'},
156
113
  {
157
114
  type: 'list',
158
115
  style: 'do',
159
116
  items: [
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',
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',
165
120
  ],
166
121
  },
167
122
  {
168
123
  type: 'list',
169
124
  style: 'dont',
170
125
  items: [
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',
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',
179
132
  ],
180
133
  },
181
134
  ],
182
135
  },
183
136
  {
184
- id: 'type-hierarchy',
185
- title: 'Type hierarchy',
137
+ title: 'Structure',
186
138
  content: [
139
+ {type: 'heading', level: 3, text: 'Type hierarchy'},
187
140
  {
188
141
  type: 'prose',
189
142
  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.',
@@ -217,12 +170,8 @@ export const docs = {
217
170
  type: 'prose',
218
171
  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.',
219
172
  },
220
- ],
221
- },
222
- {
223
- id: 'containers',
224
- title: 'Card or rows',
225
- content: [
173
+
174
+ {type: 'heading', level: 3, text: 'Containers'},
226
175
  {
227
176
  type: 'prose',
228
177
  text: 'Reach for the weakest container that reads as a group, and escalate only when it fails. Weakest to strongest:',
@@ -253,12 +202,8 @@ export const docs = {
253
202
  type: 'prose',
254
203
  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.',
255
204
  },
256
- ],
257
- },
258
- {
259
- id: 'headers-and-footers',
260
- title: 'Headers and footers',
261
- content: [
205
+
206
+ {type: 'heading', level: 3, text: 'Headers and footers'},
262
207
  {
263
208
  type: 'prose',
264
209
  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.',
@@ -290,12 +235,8 @@ export const docs = {
290
235
  type: 'prose',
291
236
  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.',
292
237
  },
293
- ],
294
- },
295
- {
296
- id: 'side-panels',
297
- title: 'Side panels',
298
- content: [
238
+
239
+ {type: 'heading', level: 3, text: 'Side panels'},
299
240
  {
300
241
  type: 'prose',
301
242
  text: 'Master-detail: selecting a row opens a fixed-width side panel instead of navigating away.',
@@ -337,45 +278,41 @@ end={
337
278
  },
338
279
  {
339
280
  type: 'prose',
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.',
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.',
351
282
  },
283
+
284
+ {type: 'heading', level: 3, text: 'Best practices'},
352
285
  {
353
286
  type: 'list',
354
287
  style: 'do',
355
288
  items: [
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',
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',
361
294
  ],
362
295
  },
363
296
  {
364
297
  type: 'list',
365
298
  style: 'dont',
366
299
  items: [
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',
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',
371
308
  ],
372
309
  },
373
310
  ],
374
311
  },
375
312
  {
376
- id: 'alignment',
377
- title: 'Alignment',
313
+ title: 'Spacing',
378
314
  content: [
315
+ {type: 'heading', level: 3, text: 'Alignment'},
379
316
  {
380
317
  type: 'prose',
381
318
  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`.',
@@ -405,12 +342,8 @@ end={
405
342
  type: 'prose',
406
343
  text: 'Verify: draw one vertical line down the left of the region. Every label touches it; only hover and selected backgrounds cross it.',
407
344
  },
408
- ],
409
- },
410
- {
411
- id: 'rhythm',
412
- title: 'Rhythm',
413
- content: [
345
+
346
+ {type: 'heading', level: 3, text: 'Rhythm'},
414
347
  {
415
348
  type: 'prose',
416
349
  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.',
@@ -442,12 +375,8 @@ end={
442
375
  type: 'prose',
443
376
  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.',
444
377
  },
445
- ],
446
- },
447
- {
448
- id: 'density',
449
- title: 'Density and size',
450
- content: [
378
+
379
+ {type: 'heading', level: 3, text: 'Density and size'},
451
380
  {
452
381
  type: 'prose',
453
382
  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.',
@@ -474,40 +403,35 @@ end={
474
403
  type: 'prose',
475
404
  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.',
476
405
  },
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
- },
406
+
407
+ {type: 'heading', level: 3, text: 'Best practices'},
487
408
  {
488
409
  type: 'list',
489
410
  style: 'do',
490
411
  items: [
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',
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',
494
417
  ],
495
418
  },
496
419
  {
497
420
  type: 'list',
498
421
  style: 'dont',
499
422
  items: [
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',
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',
503
427
  ],
504
428
  },
505
429
  ],
506
430
  },
507
431
  {
508
- id: 'responsive-contract',
509
- title: 'Responsive contract',
432
+ title: 'Breakpoints',
510
433
  content: [
434
+ {type: 'heading', level: 3, text: 'Responsive contract'},
511
435
  {
512
436
  type: 'prose',
513
437
  text: 'Lock what each region does as width changes, and pair every line of the contract with the prop or hook that enforces it.',
@@ -544,6 +468,26 @@ const isNarrow = useMediaQuery('(max-width: 1024px)');
544
468
  type: 'prose',
545
469
  text: 'Verify: every contract line names a mechanism, so the comment cannot drift from the behavior.',
546
470
  },
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
+ },
547
491
  ],
548
492
  },
549
493
  ],
@@ -30,12 +30,12 @@ export const docs = {
30
30
  type: 'list',
31
31
  style: 'ordered',
32
32
  items: [
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).',
33
+ 'Install the design system and run init so the project has package scripts, theme CSS, and agent docs.',
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, TabList, Dialog, AlertDialog, Banner, Toast, Badge, Card, Table, and ListItem.',
38
+ 'Replace shared primitives: Button, IconButton, TextInput, NumberInput, Switch, CheckboxInput, RadioList, Selector, Tabs, 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: '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.',
72
+ text: 'Use --dense when pasting output into an AI coding tool, and use --json when building automated migration reports.',
73
73
  },
74
74
  {
75
75
  type: 'code',
76
76
  lang: 'bash',
77
- label: 'Short and JSON modes',
78
- code: `astryx docs migration --full --detail brief
77
+ label: 'Dense and JSON modes',
78
+ code: `astryx docs migration --dense
79
79
  astryx component Button --json`,
80
80
  },
81
81
  ],
@@ -110,7 +110,21 @@ 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. 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}.',
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);`,
114
128
  },
115
129
  {
116
130
  type: 'prose',
@@ -135,8 +149,7 @@ export function AppRoot({children}: {children: React.ReactNode}) {
135
149
  ],
136
150
  },
137
151
  {
138
- id: 'cascade-layer-safety',
139
- title: 'Why resets break cascade layers',
152
+ title: 'Cascade Layer Safety',
140
153
  content: [
141
154
  {
142
155
  type: 'prose',
@@ -153,16 +166,6 @@ export function AppRoot({children}: {children: React.ReactNode}) {
153
166
  code: `/* was: @import "./legacy-reset.css"; (unlayered: beats every layer) */
154
167
  @import "./legacy-reset.css" layer(reset);`,
155
168
  },
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: [
166
169
  {
167
170
  type: 'prose',
168
171
  text: 'Audit the layers around the design system with this checklist before building screens.',
@@ -307,7 +310,6 @@ if (getComputedStyle(button).paddingInline === '0px') {
307
310
  ],
308
311
  },
309
312
  {
310
- id: 'command-palette',
311
313
  title: 'Command Palette, Settings, and Theme',
312
314
  content: [
313
315
  {
@@ -33,10 +33,6 @@ 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
- },
40
36
  {
41
37
  type: 'token-ref',
42
38
  topic: 'tokens',
@@ -48,10 +44,6 @@ export const docs = {
48
44
  title: 'Easing',
49
45
  category: 'foundations',
50
46
  content: [
51
- {
52
- type: 'prose',
53
- text: 'One easing curve, `--ease-standard`.',
54
- },
55
47
  {
56
48
  type: 'token-ref',
57
49
  topic: 'tokens',
@@ -109,24 +101,19 @@ export const docs = {
109
101
  content: [
110
102
  {
111
103
  type: 'prose',
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)`.',
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.',
113
105
  },
114
106
  ],
115
107
  },
116
108
  {
117
- id: 'usage',
118
- title: 'Animate with motion tokens',
109
+ title: 'Usage',
119
110
  category: 'foundations',
120
111
  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
- },
125
112
  {
126
113
  type: 'code',
127
114
  lang: 'tsx',
128
115
  label: 'Applying motion tokens',
129
- code: `import {durationVars, easeVars} from '@astryxdesign/core/theme/tokens.stylex';
116
+ code: `import {durationVars, easeVars} from '@astryxdesign/core';
130
117
 
131
118
  const styles = stylex.create({
132
119
  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: '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}' }] },
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' }] },
13
13
  ],
14
14
  };
@@ -34,10 +34,6 @@ 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
- },
41
37
  {
42
38
  type: 'list',
43
39
  style: 'ordered',
@@ -72,10 +68,6 @@ export const docs = {
72
68
  title: 'Anti-Patterns',
73
69
  category: 'guide',
74
70
  content: [
75
- {
76
- type: 'prose',
77
- text: 'Patterns that break theming, routing, or layout, and what to use instead.',
78
- },
79
71
  {
80
72
  type: 'list',
81
73
  style: 'dont',
@@ -3,12 +3,12 @@
3
3
  /** @type {import('@astryxdesign/cli/authoring').ReferenceTranslationDoc} */
4
4
 
5
5
  export const docsZh = {
6
- description: 'Astryx 核心设计原则和规则。',
6
+ description: 'XDS 核心设计原则和规则。',
7
7
  sections: [
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}。' }] },
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 查看完整参考' }] },
13
13
  ],
14
14
  };
@@ -25,10 +25,6 @@ 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
- },
32
28
  {
33
29
  type: 'token-ref',
34
30
  topic: 'tokens',
@@ -42,15 +38,14 @@ export const docs = {
42
38
  content: [
43
39
  {
44
40
  type: 'prose',
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.',
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).',
46
42
  },
47
43
  {
48
44
  type: 'code',
49
45
  lang: 'css',
50
46
  label: 'Concentric radius formula',
51
- code: `.inner {
52
- border-radius: max(0px, calc(var(--radius-container) - var(--spacing-4)));
53
- }`,
47
+ code: `/* Automatic in Astryx Card */
48
+ --card-concentric-radius: max(0px, calc(var(--_card-radius) - var(--card-padding)));`,
54
49
  },
55
50
  ],
56
51
  },
@@ -8,7 +8,6 @@ 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'],
12
11
  tokenCategory: 'spacing',
13
12
 
14
13
  sections: [
@@ -26,10 +25,6 @@ export const docs = {
26
25
  title: 'Scale',
27
26
  category: 'foundations',
28
27
  content: [
29
- {
30
- type: 'prose',
31
- text: 'Fifteen spacing tokens, from 0px to 48px.',
32
- },
33
28
  {
34
29
  type: 'token-ref',
35
30
  topic: 'tokens',
@@ -43,7 +38,7 @@ export const docs = {
43
38
  content: [
44
39
  {
45
40
  type: 'prose',
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.',
41
+ text: 'Most components accept a `gap` prop using step values (0 through 12). For custom layouts, use the spacing tokens directly in StyleX.',
47
42
  },
48
43
  {
49
44
  type: 'code',
@@ -53,7 +48,7 @@ export const docs = {
53
48
  <Stack gap={4}>{/* 16px gap */}</Stack>
54
49
 
55
50
  // Via StyleX tokens (custom layouts)
56
- import {spacingVars} from '@astryxdesign/core/theme/tokens.stylex';
51
+ import {spacingVars} from '@astryxdesign/core';
57
52
 
58
53
  const styles = stylex.create({
59
54
  custom: {