@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,225 @@
1
+ ---
2
+ schema_version: 3
3
+ template_version: 6
4
+ kind: component
5
+ id: component:ChatSystemMessage
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, layout, theming, accessibility, testing]
13
+ verified_by:
14
+ [
15
+ packages/core/src/Chat/ChatSystemMessage.test.tsx,
16
+ packages/core/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts,
17
+ packages/core/src/theme/themingTargets.test.ts,
18
+ apps/storybook/stories/ChatSystemMessageAudit.stories.tsx,
19
+ apps/storybook/rtl-audit/verified-not-applicable.json,
20
+ ]
21
+ modules: []
22
+ families: []
23
+ design_specs: []
24
+ architecture:
25
+ [
26
+ architecture:public-component-api,
27
+ architecture:component-theming-surface,
28
+ architecture:component-test-sufficiency,
29
+ architecture:react-component-runtime,
30
+ architecture:theme-tokens,
31
+ architecture:knowledge-contracts,
32
+ ]
33
+ contributing: []
34
+ system_specs: [spec:AST-002, spec:AST-009, spec:AST-020, spec:AST-029]
35
+ ---
36
+
37
+ # ChatSystemMessage component contract
38
+
39
+ ## Contract at a glance
40
+
41
+ | Area | Contract |
42
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
43
+ | Public contract | The exported noninteractive chat row accepts required content, `default` or `divider` presentation, optional icon content, and supported root DOM, styling, and ref inputs. |
44
+ | Behavior | The default branch centers and wraps content with optional icon content in a status region. The divider branch delegates its labelled separator to Divider and currently does not render the `icon` input. |
45
+ | End-user impact | People can distinguish factual chat notices from sender messages and can identify temporal or section breaks through a labelled separator. |
46
+ | Builder impact | Builders choose between a plain status row and a labelled divider and provide self-contained content. No new caller choice is introduced by this observational record. |
47
+ | Compatibility/readiness | This draft records the wrapping correction plus released observable behavior. The unresolved divider/icon combination remains unchanged and requires an owner decision before its behavior changes. |
48
+ | Review checks | Reject lost status or separator semantics, dropped supported root inputs, target/anatomy drift, or claims that the unresolved divider/icon combination has been settled. |
49
+ | Governing rules | `architecture:public-component-api/INV3`, `architecture:public-component-api/INV5`, `architecture:public-component-api/INV9`; `spec:AST-002/FR15`; `architecture:component-theming-surface/INV3-INV6`; `architecture:component-test-sufficiency`; `spec:AST-009`; `spec:AST-020`; `spec:AST-029`. |
50
+
51
+ This table is a review projection. The draft body below records checkable current
52
+ behavior and does not create product policy.
53
+
54
+ ## Intent
55
+
56
+ ChatSystemMessage presents concise non-sender content inside a chat transcript. It
57
+ separates system-originated notices from sender messages and delegates labelled date
58
+ or section separators to Divider.
59
+
60
+ ## Compatibility and migration
61
+
62
+ - Released default preserved: yes; the default branch now allows long content to wrap within its container.
63
+ - Compatibility class: additive layout correction, observational documentation, and evidence.
64
+ - Controlled/uncontrolled behavior: not applicable; the component owns no state.
65
+ - Migration decision: none for wrapping. Any divider/icon type restriction would require an explicit compatibility decision under `architecture:public-component-api/INV9`.
66
+
67
+ Consumer migration instructions belong in consumer docs and release notes.
68
+
69
+ ## Ownership boundary
70
+
71
+ **Owns**
72
+
73
+ - The non-sender status row and its `chat-system-message` target.
74
+ - Selection between the default centered row and the delegated divider composition.
75
+ - Wrapping default-variant content within the available inline space while keeping icon artwork from shrinking.
76
+ - Root DOM, styling, and ref composition.
77
+
78
+ **Does not own / non-goals**
79
+
80
+ - Sender identity, avatar, bubble, transcript ordering, or scrolling.
81
+ - Divider rule paint, label placement, separator role, or separator naming, which are delegated to `component:Divider`.
82
+ - Long Divider-label overflow and forced-colors rule paint, which remain shared `component:Divider` advisories rather than ChatSystemMessage-owned defects.
83
+ - Divider's falsey-label rendering. Empty string and empty Fragment content leave the separator without a visible label or accessible name; numeric zero renders stray `00` text with no accessible name. This is a shared `spec:AST-002/FR15` advisory routed to `component:Divider`.
84
+ - The semantic or directional meaning of caller-provided content or icon artwork.
85
+ - Announcement timing or spoken output; claims at that layer require `spec:AST-009` evidence.
86
+
87
+ ## Public concepts
88
+
89
+ Consumer syntax remains in `ChatSystemMessage.doc.mjs`. This table closes the
90
+ observable public surface without deciding the unresolved divider/icon contract.
91
+
92
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
93
+ | ---------------- | -------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------- | --------- | ----------------------------------- | -------------------------- | --------------------------------------------------- |
94
+ | Presentation | `default`; `divider` | Selects a centered status row or a labelled horizontal Divider composition. | Every render. | `default` | `component:ChatSystemMessage` | Observed released surface | Values outside the public union are rejected by TS. |
95
+ | Content | caller-provided `ReactNode` | Supplies the visible status or separator label. | Both variants. | Required | caller and component | Observed released surface | Missing content is rejected by TS. |
96
+ | Icon content | omitted; caller-provided `ReactNode` | Supplies optional caller-owned icon content associated with the message. | Rendered by default and currently ignored by divider. | Omitted | caller and component | Unsettled released surface | Divider currently ignores the input; see OQ1. |
97
+ | Root surface | ref; supported DOM/data/ARIA/events; class/style/xstyle | Extends the component-owned root without replacing its owned role or state. | Both variants. | Omitted | `architecture:public-component-api` | Observed released surface | Unsupported BaseProps omissions stay unsupported. |
98
+ | Status semantics | persistent `role="status"`; delegated labelled separator | Exposes the row as status content and the divider child as a separator. | Status on both; separator on divider. | Fixed | component and `component:Divider` | Observed released surface | Consumer role input does not replace owned role. |
99
+
100
+ ## Behavioral and layout contract
101
+
102
+ | ID | Candidate invariant | Basis | Draft review state |
103
+ | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
104
+ | FR1 | The default branch MUST render the required content in a centered, noninteractive status row, allow long content to wrap within the available inline space, and preserve optional icon geometry. | Current source, released docs, tests, and examples | Verified current behavior |
105
+ | FR2 | For truthy content, the divider branch MUST render the content through Divider as a labelled horizontal separator inside the component's status root. Falsey content follows the shared Divider advisory recorded in AV1. | Current source, released docs, Divider implementation, tests, and examples | Verified current behavior; shared Divider advisory |
106
+ | FR3 | The divider branch currently ignores `icon`; this draft MUST NOT convert that observation into a stable restriction, a requirement to render the icon, or a warning policy. | `architecture:public-component-api/INV3`, `architecture:public-component-api/INV5`, and `spec:AST-002/FR15` | Human API decision required; see OQ1 |
107
+ | FR4 | Supported root DOM, data, ARIA, className, style, xstyle, and ref inputs MUST reach or compose on the root while component-owned `role="status"` and reflected `variant` remain intact. | Current source plus `architecture:public-component-api/INV5-INV8` | Verified current behavior and existing focused evidence |
108
+ | FR5 | The component MUST use semantic color, spacing, and typography tokens and logical layout; the `variant` state remains reflected on the single `chat-system-message` target. | Current source, `architecture:theme-tokens`, and theming architecture | Verified current behavior |
109
+ | FR6 | The component remains render-only: props determine output without Effects, state mirrors, observers, listeners, timers, or owned async resources. | Current source and `architecture:react-component-runtime/INV1-INV8` | Verified current behavior |
110
+
111
+ ### Allowed variation
112
+
113
+ - **AV1 - Caller content.** Text and other React content may vary while remaining
114
+ self-contained. Empty strings, numeric zero, and empty Fragments are reachable
115
+ `ReactNode` partitions. The default variant keeps `role="status"` and renders the
116
+ content unchanged: empty string and empty Fragment content remain empty, while
117
+ numeric zero renders one `0`. In the divider variant, the status root and separator
118
+ remain; empty string and empty Fragment content produce no visible label or
119
+ accessible name, while numeric zero paints stray `00` text with no accessible name.
120
+ The divider's falsey-label behavior is a shared `spec:AST-002/FR15` advisory routed
121
+ to `component:Divider`.
122
+ - **AV2 - Caller styling.** Supported root styling inputs may extend the component
123
+ without replacing owned status semantics or variant reflection.
124
+ - **AV3 - Delegated Divider paint.** Divider owns its rule and label paint and may
125
+ evolve within its own contract.
126
+
127
+ ### Representative states
128
+
129
+ | State | Required invariant | Allowed variation |
130
+ | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- |
131
+ | Default | Centered status content is present. | Content, theme, and root styling. |
132
+ | Default with icon | Optional icon content and visible content render together. | Caller-provided artwork and content. |
133
+ | Default long content | Content wraps without crossing either inline edge or creating page overflow. | Theme and localized content. |
134
+ | Divider | A labelled horizontal separator presents the supplied content. | Label content, theme, and root styling. |
135
+ | Divider with icon | Current output is measured without deciding the ignored-input contract. | No behavior change until OQ1 is resolved. |
136
+ | Empty ReactNode | The default variant keeps `role="status"` and renders content unchanged (empty or one `0`). In the divider variant, the status root and separator remain; empty content has no label/name, while numeric zero paints stray `00` without a name. | Empty string, numeric zero, empty Fragment. |
137
+ | Narrow/coarse pointer | The noninteractive row remains visible without horizontal page overflow. | Theme and supported content. |
138
+
139
+ ### Transformation and precedence order
140
+
141
+ - **ORD1 - Select branch.** `variant="divider"` selects the Divider branch;
142
+ every other supported value uses the default branch.
143
+ - **ORD2 - Compose root.** Apply component-owned target/state and styles, then
144
+ compose supported consumer styling and root inputs while retaining the owned
145
+ status role.
146
+ - **ORD3 - Delegate divider.** Divider owns separator semantics and paint inside
147
+ the component root.
148
+
149
+ ### Performance and resources
150
+
151
+ - **PR1 - Render-only projection.** The component adds no Effect, observer,
152
+ listener, timer, state mirror, or owned asynchronous lifecycle.
153
+
154
+ ## Accessibility contract
155
+
156
+ - **AR1 - Status exposure.** The root currently exposes `role="status"` for both
157
+ variants. Browser evidence may prove role exposure; spoken announcement timing is
158
+ outside this draft and requires `spec:AST-009` evidence.
159
+ - **AR2 - Divider relationship.** For truthy content, the divider branch delegates a
160
+ horizontal `separator` whose labelled target contains the visible label; focused DOM
161
+ tests verify the computed accessible name. Falsey content follows the shared Divider
162
+ advisory in AV1.
163
+ - **AR3 - Caller content.** Visible content remains the self-contained message.
164
+ Caller-provided icon content does not replace that text.
165
+ - **AR4 - Noninteractive surface.** The component introduces no focus target,
166
+ keyboard command, pointer action, disabled state, or interactive state machine.
167
+
168
+ ## Design relationships
169
+
170
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
171
+ | ---------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | -------------- | ------------------ |
172
+ | System message | Centers a concise non-sender row and owns the component target. | Current source and released consumer docs | Supporting | FR1, FR4, FR5 |
173
+ | Content | Presents the caller's visible message. | Current source and released consumer docs | Prominent | FR1, FR2, AR3 |
174
+ | Icon content | Supplies optional caller-owned artwork associated with the message; variant behavior is unsettled. | Current source and released consumer docs; divider unsettled | Supporting | FR1, FR3, AR3 |
175
+ | Divider | Delegates labelled separator paint and semantics to Divider. | `component:Divider` observed implementation and docs | Supporting | FR2, AR2 |
176
+
177
+ This observational draft does not choose new spacing, proportions, color roles,
178
+ icon artwork, live-region timing, or divider/icon behavior.
179
+
180
+ ## Family and system relationships
181
+
182
+ - `component:Divider` owns the delegated separator structure, role, name,
183
+ paint, long-label overflow, and falsey-label behavior. The numeric-zero `00`
184
+ output with no accessible name is a shared `spec:AST-002/FR15` advisory.
185
+ - `architecture:public-component-api` owns released exports, BaseProps reachability,
186
+ styling composition, and the ref contract.
187
+ - `architecture:component-theming-surface` owns the target/anatomy mapping and
188
+ variant reflection.
189
+ - `architecture:component-test-sufficiency` owns bounded, mutation-sensitive evidence
190
+ for applicable promises and established public seams.
191
+ - `architecture:react-component-runtime` owns the render-only lifecycle boundary.
192
+ - `architecture:theme-tokens` owns the semantic token vocabulary.
193
+ - `spec:AST-009` owns any future claim about spoken announcement timing or AT output.
194
+ - `spec:AST-020` owns evidence-layer and accessibility completeness boundaries.
195
+ - `spec:AST-029` owns this observational audit backfill and prevents it from settling
196
+ new public meaning.
197
+
198
+ ## Verification map
199
+
200
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
201
+ | ------------------------- | --------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
202
+ | FR1, AR1, AR3 | `ChatSystemMessage.test.tsx`, scoped axe, and exact-head Chromium receipts | Default, default with icon, long content, nested live log, neutral light/dark | Missing content, status role, icon content, wrapping, or browser-visible subject fails focused or browser evidence. | `audit:ChatSystemMessage/accessibility` |
203
+ | FR2, AR2 | `ChatSystemMessage.test.tsx`, Divider tests, scoped axe, and exact-head Chromium receipts | Truthy divider labels plus empty string, numeric zero, and empty Fragment observations | Lost separator role, truthy label association, orientation, content, or paint fails focused or browser evidence; falsey anomalies stay routed to Divider. | `audit:ChatSystemMessage/behavior` |
204
+ | FR3 | Closed audit inventory and exact-head observation of the divider/icon partition | Divider with supplied icon | The audit must expose, not silently omit, the unresolved branch; implementation remains unchanged until owner decision. | `audit:ChatSystemMessage/public-api` |
205
+ | FR4 | Mutation-sensitive root-passthrough tests, source inspection, type checks, and target reflection | Default and divider roots | Removing ref, className, style, xstyle, ARIA forwarding, or owned role precedence fails focused tests. | `audit:ChatSystemMessage/public-api` |
206
+ | FR5 | `themingTargets.test.ts`, source inspection, generated build, and exact-head computed paint | Both variants and color modes | Target/state metadata drift, raw styling, physical layout, or unresolved mode paint fails checks or browser evidence. | `audit:ChatSystemMessage/theming` |
207
+ | FR6 | Source inspection, strict lint, and component test suite | Every render | Adding hidden state or an owned external resource triggers runtime review and corresponding evidence. | `audit:ChatSystemMessage/code-health` |
208
+ | RTL relation | Source-hashed verified-N/A record | Both variants and caller-owned icon content | Directional component-owned content, physical positioning, ordering, scroll/drag, overlay, or horizontal keyboard behavior invalidates the record. | `audit:ChatSystemMessage/i18n-rtl` |
209
+ | Browser matrix | `ChatSystemMessage.a11y.chromium.spec.ts` exact-head 10-sensor receipts | Default, icon, wrapped long content, divider, unresolved divider/icon, nested live log, 320px/coarse pointer, light/dark, D7 pairs | Stale build, wrong story, incorrect mode, missing semantics, default overflow, failed contrast, blank crop, or page error fails closed. | `audit:ChatSystemMessage/visual` |
210
+ | Documentation and surface | Consumer docs, published declarations, block metadata, explicit story ownership, exports, and `check:knowledge` | Props, `./Chat` subpath, four blocks, draft record | Missing or stale public docs, export, owner route, target map, or knowledge shape fails validation or review. | `audit:ChatSystemMessage/docs` |
211
+
212
+ ## Decision log
213
+
214
+ None. This draft records the wrapping correction, released observable behavior,
215
+ and audit evidence. It introduces no public API, default, divider/icon decision,
216
+ ownership transfer, or subjective visual decision.
217
+
218
+ ## Open questions
219
+
220
+ - **OQ1 - Which explicit contract should govern `icon` with `variant="divider"`: render the icon with the divider label; introduce a breaking type restriction with the migration required by `architecture:public-component-api/INV9`; or retain the current no-op with documentation and a development warning?** (`human-api`)
221
+
222
+ ## Content boundary
223
+
224
+ This file does not duplicate consumer examples, audit scores, screenshots,
225
+ eligibility data, or shared Divider and system rules. It links to their owners.
@@ -1,9 +1,25 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- import {describe, it, expect} from 'vitest';
3
+ import {createRef, Fragment} from 'react';
4
+ import {describe, expect, it} from 'vitest';
4
5
  import {render, screen} from '@testing-library/react';
6
+ import * as stylex from '@stylexjs/stylex';
5
7
  import {ChatSystemMessage} from './ChatSystemMessage';
6
8
 
9
+ const xstyleProbe = stylex.create({
10
+ root: {marginBlockStart: '13px'},
11
+ });
12
+
13
+ function expectProbeClasses(element: HTMLElement): void {
14
+ const classes = (stylex.props(xstyleProbe.root).className ?? '')
15
+ .split(' ')
16
+ .filter(className => className !== '' && !className.includes('__'));
17
+ expect(classes.length).toBeGreaterThan(0);
18
+ for (const className of classes) {
19
+ expect(element).toHaveClass(className);
20
+ }
21
+ }
22
+
7
23
  describe('ChatSystemMessage', () => {
8
24
  it('renders children', () => {
9
25
  render(<ChatSystemMessage>Conversation started</ChatSystemMessage>);
@@ -12,7 +28,6 @@ describe('ChatSystemMessage', () => {
12
28
 
13
29
  it('renders default variant without divider lines', () => {
14
30
  const {container} = render(<ChatSystemMessage>Hello</ChatSystemMessage>);
15
- // Divider lines have aria-hidden, so check there are none
16
31
  const hiddenElements = container.querySelectorAll('[aria-hidden]');
17
32
  expect(hiddenElements.length).toBe(0);
18
33
  });
@@ -27,7 +42,7 @@ describe('ChatSystemMessage', () => {
27
42
  expect(screen.getByRole('separator')).toHaveAccessibleName('Today');
28
43
  });
29
44
 
30
- it('renders icon', () => {
45
+ it('renders icon in the default variant', () => {
31
46
  render(
32
47
  <ChatSystemMessage icon={<span data-testid="icon">*</span>}>
33
48
  Notice
@@ -36,40 +51,117 @@ describe('ChatSystemMessage', () => {
36
51
  expect(screen.getByTestId('icon')).toBeTruthy();
37
52
  });
38
53
 
54
+ it('detects changes to the current divider and icon output for OQ1', () => {
55
+ // OQ1 is unresolved. This assertion detects current-output changes; it does
56
+ // not select whether Divider should render, reject, or warn on the icon.
57
+ render(
58
+ <ChatSystemMessage
59
+ icon={<span data-testid="divider-icon">*</span>}
60
+ variant="divider">
61
+ Today
62
+ </ChatSystemMessage>,
63
+ );
64
+ expect(screen.queryByTestId('divider-icon')).not.toBeInTheDocument();
65
+ });
66
+
39
67
  it('applies variant class', () => {
40
68
  render(
41
69
  <ChatSystemMessage variant="divider" data-testid="sys">
42
70
  Today
43
71
  </ChatSystemMessage>,
44
72
  );
45
- const el = screen.getByTestId('sys');
46
- expect(el).toHaveAttribute('data-variant', 'divider');
73
+ expect(screen.getByTestId('sys')).toHaveAttribute(
74
+ 'data-variant',
75
+ 'divider',
76
+ );
47
77
  });
48
78
 
49
- it('applies data-testid', () => {
50
- render(<ChatSystemMessage data-testid="my-sys">Hello</ChatSystemMessage>);
51
- expect(screen.getByTestId('my-sys')).toBeTruthy();
79
+ it.each(['default', 'divider'] as const)(
80
+ 'preserves the complete root passthrough seam for %s',
81
+ variant => {
82
+ const ref = createRef<HTMLDivElement>();
83
+ render(
84
+ <ChatSystemMessage
85
+ ref={ref}
86
+ variant={variant}
87
+ data-testid={`sys-${variant}`}
88
+ aria-label={`${variant} system message`}
89
+ role="note"
90
+ className="consumer-system-message"
91
+ style={{outlineOffset: '3px'}}
92
+ xstyle={xstyleProbe.root}>
93
+ {variant === 'divider' ? 'Today' : 'Conversation started'}
94
+ </ChatSystemMessage>,
95
+ );
96
+
97
+ const root = screen.getByTestId(`sys-${variant}`);
98
+ expect(ref.current).toBe(root);
99
+ expect(root).toHaveClass('consumer-system-message');
100
+ expect(root).toHaveStyle({outlineOffset: '3px'});
101
+ expectProbeClasses(root);
102
+ expect(root).toHaveAttribute('aria-label', `${variant} system message`);
103
+ expect(root).toHaveAttribute('role', 'status');
104
+ expect(root).toHaveAttribute('data-variant', variant);
105
+ },
106
+ );
107
+
108
+ it.each([
109
+ {name: 'empty string', value: '', text: ''},
110
+ {name: 'numeric zero', value: 0, text: '0'},
111
+ {
112
+ name: 'empty fragment',
113
+ value: (
114
+ <Fragment>
115
+ {null}
116
+ {null}
117
+ </Fragment>
118
+ ),
119
+ text: '',
120
+ },
121
+ ])('keeps the default root for $name children', ({value, text}) => {
122
+ render(
123
+ <ChatSystemMessage data-testid="empty-partition">
124
+ {value}
125
+ </ChatSystemMessage>,
126
+ );
127
+ const root = screen.getByTestId('empty-partition');
128
+ expect(root).toHaveAttribute('role', 'status');
129
+ expect(root).toHaveTextContent(text);
52
130
  });
53
131
 
54
- it('forwards rest props (data-*, id)', () => {
132
+ it.each([
133
+ {name: 'empty string', value: ''},
134
+ {name: 'numeric zero', value: 0},
135
+ {
136
+ name: 'empty fragment',
137
+ value: (
138
+ <Fragment>
139
+ {null}
140
+ {null}
141
+ </Fragment>
142
+ ),
143
+ },
144
+ ])('keeps the divider root for $name children', ({value}) => {
55
145
  render(
56
- <ChatSystemMessage data-testid="sys" data-custom="x" id="sys-1">
57
- Hello
146
+ <ChatSystemMessage variant="divider" data-testid="empty-partition">
147
+ {value}
58
148
  </ChatSystemMessage>,
59
149
  );
60
- const el = screen.getByTestId('sys');
61
- expect(el).toHaveAttribute('data-custom', 'x');
62
- expect(el).toHaveAttribute('id', 'sys-1');
150
+ const root = screen.getByTestId('empty-partition');
151
+ expect(root).toHaveAttribute('role', 'status');
152
+ expect(root).toContainElement(screen.getByRole('separator'));
63
153
  });
64
154
 
65
- it('forwards rest props in the divider variant', () => {
155
+ it('records Divider numeric-zero output for the shared FR15 advisory', () => {
66
156
  render(
67
- <ChatSystemMessage variant="divider" data-testid="sys" data-custom="x">
68
- Today
157
+ <ChatSystemMessage variant="divider" data-testid="divider-zero">
158
+ {0}
69
159
  </ChatSystemMessage>,
70
160
  );
71
- const el = screen.getByTestId('sys');
72
- expect(el).toHaveAttribute('data-custom', 'x');
73
- expect(el).toHaveAttribute('role', 'status');
161
+ const root = screen.getByTestId('divider-zero');
162
+ const separator = screen.getByRole('separator');
163
+ expect(root).toHaveTextContent('00');
164
+ expect(separator).not.toHaveAccessibleName();
165
+ expect(separator).not.toHaveAttribute('aria-labelledby');
74
166
  });
75
167
  });
@@ -6,7 +6,7 @@
6
6
  * @file ChatSystemMessage.tsx
7
7
  * @input Uses React, StyleX, theme tokens
8
8
  * @output Exports ChatSystemMessage component and ChatSystemMessageProps
9
- * @position Centered system/notice message in a chat thread
9
+ * @position Centered, wrapping system/notice message in a chat thread
10
10
  *
11
11
  * Renders centered, muted system messages like "conversation started",
12
12
  * date separators, or status updates. Not a sender message — no avatar,
@@ -53,8 +53,8 @@ export interface ChatSystemMessageProps extends BaseProps<HTMLDivElement> {
53
53
  variant?: ChatSystemMessageVariant;
54
54
 
55
55
  /**
56
- * Optional icon rendered before the text.
57
- * Accepts any ReactNode — typically an Icon.
56
+ * Optional caller-provided icon content associated with the message.
57
+ * Accepts any ReactNode, typically an Icon.
58
58
  */
59
59
  icon?: ReactNode;
60
60
  }
@@ -85,13 +85,11 @@ const styles = stylex.create({
85
85
  alignItems: 'center',
86
86
  flexShrink: 0,
87
87
  },
88
- // Content wrapper (to keep text + icon together)
88
+ // Content wrapper
89
89
  content: {
90
90
  display: 'inline-flex',
91
91
  alignItems: 'center',
92
92
  gap: spacingVars['--spacing-1-5'],
93
- flexShrink: 0,
94
- whiteSpace: 'nowrap',
95
93
  },
96
94
  });
97
95
 
@@ -7,30 +7,89 @@ export const docs = {
7
7
  subComponentOf: 'Chat',
8
8
  displayName: 'Chat Tokenized Text',
9
9
  isHiddenFromOverview: true,
10
- description: 'Renders a text string with token patterns replaced by inline Badge components. Wrap any message body inside ChatMessageBubble to turn raw @mentions, #tags, or /commands into styled badges. When no tokens match or none are provided, the text renders as-is: so you can use ChatTokenizedText unconditionally on every message.',
10
+ description:
11
+ 'Renders a text string with token patterns replaced by inline token content. Wrap any message body inside ChatMessageBubble to turn raw @mentions, #tags, or /commands into styled content. When no non-empty token matches or none are provided, the text renders as-is, so you can use ChatTokenizedText unconditionally on every message.',
11
12
  props: [
12
13
  {
13
14
  name: 'children',
14
15
  type: 'string',
15
- description: "The plain text message containing serialized token values. Patterns matching a token's value are replaced with badge components inline.",
16
+ description:
17
+ "The plain text message containing serialized token values. Patterns matching a token's value are replaced with inline token content.",
16
18
  required: true,
17
19
  },
18
20
  {
19
21
  name: 'tokens',
20
22
  type: 'ChatComposerToken[]',
21
- description: 'Token definitions: same type returned by trigger onSelect. Each token has a value (the string to match), label (display text), and optional variant and icon. Uses the same type as the composer input, so token definitions work for both input and display.',
23
+ description:
24
+ 'Token definitions using the same type as composer input. Each non-empty value is matched literally. Empty values are ignored. Structured tokens render a Badge, while custom tokens render caller content.',
25
+ },
26
+ {
27
+ name: 'xstyle',
28
+ type: 'StyleXStyles',
29
+ description:
30
+ 'StyleX styles for the root text wrapper. Must be a stylex.create() value: not an inline style object like style={{}}.',
22
31
  },
23
32
  ],
33
+ theming: {
34
+ targets: [{className: 'astryx-chat-tokenized-text'}],
35
+ },
36
+ usage: {
37
+ description:
38
+ 'Use ChatTokenizedText inside a chat message when stored plain text contains serialized token values that should be projected as inline badges or caller-rendered token content. Unmatched text is preserved exactly and empty token values are ignored so rendering always finishes.',
39
+ bestPractices: [
40
+ {
41
+ guidance: true,
42
+ description:
43
+ 'Reuse the same token definitions for composer insertion and message rendering so serialized values and visible labels stay aligned.',
44
+ },
45
+ {
46
+ guidance: true,
47
+ description:
48
+ 'Use non-empty, stable serialized values so every definition identifies real message text.',
49
+ },
50
+ {
51
+ guidance: false,
52
+ description:
53
+ 'Use token labels as a substitute for the surrounding message text; the complete message must remain understandable in reading order.',
54
+ },
55
+ {
56
+ guidance: false,
57
+ description:
58
+ 'Put component-owned interaction or accessibility behavior inside a custom token renderer; custom token content remains caller owned.',
59
+ },
60
+ ],
61
+ anatomy: [
62
+ {
63
+ name: 'Tokenized text',
64
+ required: true,
65
+ description:
66
+ 'The inline root that preserves unmatched text and carries the chat-tokenized-text theme target.',
67
+ },
68
+ {
69
+ name: 'Rendered token',
70
+ required: false,
71
+ description:
72
+ 'Inline token content rendered by Badge for structured tokens or by the caller for custom tokens.',
73
+ },
74
+ ],
75
+ },
24
76
  };
25
77
 
26
78
  export const docsZh = {
27
79
  name: 'ChatTokenizedText',
28
80
  isHiddenFromOverview: true,
29
81
  displayName: 'Chat Tokenized Text',
30
- description: '渲染带有标记模式的文本,将匹配的模式替换为内联 Badge 组件。在 ChatMessageBubble 内使用,将 @提及、#标签或 /命令显示为样式化徽章。未提供标记时以纯文本渲染,因此可以无条件使用。',
82
+ description:
83
+ '渲染带有标记模式的文本,将匹配的模式替换为内联标记内容。在 ChatMessageBubble 内使用,将 @提及、#标签或 /命令显示为样式化内容。没有非空匹配标记时以纯文本渲染。',
31
84
  propDescriptions: {
32
- children: '包含序列化标记值的纯文本消息。匹配标记值的模式将被替换为内联徽章组件。',
33
- tokens: '标记定义,与触发器 onSelect 返回的类型相同。每个包含 value(匹配字符串)、label(显示文本)以及可选的 variant 和 icon。',
85
+ children:
86
+ '包含序列化标记值的纯文本消息。匹配标记值的模式将被替换为内联标记内容。',
87
+ tokens:
88
+ '标记定义,与输入组件使用相同类型。空值会被忽略;其他值按调用者提供的顺序进行匹配。',
89
+ xstyle: '用于根文本包装器的额外 StyleX 样式。',
90
+ },
91
+ theming: {
92
+ targets: [{className: 'astryx-chat-tokenized-text'}],
34
93
  },
35
94
  };
36
95
 
@@ -38,9 +97,37 @@ export const docsDense = {
38
97
  name: 'ChatTokenizedText',
39
98
  isHiddenFromOverview: true,
40
99
  displayName: 'Chat Tokenized Text',
41
- description: 'renders text w/ token patterns replaced by inline badges; use in bubble for @mentions, #tags, /commands; degrades to plain text when no tokens match',
100
+ description:
101
+ 'renders text w/ literal token values replaced by inline content; empty values ignored',
102
+ usage: {
103
+ description:
104
+ 'Use for stored chat text containing serialized token values; unmatched text is preserved.',
105
+ bestPractices: [
106
+ {
107
+ guidance: true,
108
+ description: 'Reuse composer token definitions for display.',
109
+ },
110
+ {
111
+ guidance: true,
112
+ description: 'Use stable non-empty serialized values.',
113
+ },
114
+ {
115
+ guidance: false,
116
+ description:
117
+ 'Replace the surrounding message meaning with token labels.',
118
+ },
119
+ {
120
+ guidance: false,
121
+ description:
122
+ 'Move component-owned behavior into custom token renderers.',
123
+ },
124
+ ],
125
+ },
42
126
  propDescriptions: {
43
- children: 'plain text msg w/ serialized token values; matching patterns become inline badges',
44
- tokens: 'token defs (same type as composer input): value+label+variant+icon',
127
+ children:
128
+ 'plain text msg w/ serialized token values; matching patterns become inline content',
129
+ tokens:
130
+ 'token defs; literal values matched in caller order; empty values ignored',
131
+ xstyle: 'additional StyleX styles for root wrapper',
45
132
  },
46
133
  };