@astryxdesign/core 0.6.2-canary.a4bcbeb → 0.6.2-canary.a7f992d

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 (366) hide show
  1. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  2. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  3. package/dist/BottomSheet/BottomSheet.js +3 -1
  4. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  7. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  8. package/dist/Chat/ChatComposer.js +10 -5
  9. package/dist/Chat/ChatComposerDrawer.d.ts +7 -1
  10. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  11. package/dist/Chat/ChatComposerDrawer.js +29 -9
  12. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  13. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  14. package/dist/Chat/ChatComposerInput.js +63 -16
  15. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  16. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  17. package/dist/Chat/ChatDictationButton.js +6 -4
  18. package/dist/Chat/ChatSendButton.js +1 -1
  19. package/dist/Chat/index.d.ts +1 -1
  20. package/dist/Chat/index.d.ts.map +1 -1
  21. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  22. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  23. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  24. package/dist/Collapsible/Collapsible.js +6 -1
  25. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  26. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  27. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  28. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  29. package/dist/DateInput/DateInput.d.ts.map +1 -1
  30. package/dist/DateInput/DateInput.js +4 -4
  31. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  32. package/dist/DateInput/NativeDateField.js +16 -16
  33. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  34. package/dist/DateInput/TouchDateField.js +2 -2
  35. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  36. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  37. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  38. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  39. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  40. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  41. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  42. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  43. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  44. package/dist/Field/InputClearButton.d.ts +4 -2
  45. package/dist/Field/InputClearButton.d.ts.map +1 -1
  46. package/dist/Field/InputClearButton.js +4 -2
  47. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  48. package/dist/Field/PanelSearchInput.js +1 -1
  49. package/dist/FileInput/FileInput.d.ts.map +1 -1
  50. package/dist/FileInput/FileInput.js +7 -7
  51. package/dist/Kbd/Kbd.d.ts +5 -3
  52. package/dist/Kbd/Kbd.d.ts.map +1 -1
  53. package/dist/Kbd/Kbd.js +36 -42
  54. package/dist/Link/Link.d.ts.map +1 -1
  55. package/dist/Link/Link.js +6 -2
  56. package/dist/Markdown/Markdown.d.ts +8 -2
  57. package/dist/Markdown/Markdown.d.ts.map +1 -1
  58. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  59. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  60. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  61. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  62. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  63. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  64. package/dist/Markdown/Markdown.js +262 -109
  65. package/dist/Markdown/ast.d.ts +162 -0
  66. package/dist/Markdown/ast.d.ts.map +1 -0
  67. package/dist/Markdown/ast.js +74 -0
  68. package/dist/Markdown/index.d.ts +5 -3
  69. package/dist/Markdown/index.d.ts.map +1 -1
  70. package/dist/Markdown/index.js +3 -2
  71. package/dist/Markdown/parser/index.d.ts +10 -0
  72. package/dist/Markdown/parser/index.d.ts.map +1 -0
  73. package/dist/Markdown/parser/index.js +10 -0
  74. package/dist/Markdown/parser.d.ts +126 -58
  75. package/dist/Markdown/parser.d.ts.map +1 -1
  76. package/dist/Markdown/parser.js +716 -167
  77. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  78. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  79. package/dist/Markdown/plugins/frontmatter.js +132 -0
  80. package/dist/Markdown/plugins/index.d.ts +16 -0
  81. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  82. package/dist/Markdown/plugins/index.js +13 -0
  83. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  84. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  85. package/dist/Markdown/plugins/protocol.js +957 -0
  86. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  87. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  88. package/dist/Markdown/plugins/semanticFence.js +213 -0
  89. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  90. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  91. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  92. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  93. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  94. package/dist/Markdown/plugins/textTransform.js +374 -0
  95. package/dist/Markdown/remark.d.ts +196 -0
  96. package/dist/Markdown/remark.d.ts.map +1 -0
  97. package/dist/Markdown/remark.js +1062 -0
  98. package/dist/Markdown/url.d.ts +4 -0
  99. package/dist/Markdown/url.d.ts.map +1 -0
  100. package/dist/Markdown/url.js +25 -0
  101. package/dist/Markdown/utils.d.ts +4 -2
  102. package/dist/Markdown/utils.d.ts.map +1 -1
  103. package/dist/Markdown/utils.js +2 -1
  104. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  105. package/dist/NumberInput/NumberInput.js +4 -4
  106. package/dist/Outline/index.d.ts +1 -0
  107. package/dist/Outline/index.d.ts.map +1 -1
  108. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  109. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  110. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  111. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  112. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  113. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  114. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  115. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  116. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  117. package/dist/ProgressBar/ProgressBar.js +36 -31
  118. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  119. package/dist/RadioList/RadioListItem.js +13 -1
  120. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  121. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  122. package/dist/Selector/Selector.d.ts.map +1 -1
  123. package/dist/Selector/Selector.js +1 -1
  124. package/dist/SideNav/SideNav.d.ts +2 -1
  125. package/dist/SideNav/SideNav.d.ts.map +1 -1
  126. package/dist/SideNav/SideNav.js +9 -3
  127. package/dist/Slider/Slider.d.ts.map +1 -1
  128. package/dist/Slider/Slider.js +14 -8
  129. package/dist/Spinner/Spinner.d.ts.map +1 -1
  130. package/dist/Spinner/Spinner.js +23 -7
  131. package/dist/Switch/Switch.d.ts.map +1 -1
  132. package/dist/Switch/Switch.js +11 -0
  133. package/dist/TabList/Tab.d.ts +1 -1
  134. package/dist/TabList/Tab.d.ts.map +1 -1
  135. package/dist/TabList/Tab.js +20 -7
  136. package/dist/Table/Table.d.ts +1 -0
  137. package/dist/Table/Table.d.ts.map +1 -1
  138. package/dist/Table/Table.js +29 -13
  139. package/dist/TextArea/TextArea.d.ts.map +1 -1
  140. package/dist/TextArea/TextArea.js +1 -1
  141. package/dist/TextInput/TextInput.d.ts.map +1 -1
  142. package/dist/TextInput/TextInput.js +2 -2
  143. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  144. package/dist/TimeInput/TimeInput.js +4 -4
  145. package/dist/ToggleButton/ToggleButton.d.ts +2 -1
  146. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  147. package/dist/ToggleButton/ToggleButton.js +7 -1
  148. package/dist/TreeList/TreeList.d.ts.map +1 -1
  149. package/dist/TreeList/TreeList.js +3 -0
  150. package/dist/TreeList/TreeListItem.d.ts +6 -1
  151. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  152. package/dist/TreeList/TreeListItem.js +12 -2
  153. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  154. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  155. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  156. package/dist/Typeahead/BaseTypeahead.js +16 -7
  157. package/dist/astryx.css +17 -7
  158. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  159. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  160. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  161. package/dist/hooks/useScrollableArea.d.ts +6 -2
  162. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  163. package/dist/hooks/useScrollableArea.js +17 -5
  164. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  165. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  166. package/dist/utils/interactionOverlay.stylex.js +9 -0
  167. package/locales/af-ZA.json +2 -1
  168. package/locales/ar-SA.json +2 -1
  169. package/locales/ca-ES.json +2 -1
  170. package/locales/cs-CZ.json +2 -1
  171. package/locales/da-DK.json +2 -1
  172. package/locales/de-DE.json +2 -1
  173. package/locales/el-GR.json +2 -1
  174. package/locales/es-ES.json +2 -1
  175. package/locales/fi-FI.json +2 -1
  176. package/locales/fr-FR.json +2 -9
  177. package/locales/he-IL.json +2 -1
  178. package/locales/hu-HU.json +2 -1
  179. package/locales/it-IT.json +2 -1
  180. package/locales/ja-JP.json +2 -1
  181. package/locales/ko-KR.json +2 -1
  182. package/locales/nl-NL.json +2 -1
  183. package/locales/no-NO.json +2 -1
  184. package/locales/pl-PL.json +2 -1
  185. package/locales/pt-BR.json +2 -1
  186. package/locales/pt-PT.json +2 -1
  187. package/locales/ro-RO.json +2 -1
  188. package/locales/ru-RU.json +2 -1
  189. package/locales/sr-SP.json +2 -1
  190. package/locales/sv-SE.json +2 -1
  191. package/locales/tr-TR.json +2 -1
  192. package/locales/uk-UA.json +2 -1
  193. package/locales/vi-VN.json +2 -1
  194. package/locales/zh-CN.json +2 -1
  195. package/locales/zh-TW.json +2 -1
  196. package/package.json +18 -3
  197. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  198. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  199. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  200. package/src/BottomSheet/BottomSheet.tsx +3 -1
  201. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  202. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  203. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  204. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  205. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  206. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  207. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  208. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  209. package/src/Chat/ChatComposer.doc.mjs +14 -0
  210. package/src/Chat/ChatComposer.spec.md +230 -0
  211. package/src/Chat/ChatComposer.test.tsx +57 -0
  212. package/src/Chat/ChatComposer.tsx +21 -9
  213. package/src/Chat/ChatComposerDrawer.doc.mjs +53 -2
  214. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  215. package/src/Chat/ChatComposerDrawer.test.tsx +37 -14
  216. package/src/Chat/ChatComposerDrawer.tsx +13 -2
  217. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  218. package/src/Chat/ChatComposerInput.spec.md +185 -0
  219. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  220. package/src/Chat/ChatComposerInput.tsx +78 -13
  221. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  222. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  223. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  224. package/src/Chat/ChatDictationButton.spec.md +160 -0
  225. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  226. package/src/Chat/ChatDictationButton.tsx +8 -6
  227. package/src/Chat/ChatSendButton.test.tsx +1 -4
  228. package/src/Chat/ChatSendButton.tsx +1 -1
  229. package/src/Chat/index.ts +1 -0
  230. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  231. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  232. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  233. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  234. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  235. package/src/Collapsible/Collapsible.test.tsx +21 -0
  236. package/src/Collapsible/Collapsible.tsx +5 -0
  237. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  238. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  239. package/src/DateInput/DateInput.tsx +6 -1
  240. package/src/DateInput/NativeDateField.tsx +24 -8
  241. package/src/DateInput/TouchDateField.tsx +6 -2
  242. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  243. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  244. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  245. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  246. package/src/Field/InputClearButton.test.tsx +17 -3
  247. package/src/Field/InputClearButton.tsx +5 -2
  248. package/src/Field/PanelSearchInput.tsx +5 -2
  249. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  250. package/src/FileInput/FileInput.tsx +11 -2
  251. package/src/Kbd/Kbd.doc.mjs +3 -3
  252. package/src/Kbd/Kbd.test.tsx +57 -1
  253. package/src/Kbd/Kbd.tsx +57 -37
  254. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  255. package/src/Link/Link.doc.mjs +11 -0
  256. package/src/Link/Link.test.tsx +24 -0
  257. package/src/Link/Link.tsx +5 -0
  258. package/src/List/List.spec.md +200 -0
  259. package/src/Markdown/Markdown.doc.mjs +272 -0
  260. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  261. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  262. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  263. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  264. package/src/Markdown/Markdown.public.test.ts +126 -3
  265. package/src/Markdown/Markdown.spec.md +197 -44
  266. package/src/Markdown/Markdown.test.tsx +11 -0
  267. package/src/Markdown/Markdown.tsx +414 -135
  268. package/src/Markdown/ast.test.ts +307 -0
  269. package/src/Markdown/ast.ts +337 -0
  270. package/src/Markdown/incremental.test.ts +12 -0
  271. package/src/Markdown/index.ts +37 -1
  272. package/src/Markdown/modules/remark.spec.md +269 -0
  273. package/src/Markdown/parser/index.ts +64 -0
  274. package/src/Markdown/parser.public.test.ts +103 -0
  275. package/src/Markdown/parser.ts +1180 -235
  276. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  277. package/src/Markdown/plugins/frontmatter.ts +198 -0
  278. package/src/Markdown/plugins/index.ts +53 -0
  279. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  280. package/src/Markdown/plugins/protocol.ts +1618 -0
  281. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  282. package/src/Markdown/plugins/semanticFence.ts +424 -0
  283. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  284. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  285. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  286. package/src/Markdown/plugins/textTransform.ts +554 -0
  287. package/src/Markdown/remark.test.tsx +1877 -0
  288. package/src/Markdown/remark.ts +1574 -0
  289. package/src/Markdown/url.ts +30 -0
  290. package/src/Markdown/utils.ts +13 -1
  291. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  292. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  293. package/src/NumberInput/NumberInput.tsx +6 -1
  294. package/src/Outline/Outline.doc.mjs +7 -5
  295. package/src/Outline/Outline.spec.md +1 -1
  296. package/src/Outline/index.ts +1 -0
  297. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  298. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  299. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  300. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  301. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  302. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  303. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  304. package/src/ProgressBar/ProgressBar.tsx +59 -72
  305. package/src/RadioList/RadioList.doc.mjs +11 -0
  306. package/src/RadioList/RadioList.test.tsx +32 -0
  307. package/src/RadioList/RadioListItem.tsx +25 -1
  308. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  309. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  310. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  311. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  312. package/src/Selector/Selector.spec.md +12 -9
  313. package/src/Selector/Selector.tsx +6 -1
  314. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  315. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  316. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  317. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  318. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  319. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  320. package/src/SideNav/SideNav.doc.mjs +1 -1
  321. package/src/SideNav/SideNav.test.tsx +10 -0
  322. package/src/SideNav/SideNav.tsx +14 -2
  323. package/src/Slider/Slider.doc.mjs +11 -0
  324. package/src/Slider/Slider.test.tsx +128 -0
  325. package/src/Slider/Slider.tsx +25 -7
  326. package/src/Spinner/Spinner.test.tsx +4 -0
  327. package/src/Spinner/Spinner.tsx +31 -18
  328. package/src/Switch/Switch.doc.mjs +11 -0
  329. package/src/Switch/Switch.test.tsx +16 -0
  330. package/src/Switch/Switch.tsx +28 -0
  331. package/src/TabList/Tab.tsx +35 -7
  332. package/src/TabList/TabList.doc.mjs +11 -0
  333. package/src/TabList/TabList.spec.md +204 -0
  334. package/src/TabList/TabList.test.tsx +66 -0
  335. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  336. package/src/Table/Table.doc.mjs +1 -1
  337. package/src/Table/Table.spec.md +54 -40
  338. package/src/Table/Table.test.tsx +83 -10
  339. package/src/Table/Table.tsx +30 -22
  340. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  341. package/src/TextArea/TextArea.tsx +6 -1
  342. package/src/TextInput/TextInput.test.tsx +20 -1
  343. package/src/TextInput/TextInput.tsx +6 -1
  344. package/src/TimeInput/TimeInput.tsx +6 -1
  345. package/src/ToggleButton/ToggleButton.test.tsx +133 -0
  346. package/src/ToggleButton/ToggleButton.tsx +9 -2
  347. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  348. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  349. package/src/TreeList/TreeList.doc.mjs +3 -3
  350. package/src/TreeList/TreeList.spec.md +123 -75
  351. package/src/TreeList/TreeList.test.tsx +29 -0
  352. package/src/TreeList/TreeList.tsx +3 -0
  353. package/src/TreeList/TreeListItem.tsx +15 -1
  354. package/src/TreeList/TreeListTypes.ts +11 -1
  355. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  356. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  357. package/src/Typeahead/Typeahead.test.tsx +53 -0
  358. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  359. package/src/__tests__/pressState.ts +93 -0
  360. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  361. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  362. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  363. package/src/hooks/useScrollableArea.test.tsx +59 -1
  364. package/src/hooks/useScrollableArea.ts +34 -10
  365. package/src/inputFontFloor.test.ts +106 -0
  366. package/src/utils/interactionOverlay.stylex.ts +20 -0
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @file BottomSheet.tsx
3
- * @input Uses React, StyleX, core hooks/utils, BottomSheetPanel, BottomSheetSwitcherContext
3
+ * @input Uses React, StyleX, core hooks/utils, named BottomSheetPanel, BottomSheetSwitcherContext
4
4
  * @output Exports BottomSheet component and BottomSheetProps
5
5
  * @position Public BottomSheet router plus private standalone/switcher hosts
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAgB7C,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAyEhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;AA4XxD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA6BlD;yBA7Be,WAAW"}
1
+ {"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAgB7C,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAyEhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;AA8XxD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA6BlD;yBA7Be,WAAW"}
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file BottomSheet.tsx
7
- * @input Uses React, StyleX, core hooks/utils, BottomSheetPanel, BottomSheetSwitcherContext
7
+ * @input Uses React, StyleX, core hooks/utils, named BottomSheetPanel, BottomSheetSwitcherContext
8
8
  * @output Exports BottomSheet component and BottomSheetProps
9
9
  * @position Public BottomSheet router plus private standalone/switcher hosts
10
10
  *
@@ -266,6 +266,7 @@ function StandaloneBottomSheet({
266
266
  ref: ref,
267
267
  state: panelState,
268
268
  height: height,
269
+ label: label,
269
270
  snapPoints: snapPoints,
270
271
  isSwipeDismissAllowed: purpose === 'info',
271
272
  isPageScrollLocked: shouldPresent && hasScrim,
@@ -397,6 +398,7 @@ function SwitcherBottomSheetItem({
397
398
  ref: ref,
398
399
  state: panelState,
399
400
  height: height,
401
+ label: label,
400
402
  snapPoints: snapPoints,
401
403
  isSwipeDismissAllowed: purpose === 'info',
402
404
  isPageScrollLocked: hasScrim,
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * @file BottomSheetPanel.tsx
3
- * @input Uses React, StyleX, theme tokens, useSheetGestures
4
- * @output Internal BottomSheetPanel surface and motion-state types
3
+ * @input Uses React, StyleX, theme tokens, sheet gestures, shared scroll behavior, and the host label
4
+ * @output Internal BottomSheetPanel with a keyboard-reachable scrolling body and motion-state types
5
5
  * @position Shared presentation layer for standalone and switcher BottomSheets
6
6
  *
7
7
  * This component owns everything intrinsic to a sheet surface: height budgets,
8
8
  * drag and snap gestures, the handle and scrolling body, motion styles, and
9
- * transition completion. It deliberately does not own a dialog, focus, inert
10
- * state, or switcher registration; those belong to the hosting controller.
9
+ * transition completion. It owns the body's keyboard access; dialog focus
10
+ * entry/return, inert state, and switcher registration belong to the host.
11
11
  *
12
12
  * SYNC: When modified, update these files to stay in sync:
13
13
  * - /packages/core/src/BottomSheet/BottomSheet.tsx
@@ -44,6 +44,8 @@ interface BottomSheetPanelProps extends BaseProps<HTMLDivElement> {
44
44
  ref?: React.Ref<HTMLDivElement>;
45
45
  state: BottomSheetPanelState;
46
46
  height: BottomSheetHeight | number | string;
47
+ /** Existing host name, reused for the keyboard scrolling group. */
48
+ label: string;
47
49
  children: ReactNode;
48
50
  snapPoints?: ReadonlyArray<BottomSheetSnapPoint>;
49
51
  isSwipeDismissAllowed?: boolean;
@@ -56,7 +58,7 @@ interface BottomSheetPanelProps extends BaseProps<HTMLDivElement> {
56
58
  onMotionComplete?: (motion: BottomSheetPanelMotion) => void;
57
59
  }
58
60
  /** Internal visual and gesture surface shared by every BottomSheet host. */
59
- export declare function BottomSheetPanel({ ref, state, height, children, snapPoints, className, style, tabIndex, xstyle, isSwipeDismissAllowed, isPageScrollLocked, onDismiss, onScrimOpacity, onElementChange, onMotionStart, onMotionComplete, ...props }: BottomSheetPanelProps): import("react").JSX.Element;
61
+ export declare function BottomSheetPanel({ ref, state, height, label, children, snapPoints, className, style, tabIndex, xstyle, isSwipeDismissAllowed, isPageScrollLocked, onDismiss, onScrimOpacity, onElementChange, onMotionStart, onMotionComplete, ...props }: BottomSheetPanelProps): import("react").JSX.Element;
60
62
  export declare namespace BottomSheetPanel {
61
63
  var displayName: string;
62
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheetPanel.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAc5C,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAIvB,QAAA,MAAM,cAAc;;;;CAIV,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,cAAc,CAAC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,CAAC;AA2LnC,MAAM,MAAM,sBAAsB,GAChC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAC7B;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,GAChB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GACjC;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;CACzB,GACD;IAAC,IAAI,EAAE,SAAS,CAAA;CAAC,CAAC;AAEtB,UAAU,qBAAsB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC/D,+CAA+C;IAC/C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC7D;AA+GD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,KAAK,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,qBAA4B,EAC5B,kBAA0B,EAC1B,SAAS,EACT,cAAc,EACd,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,qBAAqB,+BAyQvB;yBA3Re,gBAAgB"}
1
+ {"version":3,"file":"BottomSheetPanel.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetPanel.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAiB5C,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAIvB,QAAA,MAAM,cAAc;;;;CAIV,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,cAAc,CAAC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,CAAC;AAsMnC,MAAM,MAAM,sBAAsB,GAChC,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAC7B;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,GAChB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GACjC;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;CACzB,GACD;IAAC,IAAI,EAAE,SAAS,CAAA;CAAC,CAAC;AAEtB,UAAU,qBAAsB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC/D,+CAA+C;IAC/C,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC7D;AA+GD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,UAAU,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,qBAA4B,EAC5B,kBAA0B,EAC1B,SAAS,EACT,cAAc,EACd,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,qBAAqB,+BAyRvB;yBA5Se,gBAAgB"}
@@ -4,14 +4,14 @@
4
4
 
5
5
  /**
6
6
  * @file BottomSheetPanel.tsx
7
- * @input Uses React, StyleX, theme tokens, useSheetGestures
8
- * @output Internal BottomSheetPanel surface and motion-state types
7
+ * @input Uses React, StyleX, theme tokens, sheet gestures, shared scroll behavior, and the host label
8
+ * @output Internal BottomSheetPanel with a keyboard-reachable scrolling body and motion-state types
9
9
  * @position Shared presentation layer for standalone and switcher BottomSheets
10
10
  *
11
11
  * This component owns everything intrinsic to a sheet surface: height budgets,
12
12
  * drag and snap gestures, the handle and scrolling body, motion styles, and
13
- * transition completion. It deliberately does not own a dialog, focus, inert
14
- * state, or switcher registration; those belong to the hosting controller.
13
+ * transition completion. It owns the body's keyboard access; dialog focus
14
+ * entry/return, inert state, and switcher registration belong to the host.
15
15
  *
16
16
  * SYNC: When modified, update these files to stay in sync:
17
17
  * - /packages/core/src/BottomSheet/BottomSheet.tsx
@@ -23,9 +23,11 @@
23
23
  import { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef } from 'react';
24
24
  import * as stylex from '@stylexjs/stylex';
25
25
  import { useDevWarning } from "../hooks/index.js";
26
+ import { useScrollableArea } from "../hooks/useScrollableArea.js";
26
27
  import "../theme/tokens.stylex.js";
27
- import { borderVars, colorVars, durationVars, easeVars, radiusVars, shadowVars, sizeVars, spacingVars } from "../theme/tokens.stylex.js";
28
+ import { borderVars, colorVars, durationVars, easeVars, focusVars, radiusVars, shadowVars, sizeVars, spacingVars } from "../theme/tokens.stylex.js";
28
29
  import { mergeProps, themeProps } from "../utils/index.js";
30
+ import { focusOutlineStyles } from "../utils/focusOutline.stylex.js";
29
31
  import { overlayPaddingReset } from "../Layout/padding.stylex.js";
30
32
  import { isValidSnapPoint, resolveSnapPoints } from "./snapOffsets.js";
31
33
  import { useMobileKeyboard } from "./useMobileKeyboard.js";
@@ -120,6 +122,24 @@ const styles = {
120
122
  kfzvcC: "x47corl",
121
123
  $$css: true
122
124
  },
125
+ body: {
126
+ kzQI83: "x1iyjqo2",
127
+ kAzted: "x2lwn1j",
128
+ kB7OPa: "x9f619",
129
+ kFalU9: "xx69xxh",
130
+ kInvED: "x1wfwxd8 x1nw7mhf",
131
+ kWkggS: "x10xzikg",
132
+ kGO01o: "x18d9i69",
133
+ $$css: true
134
+ },
135
+ tallKeyboardBody: {
136
+ kFlMNQ: "xrw9175",
137
+ k5JduY: "x1s928wv",
138
+ kc3QkE: "xhkezso",
139
+ k4zj60: "xu6fald",
140
+ kloYau: "x2q1x1w",
141
+ $$css: true
142
+ },
123
143
  budget: {
124
144
  kZKoxP: "x1tpcejd",
125
145
  $$css: true
@@ -222,6 +242,7 @@ export function BottomSheetPanel({
222
242
  ref,
223
243
  state,
224
244
  height,
245
+ label,
225
246
  children,
226
247
  snapPoints,
227
248
  className,
@@ -312,6 +333,22 @@ export function BottomSheetPanel({
312
333
  snapHeights,
313
334
  onScrimOpacity
314
335
  });
336
+ const {
337
+ getViewportProps,
338
+ getContentProps
339
+ } = useScrollableArea({
340
+ // The previous overflow-y:auto also computed overflow-x:auto. Keep wide
341
+ // content reachable instead of clipping that existing inline scroll path.
342
+ axis: 'both',
343
+ keyboardAccess: {
344
+ owner: 'contentOrViewport',
345
+ label
346
+ },
347
+ overscroll: 'contain',
348
+ // The sheet body deliberately remains the boundary for sheet-local sticky
349
+ // content while fitting, as it was before shared scroll adoption.
350
+ stickyContainment: 'always'
351
+ });
315
352
  const setElement = useCallback(element => {
316
353
  sheetRef(element);
317
354
  elementRef.current = element;
@@ -438,20 +475,20 @@ export function BottomSheetPanel({
438
475
  }
439
476
  })
440
477
  }), /*#__PURE__*/_jsx("div", {
441
- ...mergeProps({
442
- 0: {
443
- className: "x1iyjqo2 x2lwn1j x9f619 x1odjw0f x8du1vd xx69xxh x10xzikg x18d9i69"
444
- },
445
- 1: {
446
- className: "x1iyjqo2 x2lwn1j x9f619 x1odjw0f x8du1vd xx69xxh x10xzikg x18d9i69 xrw9175 x1s928wv xhkezso xu6fald x2q1x1w"
447
- }
448
- }[!!(height === 'tall') << 0], scrollPreservationInset > 0 ? {
449
- style: {
450
- paddingBlockEnd: `${scrollPreservationInset}px`
451
- }
452
- } : {}),
453
- ...bodyProps,
454
- children: children
478
+ ...getViewportProps({
479
+ ...bodyProps,
480
+ ...mergeProps(stylex.props(focusOutlineStyles.focusVisible, styles.body, height === 'tall' && styles.tallKeyboardBody), scrollPreservationInset > 0 ? {
481
+ style: {
482
+ paddingBlockEnd: `${scrollPreservationInset}px`
483
+ }
484
+ } : {})
485
+ }),
486
+ children: /*#__PURE__*/_jsx("div", {
487
+ ...getContentProps({
488
+ className: "xufnvkl x9f619 x5yr21d x121v3j4"
489
+ }),
490
+ children: children
491
+ })
455
492
  })]
456
493
  });
457
494
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposer.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+B5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAC7C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,GAAG,UAAU,CACxB;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAI3B,6GAA6G;IAC7G,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yHAAyH;IACzH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,yGAAyG;IACzG,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gHAAgH;IAChH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,gHAAgH;IAChH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,oDAAoD;IACpD,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CACnC;AA8MD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,qBA2MpD;yBA3Me,YAAY"}
1
+ {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposer.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+B5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAC7C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,GAAG,UAAU,CACxB;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAI3B,6GAA6G;IAC7G,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yHAAyH;IACzH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,yGAAyG;IACzG,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gHAAgH;IAChH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,gHAAgH;IAChH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,oDAAoD;IACpD,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CACnC;AAmND;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,qBAkNpD;yBAlNe,YAAY"}
@@ -150,14 +150,14 @@ export function ChatComposer(props) {
150
150
  }
151
151
  onChange?.(newValue);
152
152
  }, [isControlled, onChange]);
153
- const handleSubmit = useCallback(() => {
154
- const trimmed = currentValue.trim();
153
+ const handleSubmit = useCallback(value => {
154
+ const trimmed = value.trim();
155
155
  if (!trimmed || isDisabled) {
156
156
  return;
157
157
  }
158
158
  onSubmit(trimmed);
159
159
  updateValue('');
160
- }, [currentValue, isDisabled, onSubmit, updateValue]);
160
+ }, [isDisabled, onSubmit, updateValue]);
161
161
  const canSend = currentValue.trim().length > 0 && !isDisabled;
162
162
  const bodyRef = useRef(null);
163
163
 
@@ -289,8 +289,13 @@ export function ChatComposer(props) {
289
289
  children: footerActions
290
290
  }), /*#__PURE__*/_jsxs("div", {
291
291
  ...{
292
- className: "x78zum5 x6s0dn4 xzye2dw"
293
- },
292
+ 0: {
293
+ className: "x78zum5 x6s0dn4 xzye2dw"
294
+ },
295
+ 1: {
296
+ className: "x78zum5 x6s0dn4 xzye2dw x67bb7w"
297
+ }
298
+ }[!!(isDisabled && isStopShown) << 0],
294
299
  children: [sendActions, sendButton ?? /*#__PURE__*/_jsx(ChatSendButton, {})]
295
300
  })]
296
301
  })]
@@ -9,6 +9,10 @@
9
9
  * the content region (disclosure pattern).
10
10
  *
11
11
  * SYNC: When modified, update:
12
+ * - /packages/core/src/Chat/ChatComposerDrawer.test.tsx
13
+ * - /packages/core/src/Chat/ChatComposerDrawer.doc.mjs
14
+ * - /packages/core/src/Chat/ChatComposerDrawer.spec.md
15
+ * - /apps/storybook/stories/ChatComposerDrawer.stories.tsx
12
16
  * - /packages/core/src/Chat/index.ts (exports)
13
17
  * - /packages/cli/assets/templates/blocks/components/ChatComposerDrawer/ (block examples)
14
18
  */
@@ -52,7 +56,9 @@ export interface ChatComposerDrawerProps extends BaseProps<HTMLDivElement> {
52
56
  * @example
53
57
  * ```
54
58
  * const styles = stylex.create({ wrapper: { marginTop: 8 } });
55
- * <ChatComposerDrawer xstyle={styles.wrapper} />
59
+ * <ChatComposerDrawer xstyle={styles.wrapper}>
60
+ * <AttachmentThumbnail />
61
+ * </ChatComposerDrawer>
56
62
  * ```
57
63
  */
58
64
  xstyle?: StyleXStyles;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposerDrawer.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposerDrawer.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAkB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAYnD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAI5C,MAAM,WAAW,uBAAwB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACxE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnD;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAmID;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,QAAQ,EACR,KAAK,EACL,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,mBAAmB,EAChC,kBAA0B,EAC1B,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,SAAS,EACb,EAAE,uBAAuB,GAAG,KAAK,CAAC,YAAY,CA6F9C;yBA1Ge,kBAAkB"}
1
+ {"version":3,"file":"ChatComposerDrawer.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposerDrawer.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAkB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAYnD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,uBAAwB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACxE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnD;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAmID;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,QAAQ,EACR,KAAK,EACL,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,mBAAmB,EAChC,kBAA0B,EAC1B,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,GAAG,SAAS,EACb,EAAE,uBAAuB,GAAG,KAAK,CAAC,YAAY,CAiG9C;yBA9Ge,kBAAkB"}
@@ -13,6 +13,10 @@
13
13
  * the content region (disclosure pattern).
14
14
  *
15
15
  * SYNC: When modified, update:
16
+ * - /packages/core/src/Chat/ChatComposerDrawer.test.tsx
17
+ * - /packages/core/src/Chat/ChatComposerDrawer.doc.mjs
18
+ * - /packages/core/src/Chat/ChatComposerDrawer.spec.md
19
+ * - /apps/storybook/stories/ChatComposerDrawer.stories.tsx
16
20
  * - /packages/core/src/Chat/index.ts (exports)
17
21
  * - /packages/cli/assets/templates/blocks/components/ChatComposerDrawer/ (block examples)
18
22
  */
@@ -23,6 +27,7 @@ import { colorVars, spacingVars, radiusVars, durationVars, easeVars, typeScaleVa
23
27
  import { Badge } from "../Badge/index.js";
24
28
  import { mergeProps } from "../utils/index.js";
25
29
  import { themeProps } from "../utils/themeProps.js";
30
+ import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
26
31
  import { useTranslator } from "../i18n/index.js";
27
32
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
33
  const styles = {
@@ -41,6 +46,20 @@ const styles = {
41
46
  krdFHd: "x1n70msy",
42
47
  kfmiAY: "xg0tfu",
43
48
  $$css: true
49
+ },
50
+ toggleRow: {
51
+ k1xSpc: "xrvj5dj",
52
+ kumcoG: "x1y6fwsi",
53
+ kGNEyG: "x6s0dn4",
54
+ kZKoxP: "x1grt7ep",
55
+ kg3NbH: "x1pzlopt",
56
+ kUOVxO: "x1ng9b9t",
57
+ kkrTdU: "x1ypdohk x16khyan",
58
+ kfSwDN: "x87ps6o",
59
+ $$css: true
60
+ },
61
+ toggleCollapsed: {
62
+ $$css: true
44
63
  }
45
64
  };
46
65
 
@@ -97,14 +116,10 @@ export function ChatComposerDrawer({
97
116
  }), stylex.props(styles.root, xstyle), className, style),
98
117
  ...htmlProps,
99
118
  children: [canCollapse && /*#__PURE__*/_jsxs("div", {
100
- ...{
101
- 0: {
102
- className: "xrvj5dj x1y6fwsi x6s0dn4 x1grt7ep x1pzlopt x1ng9b9t x1ypdohk x16khyan x87ps6o x-default-marker"
103
- },
104
- 1: {
105
- className: "xrvj5dj x1y6fwsi x6s0dn4 x1grt7ep x1pzlopt x1ng9b9t x1ypdohk x16khyan x87ps6o x-default-marker"
106
- }
107
- }[!!isCollapsed << 0],
119
+ ...focusOutlineProps.focusVisible(styles.toggleRow, isCollapsed && styles.toggleCollapsed, {
120
+ "x-default-marker": "x-default-marker",
121
+ $$css: true
122
+ }),
108
123
  role: "button",
109
124
  tabIndex: 0,
110
125
  "aria-expanded": !isCollapsed,
@@ -150,7 +165,12 @@ export function ChatComposerDrawer({
150
165
  }[!!isCollapsed << 0]
151
166
  })]
152
167
  }), /*#__PURE__*/_jsx("div", {
153
- id: contentId,
168
+ id: contentId
169
+ // The 0fr row keeps the collapse animation in place. `inert` also
170
+ // removes visually hidden descendants from keyboard and assistive-
171
+ // technology navigation until the drawer expands again.
172
+ ,
173
+ inert: canCollapse && isCollapsed ? true : undefined,
154
174
  ...{
155
175
  0: {
156
176
  className: "xrvj5dj x1tu4anv x1qn9uv2 x80gvsz xlr8y92"
@@ -14,6 +14,10 @@
14
14
  *
15
15
  *
16
16
  * SYNC: When modified, update:
17
+ * - /packages/core/src/Chat/ChatComposerInput.test.tsx
18
+ * - /packages/core/src/Chat/ChatComposerInput.doc.mjs
19
+ * - /packages/core/src/Chat/ChatComposerInput.spec.md
20
+ * - /apps/storybook/stories/ChatComposerInput.stories.tsx
17
21
  * - /packages/core/src/Chat/index.ts
18
22
  * - /apps/storybook/stories/ChatComposer.stories.tsx
19
23
  * - /packages/cli/assets/templates/blocks/components/ChatComposerInput/ (block examples)
@@ -58,6 +62,12 @@ export type ChatComposerTokenCustom = {
58
62
  * Use for tooltips, hovercards, or any content beyond a badge.
59
63
  */
60
64
  export type ChatComposerToken = ChatComposerTokenBadge | ChatComposerTokenCustom;
65
+ export interface ChatComposerTokenElementProps extends BaseProps<HTMLSpanElement> {
66
+ /** Ref forwarded to the token wrapper. */
67
+ ref?: React.Ref<HTMLSpanElement>;
68
+ /** Token rendered as a Badge or by its custom render function. */
69
+ token: ChatComposerToken;
70
+ }
61
71
  export type ChatComposerTriggerItem = SearchableItem;
62
72
  export type ChatComposerTrigger = {
63
73
  /** Character that activates this trigger menu (e.g. '@', '/') */
@@ -159,9 +169,7 @@ export declare function ChatComposerInput(props: ChatComposerInputProps): import
159
169
  export declare namespace ChatComposerInput {
160
170
  var displayName: string;
161
171
  }
162
- export declare function ChatComposerTokenElement({ token }: {
163
- token: ChatComposerToken;
164
- }): import("react").JSX.Element;
172
+ export declare function ChatComposerTokenElement(props: ChatComposerTokenElementProps): import("react").JSX.Element;
165
173
  export declare namespace ChatComposerTokenElement {
166
174
  var displayName: string;
167
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposerInput.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposerInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatComposerInput.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatComposerInput.tsx"],"names":[],"mappings":"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"}
@@ -18,6 +18,10 @@
18
18
  *
19
19
  *
20
20
  * SYNC: When modified, update:
21
+ * - /packages/core/src/Chat/ChatComposerInput.test.tsx
22
+ * - /packages/core/src/Chat/ChatComposerInput.doc.mjs
23
+ * - /packages/core/src/Chat/ChatComposerInput.spec.md
24
+ * - /apps/storybook/stories/ChatComposerInput.stories.tsx
21
25
  * - /packages/core/src/Chat/index.ts
22
26
  * - /apps/storybook/stories/ChatComposer.stories.tsx
23
27
  * - /packages/cli/assets/templates/blocks/components/ChatComposerInput/ (block examples)
@@ -75,6 +79,11 @@ const styles = {
75
79
  kSiTet: "xbyyjgo",
76
80
  kfzvcC: "x47corl",
77
81
  $$css: true
82
+ },
83
+ tokenSpan: {
84
+ k1xSpc: "x3nfvp2",
85
+ kXLuUW: "xxymvpz",
86
+ $$css: true
78
87
  }
79
88
  };
80
89
 
@@ -303,6 +312,7 @@ export function ChatComposerInput(props) {
303
312
  }
304
313
  }, [controlledValue]);
305
314
  const cleanupPortalsRef = useRef(null);
315
+ const emitChangeVersionRef = useRef(0);
306
316
  const emitChange = useCallback(() => {
307
317
  if (!editableRef.current) {
308
318
  return;
@@ -315,6 +325,7 @@ export function ChatComposerInput(props) {
315
325
  const nextValue = trimmedEmpty ? '' : text;
316
326
  pendingEchoValueRef.current = nextValue;
317
327
  setIsEmpty(trimmedEmpty);
328
+ emitChangeVersionRef.current += 1;
318
329
  onChange?.(nextValue);
319
330
  cleanupPortalsRef.current?.();
320
331
  }, [onChange]);
@@ -331,13 +342,17 @@ export function ChatComposerInput(props) {
331
342
  inputRef: selfRef
332
343
  });
333
344
  const pasteAsToken = pasteAsTokenProp === false ? null : pasteAsTokenProp ?? defaultPasteAsToken;
334
- const insertText = useCallback(text => {
345
+ const insertTextWithoutEmit = useCallback(text => {
335
346
  const editable = editableRef.current;
336
347
  if (!editable) {
337
348
  return;
338
349
  }
339
350
  insertTextAtCursor(editable, text);
340
351
  }, []);
352
+ const insertText = useCallback(text => {
353
+ insertTextWithoutEmit(text);
354
+ emitChange();
355
+ }, [emitChange, insertTextWithoutEmit]);
341
356
 
342
357
  // Keep stable refs in sync for imperative handle
343
358
  insertTokenRef.current = tokens.insertToken;
@@ -348,7 +363,7 @@ export function ChatComposerInput(props) {
348
363
  triggers,
349
364
  editableRef,
350
365
  onInsertToken: tokens.insertToken,
351
- onInsertText: insertText,
366
+ onInsertText: insertTextWithoutEmit,
352
367
  onEmitChange: emitChange,
353
368
  debounceMs
354
369
  });
@@ -513,21 +528,44 @@ export function ChatComposerInput(props) {
513
528
  e.preventDefault();
514
529
  const text = e.clipboardData.getData('text/plain');
515
530
 
516
- // Paste-as-token: convert long pastes to token chips
517
- if (pasteAsToken?.onPaste(e, text)) {
518
- emitChange();
531
+ // Consumer onPaste gets first refusal over plain text. Return true after
532
+ // handling it so the built-in insertion paths do not run. A consumer may
533
+ // use the observable imperative handle while handling the event; emit only
534
+ // if that path did not already publish the change.
535
+ const versionBeforeConsumer = emitChangeVersionRef.current;
536
+ const handled = onPasteProp?.(e, text);
537
+ if (handled) {
538
+ if (emitChangeVersionRef.current === versionBeforeConsumer) {
539
+ emitChange();
540
+ }
519
541
  return;
520
542
  }
521
543
 
522
- // Consumer onPaste — return true to prevent default text insert
523
- const handled = onPasteProp?.(e, text);
524
- if (handled) {
544
+ // Paste-as-token: convert long pastes to token chips.
545
+ if (pasteAsToken?.onPaste(e, text)) {
525
546
  emitChange();
526
547
  return;
527
548
  }
528
549
  insertTextAtCursor(editable, text);
529
550
  emitChange();
530
551
  }, [onFiles, onPasteProp, emitChange, tokens, pasteAsToken]);
552
+ const handleDragOver = useCallback(e => {
553
+ if (Array.from(e.dataTransfer.types).includes('Files')) {
554
+ e.preventDefault();
555
+ }
556
+ }, []);
557
+ const handleDrop = useCallback(e => {
558
+ const files = Array.from(e.dataTransfer.files);
559
+ if (files.length === 0) {
560
+ return;
561
+ }
562
+ // File drops navigate the page by default. The input owns that drop
563
+ // target even when no callback is supplied, so keep the user in place.
564
+ e.preventDefault();
565
+ if (!isDisabled) {
566
+ onFiles?.(files);
567
+ }
568
+ }, [isDisabled, onFiles]);
531
569
  const maxHeight = maxRows * LINE_HEIGHT_PX;
532
570
  return /*#__PURE__*/_jsxs("div", {
533
571
  ref: ref,
@@ -535,7 +573,7 @@ export function ChatComposerInput(props) {
535
573
  ...rest,
536
574
  children: [isEmpty && /*#__PURE__*/_jsx("div", {
537
575
  ...{
538
- className: "x10l6tqk x13vifvy x1o0tod xtijo5x x47corl xv1l7n4 xjm74w1 x6pjikd x19v9tvf x9ynric x87ps6o x9epnlk"
576
+ className: "x10l6tqk x13vifvy x1o0tod xtijo5x x47corl xv1l7n4 xjm74w1 xf9zqsd x19v9tvf x9ynric x87ps6o x9epnlk"
539
577
  },
540
578
  "aria-hidden": "true",
541
579
  children: placeholder
@@ -547,9 +585,12 @@ export function ChatComposerInput(props) {
547
585
  onInput: handleInput,
548
586
  onKeyDown: handleKeyDown,
549
587
  onPaste: handlePaste,
588
+ onDragOver: handleDragOver,
589
+ onDrop: handleDrop,
550
590
  ...triggerMenu.ariaProps,
591
+ "aria-disabled": isDisabled || undefined,
551
592
  ...mergeProps({
552
- className: "x1a2a7pz x126k92a x13faqbe x1odjw0f xjm74w1 x6pjikd x19v9tvf x9ynric x1tgivj0 xxugrtn x9epnlk"
593
+ className: "x1a2a7pz x126k92a x13faqbe x1odjw0f xjm74w1 xf9zqsd x19v9tvf x9ynric x1tgivj0 xxugrtn x9epnlk"
553
594
  }, {
554
595
  style: {
555
596
  maxHeight: `${maxHeight}px`
@@ -579,16 +620,22 @@ ChatComposerInput.displayName = 'ChatComposerInput';
579
620
  // Token element helper (for custom rendering in stories/consumers)
580
621
  // =============================================================================
581
622
 
582
- export function ChatComposerTokenElement({
583
- token
584
- }) {
623
+ export function ChatComposerTokenElement(props) {
624
+ const {
625
+ token,
626
+ ref,
627
+ xstyle,
628
+ className,
629
+ style,
630
+ ...rest
631
+ } = props;
585
632
  return /*#__PURE__*/_jsx("span", {
633
+ ref: ref,
634
+ ...mergeProps(stylex.props(styles.tokenSpan, xstyle), className, style),
635
+ ...rest,
586
636
  "data-astryx-token": "",
587
637
  "data-astryx-token-value": token.value,
588
638
  contentEditable: false,
589
- ...{
590
- className: "x3nfvp2 xxymvpz"
591
- },
592
639
  children: isCustomToken(token) ? token.render() : /*#__PURE__*/_jsx(Badge, {
593
640
  label: token.label,
594
641
  variant: token.variant,
@@ -7,7 +7,8 @@
7
7
  * A toggle button that connects to useChatDictation. Shows a microphone
8
8
  * icon when idle. When listening, replaces the icon with volume-reactive
9
9
  * frequency bars (equalizer style) that respond to real mic input.
10
- * Bars use the accent color and hue-shift when volume clips past 10%.
10
+ * Bars use the accent color and blend toward the semantic error color when
11
+ * volume clips past 20%.
11
12
  *
12
13
  * SYNC: When modified, update:
13
14
  * - /packages/core/src/Chat/index.ts (exports)
@@ -22,7 +23,7 @@ export interface ChatDictationButtonProps extends BaseProps<HTMLSpanElement> {
22
23
  dictation: UseSpeechRecognitionReturn;
23
24
  /** Button size. @default "md" */
24
25
  size?: 'sm' | 'md';
25
- /** Hide the button when SpeechRecognition is not supported. @default true */
26
+ /** Hide the button when SpeechRecognition is unsupported. When false, the unsupported button remains visible but disabled. @default true */
26
27
  isHiddenWhenUnsupported?: boolean;
27
28
  /** Accessible label override. */
28
29
  label?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatDictationButton.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatDictationButton.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,wBAAwB,CAAC;AAMvE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAQ5C,MAAM,WAAW,wBAAyB,SAAQ,SAAS,CAAC,eAAe,CAAC;IAC1E,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC,sEAAsE;IACtE,SAAS,EAAE,0BAA0B,CAAC;IACtC,iCAAiC;IACjC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,6EAA6E;IAC7E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiDD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,SAAS,EACT,IAAW,EACX,uBAA8B,EAC9B,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,wBAAwB,4BAyE1B;yBAnFe,mBAAmB"}
1
+ {"version":3,"file":"ChatDictationButton.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatDictationButton.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,wBAAwB,CAAC;AAMvE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAQ5C,MAAM,WAAW,wBAAyB,SAAQ,SAAS,CAAC,eAAe,CAAC;IAC1E,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC,sEAAsE;IACtE,SAAS,EAAE,0BAA0B,CAAC;IACtC,iCAAiC;IACjC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,4IAA4I;IAC5I,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiDD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,SAAS,EACT,IAAW,EACX,uBAA8B,EAC9B,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,wBAAwB,4BA0E1B;yBApFe,mBAAmB"}
@@ -11,7 +11,8 @@
11
11
  * A toggle button that connects to useChatDictation. Shows a microphone
12
12
  * icon when idle. When listening, replaces the icon with volume-reactive
13
13
  * frequency bars (equalizer style) that respond to real mic input.
14
- * Bars use the accent color and hue-shift when volume clips past 10%.
14
+ * Bars use the accent color and blend toward the semantic error color when
15
+ * volume clips past 20%.
15
16
  *
16
17
  * SYNC: When modified, update:
17
18
  * - /packages/core/src/Chat/index.ts (exports)
@@ -102,10 +103,10 @@ export function ChatDictationButton({
102
103
  // Boost each band for visibility — quiet speech (0-10%) maps to full visual range
103
104
  const boostedBands = bands.map(b => Math.min(Math.pow(b / 0.2, 0.5), 1));
104
105
 
105
- // Hue shift from accent color when volume clips past 10%
106
+ // Blend toward the theme's semantic error color as clipping increases.
106
107
  const isClipping = rawVolume >= 0.2;
107
- const hueShift = isClipping ? Math.min((rawVolume - 0.2) / 0.1, 1) * 60 : 0;
108
- const barColor = isClipping ? `hsl(calc(var(--accent-hue, 210) + ${hueShift}), 80%, 50%)` : `var(--color-accent, ${colorVars['--color-accent']})`;
108
+ const clippingStrength = Math.min((rawVolume - 0.2) / 0.1, 1) * 100;
109
+ const barColor = isClipping ? `color-mix(in srgb, ${colorVars['--color-accent']}, ${colorVars['--color-error']} ${clippingStrength}%)` : colorVars['--color-accent'];
109
110
  const {
110
111
  barWidth,
111
112
  barGap,
@@ -150,6 +151,7 @@ export function ChatDictationButton({
150
151
  size: size
151
152
  }),
152
153
  isIconOnly: true,
154
+ isDisabled: !dictation.isSupported,
153
155
  onClick: dictation.toggle
154
156
  })]
155
157
  });
@@ -73,7 +73,7 @@ export function ChatSendButton(props) {
73
73
  ref,
74
74
  ...rest
75
75
  } = props;
76
- const handleSend = onSend ?? (() => context?.onSubmit(''));
76
+ const handleSend = onSend ?? (() => context?.onSubmit(context.value));
77
77
  const defaultStopIcon = useIcon('stop');
78
78
  const defaultSendIcon = useIcon('arrowUp');
79
79
  return /*#__PURE__*/_jsx(Button, {