@astryxdesign/core 0.6.2 → 0.6.3-canary.039a67e

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 (621) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/Avatar/Avatar.d.ts.map +1 -1
  3. package/dist/Avatar/Avatar.js +33 -12
  4. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  5. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheet.js +3 -1
  7. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  10. package/dist/Button/Button.d.ts.map +1 -1
  11. package/dist/Button/Button.js +13 -28
  12. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  13. package/dist/Chat/ChatComposer.js +10 -5
  14. package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
  15. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  16. package/dist/Chat/ChatComposerDrawer.js +48 -23
  17. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  18. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  19. package/dist/Chat/ChatComposerInput.js +63 -16
  20. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  21. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  22. package/dist/Chat/ChatDictationButton.js +6 -4
  23. package/dist/Chat/ChatLayout.d.ts +19 -0
  24. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  25. package/dist/Chat/ChatLayout.js +19 -0
  26. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  27. package/dist/Chat/ChatLayoutScrollButton.js +44 -34
  28. package/dist/Chat/ChatMessageBubble.d.ts +2 -0
  29. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  30. package/dist/Chat/ChatMessageBubble.js +5 -3
  31. package/dist/Chat/ChatMessageList.d.ts +2 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +4 -3
  34. package/dist/Chat/ChatMessageMetadata.d.ts +5 -4
  35. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  36. package/dist/Chat/ChatMessageMetadata.js +12 -9
  37. package/dist/Chat/ChatSendButton.d.ts +2 -1
  38. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  39. package/dist/Chat/ChatSendButton.js +6 -4
  40. package/dist/Chat/ChatSystemMessage.d.ts +3 -3
  41. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  42. package/dist/Chat/ChatSystemMessage.js +2 -2
  43. package/dist/Chat/ChatTokenizedText.d.ts +6 -6
  44. package/dist/Chat/ChatTokenizedText.js +10 -6
  45. package/dist/Chat/ChatToolCalls.d.ts +7 -9
  46. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  47. package/dist/Chat/ChatToolCalls.js +43 -26
  48. package/dist/Chat/index.d.ts +1 -1
  49. package/dist/Chat/index.d.ts.map +1 -1
  50. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  51. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  52. package/dist/Citation/Citation.d.ts +1 -1
  53. package/dist/Citation/Citation.d.ts.map +1 -1
  54. package/dist/Citation/Citation.js +3 -2
  55. package/dist/CodeBlock/highlightRanges.d.ts.map +1 -1
  56. package/dist/CodeBlock/highlightRanges.js +14 -3
  57. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  58. package/dist/Collapsible/Collapsible.js +6 -1
  59. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  60. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  61. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  62. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  63. package/dist/DateInput/DateInput.d.ts +25 -5
  64. package/dist/DateInput/DateInput.d.ts.map +1 -1
  65. package/dist/DateInput/DateInput.js +29 -17
  66. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  67. package/dist/DateInput/NativeDateField.js +16 -16
  68. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  69. package/dist/DateInput/TouchDateField.js +2 -2
  70. package/dist/DateInput/index.d.ts +1 -1
  71. package/dist/DateInput/index.d.ts.map +1 -1
  72. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  73. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  74. package/dist/DateTimeInput/DateTimeInput.d.ts +32 -15
  75. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  76. package/dist/DateTimeInput/DateTimeInput.js +55 -30
  77. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  78. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  79. package/dist/DateTimeInput/index.d.ts +1 -1
  80. package/dist/DateTimeInput/index.d.ts.map +1 -1
  81. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  82. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  83. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  84. package/dist/Dialog/DialogHeader.d.ts +8 -1
  85. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  86. package/dist/Dialog/DialogHeader.js +13 -4
  87. package/dist/Field/InputClearButton.d.ts +4 -2
  88. package/dist/Field/InputClearButton.d.ts.map +1 -1
  89. package/dist/Field/InputClearButton.js +4 -2
  90. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  91. package/dist/Field/PanelSearchInput.js +1 -1
  92. package/dist/FileInput/FileInput.d.ts.map +1 -1
  93. package/dist/FileInput/FileInput.js +7 -7
  94. package/dist/Icon/Icon.d.ts +6 -31
  95. package/dist/Icon/Icon.d.ts.map +1 -1
  96. package/dist/Icon/Icon.js +8 -71
  97. package/dist/Icon/IconDefaultSizeContext.d.ts +4 -0
  98. package/dist/Icon/IconDefaultSizeContext.d.ts.map +1 -0
  99. package/dist/Icon/IconDefaultSizeContext.js +18 -0
  100. package/dist/Icon/IconSize.stylex.d.ts +65 -0
  101. package/dist/Icon/IconSize.stylex.d.ts.map +1 -0
  102. package/dist/Icon/IconSize.stylex.js +75 -0
  103. package/dist/Item/Item.d.ts +1 -1
  104. package/dist/Item/Item.d.ts.map +1 -1
  105. package/dist/Item/Item.js +4 -3
  106. package/dist/Kbd/Kbd.d.ts +5 -3
  107. package/dist/Kbd/Kbd.d.ts.map +1 -1
  108. package/dist/Kbd/Kbd.js +36 -42
  109. package/dist/Link/Link.d.ts.map +1 -1
  110. package/dist/Link/Link.js +6 -2
  111. package/dist/Link/useLinkComponent.d.ts +5 -15
  112. package/dist/Link/useLinkComponent.d.ts.map +1 -1
  113. package/dist/Link/useLinkComponent.js +34 -51
  114. package/dist/List/List.d.ts +19 -1
  115. package/dist/List/List.d.ts.map +1 -1
  116. package/dist/List/List.js +9 -2
  117. package/dist/List/ListContext.d.ts +1 -0
  118. package/dist/List/ListContext.d.ts.map +1 -1
  119. package/dist/List/ListContext.js +2 -1
  120. package/dist/List/ListItem.d.ts +1 -1
  121. package/dist/List/ListItem.d.ts.map +1 -1
  122. package/dist/List/ListItem.js +9 -2
  123. package/dist/Markdown/Markdown.d.ts +8 -2
  124. package/dist/Markdown/Markdown.d.ts.map +1 -1
  125. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  126. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  127. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  128. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  129. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  130. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  131. package/dist/Markdown/Markdown.js +262 -109
  132. package/dist/Markdown/ast.d.ts +162 -0
  133. package/dist/Markdown/ast.d.ts.map +1 -0
  134. package/dist/Markdown/ast.js +74 -0
  135. package/dist/Markdown/index.d.ts +5 -3
  136. package/dist/Markdown/index.d.ts.map +1 -1
  137. package/dist/Markdown/index.js +3 -2
  138. package/dist/Markdown/parser/index.d.ts +10 -0
  139. package/dist/Markdown/parser/index.d.ts.map +1 -0
  140. package/dist/Markdown/parser/index.js +10 -0
  141. package/dist/Markdown/parser.d.ts +126 -58
  142. package/dist/Markdown/parser.d.ts.map +1 -1
  143. package/dist/Markdown/parser.js +726 -177
  144. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  145. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  146. package/dist/Markdown/plugins/frontmatter.js +132 -0
  147. package/dist/Markdown/plugins/index.d.ts +17 -0
  148. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  149. package/dist/Markdown/plugins/index.js +14 -0
  150. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  151. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  152. package/dist/Markdown/plugins/protocol.js +957 -0
  153. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  154. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  155. package/dist/Markdown/plugins/semanticFence.js +213 -0
  156. package/dist/Markdown/plugins/softBreaks.d.ts +3 -0
  157. package/dist/Markdown/plugins/softBreaks.d.ts.map +1 -0
  158. package/dist/Markdown/plugins/softBreaks.js +172 -0
  159. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  160. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  161. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  162. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  163. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  164. package/dist/Markdown/plugins/textTransform.js +374 -0
  165. package/dist/Markdown/remark.d.ts +196 -0
  166. package/dist/Markdown/remark.d.ts.map +1 -0
  167. package/dist/Markdown/remark.js +1062 -0
  168. package/dist/Markdown/url.d.ts +6 -0
  169. package/dist/Markdown/url.d.ts.map +1 -0
  170. package/dist/Markdown/url.js +31 -0
  171. package/dist/Markdown/utils.d.ts +4 -2
  172. package/dist/Markdown/utils.d.ts.map +1 -1
  173. package/dist/Markdown/utils.js +2 -1
  174. package/dist/MetadataList/MetadataList.js +3 -3
  175. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  176. package/dist/NumberInput/NumberInput.js +4 -4
  177. package/dist/Outline/index.d.ts +1 -0
  178. package/dist/Outline/index.d.ts.map +1 -1
  179. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  180. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  181. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  182. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  183. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  184. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  185. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  186. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  187. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  188. package/dist/PowerSearch/PowerSearchValueEditor.js +5 -0
  189. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  190. package/dist/ProgressBar/ProgressBar.js +36 -31
  191. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  192. package/dist/RadioList/RadioListItem.js +13 -1
  193. package/dist/ScrollableArea/ScrollableArea.d.ts +1 -0
  194. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  195. package/dist/ScrollableArea/ScrollableArea.js +1 -0
  196. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  197. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  198. package/dist/SegmentedControl/SegmentedControl.js +1 -0
  199. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  200. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  201. package/dist/Selector/Selector.d.ts +9 -7
  202. package/dist/Selector/Selector.d.ts.map +1 -1
  203. package/dist/Selector/Selector.js +16 -7
  204. package/dist/SideNav/SideNav.d.ts +2 -1
  205. package/dist/SideNav/SideNav.d.ts.map +1 -1
  206. package/dist/SideNav/SideNav.js +9 -3
  207. package/dist/Slider/Slider.d.ts.map +1 -1
  208. package/dist/Slider/Slider.js +28 -12
  209. package/dist/Spinner/Spinner.d.ts.map +1 -1
  210. package/dist/Spinner/Spinner.js +23 -7
  211. package/dist/Switch/Switch.d.ts.map +1 -1
  212. package/dist/Switch/Switch.js +11 -0
  213. package/dist/TabList/Tab.d.ts +1 -1
  214. package/dist/TabList/Tab.d.ts.map +1 -1
  215. package/dist/TabList/Tab.js +20 -7
  216. package/dist/Table/Table.d.ts +1 -0
  217. package/dist/Table/Table.d.ts.map +1 -1
  218. package/dist/Table/Table.js +29 -13
  219. package/dist/TextArea/TextArea.d.ts.map +1 -1
  220. package/dist/TextArea/TextArea.js +1 -1
  221. package/dist/TextInput/TextInput.d.ts.map +1 -1
  222. package/dist/TextInput/TextInput.js +2 -2
  223. package/dist/TimeInput/TimeInput.d.ts +30 -14
  224. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  225. package/dist/TimeInput/TimeInput.js +61 -13
  226. package/dist/TimeInput/TouchTimeField.d.ts +11 -0
  227. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -0
  228. package/dist/TimeInput/TouchTimeField.js +417 -0
  229. package/dist/TimeInput/index.d.ts +1 -1
  230. package/dist/TimeInput/index.d.ts.map +1 -1
  231. package/dist/Timer/Timer.d.ts +49 -0
  232. package/dist/Timer/Timer.d.ts.map +1 -0
  233. package/dist/Timer/Timer.js +158 -0
  234. package/dist/Timer/index.d.ts +9 -0
  235. package/dist/Timer/index.d.ts.map +1 -0
  236. package/dist/Timer/index.js +10 -0
  237. package/dist/ToggleButton/ToggleButton.d.ts +9 -6
  238. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  239. package/dist/ToggleButton/ToggleButton.js +15 -27
  240. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  241. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  242. package/dist/TopNav/TopNavMenu.js +3 -2
  243. package/dist/TreeList/TreeList.d.ts.map +1 -1
  244. package/dist/TreeList/TreeList.js +3 -0
  245. package/dist/TreeList/TreeListItem.d.ts +6 -1
  246. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  247. package/dist/TreeList/TreeListItem.js +12 -2
  248. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  249. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  250. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  251. package/dist/Typeahead/BaseTypeahead.js +16 -7
  252. package/dist/astryx.css +27 -11
  253. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  254. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  255. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  256. package/dist/hooks/useClickableContainer.d.ts +10 -1
  257. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  258. package/dist/hooks/useClickableContainer.js +15 -4
  259. package/dist/hooks/useScrollableArea.d.ts +6 -2
  260. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  261. package/dist/hooks/useScrollableArea.js +17 -5
  262. package/dist/index.d.ts +1 -0
  263. package/dist/index.d.ts.map +1 -1
  264. package/dist/index.js +3 -0
  265. package/dist/theme/declarationBoundary.d.ts +17 -0
  266. package/dist/theme/declarationBoundary.d.ts.map +1 -0
  267. package/dist/theme/declarationBoundary.js +343 -0
  268. package/dist/theme/defineTheme.d.ts +3 -0
  269. package/dist/theme/defineTheme.d.ts.map +1 -1
  270. package/dist/theme/defineTheme.js +4 -1
  271. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  272. package/dist/theme/derivedVarRegistry.js +4 -0
  273. package/dist/theme/generateThemeRules.d.ts +15 -7
  274. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  275. package/dist/theme/generateThemeRules.js +143 -35
  276. package/dist/theme/themeAdaptations.d.ts +5 -3
  277. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  278. package/dist/theme/themeAdaptations.js +33 -5
  279. package/dist/utils/inputPresentation.d.ts +55 -0
  280. package/dist/utils/inputPresentation.d.ts.map +1 -0
  281. package/dist/utils/inputPresentation.js +108 -0
  282. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  283. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  284. package/dist/utils/interactionOverlay.stylex.js +9 -0
  285. package/dist/utils/safeUrl.d.ts +11 -0
  286. package/dist/utils/safeUrl.d.ts.map +1 -0
  287. package/dist/utils/safeUrl.js +78 -0
  288. package/locales/af-ZA.json +530 -1
  289. package/locales/ar-SA.json +490 -1
  290. package/locales/ca-ES.json +514 -1
  291. package/locales/cs-CZ.json +498 -1
  292. package/locales/da-DK.json +522 -1
  293. package/locales/de-DE.json +522 -1
  294. package/locales/el-GR.json +498 -1
  295. package/locales/es-ES.json +510 -1
  296. package/locales/fi-FI.json +498 -1
  297. package/locales/fr-FR.json +534 -1
  298. package/locales/he-IL.json +498 -1
  299. package/locales/hu-HU.json +498 -1
  300. package/locales/it-IT.json +510 -1
  301. package/locales/ja-JP.json +490 -1
  302. package/locales/ko-KR.json +498 -1
  303. package/locales/nl-NL.json +534 -1
  304. package/locales/no-NO.json +510 -1
  305. package/locales/pl-PL.json +506 -1
  306. package/locales/pt-BR.json +506 -1
  307. package/locales/pt-PT.json +506 -1
  308. package/locales/ro-RO.json +506 -1
  309. package/locales/ru-RU.json +498 -1
  310. package/locales/sr-SP.json +498 -1
  311. package/locales/sv-SE.json +502 -1
  312. package/locales/tr-TR.json +498 -1
  313. package/locales/uk-UA.json +498 -1
  314. package/locales/vi-VN.json +502 -1
  315. package/locales/zh-CN.json +490 -1
  316. package/locales/zh-TW.json +490 -1
  317. package/package.json +24 -4
  318. package/src/Avatar/Avatar.doc.mjs +1 -1
  319. package/src/Avatar/Avatar.test.tsx +30 -0
  320. package/src/Avatar/Avatar.tsx +38 -14
  321. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  322. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  323. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  324. package/src/BottomSheet/BottomSheet.tsx +3 -1
  325. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  326. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  327. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  328. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  329. package/src/Button/Button.doc.mjs +5 -5
  330. package/src/Button/Button.tsx +15 -13
  331. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  332. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  333. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  334. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  335. package/src/Chat/ChatComposer.doc.mjs +14 -0
  336. package/src/Chat/ChatComposer.spec.md +230 -0
  337. package/src/Chat/ChatComposer.test.tsx +57 -0
  338. package/src/Chat/ChatComposer.tsx +21 -9
  339. package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
  340. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  341. package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
  342. package/src/Chat/ChatComposerDrawer.tsx +38 -9
  343. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  344. package/src/Chat/ChatComposerInput.spec.md +185 -0
  345. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  346. package/src/Chat/ChatComposerInput.tsx +78 -13
  347. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  348. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  349. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  350. package/src/Chat/ChatDictationButton.spec.md +160 -0
  351. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  352. package/src/Chat/ChatDictationButton.tsx +8 -6
  353. package/src/Chat/ChatLayout.doc.mjs +12 -4
  354. package/src/Chat/ChatLayout.spec.md +271 -0
  355. package/src/Chat/ChatLayout.test.tsx +28 -0
  356. package/src/Chat/ChatLayout.tsx +19 -0
  357. package/src/Chat/ChatLayoutScrollButton.spec.md +338 -0
  358. package/src/Chat/ChatLayoutScrollButton.test.tsx +31 -0
  359. package/src/Chat/ChatLayoutScrollButton.tsx +31 -14
  360. package/src/Chat/ChatMessageBubble.doc.mjs +28 -15
  361. package/src/Chat/ChatMessageBubble.spec.md +263 -0
  362. package/src/Chat/ChatMessageBubble.test.tsx +93 -0
  363. package/src/Chat/ChatMessageBubble.tsx +8 -3
  364. package/src/Chat/ChatMessageList.spec.md +222 -0
  365. package/src/Chat/ChatMessageList.test.tsx +64 -2
  366. package/src/Chat/ChatMessageList.tsx +4 -3
  367. package/src/Chat/ChatMessageMetadata.doc.mjs +57 -3
  368. package/src/Chat/ChatMessageMetadata.spec.md +220 -0
  369. package/src/Chat/ChatMessageMetadata.test.tsx +34 -0
  370. package/src/Chat/ChatMessageMetadata.tsx +13 -13
  371. package/src/Chat/ChatSendButton.doc.mjs +32 -0
  372. package/src/Chat/ChatSendButton.spec.md +227 -0
  373. package/src/Chat/ChatSendButton.test.tsx +128 -8
  374. package/src/Chat/ChatSendButton.tsx +6 -4
  375. package/src/Chat/ChatSystemMessage.doc.mjs +115 -12
  376. package/src/Chat/ChatSystemMessage.spec.md +225 -0
  377. package/src/Chat/ChatSystemMessage.test.tsx +112 -20
  378. package/src/Chat/ChatSystemMessage.tsx +4 -6
  379. package/src/Chat/ChatTokenizedText.doc.mjs +96 -9
  380. package/src/Chat/ChatTokenizedText.spec.md +190 -0
  381. package/src/Chat/ChatTokenizedText.test.tsx +60 -1
  382. package/src/Chat/ChatTokenizedText.tsx +14 -8
  383. package/src/Chat/ChatToolCalls.doc.mjs +4 -1
  384. package/src/Chat/ChatToolCalls.spec.md +194 -0
  385. package/src/Chat/ChatToolCalls.test.tsx +83 -0
  386. package/src/Chat/ChatToolCalls.tsx +46 -21
  387. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +514 -0
  388. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +740 -0
  389. package/src/Chat/__tests__/ChatMessageBubble.a11y.chromium.spec.ts +457 -0
  390. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.test.ts +91 -0
  391. package/src/Chat/__tests__/ChatMessageBubble.auditProvenance.ts +91 -0
  392. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +456 -0
  393. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +413 -0
  394. package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1522 -0
  395. package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1004 -0
  396. package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +573 -0
  397. package/src/Chat/index.ts +1 -0
  398. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  399. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  400. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  401. package/src/Citation/Citation.doc.mjs +2 -2
  402. package/src/Citation/Citation.test.tsx +17 -0
  403. package/src/Citation/Citation.tsx +4 -2
  404. package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
  405. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  406. package/src/CodeBlock/highlightRanges.test.ts +143 -1
  407. package/src/CodeBlock/highlightRanges.ts +15 -5
  408. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  409. package/src/Collapsible/Collapsible.test.tsx +21 -0
  410. package/src/Collapsible/Collapsible.tsx +5 -0
  411. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  412. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  413. package/src/DateInput/DateInput.doc.mjs +38 -9
  414. package/src/DateInput/DateInput.tsx +59 -17
  415. package/src/DateInput/NativeDateField.tsx +24 -8
  416. package/src/DateInput/Presentation.test.tsx +121 -0
  417. package/src/DateInput/TouchDateField.tsx +6 -2
  418. package/src/DateInput/index.ts +1 -0
  419. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  420. package/src/DateTimeInput/DateTimeInput.doc.mjs +28 -12
  421. package/src/DateTimeInput/DateTimeInput.tsx +93 -37
  422. package/src/DateTimeInput/Presentation.test.tsx +89 -0
  423. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  424. package/src/DateTimeInput/index.ts +1 -0
  425. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  426. package/src/Dialog/Dialog.doc.mjs +2 -0
  427. package/src/Dialog/DialogHeader.doc.mjs +22 -0
  428. package/src/Dialog/DialogHeader.test.tsx +167 -3
  429. package/src/Dialog/DialogHeader.tsx +37 -6
  430. package/src/Dialog/modules/DialogHeader.spec.md +101 -42
  431. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -2
  432. package/src/Field/InputClearButton.test.tsx +17 -3
  433. package/src/Field/InputClearButton.tsx +5 -2
  434. package/src/Field/PanelSearchInput.tsx +5 -2
  435. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  436. package/src/FileInput/FileInput.tsx +11 -2
  437. package/src/Icon/Icon.doc.mjs +7 -5
  438. package/src/Icon/Icon.spec.md +81 -40
  439. package/src/Icon/Icon.test.tsx +6 -3
  440. package/src/Icon/Icon.tsx +20 -68
  441. package/src/Icon/IconDefaultSizeContext.ts +23 -0
  442. package/src/Icon/IconSize.stylex.ts +70 -0
  443. package/src/IconButton/IconButton.doc.mjs +3 -3
  444. package/src/IconButton/IconButton.test.tsx +40 -0
  445. package/src/Item/Item.doc.mjs +6 -2
  446. package/src/Item/Item.tsx +9 -3
  447. package/src/Kbd/Kbd.doc.mjs +3 -3
  448. package/src/Kbd/Kbd.test.tsx +57 -1
  449. package/src/Kbd/Kbd.tsx +57 -37
  450. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  451. package/src/Link/Link.doc.mjs +17 -4
  452. package/src/Link/Link.test.tsx +24 -0
  453. package/src/Link/Link.tsx +5 -0
  454. package/src/Link/LinkProvider.doc.mjs +2 -2
  455. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +261 -0
  456. package/src/Link/useLinkComponent.test.tsx +333 -0
  457. package/src/Link/useLinkComponent.ts +29 -57
  458. package/src/List/List.doc.mjs +6 -0
  459. package/src/List/List.spec.md +200 -0
  460. package/src/List/List.test.tsx +117 -1
  461. package/src/List/List.tsx +22 -2
  462. package/src/List/ListContext.tsx +3 -1
  463. package/src/List/ListItem.doc.mjs +2 -2
  464. package/src/List/ListItem.source-build.test.mjs +41 -0
  465. package/src/List/ListItem.tsx +26 -2
  466. package/src/Markdown/Markdown.doc.mjs +300 -2
  467. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  468. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  469. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  470. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  471. package/src/Markdown/Markdown.public.test.ts +130 -3
  472. package/src/Markdown/Markdown.renderBoundary.test.tsx +72 -0
  473. package/src/Markdown/Markdown.spec.md +210 -45
  474. package/src/Markdown/Markdown.test.tsx +87 -3
  475. package/src/Markdown/Markdown.tsx +414 -135
  476. package/src/Markdown/ast.test.ts +307 -0
  477. package/src/Markdown/ast.ts +337 -0
  478. package/src/Markdown/incremental.test.ts +43 -0
  479. package/src/Markdown/index.ts +37 -1
  480. package/src/Markdown/modules/remark.spec.md +269 -0
  481. package/src/Markdown/modules/softBreaks.spec.md +137 -0
  482. package/src/Markdown/parser/index.ts +64 -0
  483. package/src/Markdown/parser.public.test.ts +103 -0
  484. package/src/Markdown/parser.test.ts +38 -6
  485. package/src/Markdown/parser.ts +1221 -242
  486. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  487. package/src/Markdown/plugins/frontmatter.ts +198 -0
  488. package/src/Markdown/plugins/index.ts +54 -0
  489. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  490. package/src/Markdown/plugins/protocol.ts +1618 -0
  491. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  492. package/src/Markdown/plugins/semanticFence.ts +424 -0
  493. package/src/Markdown/plugins/softBreaks.test.tsx +172 -0
  494. package/src/Markdown/plugins/softBreaks.ts +169 -0
  495. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  496. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  497. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  498. package/src/Markdown/plugins/textTransform.ts +554 -0
  499. package/src/Markdown/remark.test.tsx +1877 -0
  500. package/src/Markdown/remark.ts +1574 -0
  501. package/src/Markdown/url.ts +36 -0
  502. package/src/Markdown/utils.ts +13 -1
  503. package/src/MetadataList/MetadataList.test.tsx +4 -2
  504. package/src/MetadataList/MetadataList.tsx +3 -3
  505. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  506. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  507. package/src/NumberInput/NumberInput.tsx +6 -1
  508. package/src/Outline/Outline.doc.mjs +7 -5
  509. package/src/Outline/Outline.spec.md +1 -1
  510. package/src/Outline/index.ts +1 -0
  511. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  512. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  513. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  514. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  515. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  516. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  517. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +51 -0
  518. package/src/PowerSearch/PowerSearchValueEditor.tsx +4 -0
  519. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  520. package/src/ProgressBar/ProgressBar.tsx +59 -72
  521. package/src/RadioList/RadioList.doc.mjs +11 -0
  522. package/src/RadioList/RadioList.test.tsx +32 -0
  523. package/src/RadioList/RadioListItem.tsx +25 -1
  524. package/src/ScrollableArea/ScrollableArea.tsx +1 -0
  525. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  526. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  527. package/src/SegmentedControl/SegmentedControl.test.tsx +61 -0
  528. package/src/SegmentedControl/SegmentedControl.tsx +2 -1
  529. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  530. package/src/Selector/Selector.doc.mjs +3 -3
  531. package/src/Selector/Selector.spec.md +51 -49
  532. package/src/Selector/Selector.test.tsx +61 -55
  533. package/src/Selector/Selector.tsx +34 -15
  534. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  535. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  536. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  537. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  538. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  539. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +45 -0
  540. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  541. package/src/SideNav/SideNav.doc.mjs +1 -1
  542. package/src/SideNav/SideNav.test.tsx +10 -0
  543. package/src/SideNav/SideNav.tsx +14 -2
  544. package/src/Slider/Slider.doc.mjs +17 -3
  545. package/src/Slider/Slider.test.tsx +221 -0
  546. package/src/Slider/Slider.tsx +40 -9
  547. package/src/Spinner/Spinner.test.tsx +4 -0
  548. package/src/Spinner/Spinner.tsx +31 -18
  549. package/src/Switch/Switch.doc.mjs +11 -0
  550. package/src/Switch/Switch.test.tsx +16 -0
  551. package/src/Switch/Switch.tsx +28 -0
  552. package/src/TabList/Tab.tsx +35 -7
  553. package/src/TabList/TabList.doc.mjs +11 -0
  554. package/src/TabList/TabList.spec.md +204 -0
  555. package/src/TabList/TabList.test.tsx +66 -0
  556. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  557. package/src/Table/Table.doc.mjs +1 -1
  558. package/src/Table/Table.spec.md +54 -40
  559. package/src/Table/Table.test.tsx +83 -10
  560. package/src/Table/Table.tsx +30 -22
  561. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  562. package/src/TextArea/TextArea.tsx +6 -1
  563. package/src/TextInput/TextInput.test.tsx +20 -1
  564. package/src/TextInput/TextInput.tsx +6 -1
  565. package/src/TimeInput/NativeTimeInput.test.tsx +36 -3
  566. package/src/TimeInput/Presentation.test.tsx +148 -0
  567. package/src/TimeInput/TimeInput.doc.mjs +21 -5
  568. package/src/TimeInput/TimeInput.tsx +102 -11
  569. package/src/TimeInput/TouchTimeField.tsx +572 -0
  570. package/src/TimeInput/index.ts +1 -0
  571. package/src/Timer/Timer.doc.mjs +183 -0
  572. package/src/Timer/Timer.spec.md +215 -0
  573. package/src/Timer/Timer.test.tsx +302 -0
  574. package/src/Timer/Timer.tsx +258 -0
  575. package/src/Timer/index.ts +11 -0
  576. package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
  577. package/src/ToggleButton/ToggleButton.test.tsx +299 -4
  578. package/src/ToggleButton/ToggleButton.tsx +26 -33
  579. package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
  580. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  581. package/src/Token/Token.doc.mjs +2 -2
  582. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  583. package/src/TopNav/TopNavMenu.doc.mjs +2 -2
  584. package/src/TopNav/TopNavMenu.test.tsx +30 -0
  585. package/src/TopNav/TopNavMenu.tsx +7 -2
  586. package/src/TreeList/TreeList.doc.mjs +3 -3
  587. package/src/TreeList/TreeList.spec.md +123 -75
  588. package/src/TreeList/TreeList.test.tsx +29 -0
  589. package/src/TreeList/TreeList.tsx +3 -0
  590. package/src/TreeList/TreeListItem.tsx +15 -1
  591. package/src/TreeList/TreeListTypes.ts +11 -1
  592. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  593. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  594. package/src/Typeahead/Typeahead.test.tsx +53 -0
  595. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  596. package/src/__tests__/pressState.ts +93 -0
  597. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  598. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  599. package/src/hooks/useClickableContainer.test.tsx +236 -0
  600. package/src/hooks/useClickableContainer.ts +20 -4
  601. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  602. package/src/hooks/useScrollableArea.test.tsx +59 -1
  603. package/src/hooks/useScrollableArea.ts +34 -10
  604. package/src/index.ts +3 -0
  605. package/src/inputFontFloor.test.ts +106 -0
  606. package/src/tailwind-theme.css +0 -6
  607. package/src/theme/Theme.test.tsx +32 -0
  608. package/src/theme/declarationBoundary.test.ts +126 -0
  609. package/src/theme/declarationBoundary.ts +347 -0
  610. package/src/theme/defineTheme.ts +4 -0
  611. package/src/theme/derivedVarRegistry.test.ts +7 -0
  612. package/src/theme/derivedVarRegistry.ts +1 -0
  613. package/src/theme/generateThemeRules.test.ts +526 -1
  614. package/src/theme/generateThemeRules.ts +231 -50
  615. package/src/theme/themeAdaptations.test.ts +211 -1
  616. package/src/theme/themeAdaptations.ts +50 -4
  617. package/src/theme/tokenValueCompat.test.ts +4 -1
  618. package/src/utils/inputPresentation.ts +143 -0
  619. package/src/utils/interactionOverlay.stylex.ts +20 -0
  620. package/src/utils/safeUrl.test.ts +88 -0
  621. package/src/utils/safeUrl.ts +85 -0
@@ -0,0 +1,227 @@
1
+ ---
2
+ schema_version: 3
3
+ template_version: 6
4
+ kind: component
5
+ id: component:ChatSendButton
6
+ authority: draft
7
+ archive_reason: null
8
+ superseded_by: null
9
+ approved_by: null
10
+ approved_at: null
11
+ owners: [cixzhang]
12
+ review_triggers: [public-api, behavior, theming, accessibility, testing]
13
+ verified_by:
14
+ [
15
+ packages/core/src/Chat/ChatSendButton.test.tsx,
16
+ packages/core/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts,
17
+ packages/core/src/theme/themingTargets.test.ts,
18
+ apps/storybook/stories/ChatComposer.stories.tsx,
19
+ apps/storybook/stories/ChatSendButtonAudit.stories.tsx,
20
+ apps/storybook/rtl-audit/verified-not-applicable.json,
21
+ ]
22
+ modules: []
23
+ families: []
24
+ design_specs: []
25
+ architecture:
26
+ [
27
+ architecture:public-component-api,
28
+ architecture:icon-resolution-and-component-slots,
29
+ architecture:component-theming-surface,
30
+ architecture:interaction-modality,
31
+ architecture:component-test-sufficiency,
32
+ architecture:knowledge-contracts,
33
+ ]
34
+ contributing: []
35
+ system_specs: [spec:AST-002, spec:AST-020, spec:AST-029, spec:AST-032]
36
+ ---
37
+
38
+ # ChatSendButton component contract
39
+
40
+ ## Contract at a glance
41
+
42
+ | Area | Contract |
43
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
44
+ | Public contract | The exported control selects send or stop presentation from props over ChatComposer context, accepts `sm` or `md`, supports icon overrides, and extends the rendered Button with supported Button DOM, event, styling, and ref inputs. |
45
+ | Behavior | Send is disabled from explicit or composer readiness, stop remains enabled, state-specific actions run before a composed generic click handler, and current send artwork resolves from an explicit override before the shared fallback. |
46
+ | End-user impact | People receive a translated, state-appropriate send or stop action whose availability follows composer readiness. |
47
+ | Builder impact | Builders can use the context defaults or supply every state and action explicitly for standalone composition. |
48
+ | Compatibility/readiness | This draft records current or remediated observable behavior. It adds no public prop, default, target, or compatibility promise. Consumers that used `onClick` to replace sending migrate that logic to `onSend`; implementation of the AST-032 component-slot requirement remains pending. |
49
+ | Review checks | Reject lost send/stop routing, consumer events that replace the state action, a disabled stop action, unlabelled icon-only output, dropped root inputs, or send fallback drift from the observed explicit-then-shared order. |
50
+ | Governing rules | `spec:AST-032/FR2-FR3` (current requirement, implementation pending with its owner); `architecture:public-component-api/INV5-INV8`; `architecture:interaction-modality`; `architecture:component-test-sufficiency`; `spec:AST-020`; `spec:AST-029`. |
51
+
52
+ This table is a review projection. The draft body below records checkable current
53
+ or remediated behavior and does not create product policy.
54
+
55
+ ## Intent
56
+
57
+ ChatSendButton is the compact action control used by ChatComposer. It translates
58
+ composer readiness and streaming state into a shared Button while keeping action,
59
+ icon, styling, and ref seams available for standalone composition.
60
+
61
+ ## Compatibility and migration
62
+
63
+ - Released default preserved: no public default changes are made by this audit.
64
+ - Compatibility class: patch-compatible event-composition repair plus observational documentation and evidence coverage.
65
+ - Controlled/uncontrolled behavior: not applicable; explicit props take precedence over context-derived values.
66
+ - Migration decision: consumers that previously used `onClick` to replace sending should move that logic to `onSend`, because the repaired component now runs the state action and then the accepted generic click.
67
+
68
+ Consumer migration instructions belong in consumer docs and release notes.
69
+
70
+ ## Ownership boundary
71
+
72
+ **Owns**
73
+
74
+ - Selection of the send or stop state.
75
+ - State-specific translated accessible names and Button variants.
76
+ - Composer-context fallback for readiness and actions.
77
+ - Send and stop icon selection at the component seam.
78
+ - Composition of the state action with an accepted generic click handler.
79
+ - The `chat-send-button` theme target and circular root treatment.
80
+
81
+ **Does not own / non-goals**
82
+
83
+ - ChatComposer value editing, submission lifecycle, streaming lifecycle, or placement.
84
+ - Shared Button activation, focus, disabled semantics, hit area, or base styling.
85
+ - Shared icon artwork or theme icon registration.
86
+ - A public policy for whether `isStopShown` may appear without a stop action.
87
+
88
+ ## Public concepts
89
+
90
+ Consumer syntax remains in `ChatSendButton.doc.mjs`. This inventory closes the
91
+ observable semantic surface without duplicating the prop table.
92
+
93
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
94
+ | ------------ | -------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------- | ----------------------------------------------------------- | ----------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------- |
95
+ | Action state | send; stop | Selects the name, Button variant, icon role, disabled rule, and state action. | Every render. | Composer `isStopShown`, otherwise send. | `component:ChatSendButton` | Observed released surface | Values outside the boolean prop type are unsupported. |
96
+ | Availability | enabled; disabled | Prevents send activation when content is not ready. Stop intentionally ignores it. | Disabled applies only to send. | Explicit `isDisabled`, otherwise inverse composer canSend. | component and ChatComposer context | Observed released surface | Values outside the boolean prop type are unsupported. |
97
+ | Action | state callback; composer fallback; composed generic click | Runs the state action and then an accepted consumer click handler. | Enabled send and stop activation. | `onSend` or submit current value; `onStop` or context stop. | component, context, and caller | Remediated observable path | With no state callback or matching context action, only a supplied generic click can run. |
98
+ | Send icon | explicit content; shared fallback | Selects artwork for the send state. | Send state. | `sendIcon`, then shared `arrowUp`. | component and caller | Observed released surface | Unsupported React content follows the shared Button rendering boundary. |
99
+ | Stop icon | explicit content; shared fallback | Selects artwork for the stop state. | Stop state. | `stopIcon`, then shared `stop`. | component and caller | Observed released surface | Unsupported React content follows the shared Button rendering boundary. |
100
+ | Size | `sm`; `md` | Selects the delegated Button size while preserving circular treatment. | Both states. | `md`. | `component:ChatSendButton` | Observed released surface | Values outside the public union are rejected by TypeScript. |
101
+ | Root surface | ref; supported Button DOM/data/ARIA/events; style/class/xstyle | Extends and styles the rendered Button without replacing component-owned action logic. | Every render. | Omitted. | `architecture:public-component-api` | Remediated observable path | Unsupported BaseProps omissions remain unsupported; owned semantics win accidental clashes. |
102
+
103
+ ## Behavioral and layout contract
104
+
105
+ | ID | Candidate invariant | Basis | Draft review state |
106
+ | --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
107
+ | FR1 | The send state MUST render a primary icon-only Button named by the send translation, and it MUST be disabled when explicit or context-derived readiness is false. | Current implementation, docs, tests, `spec:AST-020`, and shared Button behavior | Verified current behavior |
108
+ | FR2 | The stop state MUST render a secondary icon-only Button named by the stop translation, remain enabled regardless of send readiness, and invoke explicit or context stop behavior. | Current implementation, docs, and tests | Verified current behavior; the missing-handler public boundary is owned by `component:ChatComposer/OQ4` |
109
+ | FR3 | Send icon resolution currently prefers `sendIcon` and otherwise resolves shared `arrowUp`. `spec:AST-032/FR2-FR3` separately owns a current requirement to add a component-icon slot; its implementation remains pending with that owner. | Current implementation, docs, tests, and current owner requirement in `spec:AST-032` | Verified shipped two-stage behavior; the required AST-032 stage is not described as shipped |
110
+ | FR4 | Stop icon resolution currently prefers `stopIcon` and otherwise resolves the shared `stop` icon. | Current implementation, docs, and tests | Verified shipped behavior; this draft does not invent a stop component slot |
111
+ | FR5 | Explicit state, disabled, callback, icon, and size props MUST win over their context or component fallback. A generic accepted click handler MUST compose after the selected state action rather than replace it. | Current implementation after audit repair plus `architecture:public-component-api/INV5-INV7` and API contributor guide | Settled objective repair with red-before-green focused tests |
112
+ | FR6 | Supported Button DOM, data, ARIA, className, style, xstyle, and ref inputs MUST reach or compose on the rendered Button while component-owned label, state, and activation behavior remain intact. | Current implementation plus `architecture:public-component-api/INV5-INV8` | Verify through source, type checks, and focused tests |
113
+ | FR7 | The component MUST paint through the shared Button on the co-located `chat-send-button` target and preserve its circular component treatment. | Current implementation, Chat consumer docs, and `architecture:component-theming-surface` | Verified current target and composition |
114
+
115
+ ### Allowed variation
116
+
117
+ - **AV1 — Context or standalone composition.** A builder may rely on ChatComposer
118
+ context or provide all state, action, and disabled values explicitly.
119
+ - **AV2 — Artwork.** Explicit send and stop content and shared fallback artwork may
120
+ vary within the observed icon-resolution behavior.
121
+ - **AV3 — Consumer styling.** Supported styling inputs may extend the Button while
122
+ component-owned state and activation behavior remain.
123
+
124
+ ### Representative states
125
+
126
+ | State | Required invariant | Allowed variation |
127
+ | ---------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------- |
128
+ | Send, disabled | Primary translated send action is unavailable and does not run callbacks. | Icon source, size, theme, and consumer styling. |
129
+ | Send, enabled | Primary translated send action runs explicit or context submission. | Icon source, size, theme, and consumer styling. |
130
+ | Stop | Secondary translated stop action remains enabled and runs explicit or context stop. | Icon source, size, theme, and consumer styling. |
131
+ | Explicit override | Explicit state, callback, icon, disabled value, and size win their fallback seams. | Context may still supply unspecified values. |
132
+ | Composed generic click | State action and accepted generic click both run without one replacing the other. | Either handler may be absent. |
133
+
134
+ ### Transformation and precedence order
135
+
136
+ - **ORD1 — Resolve state.** Explicit `isStopShown` wins, then composer context,
137
+ then the send state.
138
+ - **ORD2 — Resolve action.** Explicit state callback wins its composer fallback.
139
+ The selected state action runs before the accepted generic click handler because
140
+ this component does not promise consumer cancellation of its state action.
141
+ - **ORD3 — Resolve availability.** Stop remains enabled. Send uses explicit
142
+ `isDisabled`, then inverse composer readiness, then disabled outside context.
143
+ - **ORD4 — Resolve artwork.** In send, explicit `sendIcon` wins, then shared
144
+ `arrowUp`; in stop, explicit `stopIcon` wins, then shared `stop`.
145
+ - **ORD5 — Compose root.** Apply component-owned Button semantics and the
146
+ `chat-send-button` target while preserving supported consumer root inputs.
147
+
148
+ ### Performance and resources
149
+
150
+ - **PR1 — Render-only projection.** The component adds no Effect, observer,
151
+ listener, timer, state mirror, or owned async lifecycle.
152
+
153
+ ## Accessibility contract
154
+
155
+ - **AR1 — Native action semantics.** The delegated Button MUST own native button
156
+ activation, keyboard behavior, focus indication, and disabled semantics.
157
+ - **AR2 — State-appropriate name.** The icon-only control MUST expose the current
158
+ translated send or stop label independently of icon artwork.
159
+ - **AR3 — Disabled send behavior.** A disabled send action MUST not invoke either
160
+ the state action or a consumer click handler.
161
+ - **AR4 — Modality parity.** Pointer and keyboard activation MUST traverse the same
162
+ state-action and composed-event path.
163
+
164
+ ## Design relationships
165
+
166
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
167
+ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------ | ------------------ |
168
+ | Action button | Circular compact Button carrying the current send or stop action. | Current source and consumer docs; exact tuning stays in code | Primary/secondary action | FR1, FR2, FR7 |
169
+ | Send artwork | Upward send glyph unless explicit content wins; AST-032 currently requires a component slot whose implementation is pending. | Current source and docs; current requirement in `spec:AST-032/FR2-FR3` | Action cue | FR3 |
170
+ | Stop artwork | Shared stop glyph unless explicit content wins. | Current source and consumer docs | Action cue | FR4 |
171
+
172
+ This observational draft does not select new dimensions, variants, icon artwork,
173
+ color roles, or visual prominence.
174
+
175
+ The Chat family consumer doc catalogs `chat-send-button`. Button owns the
176
+ underlying painting and interaction-state styling; the component target is
177
+ co-located on that painting element.
178
+
179
+ ## Family and system relationships
180
+
181
+ - ChatComposer owns value, readiness, submission, stop lifecycle, and placement.
182
+ - Button owns shared activation, focus, disabled semantics, hit area, and paint.
183
+ - `architecture:public-component-api` owns BaseProps reachability, style/ref
184
+ composition, and deliberate event composition.
185
+ - `architecture:icon-resolution-and-component-slots` owns the shared slot model;
186
+ `spec:AST-032/FR2-FR3` currently requires that stage in send resolution, and
187
+ its implementation remains pending with the owner. This draft does not describe
188
+ the unshipped stage as current behavior.
189
+ - `architecture:component-theming-surface` owns the qualification and placement
190
+ of the co-located `chat-send-button` target.
191
+ - `architecture:interaction-modality` and `spec:AST-020` own pointer, keyboard,
192
+ focus, and accessibility parity inherited through Button.
193
+ - `architecture:component-test-sufficiency` owns public-seam regression coverage.
194
+ - `spec:AST-029` owns this Night Watch observational backfill and prevents it from
195
+ settling new product meaning.
196
+
197
+ ## Verification map
198
+
199
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
200
+ | ------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------ |
201
+ | FR1, FR2, AR1-AR4 | `ChatSendButton.test.tsx`, `ChatSendButton.a11y.chromium.spec.ts`, and `ChatComposer.test.tsx` | Enabled/disabled send, stop with and without handler, context stop, keyboard/pointer, light/dark interaction states | Label, disabled, native activation, state routing, or interaction paint drift fails focused or exact-head browser evidence. | `audit:ChatSendButton/accessibility` |
202
+ | FR3 | `ChatSendButton.test.tsx`; current AST-032 owner requirement and its pending implementation | Explicit and shared-fallback send icon | Losing the observed two-stage precedence fails focused tests; the AST-032 owner verifies the required component-slot stage. | `audit:ChatSendButton/theming` |
203
+ | FR4 | `ChatSendButton.test.tsx` | Explicit and fallback stop icon | Losing explicit precedence or registry resolution fails focused assertions. | `audit:ChatSendButton/behavior` |
204
+ | FR5, FR6 | Red-before-green callback composition, ordering, size, root passthrough, disabled-click, and keyboard tests; types and lint | Send, stop, `sm`/`md`, ref/class/data/ARIA, Enter/Space | Consumer events replacing state actions, cancellation reordering, lost root inputs, or modality drift fails focused tests. | `audit:ChatSendButton/api` |
205
+ | FR7 | `themingTargets.test.ts`, exact-head browser receipts, and source inspection | Send and stop themes | Target removal, movement off paint, or undocumented target drift fails tests or browser evidence. | `audit:ChatSendButton/theming` |
206
+ | RTL relation | RTL shared-fixture route plus refreshed verified-N/A source receipts for ChatSendButton and ChatComposer | Send and stop | Directional artwork, physical positioning, or transform invalidates the checked-in receipts. | `audit:ChatSendButton/i18n-rtl` |
207
+ | Browser matrix | `ChatSendButton.a11y.chromium.spec.ts` exact-head 10-sensor receipts | Light/dark send and stop rest/hover/focus/press, disabled rest/hover, `sm`/`md`, 320px coarse pointer, D7 contrast pairs | A stale build, decoy selector, missing state, changed disabled paint, absent interaction pixels, failed contrast, or geometry miss fails closed. | `audit:ChatSendButton/visual` |
208
+ | Documentation and surface | Consumer docs, export checks, Storybook, and `check:knowledge` | Props, public subpath, states, draft contract | Missing or stale docs, exports, relationships, or required draft structure fails validation. | `audit:ChatSendButton/docs` |
209
+
210
+ ## Decision log
211
+
212
+ None. This draft records current facts, one objective event-composition repair,
213
+ and one current AST-032 requirement whose implementation remains pending with its
214
+ owner. It introduces no component-local public API, default, compatibility,
215
+ ownership, or subjective visual decision.
216
+
217
+ ## Open questions
218
+
219
+ - **Cross-reference: stop without handler.** `component:ChatComposer/OQ4` owns
220
+ the unresolved policy for a visible stop action without an explicit or context
221
+ `onStop`. This component draft records and tests the current enabled no-op
222
+ branch without duplicating that question.
223
+
224
+ ## Content boundary
225
+
226
+ This file does not duplicate consumer examples, audit scores, screenshots,
227
+ eligibility data, or shared Button and icon-system rules. It links to their owners.
@@ -4,12 +4,14 @@
4
4
  * @file ChatSendButton.test.tsx
5
5
  * @input Uses vitest, @testing-library/react, the global icon registry
6
6
  * @output Unit tests for ChatSendButton
7
- * @position Colocated unit test; covers the send/stop labels and icons, the
8
- * disabled rules, click routing, and the ChatComposer context defaults
7
+ * @position Colocated unit test; covers labels and icons, disabled rules,
8
+ * composed consumer clicks, state-action routing, and ChatComposer defaults
9
9
  */
10
10
 
11
+ import {createRef} from 'react';
11
12
  import {describe, it, expect, vi, afterEach} from 'vitest';
12
13
  import {render, screen, fireEvent} from '@testing-library/react';
14
+ import userEvent from '@testing-library/user-event';
13
15
  import {ChatSendButton} from './ChatSendButton';
14
16
  import {ChatComposer} from './ChatComposer';
15
17
  import {Button} from '../Button';
@@ -38,6 +40,55 @@ describe('ChatSendButton', () => {
38
40
  expect(screen.getByRole('button', {name: 'Send'})).toBeEnabled();
39
41
  });
40
42
 
43
+ it('forwards ref, className, data, and ARIA inputs to the Button root', () => {
44
+ const ref = createRef<HTMLButtonElement>();
45
+ render(
46
+ <>
47
+ <ChatSendButton
48
+ ref={ref}
49
+ isDisabled={false}
50
+ onSend={() => {}}
51
+ className="consumer-class"
52
+ data-audit-root="forwarded"
53
+ aria-describedby="send-help"
54
+ />
55
+ <span id="send-help">Sends the current message</span>
56
+ </>,
57
+ );
58
+ const button = screen.getByRole('button', {name: 'Send'});
59
+ expect(ref.current).toBe(button);
60
+ expect(button).toHaveClass('consumer-class');
61
+ expect(button).toHaveAttribute('data-audit-root', 'forwarded');
62
+ expect(button).toHaveAccessibleDescription('Sends the current message');
63
+ });
64
+
65
+ it('reflects both supported Button sizes', () => {
66
+ render(
67
+ <>
68
+ <ChatSendButton
69
+ data-testid="send-small"
70
+ isDisabled={false}
71
+ onSend={() => {}}
72
+ size="sm"
73
+ />
74
+ <ChatSendButton
75
+ data-testid="send-medium"
76
+ isDisabled={false}
77
+ onSend={() => {}}
78
+ size="md"
79
+ />
80
+ </>,
81
+ );
82
+ expect(screen.getByTestId('send-small')).toHaveAttribute(
83
+ 'data-size',
84
+ 'sm',
85
+ );
86
+ expect(screen.getByTestId('send-medium')).toHaveAttribute(
87
+ 'data-size',
88
+ 'md',
89
+ );
90
+ });
91
+
41
92
  it('calls onSend when clicked', () => {
42
93
  const onSend = vi.fn();
43
94
  render(<ChatSendButton isDisabled={false} onSend={onSend} />);
@@ -45,13 +96,53 @@ describe('ChatSendButton', () => {
45
96
  expect(onSend).toHaveBeenCalledTimes(1);
46
97
  });
47
98
 
48
- it('swallows the click while disabled', () => {
99
+ it('composes the consumer onClick with onSend', () => {
100
+ const onClick = vi.fn();
101
+ const onSend = vi.fn();
102
+ render(
103
+ <ChatSendButton isDisabled={false} onClick={onClick} onSend={onSend} />,
104
+ );
105
+ fireEvent.click(screen.getByRole('button', {name: 'Send'}));
106
+ expect(onClick).toHaveBeenCalledTimes(1);
107
+ expect(onSend).toHaveBeenCalledTimes(1);
108
+ });
109
+
110
+ it('runs onSend exactly once before a consumer click prevents default', () => {
111
+ const order: string[] = [];
112
+ const onSend = vi.fn(() => order.push('send'));
113
+ const onClick = vi.fn(event => {
114
+ order.push('click');
115
+ event.preventDefault();
116
+ });
117
+ render(
118
+ <ChatSendButton isDisabled={false} onClick={onClick} onSend={onSend} />,
119
+ );
120
+ fireEvent.click(screen.getByRole('button', {name: 'Send'}));
121
+ expect(order).toEqual(['send', 'click']);
122
+ expect(onSend).toHaveBeenCalledTimes(1);
123
+ expect(onClick).toHaveBeenCalledTimes(1);
124
+ });
125
+
126
+ it('supports native Enter and Space activation', async () => {
127
+ const user = userEvent.setup();
128
+ const onSend = vi.fn();
129
+ render(<ChatSendButton isDisabled={false} onSend={onSend} />);
130
+ const button = screen.getByRole('button', {name: 'Send'});
131
+ button.focus();
132
+ await user.keyboard('{Enter}');
133
+ await user.keyboard(' ');
134
+ expect(onSend).toHaveBeenCalledTimes(2);
135
+ });
136
+
137
+ it('swallows both state and consumer clicks while disabled', () => {
49
138
  // isDisabled already defaults true here (no composer context), so this
50
139
  // pins the click routing through a disabled Button, not the prop.
51
140
  const onSend = vi.fn();
52
- render(<ChatSendButton onSend={onSend} />);
141
+ const onClick = vi.fn();
142
+ render(<ChatSendButton onClick={onClick} onSend={onSend} />);
53
143
  fireEvent.click(screen.getByRole('button', {name: 'Send'}));
54
144
  expect(onSend).not.toHaveBeenCalled();
145
+ expect(onClick).not.toHaveBeenCalled();
55
146
  });
56
147
 
57
148
  it('styles the send state as a primary button', () => {
@@ -133,6 +224,38 @@ describe('ChatSendButton', () => {
133
224
  expect(onSend).not.toHaveBeenCalled();
134
225
  });
135
226
 
227
+ it('composes the consumer onClick with onStop', () => {
228
+ const onClick = vi.fn();
229
+ const onStop = vi.fn();
230
+ render(<ChatSendButton isStopShown onClick={onClick} onStop={onStop} />);
231
+ fireEvent.click(screen.getByRole('button', {name: 'Stop'}));
232
+ expect(onClick).toHaveBeenCalledTimes(1);
233
+ expect(onStop).toHaveBeenCalledTimes(1);
234
+ });
235
+
236
+ it('runs onStop exactly once before a consumer click prevents default', () => {
237
+ const order: string[] = [];
238
+ const onStop = vi.fn(() => order.push('stop'));
239
+ const onClick = vi.fn(event => {
240
+ order.push('click');
241
+ event.preventDefault();
242
+ });
243
+ render(<ChatSendButton isStopShown onClick={onClick} onStop={onStop} />);
244
+ fireEvent.click(screen.getByRole('button', {name: 'Stop'}));
245
+ expect(order).toEqual(['stop', 'click']);
246
+ expect(onStop).toHaveBeenCalledTimes(1);
247
+ expect(onClick).toHaveBeenCalledTimes(1);
248
+ });
249
+
250
+ it('remains an enabled no-op without onStop while generic onClick still runs', () => {
251
+ const onClick = vi.fn();
252
+ render(<ChatSendButton isStopShown onClick={onClick} />);
253
+ const stop = screen.getByRole('button', {name: 'Stop'});
254
+ expect(stop).toBeEnabled();
255
+ fireEvent.click(stop);
256
+ expect(onClick).toHaveBeenCalledTimes(1);
257
+ });
258
+
136
259
  it('resolves its default icon from the registry stop entry', () => {
137
260
  registerIcons({
138
261
  stop: (
@@ -180,10 +303,7 @@ describe('ChatSendButton', () => {
180
303
  expect(send).toBeEnabled();
181
304
 
182
305
  fireEvent.click(send);
183
- // Only that the click reaches the composer's submit path is this
184
- // button's behavior. The submitted value comes from the composer's own
185
- // state, not from here, so asserting it would pin ChatComposer instead.
186
- expect(onSubmit).toHaveBeenCalledTimes(1);
306
+ expect(onSubmit).toHaveBeenCalledWith('hello');
187
307
  });
188
308
  });
189
309
  });
@@ -10,7 +10,8 @@
10
10
  *
11
11
  * Reads composer state from ChatComposerContext by default so it "just
12
12
  * works" inside ChatComposer. All context-derived values can be
13
- * overridden via props for standalone usage.
13
+ * overridden via props for standalone usage. Accepted `onClick` handlers
14
+ * compose after the selected send or stop action.
14
15
  *
15
16
  * States:
16
17
  * - **Send** — accent/primary, arrowUp icon, disabled when nothing to send.
@@ -24,7 +25,7 @@ import {useIcon} from '../Icon';
24
25
  import {useChatComposerContext} from './ChatContext';
25
26
 
26
27
  import type {BaseProps} from '../BaseProps';
27
- import {mergeProps} from '../utils';
28
+ import {composeEventHandlers, mergeProps} from '../utils';
28
29
  import {themeProps} from '../utils/themeProps';
29
30
  import {useTranslator} from '../i18n';
30
31
 
@@ -85,6 +86,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
85
86
  isDisabled = !(context?.canSend ?? false),
86
87
  onSend,
87
88
  onStop = context?.onStop,
89
+ onClick,
88
90
  sendIcon,
89
91
  stopIcon,
90
92
  size = 'md',
@@ -95,7 +97,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
95
97
  ...rest
96
98
  } = props;
97
99
 
98
- const handleSend = onSend ?? (() => context?.onSubmit(''));
100
+ const handleSend = onSend ?? (() => context?.onSubmit(context.value));
99
101
  const defaultStopIcon = useIcon('stop');
100
102
  const defaultSendIcon = useIcon('arrowUp');
101
103
 
@@ -116,7 +118,7 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
116
118
  }
117
119
  isIconOnly
118
120
  isDisabled={!isStopShown && isDisabled}
119
- onClick={isStopShown ? onStop : handleSend}
121
+ onClick={composeEventHandlers(isStopShown ? onStop : handleSend, onClick)}
120
122
  {...rest}
121
123
  {...mergeProps(themeProps('chat-send-button'), {className}, style)}
122
124
  xstyle={[styles.root, xstyle]}
@@ -6,24 +6,28 @@ export const docs = {
6
6
  name: 'ChatSystemMessage',
7
7
  subComponentOf: 'Chat',
8
8
  displayName: 'Chat System Message',
9
- description: 'Centered system message for non-sender content like date separators, membership changes, and status notices. It is not a chat bubble; it has no avatar, no alignment, and no sender context. Use the divider variant for temporal breaks and default for inline status updates.',
9
+ description:
10
+ 'Centered system message for non-sender content like date separators, membership changes, and status notices. It is not a chat bubble; it has no avatar, no alignment, and no sender context. Use the divider variant for temporal breaks and default for inline status updates.',
10
11
  props: [
11
12
  {
12
13
  name: 'children',
13
14
  type: 'ReactNode',
14
- description: 'System message content: a short, factual string like a date, a join/leave notice, or a status change.',
15
+ description:
16
+ 'System message content: factual text or React content such as a date, join/leave notice, or status change. Long default content wraps within the available width.',
15
17
  required: true,
16
18
  },
17
19
  {
18
20
  name: 'variant',
19
21
  type: "'default' | 'divider'",
20
- description: "Visual variant. 'default' renders centered text. 'divider' adds horizontal lines on each side via Divider: use for date separators and section breaks.",
22
+ description:
23
+ "Visual variant. 'default' renders centered text. 'divider' adds horizontal lines on each side via Divider: use for date separators and section breaks.",
21
24
  default: "'default'",
22
25
  },
23
26
  {
24
27
  name: 'icon',
25
28
  type: 'ReactNode',
26
- description: 'Leading icon that reinforces the message type. Wrap in Icon for consistent sizing. Use for membership changes, encryption notices, or AI activity.',
29
+ description:
30
+ 'Optional caller-provided icon content. Rendered before the message in the default variant; the divider variant currently does not render it. Wrap in Icon for consistent sizing.',
27
31
  slotElements: [
28
32
  {
29
33
  __element: 'Icon',
@@ -34,27 +38,126 @@ export const docs = {
34
38
  },
35
39
  ],
36
40
  },
41
+ {
42
+ name: 'xstyle',
43
+ type: 'StyleXStyles',
44
+ description:
45
+ 'StyleX styles for layout customization. Must be a stylex.create() value: not an inline style object like style={{}}.',
46
+ },
37
47
  ],
48
+ theming: {
49
+ targets: [
50
+ {className: 'astryx-chat-system-message', visualProps: ['variant']},
51
+ ],
52
+ },
53
+ usage: {
54
+ description:
55
+ 'Use ChatSystemMessage for concise, non-sender content inside a chat transcript. Choose the default variant for factual status notices and the divider variant for date or section breaks. Long default content wraps within the available width. The component exposes status semantics and the divider branch includes a labelled separator.',
56
+ bestPractices: [
57
+ {
58
+ guidance: true,
59
+ description:
60
+ 'Keep the visible message concise and self-contained so it remains understandable without an icon.',
61
+ },
62
+ {
63
+ guidance: true,
64
+ description:
65
+ 'Use the divider variant for temporal or section boundaries and the default variant for factual status notices.',
66
+ },
67
+ {
68
+ guidance: false,
69
+ description:
70
+ 'Use ChatSystemMessage for sender-authored content; use ChatMessage and ChatMessageBubble instead.',
71
+ },
72
+ {
73
+ guidance: false,
74
+ description:
75
+ 'Use caller-provided icon artwork as the only source of meaning; the visible message must carry the same information.',
76
+ },
77
+ ],
78
+ anatomy: [
79
+ {
80
+ name: 'System message',
81
+ required: true,
82
+ description:
83
+ 'The noninteractive status row that carries the chat-system-message theme target.',
84
+ },
85
+ {
86
+ name: 'Content',
87
+ required: true,
88
+ description: 'The concise caller-provided message or divider label.',
89
+ },
90
+ {
91
+ name: 'Icon content',
92
+ required: false,
93
+ description:
94
+ 'Rendered before the message in the default variant; the divider variant currently does not render it.',
95
+ },
96
+ {
97
+ name: 'Divider',
98
+ required: false,
99
+ description:
100
+ 'A labelled horizontal Divider rendered by the divider variant.',
101
+ },
102
+ ],
103
+ },
38
104
  };
39
105
 
40
106
  export const docsZh = {
41
107
  name: 'ChatSystemMessage',
42
108
  displayName: 'Chat System Message',
43
- description: '居中的系统消息,用于日期分隔、成员变更和状态通知等非发送者内容。没有头像、对齐或气泡。使用 divider 变体做时间分隔,default 做内联状态更新。',
109
+ description:
110
+ '居中的系统消息,用于日期分隔、成员变更和状态通知等非发送者内容。没有头像、对齐或气泡。使用 divider 变体做时间分隔,default 做内联状态更新。',
44
111
  propDescriptions: {
45
- children: '系统消息内容,简短的事实性文本,如日期、加入/离开通知或状态变更。',
46
- variant: "视觉变体。'default' 渲染居中文本。'divider' 通过 Divider 在两侧添加水平线,用于日期分隔和段落分隔。",
47
- icon: '增强消息类型辨识度的前置图标。使用 Icon 包裹以获得一致的尺寸。',
112
+ children:
113
+ '事实性系统消息内容,如日期、加入/离开通知或状态变更;较长的 default 内容会在可用宽度内换行。',
114
+ variant:
115
+ "视觉变体。'default' 渲染居中文本。'divider' 通过 Divider 在两侧添加水平线,用于日期分隔和段落分隔。",
116
+ icon: '可选的调用方图标内容。default 变体会在消息前渲染;divider 变体当前不会渲染。使用 Icon 包裹以获得一致的尺寸。',
117
+ xstyle: '用于布局自定义的 StyleX 样式。',
118
+ },
119
+ theming: {
120
+ targets: [
121
+ {className: 'astryx-chat-system-message', visualProps: ['variant']},
122
+ ],
48
123
  },
49
124
  };
50
125
 
51
126
  export const docsDense = {
52
127
  name: 'ChatSystemMessage',
53
128
  displayName: 'Chat System Message',
54
- description: 'centered non-sender msg; divider variant for date breaks, default for status notices; supports leading icon',
129
+ description:
130
+ 'centered non-sender msg; divider variant for date breaks, default for status notices; accepts optional icon content',
131
+ usage: {
132
+ description:
133
+ 'Use for concise non-sender content in chat. Default is a factual status row; divider is a labelled date/section break.',
134
+ bestPractices: [
135
+ {
136
+ guidance: true,
137
+ description: 'Keep visible content concise and self-contained.',
138
+ },
139
+ {
140
+ guidance: true,
141
+ description:
142
+ 'Use divider for temporal/section boundaries and default for factual notices.',
143
+ },
144
+ {
145
+ guidance: false,
146
+ description:
147
+ 'Use for sender-authored content; use ChatMessage and ChatMessageBubble.',
148
+ },
149
+ {
150
+ guidance: false,
151
+ description: 'Rely on icon artwork as the only source of meaning.',
152
+ },
153
+ ],
154
+ },
55
155
  propDescriptions: {
56
- children: 'short factual text: date, join/leave, status change',
57
- variant: 'default=centered text, divider=horizontal lines via Divider for date/section breaks',
58
- icon: 'leading icon reinforcing msg type; wrap in Icon',
156
+ children:
157
+ 'factual React content: date, join/leave, status change; long default content wraps',
158
+ variant:
159
+ 'default=centered text, divider=horizontal lines via Divider for date/section breaks',
160
+ icon: 'optional caller icon; rendered before default message; divider currently does not render it',
161
+ xstyle: 'additional StyleX layout styles',
59
162
  },
60
163
  };