@astryxdesign/core 0.6.2 → 0.6.3-canary.0788c49

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 (558) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +3 -1
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  8. package/dist/Button/Button.d.ts.map +1 -1
  9. package/dist/Button/Button.js +13 -28
  10. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  11. package/dist/Chat/ChatComposer.js +10 -5
  12. package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
  13. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  14. package/dist/Chat/ChatComposerDrawer.js +48 -23
  15. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  16. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  17. package/dist/Chat/ChatComposerInput.js +63 -16
  18. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  19. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  20. package/dist/Chat/ChatDictationButton.js +6 -4
  21. package/dist/Chat/ChatLayout.d.ts +19 -0
  22. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  23. package/dist/Chat/ChatLayout.js +19 -0
  24. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  25. package/dist/Chat/ChatLayoutScrollButton.js +44 -34
  26. package/dist/Chat/ChatMessageBubble.d.ts +2 -0
  27. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  28. package/dist/Chat/ChatMessageBubble.js +5 -3
  29. package/dist/Chat/ChatMessageList.d.ts +2 -1
  30. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  31. package/dist/Chat/ChatMessageList.js +4 -3
  32. package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
  33. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  34. package/dist/Chat/ChatMessageMetadata.js +12 -9
  35. package/dist/Chat/ChatSendButton.d.ts +2 -1
  36. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  37. package/dist/Chat/ChatSendButton.js +6 -4
  38. package/dist/Chat/index.d.ts +1 -1
  39. package/dist/Chat/index.d.ts.map +1 -1
  40. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  41. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  42. package/dist/Citation/Citation.d.ts +1 -1
  43. package/dist/Citation/Citation.d.ts.map +1 -1
  44. package/dist/Citation/Citation.js +3 -2
  45. package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
  46. package/dist/CodeBlock/highlightRanges.js +14 -3
  47. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  48. package/dist/Collapsible/Collapsible.js +6 -1
  49. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  50. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  53. package/dist/DateInput/DateInput.d.ts.map +1 -1
  54. package/dist/DateInput/DateInput.js +4 -4
  55. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  56. package/dist/DateInput/NativeDateField.js +16 -16
  57. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  58. package/dist/DateInput/TouchDateField.js +2 -2
  59. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  60. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  61. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  62. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  63. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  64. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  65. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  66. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  67. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  68. package/dist/Dialog/DialogHeader.d.ts +8 -1
  69. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  70. package/dist/Dialog/DialogHeader.js +13 -4
  71. package/dist/Field/InputClearButton.d.ts +4 -2
  72. package/dist/Field/InputClearButton.d.ts.map +1 -1
  73. package/dist/Field/InputClearButton.js +4 -2
  74. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  75. package/dist/Field/PanelSearchInput.js +1 -1
  76. package/dist/FileInput/FileInput.d.ts.map +1 -1
  77. package/dist/FileInput/FileInput.js +7 -7
  78. package/dist/Icon/Icon.d.ts +6 -31
  79. package/dist/Icon/Icon.d.ts.map +1 -1
  80. package/dist/Icon/Icon.js +8 -71
  81. package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
  82. package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
  83. package/dist/Icon/IconDefaultSizeContext.js +18 -0
  84. package/dist/Icon/IconSize.stylex.d.ts +65 -0
  85. package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
  86. package/dist/Icon/IconSize.stylex.js +75 -0
  87. package/dist/Item/Item.d.ts +1 -1
  88. package/dist/Item/Item.d.ts.map +1 -1
  89. package/dist/Item/Item.js +4 -3
  90. package/dist/Kbd/Kbd.d.ts +5 -3
  91. package/dist/Kbd/Kbd.d.ts.map +1 -1
  92. package/dist/Kbd/Kbd.js +36 -42
  93. package/dist/Link/Link.d.ts.map +1 -1
  94. package/dist/Link/Link.js +6 -2
  95. package/dist/Link/useLinkComponent.d.ts +5 -15
  96. package/dist/Link/useLinkComponent.d.ts.map +1 -1
  97. package/dist/Link/useLinkComponent.js +34 -51
  98. package/dist/List/List.d.ts +19 -1
  99. package/dist/List/List.d.ts.map +1 -1
  100. package/dist/List/List.js +9 -2
  101. package/dist/List/ListContext.d.ts +1 -0
  102. package/dist/List/ListContext.d.ts.map +1 -1
  103. package/dist/List/ListContext.js +2 -1
  104. package/dist/List/ListItem.d.ts +1 -1
  105. package/dist/List/ListItem.d.ts.map +1 -1
  106. package/dist/List/ListItem.js +9 -2
  107. package/dist/Markdown/Markdown.d.ts +8 -2
  108. package/dist/Markdown/Markdown.d.ts.map +1 -1
  109. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  110. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  111. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  112. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  113. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  114. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  115. package/dist/Markdown/Markdown.js +262 -109
  116. package/dist/Markdown/ast.d.ts +162 -0
  117. package/dist/Markdown/ast.d.ts.map +1 -0
  118. package/dist/Markdown/ast.js +74 -0
  119. package/dist/Markdown/index.d.ts +5 -3
  120. package/dist/Markdown/index.d.ts.map +1 -1
  121. package/dist/Markdown/index.js +3 -2
  122. package/dist/Markdown/parser/index.d.ts +10 -0
  123. package/dist/Markdown/parser/index.d.ts.map +1 -0
  124. package/dist/Markdown/parser/index.js +10 -0
  125. package/dist/Markdown/parser.d.ts +126 -58
  126. package/dist/Markdown/parser.d.ts.map +1 -1
  127. package/dist/Markdown/parser.js +726 -177
  128. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  129. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  130. package/dist/Markdown/plugins/frontmatter.js +132 -0
  131. package/dist/Markdown/plugins/index.d.ts +17 -0
  132. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  133. package/dist/Markdown/plugins/index.js +14 -0
  134. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  135. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  136. package/dist/Markdown/plugins/protocol.js +957 -0
  137. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  138. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  139. package/dist/Markdown/plugins/semanticFence.js +213 -0
  140. package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
  141. package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
  142. package/dist/Markdown/plugins/softBreaks.js +172 -0
  143. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  144. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  145. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  146. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  147. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  148. package/dist/Markdown/plugins/textTransform.js +374 -0
  149. package/dist/Markdown/remark.d.ts +196 -0
  150. package/dist/Markdown/remark.d.ts.map +1 -0
  151. package/dist/Markdown/remark.js +1062 -0
  152. package/dist/Markdown/url.d.ts +6 -0
  153. package/dist/Markdown/url.d.ts.map +1 -0
  154. package/dist/Markdown/url.js +31 -0
  155. package/dist/Markdown/utils.d.ts +4 -2
  156. package/dist/Markdown/utils.d.ts.map +1 -1
  157. package/dist/Markdown/utils.js +2 -1
  158. package/dist/MetadataList/MetadataList.js +3 -3
  159. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  160. package/dist/NumberInput/NumberInput.js +4 -4
  161. package/dist/Outline/index.d.ts +1 -0
  162. package/dist/Outline/index.d.ts.map +1 -1
  163. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  164. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  165. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  166. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  167. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  168. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  169. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  171. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  172. package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
  173. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  174. package/dist/ProgressBar/ProgressBar.js +36 -31
  175. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  176. package/dist/RadioList/RadioListItem.js +13 -1
  177. package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
  178. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  179. package/dist/ScrollableArea/ScrollableArea.js +1 -0
  180. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  181. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  182. package/dist/SegmentedControl/SegmentedControl.js +1 -0
  183. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  184. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  185. package/dist/Selector/Selector.d.ts +9 -7
  186. package/dist/Selector/Selector.d.ts.map +1 -1
  187. package/dist/Selector/Selector.js +16 -7
  188. package/dist/SideNav/SideNav.d.ts +2 -1
  189. package/dist/SideNav/SideNav.d.ts.map +1 -1
  190. package/dist/SideNav/SideNav.js +9 -3
  191. package/dist/Slider/Slider.d.ts.map +1 -1
  192. package/dist/Slider/Slider.js +28 -12
  193. package/dist/Spinner/Spinner.d.ts.map +1 -1
  194. package/dist/Spinner/Spinner.js +23 -7
  195. package/dist/Switch/Switch.d.ts.map +1 -1
  196. package/dist/Switch/Switch.js +11 -0
  197. package/dist/TabList/Tab.d.ts +1 -1
  198. package/dist/TabList/Tab.d.ts.map +1 -1
  199. package/dist/TabList/Tab.js +20 -7
  200. package/dist/Table/Table.d.ts +1 -0
  201. package/dist/Table/Table.d.ts.map +1 -1
  202. package/dist/Table/Table.js +29 -13
  203. package/dist/TextArea/TextArea.d.ts.map +1 -1
  204. package/dist/TextArea/TextArea.js +1 -1
  205. package/dist/TextInput/TextInput.d.ts.map +1 -1
  206. package/dist/TextInput/TextInput.js +2 -2
  207. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  208. package/dist/TimeInput/TimeInput.js +4 -4
  209. package/dist/Timer/Timer.d.ts +49 -0
  210. package/dist/Timer/Timer.d.ts.map +1 -0
  211. package/dist/Timer/Timer.js +158 -0
  212. package/dist/Timer/index.d.ts +9 -0
  213. package/dist/Timer/index.d.ts.map +1 -0
  214. package/dist/Timer/index.js +10 -0
  215. package/dist/ToggleButton/ToggleButton.d.ts +9 -6
  216. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  217. package/dist/ToggleButton/ToggleButton.js +15 -27
  218. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  219. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  220. package/dist/TopNav/TopNavMenu.js +3 -2
  221. package/dist/TreeList/TreeList.d.ts.map +1 -1
  222. package/dist/TreeList/TreeList.js +3 -0
  223. package/dist/TreeList/TreeListItem.d.ts +6 -1
  224. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  225. package/dist/TreeList/TreeListItem.js +12 -2
  226. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  227. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  228. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  229. package/dist/Typeahead/BaseTypeahead.js +16 -7
  230. package/dist/astryx.css +27 -11
  231. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  232. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  233. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  234. package/dist/hooks/useClickableContainer.d.ts +10 -1
  235. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  236. package/dist/hooks/useClickableContainer.js +15 -4
  237. package/dist/hooks/useScrollableArea.d.ts +6 -2
  238. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  239. package/dist/hooks/useScrollableArea.js +17 -5
  240. package/dist/index.d.ts +1 -0
  241. package/dist/index.d.ts.map +1 -1
  242. package/dist/index.js +3 -0
  243. package/dist/theme/declarationBoundary.d.ts +17 -0
  244. package/dist/theme/declarationBoundary.d.ts.map +1 -0
  245. package/dist/theme/declarationBoundary.js +343 -0
  246. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  247. package/dist/theme/derivedVarRegistry.js +4 -0
  248. package/dist/theme/generateThemeRules.d.ts +13 -7
  249. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  250. package/dist/theme/generateThemeRules.js +140 -34
  251. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  252. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  253. package/dist/utils/interactionOverlay.stylex.js +9 -0
  254. package/dist/utils/safeUrl.d.ts +11 -0
  255. package/dist/utils/safeUrl.d.ts.map +1 -0
  256. package/dist/utils/safeUrl.js +78 -0
  257. package/locales/af-ZA.json +530 -1
  258. package/locales/ar-SA.json +490 -1
  259. package/locales/ca-ES.json +514 -1
  260. package/locales/cs-CZ.json +498 -1
  261. package/locales/da-DK.json +522 -1
  262. package/locales/de-DE.json +522 -1
  263. package/locales/el-GR.json +498 -1
  264. package/locales/es-ES.json +510 -1
  265. package/locales/fi-FI.json +498 -1
  266. package/locales/fr-FR.json +534 -1
  267. package/locales/he-IL.json +498 -1
  268. package/locales/hu-HU.json +498 -1
  269. package/locales/it-IT.json +510 -1
  270. package/locales/ja-JP.json +490 -1
  271. package/locales/ko-KR.json +498 -1
  272. package/locales/nl-NL.json +534 -1
  273. package/locales/no-NO.json +510 -1
  274. package/locales/pl-PL.json +506 -1
  275. package/locales/pt-BR.json +506 -1
  276. package/locales/pt-PT.json +506 -1
  277. package/locales/ro-RO.json +506 -1
  278. package/locales/ru-RU.json +498 -1
  279. package/locales/sr-SP.json +498 -1
  280. package/locales/sv-SE.json +502 -1
  281. package/locales/tr-TR.json +498 -1
  282. package/locales/uk-UA.json +498 -1
  283. package/locales/vi-VN.json +502 -1
  284. package/locales/zh-CN.json +490 -1
  285. package/locales/zh-TW.json +490 -1
  286. package/package.json +24 -4
  287. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  288. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  289. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  290. package/src/BottomSheet/BottomSheet.tsx +3 -1
  291. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  292. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  293. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  294. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  295. package/src/Button/Button.doc.mjs +5 -5
  296. package/src/Button/Button.tsx +15 -13
  297. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  298. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  299. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  300. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  301. package/src/Chat/ChatComposer.doc.mjs +14 -0
  302. package/src/Chat/ChatComposer.spec.md +230 -0
  303. package/src/Chat/ChatComposer.test.tsx +57 -0
  304. package/src/Chat/ChatComposer.tsx +21 -9
  305. package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
  306. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  307. package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
  308. package/src/Chat/ChatComposerDrawer.tsx +38 -9
  309. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  310. package/src/Chat/ChatComposerInput.spec.md +185 -0
  311. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  312. package/src/Chat/ChatComposerInput.tsx +78 -13
  313. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  314. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  315. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  316. package/src/Chat/ChatDictationButton.spec.md +160 -0
  317. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  318. package/src/Chat/ChatDictationButton.tsx +8 -6
  319. package/src/Chat/ChatLayout.doc.mjs +12 -4
  320. package/src/Chat/ChatLayout.spec.md +271 -0
  321. package/src/Chat/ChatLayout.test.tsx +28 -0
  322. package/src/Chat/ChatLayout.tsx +19 -0
  323. package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
  324. package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
  325. package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
  326. package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
  327. package/src/Chat/ChatMessageBubble.spec.md +263 -0
  328. package/src/Chat/ChatMessageBubble.test.tsx +93 -0
  329. package/src/Chat/ChatMessageBubble.tsx +8 -3
  330. package/src/Chat/ChatMessageList.spec.md +222 -0
  331. package/src/Chat/ChatMessageList.test.tsx +64 -2
  332. package/src/Chat/ChatMessageList.tsx +4 -3
  333. package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
  334. package/src/Chat/ChatMessageMetadata.spec.md +220 -0
  335. package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
  336. package/src/Chat/ChatMessageMetadata.tsx +13 -13
  337. package/src/Chat/ChatSendButton.doc.mjs +32 -0
  338. package/src/Chat/ChatSendButton.spec.md +227 -0
  339. package/src/Chat/ChatSendButton.test.tsx +128 -8
  340. package/src/Chat/ChatSendButton.tsx +6 -4
  341. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
  342. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
  343. package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
  344. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
  345. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
  346. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
  347. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
  348. package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
  349. package/src/Chat/index.ts +1 -0
  350. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  351. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  352. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  353. package/src/Citation/Citation.doc.mjs +2 -2
  354. package/src/Citation/Citation.test.tsx +17 -0
  355. package/src/Citation/Citation.tsx +4 -2
  356. package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
  357. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  358. package/src/CodeBlock/highlightRanges.test.ts +143 -1
  359. package/src/CodeBlock/highlightRanges.ts +15 -5
  360. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  361. package/src/Collapsible/Collapsible.test.tsx +21 -0
  362. package/src/Collapsible/Collapsible.tsx +5 -0
  363. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  364. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  365. package/src/DateInput/DateInput.tsx +6 -1
  366. package/src/DateInput/NativeDateField.tsx +24 -8
  367. package/src/DateInput/TouchDateField.tsx +6 -2
  368. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  369. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  370. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  371. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  372. package/src/Dialog/Dialog.doc.mjs +2 -0
  373. package/src/Dialog/DialogHeader.doc.mjs +22 -0
  374. package/src/Dialog/DialogHeader.test.tsx +167 -3
  375. package/src/Dialog/DialogHeader.tsx +37 -6
  376. package/src/Dialog/modules/DialogHeader.spec.md +101 -42
  377. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
  378. package/src/Field/InputClearButton.test.tsx +17 -3
  379. package/src/Field/InputClearButton.tsx +5 -2
  380. package/src/Field/PanelSearchInput.tsx +5 -2
  381. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  382. package/src/FileInput/FileInput.tsx +11 -2
  383. package/src/Icon/Icon.doc.mjs +7 -5
  384. package/src/Icon/Icon.spec.md +81 -40
  385. package/src/Icon/Icon.test.tsx +6 -3
  386. package/src/Icon/Icon.tsx +20 -68
  387. package/src/Icon/IconDefaultSizeContext.ts +23 -0
  388. package/src/Icon/IconSize.stylex.ts +70 -0
  389. package/src/IconButton/IconButton.doc.mjs +3 -3
  390. package/src/IconButton/IconButton.test.tsx +40 -0
  391. package/src/Item/Item.doc.mjs +6 -2
  392. package/src/Item/Item.tsx +9 -3
  393. package/src/Kbd/Kbd.doc.mjs +3 -3
  394. package/src/Kbd/Kbd.test.tsx +57 -1
  395. package/src/Kbd/Kbd.tsx +57 -37
  396. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  397. package/src/Link/Link.doc.mjs +17 -4
  398. package/src/Link/Link.test.tsx +24 -0
  399. package/src/Link/Link.tsx +5 -0
  400. package/src/Link/LinkProvider.doc.mjs +2 -2
  401. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
  402. package/src/Link/useLinkComponent.test.tsx +333 -0
  403. package/src/Link/useLinkComponent.ts +29 -57
  404. package/src/List/List.doc.mjs +6 -0
  405. package/src/List/List.spec.md +200 -0
  406. package/src/List/List.test.tsx +117 -1
  407. package/src/List/List.tsx +22 -2
  408. package/src/List/ListContext.tsx +3 -1
  409. package/src/List/ListItem.doc.mjs +2 -2
  410. package/src/List/ListItem.source-build.test.mjs +41 -0
  411. package/src/List/ListItem.tsx +26 -2
  412. package/src/Markdown/Markdown.doc.mjs +300 -2
  413. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  414. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  415. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  416. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  417. package/src/Markdown/Markdown.public.test.ts +130 -3
  418. package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
  419. package/src/Markdown/Markdown.spec.md +210 -45
  420. package/src/Markdown/Markdown.test.tsx +87 -3
  421. package/src/Markdown/Markdown.tsx +414 -135
  422. package/src/Markdown/ast.test.ts +307 -0
  423. package/src/Markdown/ast.ts +337 -0
  424. package/src/Markdown/incremental.test.ts +43 -0
  425. package/src/Markdown/index.ts +37 -1
  426. package/src/Markdown/modules/remark.spec.md +269 -0
  427. package/src/Markdown/modules/softBreaks.spec.md +137 -0
  428. package/src/Markdown/parser/index.ts +64 -0
  429. package/src/Markdown/parser.public.test.ts +103 -0
  430. package/src/Markdown/parser.test.ts +38 -6
  431. package/src/Markdown/parser.ts +1221 -242
  432. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  433. package/src/Markdown/plugins/frontmatter.ts +198 -0
  434. package/src/Markdown/plugins/index.ts +54 -0
  435. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  436. package/src/Markdown/plugins/protocol.ts +1618 -0
  437. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  438. package/src/Markdown/plugins/semanticFence.ts +424 -0
  439. package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
  440. package/src/Markdown/plugins/softBreaks.ts +169 -0
  441. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  442. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  443. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  444. package/src/Markdown/plugins/textTransform.ts +554 -0
  445. package/src/Markdown/remark.test.tsx +1877 -0
  446. package/src/Markdown/remark.ts +1574 -0
  447. package/src/Markdown/url.ts +36 -0
  448. package/src/Markdown/utils.ts +13 -1
  449. package/src/MetadataList/MetadataList.test.tsx +4 -2
  450. package/src/MetadataList/MetadataList.tsx +3 -3
  451. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  452. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  453. package/src/NumberInput/NumberInput.tsx +6 -1
  454. package/src/Outline/Outline.doc.mjs +7 -5
  455. package/src/Outline/Outline.spec.md +1 -1
  456. package/src/Outline/index.ts +1 -0
  457. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  458. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  459. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  460. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  461. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  462. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  463. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
  464. package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
  465. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  466. package/src/ProgressBar/ProgressBar.tsx +59 -72
  467. package/src/RadioList/RadioList.doc.mjs +11 -0
  468. package/src/RadioList/RadioList.test.tsx +32 -0
  469. package/src/RadioList/RadioListItem.tsx +25 -1
  470. package/src/ScrollableArea/ScrollableArea.tsx +1 -0
  471. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  472. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  473. package/src/SegmentedControl/SegmentedControl.test.tsx +61 -0
  474. package/src/SegmentedControl/SegmentedControl.tsx +2 -1
  475. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  476. package/src/Selector/Selector.doc.mjs +3 -3
  477. package/src/Selector/Selector.spec.md +51 -49
  478. package/src/Selector/Selector.test.tsx +61 -55
  479. package/src/Selector/Selector.tsx +34 -15
  480. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  481. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  482. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  483. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  484. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  485. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
  486. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  487. package/src/SideNav/SideNav.doc.mjs +1 -1
  488. package/src/SideNav/SideNav.test.tsx +10 -0
  489. package/src/SideNav/SideNav.tsx +14 -2
  490. package/src/Slider/Slider.doc.mjs +17 -3
  491. package/src/Slider/Slider.test.tsx +221 -0
  492. package/src/Slider/Slider.tsx +40 -9
  493. package/src/Spinner/Spinner.test.tsx +4 -0
  494. package/src/Spinner/Spinner.tsx +31 -18
  495. package/src/Switch/Switch.doc.mjs +11 -0
  496. package/src/Switch/Switch.test.tsx +16 -0
  497. package/src/Switch/Switch.tsx +28 -0
  498. package/src/TabList/Tab.tsx +35 -7
  499. package/src/TabList/TabList.doc.mjs +11 -0
  500. package/src/TabList/TabList.spec.md +204 -0
  501. package/src/TabList/TabList.test.tsx +66 -0
  502. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  503. package/src/Table/Table.doc.mjs +1 -1
  504. package/src/Table/Table.spec.md +54 -40
  505. package/src/Table/Table.test.tsx +83 -10
  506. package/src/Table/Table.tsx +30 -22
  507. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  508. package/src/TextArea/TextArea.tsx +6 -1
  509. package/src/TextInput/TextInput.test.tsx +20 -1
  510. package/src/TextInput/TextInput.tsx +6 -1
  511. package/src/TimeInput/TimeInput.tsx +6 -1
  512. package/src/Timer/Timer.doc.mjs +183 -0
  513. package/src/Timer/Timer.spec.md +215 -0
  514. package/src/Timer/Timer.test.tsx +302 -0
  515. package/src/Timer/Timer.tsx +258 -0
  516. package/src/Timer/index.ts +11 -0
  517. package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
  518. package/src/ToggleButton/ToggleButton.test.tsx +299 -4
  519. package/src/ToggleButton/ToggleButton.tsx +26 -33
  520. package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
  521. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  522. package/src/Token/Token.doc.mjs +2 -2
  523. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  524. package/src/TopNav/TopNavMenu.doc.mjs +2 -2
  525. package/src/TopNav/TopNavMenu.test.tsx +30 -0
  526. package/src/TopNav/TopNavMenu.tsx +7 -2
  527. package/src/TreeList/TreeList.doc.mjs +3 -3
  528. package/src/TreeList/TreeList.spec.md +123 -75
  529. package/src/TreeList/TreeList.test.tsx +29 -0
  530. package/src/TreeList/TreeList.tsx +3 -0
  531. package/src/TreeList/TreeListItem.tsx +15 -1
  532. package/src/TreeList/TreeListTypes.ts +11 -1
  533. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  534. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  535. package/src/Typeahead/Typeahead.test.tsx +53 -0
  536. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  537. package/src/__tests__/pressState.ts +93 -0
  538. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  539. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  540. package/src/hooks/useClickableContainer.test.tsx +236 -0
  541. package/src/hooks/useClickableContainer.ts +20 -4
  542. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  543. package/src/hooks/useScrollableArea.test.tsx +59 -1
  544. package/src/hooks/useScrollableArea.ts +34 -10
  545. package/src/index.ts +3 -0
  546. package/src/inputFontFloor.test.ts +106 -0
  547. package/src/tailwind-theme.css +0 -6
  548. package/src/theme/Theme.test.tsx +32 -0
  549. package/src/theme/declarationBoundary.test.ts +126 -0
  550. package/src/theme/declarationBoundary.ts +347 -0
  551. package/src/theme/derivedVarRegistry.test.ts +7 -0
  552. package/src/theme/derivedVarRegistry.ts +1 -0
  553. package/src/theme/generateThemeRules.test.ts +526 -1
  554. package/src/theme/generateThemeRules.ts +228 -50
  555. package/src/theme/tokenValueCompat.test.ts +4 -1
  556. package/src/utils/interactionOverlay.stylex.ts +20 -0
  557. package/src/utils/safeUrl.test.ts +88 -0
  558. package/src/utils/safeUrl.ts +85 -0
@@ -10,12 +10,18 @@ approved_by: cixzhang
10
10
  approved_at: 2026-08-30
11
11
  owners: [cixzhang, imdreamrunner]
12
12
  review_triggers: [public-api, behavior, theming, accessibility]
13
- verified_by: [packages/core/src/Icon/Icon.test.tsx, scripts/check-knowledge.mjs]
13
+ verified_by:
14
+ [
15
+ packages/core/src/Icon/Icon.test.tsx,
16
+ packages/core/src/IconButton/IconButton.test.tsx,
17
+ scripts/check-knowledge.mjs,
18
+ ]
14
19
  modules: []
15
20
  families: []
16
21
  design_specs: []
17
22
  architecture:
18
23
  [
24
+ architecture:component-size-cascade,
19
25
  architecture:component-theming-surface,
20
26
  architecture:icon-resolution-and-component-slots,
21
27
  architecture:public-component-api,
@@ -33,11 +39,12 @@ semantics. Consumer usage remains documented in `Icon.doc.mjs`.
33
39
 
34
40
  ## Compatibility and migration
35
41
 
36
- - Released default preserved: `yes`
37
- - Compatibility class: additive documentation only; runtime, DOM, styling, and
38
- public API remain unchanged
42
+ - Released default preserved: `yes` for explicit sizes and standalone Icons
43
+ - Compatibility class: component-owned Icon slots may supply a contextual default;
44
+ explicit Icon sizes and the standalone `md` fallback remain unchanged
39
45
  - Controlled/uncontrolled behavior: not applicable
40
- - Migration decision: none; this record characterizes the released component
46
+ - Migration decision: no consumer migration; omit `size` when the owning Astryx
47
+ component should select the contextual default
41
48
 
42
49
  Consumer migration instructions belong in consumer docs and release notes.
43
50
 
@@ -46,6 +53,7 @@ Consumer migration instructions belong in consumer docs and release notes.
46
53
  **Owns**
47
54
 
48
55
  - Accepting a semantic icon key or a supplied icon component as the glyph source.
56
+ - Resolving explicit, component-owned contextual, and standalone size defaults.
49
57
  - Applying Icon's size, color, theming target, and accessibility semantics to
50
58
  the rendered glyph.
51
59
 
@@ -53,19 +61,22 @@ Consumer migration instructions belong in consumer docs and release notes.
53
61
 
54
62
  - The shared registry's key-resolution and fallback order — owned by the shared
55
63
  icon system.
64
+ - Which contextual default an owning Astryx component selects for its icon slot —
65
+ owned by that component or family contract.
56
66
  - The meaning of a glyph in product context or whether nearby text makes it
57
67
  decorative — owned by the product callsite.
58
68
  - Interaction, focus, or control naming — owned by the interactive parent.
59
69
  - The artwork supplied by a consumer or registered through a theme.
70
+ - A public Icon size-provider API; contextual transport is implementation detail.
60
71
 
61
72
  ## Public concepts
62
73
 
63
- | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
64
- | ------------- | --------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------------- | ---------- | ---------------- | --------- | ------------------------------------------------------ |
65
- | Glyph source | semantic key, namespaced extension key, or icon component | Selects the visual symbol. | Every render | Required | `component:Icon` | Stable | TypeScript rejects unsupported built-in string values. |
66
- | Size | `xsm`, `sm`, `md`, `lg` | Selects the icon box size. | Every rendered glyph | `md` | `component:Icon` | Stable | TypeScript rejects unsupported values. |
67
- | Color | documented semantic and palette values | Selects the glyph color or inherits it from context. | Every rendered glyph | `inherit` | `component:Icon` | Stable | TypeScript rejects unsupported values. |
68
- | Accessibility | decorative or meaningfully labelled | Controls whether assistive technology receives the glyph. | Every rendered glyph | Decorative | `component:Icon` | Stable | Empty labels use the decorative behavior. |
74
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
75
+ | ------------- | --------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------------- | ----------------------------------------------- | ---------------- | --------- | ------------------------------------------------------ |
76
+ | Glyph source | semantic key, namespaced extension key, or icon component | Selects the visual symbol. | Every render | Required | `component:Icon` | Stable | TypeScript rejects unsupported built-in string values. |
77
+ | Size | `xsm`, `sm`, `md`, `lg` | Selects the icon box size. | Every rendered glyph | nearest component-owned default; otherwise `md` | `component:Icon` | Stable | TypeScript rejects unsupported values. |
78
+ | Color | documented semantic and palette values | Selects the glyph color or inherits it from context. | Every rendered glyph | `inherit` | `component:Icon` | Stable | TypeScript rejects unsupported values. |
79
+ | Accessibility | decorative or meaningfully labelled | Controls whether assistive technology receives the glyph. | Every rendered glyph | Decorative | `component:Icon` | Stable | Empty labels use the decorative behavior. |
69
80
 
70
81
  A namespaced key that does not resolve currently renders nothing. This is
71
82
  existing behavior, not an intentional fallback promise.
@@ -75,42 +86,51 @@ existing behavior, not an intentional fallback promise.
75
86
  Requirements identify their basis so observed code is not mistaken for an
76
87
  intentional decision.
77
88
 
78
- | ID | Candidate invariant | Basis | Draft review state |
79
- | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------- |
80
- | FR1 | Icon MUST present at most one glyph from the supplied semantic key, namespaced key, or icon component. | Documented promise and current tests. | Settled intent. |
81
- | FR2 | Every rendered glyph MUST carry the `icon` theming target with its selected size and color reflected as target data. | Current source, docs, and theming tests. | Settled intent. |
82
- | FR3 | Icon MUST apply the selected size as width and height for every glyph, plus font size where needed for 1em-based icon sources. This sizing contract MUST NOT promise an HTML or SVG element type. | Human decision, current source, and tests. | Settled intent. |
83
- | FR4 | Supported SVG and styling escape hatches MUST retain their established merge and override behavior. | Current source and regression tests. | Current compatibility behavior; verify before changing. |
89
+ | ID | Candidate invariant | Basis | Draft review state |
90
+ | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------- |
91
+ | FR1 | Icon MUST present at most one glyph from the supplied semantic key, namespaced key, or icon component. | Documented promise and current tests. | Settled intent. |
92
+ | FR2 | Every rendered glyph MUST carry the `icon` theming target with its resolved size and selected color reflected as target data. | Current source, docs, and theming tests. | Settled intent. |
93
+ | FR3 | Icon MUST apply the resolved size as width and height for every glyph, plus font size where needed for 1em-based icon sources. This sizing contract MUST NOT promise an HTML or SVG element type. | Human decision, current source, and tests. | Settled intent. |
94
+ | FR4 | Supported SVG and styling escape hatches MUST retain their established merge and override behavior. | Current source and regression tests. | Current compatibility behavior; verify before changing. |
95
+ | FR5 | An explicit Icon `size` MUST win. Without one, Icon MUST use the nearest default supplied by an owning Astryx component for its documented icon slot; without such a default, Icon MUST use `md`. | Component-size precedence and Button sizing decision. | Settled intent. |
84
96
 
85
97
  ### Allowed variation
86
98
 
87
99
  - **AV1 — Artwork.** The path, view box, and internal structure may vary by icon
88
100
  source or theme without changing Icon's one-part consumer anatomy.
89
- - **AV2 — Rendering strategy.** Icon may render a supplied component directly or
101
+ - **AV2 — Rendering strategy.** Icon may render a supplied icon component directly or
90
102
  use an internal wrapper for a resolved key; neither element shape is public
91
103
  anatomy.
92
104
  - **AV3 — Theme and consumer styling.** Existing theme and styling escape hatches
93
105
  may change visual CSS properties without changing glyph ownership.
106
+ - **AV4 — Contextual mapping.** An owning Astryx component may map its own public
107
+ size or variant to an Icon default. That mapping belongs to the owner and MUST
108
+ preserve explicit Icon sizes and the standalone fallback.
94
109
 
95
110
  ### Representative states
96
111
 
97
- | State | Required invariant | Allowed variation |
98
- | ------------------------- | ----------------------------------------------------- | ---------------------------------------------- |
99
- | Semantic key | One resolved glyph carries the `icon` target. | Theme, registry, or built-in artwork. |
100
- | Namespaced extension key | A resolved extension glyph carries the `icon` target. | Consumer- or library-owned artwork. |
101
- | Supplied icon component | The supplied glyph carries the `icon` target. | Component implementation and SVG internals. |
102
- | Unresolved namespaced key | No glyph is currently rendered. | No fallback behavior is established by intent. |
112
+ | State | Required invariant | Allowed variation |
113
+ | -------------------------------- | -------------------------------------------------------- | ---------------------------------------------- |
114
+ | Semantic key | One resolved glyph carries the `icon` target. | Theme, registry, or built-in artwork. |
115
+ | Namespaced extension key | A resolved extension glyph carries the `icon` target. | Consumer- or library-owned artwork. |
116
+ | Supplied icon component | The supplied glyph carries the `icon` target. | Component implementation and SVG internals. |
117
+ | Standalone Icon without `size` | The resolved size is `md`. | Glyph source and color. |
118
+ | Owned icon slot without `size` | The nearest documented component default is used. | The owning component's declared size mapping. |
119
+ | Explicit Icon size in owned slot | The explicit Icon size wins over the contextual default. | Any supported Icon size. |
120
+ | Unresolved namespaced key | No glyph is currently rendered. | No fallback behavior is established by intent. |
103
121
 
104
122
  ### Transformation and precedence order
105
123
 
106
- - **ORD1 — Presentation.** Apply the target, component size and color styles,
107
- then merge consumer `xstyle`, `className`, inline `style`, and supported
124
+ - **ORD1 — Size resolution.** Resolve explicit Icon `size` → nearest
125
+ component-owned contextual default → standalone `md` fallback.
126
+ - **ORD2 — Presentation.** Apply the target, resolved size, and component color
127
+ styles, then merge consumer `xstyle`, `className`, inline `style`, and supported
108
128
  pass-through props in their established order.
109
129
 
110
130
  ### Performance and resources
111
131
 
112
132
  - **PR1 — Render work.** Icon owns no listeners, observers, or layout
113
- measurement; semantic resolution is synchronous during render.
133
+ measurement; semantic and size resolution are synchronous during render.
114
134
 
115
135
  ## Accessibility contract
116
136
 
@@ -123,9 +143,9 @@ intentional decision.
123
143
 
124
144
  ## Design relationships
125
145
 
126
- | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
127
- | ---------------- | ------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------- | ------------------ |
128
- | Glyph | Carries the selected visual symbol at the requested size and color. | Consumer or registry selects artwork; Icon owns presentation. | Context-dependent | FR1, FR2, FR3 |
146
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
147
+ | ---------------- | ------------------------------------------------------------------ | ------------------------------------------------------------- | ----------------- | ------------------ |
148
+ | Glyph | Carries the resolved visual symbol at the resolved size and color. | Consumer or registry selects artwork; Icon owns presentation. | Context-dependent | FR1, FR2, FR3, FR5 |
129
149
 
130
150
  `Glyph` is the single conceptual consumer part in both source modes. Current
131
151
  implementation may render a supplied icon component directly or place a
@@ -144,26 +164,32 @@ not promise a `span`, `svg`, or other element type.
144
164
 
145
165
  ## Family and system relationships
146
166
 
167
+ - `architecture:component-size-cascade` owns the shared explicit → nearest
168
+ provider → component fallback pattern and requires provider ownership to be
169
+ declared. Icon retains its own `xsm | sm | md | lg` axis outside the standard
170
+ element-size cascade and adopts that precedence for component-owned defaults.
147
171
  - `architecture:component-theming-surface` owns the qualification and validation
148
172
  rules for the `icon` target.
149
173
  - `architecture:icon-resolution-and-component-slots` owns semantic-key and
150
174
  component-slot resolution before Icon renders the selected source.
151
175
  - `architecture:public-component-api` owns admission and compatibility rules for
152
- Icon's public props.
176
+ Icon's public props and observable defaults.
177
+ - The owning component or family specifies each contextual Icon-size mapping.
178
+ The Button family currently maps `sm` and `md` controls to `sm` Icons and `lg`
179
+ controls to `md` Icons.
153
180
  - Icon has no current family contract.
154
181
 
155
182
  ## Verification map
156
183
 
157
- | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
158
- | ------------------- | ------------------------------------------------------------ | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
159
- | FR1, FR3 | `Icon.test.tsx` source-mode and sizing suites | Built-in, themed, namespaced, component | Breaking source rendering or cross-mode sizing fails assertions. | `audit:Icon/behavior` |
160
- | FR2, FR4 | `Icon.test.tsx` target/styling suites plus source inspection | Both source modes; size and color variants | Removing the target or breaking override composition fails existing assertions; `data-size` and `data-color` reflection currently lack focused assertions. | `audit:Icon/theming` |
161
- | AR1, AR2, AR3 | `Icon.test.tsx` accessible-name suites | Decorative, labelled, explicit ARIA override | Changing default or labelled semantics fails accessibility assertions. | `audit:Icon/accessibility` |
162
- | Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical consumer anatomy and current target | Missing, extra, prefixed, or stale mappings fail repository validation. | `audit:Icon/theming` |
184
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
185
+ | ------------------- | ------------------------------------------------------------------------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
186
+ | FR1, FR3, FR5 | `Icon.test.tsx` sizing suites and `IconButton.test.tsx` contextual-size suites | standalone default; Button sizes; explicit override; both modes | Breaking source rendering, standalone fallback, contextual mapping, explicit precedence, or cross-mode sizing fails assertions. | `audit:Icon/behavior` |
187
+ | FR2, FR4 | `Icon.test.tsx` target/styling suites plus source inspection | Both source modes; size and color variants | Removing the target or breaking override composition fails existing assertions; `data-color` reflection currently lacks focused assertions. | `audit:Icon/theming` |
188
+ | AR1, AR2, AR3 | `Icon.test.tsx` accessible-name suites | Decorative, labelled, explicit ARIA override | Changing default or labelled semantics fails accessibility assertions. | `audit:Icon/accessibility` |
189
+ | Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical consumer anatomy and current target | Missing, extra, prefixed, or stale mappings fail repository validation. | `audit:Icon/theming` |
163
190
 
164
- Focused coverage for `data-size` and `data-color` on both glyph source modes is
165
- a checkable test gap; source inspection is the current evidence for that part of
166
- FR2.
191
+ Focused coverage for `data-color` on both glyph source modes is a checkable test
192
+ gap; source inspection is the current evidence for that part of FR2.
167
193
 
168
194
  ## Decision log
169
195
 
@@ -182,6 +208,21 @@ a `span`, `svg`, or other element.
182
208
  Rejected: separate wrapper and SVG anatomy entries, because those describe
183
209
  implementation strategies rather than stable consumer concepts.
184
210
 
211
+ ### DEC-2 — Owning components may provide contextual Icon defaults
212
+
213
+ **Reference:** `component:Icon/DEC-2`
214
+ **Decider:** cixzhang, 2026-09-23
215
+
216
+ A person should see an icon that is proportionate to the Astryx component that
217
+ owns its slot without every caller repeating a size. The owning component may
218
+ therefore provide the default while an explicit Icon size remains authoritative
219
+ and a standalone Icon remains `md`. Provider objects, hooks, and context shape
220
+ remain private implementation details rather than public API.
221
+
222
+ Rejected: an unconditional `md` default inside every composition, forcing every
223
+ caller to repeat the owner-derived size, and exposing the provider mechanism as
224
+ public API.
225
+
185
226
  ## Open questions
186
227
 
187
228
  None.
@@ -162,10 +162,13 @@ describe('Icon', () => {
162
162
  expect(icon).toHaveAttribute('aria-label', 'Home');
163
163
  });
164
164
 
165
- it('uses default color and size when not specified', () => {
165
+ it('uses default color and standalone size when not specified', () => {
166
166
  render(<Icon icon={TestIcon} data-testid="icon" />);
167
- // The component should render without errors with defaults
168
- expect(screen.getByTestId('icon')).toBeInTheDocument();
167
+
168
+ const icon = screen.getByTestId('icon');
169
+ expect(icon).toHaveAttribute('data-size', 'md');
170
+ expect(getComputedStyle(icon).width).toBe('1.25rem');
171
+ expect(getComputedStyle(icon).height).toBe('1.25rem');
169
172
  });
170
173
 
171
174
  it('applies aria-hidden by default in string (registry) mode', () => {
package/src/Icon/Icon.tsx CHANGED
@@ -31,6 +31,14 @@ import {getIcon} from './globalIconRegistry';
31
31
  import type {IconName, NamespacedIconName} from './globalIconRegistry';
32
32
  import {mergeProps} from '../utils';
33
33
  import {themeProps} from '../utils/themeProps';
34
+ import {useIconSize} from './IconDefaultSizeContext';
35
+ import {
36
+ iconBoxSizeStyles,
37
+ iconSizeStyles,
38
+ type IconSize,
39
+ } from './IconSize.stylex';
40
+
41
+ export type {IconSize} from './IconSize.stylex';
34
42
 
35
43
  // =============================================================================
36
44
  // Styles
@@ -110,75 +118,11 @@ const colorStyles = stylex.create({
110
118
  },
111
119
  });
112
120
 
113
- /**
114
- * Size styles for direct SVG icon components.
115
- * Uses width/height only — SVG components handle their own viewBox scaling.
116
- *
117
- * Sizes are expressed in `rem` (relative to the root font-size) so icons scale
118
- * in step with text when the document font-size changes, matching the rest of
119
- * the design system's rem-based type scale. Values are the px-equivalents at a
120
- * 16px root: 12px → 0.75rem, 16px → 1rem, 20px → 1.25rem, 24px → 1.5rem.
121
- */
122
- const sizeStyles = stylex.create({
123
- xsm: {
124
- width: '0.75rem',
125
- height: '0.75rem',
126
- },
127
- sm: {
128
- width: '1rem',
129
- height: '1rem',
130
- },
131
- md: {
132
- width: '1.25rem',
133
- height: '1.25rem',
134
- },
135
- lg: {
136
- width: '1.5rem',
137
- height: '1.5rem',
138
- },
139
- });
140
-
141
- /**
142
- * Size styles for string-based (registry) icons.
143
- * Includes fontSize so that 1em-based icons from the registry scale correctly.
144
- *
145
- * Expressed in `rem` for the same reason as {@link sizeStyles} — icons track the
146
- * root font-size instead of being locked to absolute pixels.
147
- */
148
- const spanSizeStyles = stylex.create({
149
- /* eslint-disable @astryx/no-hardcoded-styles -- fontSize here sizes 1em-based
150
- registry SVGs to the icon box; icons use their own 12/16/20/24 scale, not
151
- the 14px-anchored textSizeVars type scale. Values are rem so icons track
152
- the root font-size. */
153
- xsm: {
154
- width: '0.75rem',
155
- height: '0.75rem',
156
- fontSize: '0.75rem',
157
- },
158
- sm: {
159
- width: '1rem',
160
- height: '1rem',
161
- fontSize: '1rem',
162
- },
163
- md: {
164
- width: '1.25rem',
165
- height: '1.25rem',
166
- fontSize: '1.25rem',
167
- },
168
- lg: {
169
- width: '1.5rem',
170
- height: '1.5rem',
171
- fontSize: '1.5rem',
172
- },
173
- /* eslint-enable @astryx/no-hardcoded-styles */
174
- });
175
-
176
121
  // =============================================================================
177
122
  // Types
178
123
  // =============================================================================
179
124
 
180
125
  export type IconColor = keyof typeof colorStyles;
181
- export type IconSize = keyof typeof sizeStyles;
182
126
 
183
127
  /**
184
128
  * Type for icon components that can be passed to Icon.
@@ -215,7 +159,9 @@ export interface IconProps extends Omit<
215
159
  * - 'sm': 1rem (16px at a 16px root)
216
160
  * - 'md': 1.25rem (20px at a 16px root)
217
161
  * - 'lg': 1.5rem (24px at a 16px root)
218
- * @default 'md'
162
+ *
163
+ * An explicit value wins. When omitted, Icon uses the nearest default supplied
164
+ * by an owning Astryx component for its icon slot, then falls back to 'md'.
219
165
  */
220
166
  size?: IconSize;
221
167
  /**
@@ -297,7 +243,7 @@ function getIconA11yProps(
297
243
  export function Icon({
298
244
  icon,
299
245
  color = 'inherit',
300
- size = 'md',
246
+ size: sizeProp,
301
247
  label,
302
248
  ref,
303
249
  className,
@@ -305,6 +251,7 @@ export function Icon({
305
251
  xstyle,
306
252
  ...props
307
253
  }: IconProps) {
254
+ const size = useIconSize(sizeProp);
308
255
  // Derive ARIA from `label`: decorative (aria-hidden) by default, or a
309
256
  // meaningful image (role="img" + aria-label) when `label` is non-empty.
310
257
  const a11yProps = getIconA11yProps(label);
@@ -341,7 +288,12 @@ export function Icon({
341
288
  // precedence as escape hatches.
342
289
  {...mergeProps(
343
290
  themeProps('icon', {size, color}),
344
- stylex.props(styles.root, colorStyles[color], sizeStyles[size], xstyle),
291
+ stylex.props(
292
+ styles.root,
293
+ colorStyles[color],
294
+ iconSizeStyles[size],
295
+ xstyle,
296
+ ),
345
297
  className ?? undefined,
346
298
  style,
347
299
  )}
@@ -410,7 +362,7 @@ function IconFromRegistry({
410
362
  stylex.props(
411
363
  styles.span,
412
364
  colorStyles[color],
413
- spanSizeStyles[size],
365
+ iconBoxSizeStyles[size],
414
366
  xstyle,
415
367
  ),
416
368
  className ?? undefined,
@@ -0,0 +1,23 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file IconDefaultSizeContext.ts
7
+ * @input Uses React context and an optional Icon size prop
8
+ * @output Supplies a component-owned default size to descendant Icon instances
9
+ * @position Internal Icon sizing context; consumed by Icon and icon-slot owners
10
+ */
11
+
12
+ import {createContext, use} from 'react';
13
+ import type {IconSize} from './IconSize.stylex';
14
+
15
+ const IconDefaultSizeContext = createContext<IconSize | null>(null);
16
+ IconDefaultSizeContext.displayName = 'IconDefaultSizeContext';
17
+
18
+ export const IconDefaultSizeProvider = IconDefaultSizeContext.Provider;
19
+
20
+ export function useIconSize(size: IconSize | undefined): IconSize {
21
+ const contextualSize = use(IconDefaultSizeContext);
22
+ return size ?? contextualSize ?? 'md';
23
+ }
@@ -0,0 +1,70 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file IconSize.stylex.ts
5
+ * @input Defines the Icon size scale
6
+ * @output Exports shared Icon size types and StyleX styles
7
+ * @position Internal Icon sizing source; consumed by Icon and icon-slot owners
8
+ */
9
+
10
+ import * as stylex from '@stylexjs/stylex';
11
+
12
+ /**
13
+ * Icon sizes are expressed in `rem` so they scale with the root font-size.
14
+ * Values are the px-equivalents at a 16px root: 12, 16, 20, and 24px.
15
+ */
16
+ const iconSizeValues = {
17
+ xsm: '0.75rem',
18
+ sm: '1rem',
19
+ md: '1.25rem',
20
+ lg: '1.5rem',
21
+ } as const;
22
+
23
+ export type IconSize = keyof typeof iconSizeValues;
24
+
25
+ /** Size styles for direct SVG icon components. */
26
+ export const iconSizeStyles = stylex.create({
27
+ xsm: {
28
+ width: iconSizeValues.xsm,
29
+ height: iconSizeValues.xsm,
30
+ },
31
+ sm: {
32
+ width: iconSizeValues.sm,
33
+ height: iconSizeValues.sm,
34
+ },
35
+ md: {
36
+ width: iconSizeValues.md,
37
+ height: iconSizeValues.md,
38
+ },
39
+ lg: {
40
+ width: iconSizeValues.lg,
41
+ height: iconSizeValues.lg,
42
+ },
43
+ });
44
+
45
+ /**
46
+ * Size styles for icon boxes and string-based registry icons. `fontSize`
47
+ * keeps 1em-based icons in step with the box.
48
+ */
49
+ export const iconBoxSizeStyles = stylex.create({
50
+ xsm: {
51
+ width: iconSizeValues.xsm,
52
+ height: iconSizeValues.xsm,
53
+ fontSize: iconSizeValues.xsm,
54
+ },
55
+ sm: {
56
+ width: iconSizeValues.sm,
57
+ height: iconSizeValues.sm,
58
+ fontSize: iconSizeValues.sm,
59
+ },
60
+ md: {
61
+ width: iconSizeValues.md,
62
+ height: iconSizeValues.md,
63
+ fontSize: iconSizeValues.md,
64
+ },
65
+ lg: {
66
+ width: iconSizeValues.lg,
67
+ height: iconSizeValues.lg,
68
+ fontSize: iconSizeValues.lg,
69
+ },
70
+ });
@@ -20,9 +20,9 @@ export const docs = {
20
20
  {
21
21
  name: 'icon',
22
22
  type: 'ReactNode',
23
- description: 'Icon element rendered inside the button.',
23
+ description: 'Icon element rendered inside the button. An Astryx Icon with no explicit size defaults to sm for sm/md buttons and md for lg buttons.',
24
24
  required: true,
25
- slotElements: [{__element: 'Icon', props: {icon: 'check', size: 'sm'}}],
25
+ slotElements: [{__element: 'Icon', props: {icon: 'check'}}],
26
26
  },
27
27
  {
28
28
  name: 'variant',
@@ -137,7 +137,7 @@ export const docsDense = {
137
137
  },
138
138
  propDescriptions: {
139
139
  label: 'accessible label; used as aria-label, not rendered as visible text',
140
- icon: 'icon element rendered inside button',
140
+ icon: 'icon element rendered inside button; unsized Astryx Icon defaults to sm for sm/md buttons and md for lg',
141
141
  variant: 'visual style variant',
142
142
  size: 'size variant',
143
143
  elevation: 'resting shadow depth: none|low|med|high; raise for a floating action button (FAB)',
@@ -12,6 +12,7 @@
12
12
  import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import {Icon} from '../Icon/Icon';
15
16
  import {IconButton} from './IconButton';
16
17
 
17
18
  describe('IconButton', () => {
@@ -52,6 +53,45 @@ describe('IconButton', () => {
52
53
  expect(screen.getByRole('button', {name: 'Add'})).toBeInTheDocument();
53
54
  });
54
55
 
56
+ it.each([
57
+ ['sm', 'sm', '1rem'],
58
+ ['md', 'sm', '1rem'],
59
+ ['lg', 'md', '1.25rem'],
60
+ ] as const)(
61
+ 'renders the %s button wrapper and inherited Icon at the same size',
62
+ (buttonSize, iconSize, renderedSize) => {
63
+ render(
64
+ <IconButton
65
+ label="Add"
66
+ icon={<Icon icon="check" data-testid="icon" />}
67
+ size={buttonSize}
68
+ />,
69
+ );
70
+
71
+ const icon = screen.getByTestId('icon');
72
+ const wrapper = icon.parentElement;
73
+ expect(wrapper).not.toBeNull();
74
+
75
+ expect(icon).toHaveAttribute('data-size', iconSize);
76
+ expect(getComputedStyle(icon).width).toBe(renderedSize);
77
+ expect(getComputedStyle(icon).height).toBe(renderedSize);
78
+ expect(getComputedStyle(wrapper!).width).toBe(renderedSize);
79
+ expect(getComputedStyle(wrapper!).height).toBe(renderedSize);
80
+ },
81
+ );
82
+
83
+ it('preserves an explicit Astryx Icon size', () => {
84
+ render(
85
+ <IconButton
86
+ label="Add"
87
+ icon={<Icon icon="check" size="lg" data-testid="icon" />}
88
+ size="sm"
89
+ />,
90
+ );
91
+
92
+ expect(screen.getByTestId('icon')).toHaveAttribute('data-size', 'lg');
93
+ });
94
+
55
95
  it('handles click events', async () => {
56
96
  const user = userEvent.setup();
57
97
  const handleClick = vi.fn();
@@ -22,6 +22,10 @@ export const docs = {
22
22
  vars: [
23
23
  {name: '--_item-label-color', description: 'Color of the label line. Unset by default (the label uses the primary text token); a parent sets it to recolor the label it renders, as the destructive dropdown/context menu item does.', default: 'var(--color-text-primary)', private: true},
24
24
  {name: '--_item-description-color', description: 'Companion to --_item-label-color for the secondary description line.', default: 'var(--color-text-secondary)', private: true},
25
+ {name: '--_item-inset-inline', description: 'Inline inset of the row. Item derives its paddingInline from this variable, and List reads it to cancel the inset when edgeCompensation="inline". Set paddingInline on `item` in a theme and both stay in sync.', default: 'var(--spacing-2) (var(--spacing-3) for density="spacious")', private: true},
26
+ ],
27
+ derived: [
28
+ {property: 'paddingInline', vars: ['--_item-inset-inline']},
25
29
  ],
26
30
  },
27
31
  components: [
@@ -43,7 +47,7 @@ export const docs = {
43
47
  {name: 'layout', type: "'stacked' | 'inline'", description: 'How the label and description sit together. stacked puts the description on its own line below the label; inline keeps both on one line, description ellipsizing first, so the row fits a fixed-height host.', default: "'stacked'"},
44
48
  {name: 'onClick', type: '(event: MouseEvent) => void', description: 'Click handler. Makes the item clickable with button semantics.'},
45
49
  {name: 'interactiveRef', type: 'RefObject<HTMLElement | null>', description: 'Ref to a nested control (e.g. a checkbox in startContent) that owns the item\'s keyboard access and action. The row becomes an enlarged click/tap target that delegates surface clicks to it (useClickableContainer) and renders no invisible button/anchor, so the row adds no second tab stop (WCAG 4.1.2). Mutually exclusive with onClick/href; those are ignored when set.'},
46
- {name: 'href', type: 'string', description: 'Link URL. Makes the item a link via an invisible anchor element.'},
50
+ {name: 'href', type: 'string', description: 'Link URL. Makes the item a link via an invisible anchor element. The destination follows the shared navigation rule described on the Link `href` prop.'},
47
51
  {name: 'target', type: "'_blank' | '_self'", description: 'Link target. Only used with href. target="_blank" automatically adds noopener noreferrer.'},
48
52
  {name: 'rel', type: 'string', description: 'Link relationship tokens. noopener noreferrer are merged automatically for target="_blank".'},
49
53
  {name: 'isHighlighted', type: 'boolean', description: 'Highlighted state (hover/keyboard focus appearance).', default: 'false'},
@@ -167,7 +171,7 @@ export const docsDense = {
167
171
  onClick: 'Click handler; enables button semantics.',
168
172
  interactiveRef:
169
173
  'Ref to a nested control that owns the item\'s keyboard access/action; row delegates surface clicks to it (useClickableContainer), no invisible button/anchor, no second tab stop (WCAG 4.1.2). Mutually exclusive with onClick/href.',
170
- href: 'Link URL; enables anchor semantics.',
174
+ href: 'Link URL; enables anchor semantics. Follows the shared navigation rule (see Link href).',
171
175
  target:
172
176
  'Link target, only with href. target="_blank" auto-adds noopener noreferrer.',
173
177
  rel: 'Link relationship tokens. noopener noreferrer are merged for target="_blank".',
package/src/Item/Item.tsx CHANGED
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * @file Item.tsx
7
7
  * @input Uses React, ReactNode, StyleXStyles, theme tokens, useClickableContainer
8
- * @output Exports Item component, ItemProps type
8
+ * @output Exports Item component, ItemProps type; publishes the shared inline inset
9
9
  * @position Core layout primitive; consumed by index.ts, tested by Item.test.tsx
10
10
  *
11
11
  * SYNC: When modified, update these files to stay in sync:
@@ -209,7 +209,13 @@ const styles = stylex.create({
209
209
  display: 'flex',
210
210
  alignItems: 'center',
211
211
  gap: spacingVars['--spacing-2'],
212
- paddingInline: spacingVars['--spacing-2'],
212
+ // The inline inset is published as --_item-inset-inline and the padding
213
+ // derives from it, so consumers that need to compensate for the inset
214
+ // (List's edgeCompensation) read the var instead of mirroring the values.
215
+ // Themes that set paddingInline on `item` also feed this var via the
216
+ // derived var registry, keeping padding and compensation in sync.
217
+ '--_item-inset-inline': spacingVars['--spacing-2'],
218
+ paddingInline: 'var(--_item-inset-inline)',
213
219
  position: 'relative',
214
220
  boxSizing: 'border-box',
215
221
  textAlign: 'start',
@@ -356,7 +362,7 @@ const densityStyles = stylex.create({
356
362
  },
357
363
  spacious: {
358
364
  paddingBlock: spacingVars['--spacing-3'],
359
- paddingInline: spacingVars['--spacing-3'],
365
+ '--_item-inset-inline': spacingVars['--spacing-3'],
360
366
  },
361
367
  });
362
368
 
@@ -27,7 +27,7 @@ export const docs = {
27
27
  name: 'keys',
28
28
  type: 'string',
29
29
  description:
30
- 'Keyboard shortcut string. Use "+" to separate keys. Special keys: mod (Cmd on Mac), ctrl, alt, shift, enter, backspace, escape, tab, up, down, left, right.',
30
+ 'Keyboard shortcut string. Use "+" to separate keys. Special keys: mod (Cmd on Mac), ctrl, alt, shift, enter, backspace, escape, tab, up, down, left, right, plus. Aliases: esc for escape and return for enter.',
31
31
  required: true,
32
32
  },
33
33
  {
@@ -72,7 +72,7 @@ export const docsZh = {
72
72
  name: 'keys',
73
73
  type: 'string',
74
74
  description:
75
- '键盘快捷键字符串。使用 "+" 分隔各按键。特殊按键:mod(Mac 上为 Cmd)、ctrl、alt、shift、enter、backspace、escape、tab、up、down、left、right。',
75
+ '键盘快捷键字符串。使用 "+" 分隔各按键。特殊按键:mod(Mac 上为 Cmd)、ctrl、alt、shift、enter、backspace、escape、tab、up、down、left、right、plus。别名:esc 等同于 escape,return 等同于 enter。',
76
76
  required: true,
77
77
  },
78
78
  {
@@ -122,7 +122,7 @@ export const docsDense = {
122
122
  ],
123
123
  },
124
124
  propDescriptions: {
125
- keys: 'Shortcut string. "+" separates keys. Special: mod (Cmd on Mac), ctrl, alt, shift, enter, backspace, escape, tab, up, down, left, right.',
125
+ keys: 'Shortcut string. "+" separates keys. Special: mod (Cmd on Mac), ctrl, alt, shift, enter, backspace, escape, tab, up, down, left, right, plus. Aliases: esc for escape, return for enter.',
126
126
  xstyle: 'StyleX styles for layout customization. Must be stylex.create() value.',
127
127
  className: 'CSS class for root element. Prefer xstyle; className for non-StyleX integration.',
128
128
  style: 'Inline styles for root element. Prefer xstyle; inline styles bypass StyleX optimization.',