@astryxdesign/core 0.6.2 → 0.6.3-canary.01fa439

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 (384) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +3 -1
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  8. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  9. package/dist/Chat/ChatComposer.js +10 -5
  10. package/dist/Chat/ChatComposerDrawer.d.ts +19 -5
  11. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  12. package/dist/Chat/ChatComposerDrawer.js +48 -23
  13. package/dist/Chat/ChatComposerInput.d.ts +11 -3
  14. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  15. package/dist/Chat/ChatComposerInput.js +63 -16
  16. package/dist/Chat/ChatDictationButton.d.ts +3 -2
  17. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  18. package/dist/Chat/ChatDictationButton.js +6 -4
  19. package/dist/Chat/ChatSendButton.js +1 -1
  20. package/dist/Chat/index.d.ts +1 -1
  21. package/dist/Chat/index.d.ts.map +1 -1
  22. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  23. package/dist/CheckboxInput/CheckboxInput.js +12 -2
  24. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  25. package/dist/Collapsible/Collapsible.js +6 -1
  26. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  27. package/dist/CommandPalette/CommandPaletteInput.js +1 -1
  28. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  29. package/dist/ComplexSelector/ComplexSelector.js +1 -1
  30. package/dist/DateInput/DateInput.d.ts.map +1 -1
  31. package/dist/DateInput/DateInput.js +4 -4
  32. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  33. package/dist/DateInput/NativeDateField.js +16 -16
  34. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  35. package/dist/DateInput/TouchDateField.js +2 -2
  36. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  37. package/dist/DateRangeInput/DateRangeInput.js +4 -4
  38. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  39. package/dist/DateTimeInput/DateTimeInput.js +8 -8
  40. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  41. package/dist/DateTimeInput/TouchDateTimeField.js +4 -4
  42. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts +9 -3
  43. package/dist/DateTimeInput/nativePickerSegmentStyles.d.ts.map +1 -1
  44. package/dist/DateTimeInput/nativePickerSegmentStyles.js +3 -3
  45. package/dist/Dialog/DialogHeader.d.ts +8 -1
  46. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  47. package/dist/Dialog/DialogHeader.js +10 -1
  48. package/dist/Field/InputClearButton.d.ts +4 -2
  49. package/dist/Field/InputClearButton.d.ts.map +1 -1
  50. package/dist/Field/InputClearButton.js +4 -2
  51. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  52. package/dist/Field/PanelSearchInput.js +1 -1
  53. package/dist/FileInput/FileInput.d.ts.map +1 -1
  54. package/dist/FileInput/FileInput.js +7 -7
  55. package/dist/Kbd/Kbd.d.ts +5 -3
  56. package/dist/Kbd/Kbd.d.ts.map +1 -1
  57. package/dist/Kbd/Kbd.js +36 -42
  58. package/dist/Link/Link.d.ts.map +1 -1
  59. package/dist/Link/Link.js +6 -2
  60. package/dist/Markdown/Markdown.d.ts +8 -2
  61. package/dist/Markdown/Markdown.d.ts.map +1 -1
  62. package/dist/Markdown/Markdown.fr23.bench.d.ts +2 -0
  63. package/dist/Markdown/Markdown.fr23.bench.d.ts.map +1 -0
  64. package/dist/Markdown/Markdown.fr23.bench.js +150 -0
  65. package/dist/Markdown/Markdown.fr23.sampling.d.ts +2 -0
  66. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -0
  67. package/dist/Markdown/Markdown.fr23.sampling.js +43 -0
  68. package/dist/Markdown/Markdown.js +262 -109
  69. package/dist/Markdown/ast.d.ts +162 -0
  70. package/dist/Markdown/ast.d.ts.map +1 -0
  71. package/dist/Markdown/ast.js +74 -0
  72. package/dist/Markdown/index.d.ts +5 -3
  73. package/dist/Markdown/index.d.ts.map +1 -1
  74. package/dist/Markdown/index.js +3 -2
  75. package/dist/Markdown/parser/index.d.ts +10 -0
  76. package/dist/Markdown/parser/index.d.ts.map +1 -0
  77. package/dist/Markdown/parser/index.js +10 -0
  78. package/dist/Markdown/parser.d.ts +126 -58
  79. package/dist/Markdown/parser.d.ts.map +1 -1
  80. package/dist/Markdown/parser.js +716 -167
  81. package/dist/Markdown/plugins/frontmatter.d.ts +32 -0
  82. package/dist/Markdown/plugins/frontmatter.d.ts.map +1 -0
  83. package/dist/Markdown/plugins/frontmatter.js +132 -0
  84. package/dist/Markdown/plugins/index.d.ts +16 -0
  85. package/dist/Markdown/plugins/index.d.ts.map +1 -0
  86. package/dist/Markdown/plugins/index.js +13 -0
  87. package/dist/Markdown/plugins/protocol.d.ts +191 -0
  88. package/dist/Markdown/plugins/protocol.d.ts.map +1 -0
  89. package/dist/Markdown/plugins/protocol.js +957 -0
  90. package/dist/Markdown/plugins/semanticFence.d.ts +36 -0
  91. package/dist/Markdown/plugins/semanticFence.d.ts.map +1 -0
  92. package/dist/Markdown/plugins/semanticFence.js +213 -0
  93. package/dist/Markdown/plugins/sourceDecoration.d.ts +76 -0
  94. package/dist/Markdown/plugins/sourceDecoration.d.ts.map +1 -0
  95. package/dist/Markdown/plugins/sourceDecoration.js +393 -0
  96. package/dist/Markdown/plugins/textTransform.d.ts +30 -0
  97. package/dist/Markdown/plugins/textTransform.d.ts.map +1 -0
  98. package/dist/Markdown/plugins/textTransform.js +374 -0
  99. package/dist/Markdown/remark.d.ts +196 -0
  100. package/dist/Markdown/remark.d.ts.map +1 -0
  101. package/dist/Markdown/remark.js +1062 -0
  102. package/dist/Markdown/url.d.ts +4 -0
  103. package/dist/Markdown/url.d.ts.map +1 -0
  104. package/dist/Markdown/url.js +25 -0
  105. package/dist/Markdown/utils.d.ts +4 -2
  106. package/dist/Markdown/utils.d.ts.map +1 -1
  107. package/dist/Markdown/utils.js +2 -1
  108. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  109. package/dist/NumberInput/NumberInput.js +4 -4
  110. package/dist/Outline/index.d.ts +1 -0
  111. package/dist/Outline/index.d.ts.map +1 -1
  112. package/dist/Outline/parseOutlineFromMarkdown.d.ts +7 -1
  113. package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
  114. package/dist/Outline/parseOutlineFromMarkdown.js +14 -8
  115. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -1
  116. package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
  117. package/dist/Outline/useOutlineFromMarkdown.js +8 -3
  118. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  119. package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
  120. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  121. package/dist/ProgressBar/ProgressBar.js +36 -31
  122. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  123. package/dist/RadioList/RadioListItem.js +13 -1
  124. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  125. package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
  126. package/dist/Selector/Selector.d.ts +9 -7
  127. package/dist/Selector/Selector.d.ts.map +1 -1
  128. package/dist/Selector/Selector.js +7 -5
  129. package/dist/SideNav/SideNav.d.ts +2 -1
  130. package/dist/SideNav/SideNav.d.ts.map +1 -1
  131. package/dist/SideNav/SideNav.js +9 -3
  132. package/dist/Slider/Slider.d.ts.map +1 -1
  133. package/dist/Slider/Slider.js +28 -12
  134. package/dist/Spinner/Spinner.d.ts.map +1 -1
  135. package/dist/Spinner/Spinner.js +23 -7
  136. package/dist/Switch/Switch.d.ts.map +1 -1
  137. package/dist/Switch/Switch.js +11 -0
  138. package/dist/TabList/Tab.d.ts +1 -1
  139. package/dist/TabList/Tab.d.ts.map +1 -1
  140. package/dist/TabList/Tab.js +20 -7
  141. package/dist/Table/Table.d.ts +1 -0
  142. package/dist/Table/Table.d.ts.map +1 -1
  143. package/dist/Table/Table.js +29 -13
  144. package/dist/TextArea/TextArea.d.ts.map +1 -1
  145. package/dist/TextArea/TextArea.js +1 -1
  146. package/dist/TextInput/TextInput.d.ts.map +1 -1
  147. package/dist/TextInput/TextInput.js +2 -2
  148. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  149. package/dist/TimeInput/TimeInput.js +4 -4
  150. package/dist/ToggleButton/ToggleButton.d.ts +9 -6
  151. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  152. package/dist/ToggleButton/ToggleButton.js +15 -27
  153. package/dist/TreeList/TreeList.d.ts.map +1 -1
  154. package/dist/TreeList/TreeList.js +3 -0
  155. package/dist/TreeList/TreeListItem.d.ts +6 -1
  156. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  157. package/dist/TreeList/TreeListItem.js +12 -2
  158. package/dist/TreeList/TreeListTypes.d.ts +8 -1
  159. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  160. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  161. package/dist/Typeahead/BaseTypeahead.js +16 -7
  162. package/dist/astryx.css +18 -7
  163. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  164. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  165. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  166. package/dist/hooks/useScrollableArea.d.ts +6 -2
  167. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  168. package/dist/hooks/useScrollableArea.js +17 -5
  169. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  170. package/dist/theme/generateThemeRules.js +10 -0
  171. package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
  172. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  173. package/dist/utils/interactionOverlay.stylex.js +9 -0
  174. package/locales/af-ZA.json +530 -1
  175. package/locales/ar-SA.json +490 -1
  176. package/locales/ca-ES.json +514 -1
  177. package/locales/cs-CZ.json +498 -1
  178. package/locales/da-DK.json +522 -1
  179. package/locales/de-DE.json +522 -1
  180. package/locales/el-GR.json +498 -1
  181. package/locales/es-ES.json +510 -1
  182. package/locales/fi-FI.json +498 -1
  183. package/locales/fr-FR.json +534 -1
  184. package/locales/he-IL.json +498 -1
  185. package/locales/hu-HU.json +498 -1
  186. package/locales/it-IT.json +510 -1
  187. package/locales/ja-JP.json +490 -1
  188. package/locales/ko-KR.json +498 -1
  189. package/locales/nl-NL.json +534 -1
  190. package/locales/no-NO.json +510 -1
  191. package/locales/pl-PL.json +506 -1
  192. package/locales/pt-BR.json +506 -1
  193. package/locales/pt-PT.json +506 -1
  194. package/locales/ro-RO.json +506 -1
  195. package/locales/ru-RU.json +498 -1
  196. package/locales/sr-SP.json +498 -1
  197. package/locales/sv-SE.json +502 -1
  198. package/locales/tr-TR.json +498 -1
  199. package/locales/uk-UA.json +498 -1
  200. package/locales/vi-VN.json +502 -1
  201. package/locales/zh-CN.json +490 -1
  202. package/locales/zh-TW.json +490 -1
  203. package/package.json +19 -4
  204. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  205. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  206. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  207. package/src/BottomSheet/BottomSheet.tsx +3 -1
  208. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  209. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  210. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  211. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  212. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
  213. package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
  214. package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
  215. package/src/Button/__tests__/Button.a11y.states.ts +9 -0
  216. package/src/Chat/ChatComposer.doc.mjs +14 -0
  217. package/src/Chat/ChatComposer.spec.md +230 -0
  218. package/src/Chat/ChatComposer.test.tsx +57 -0
  219. package/src/Chat/ChatComposer.tsx +21 -9
  220. package/src/Chat/ChatComposerDrawer.doc.mjs +63 -5
  221. package/src/Chat/ChatComposerDrawer.spec.md +267 -0
  222. package/src/Chat/ChatComposerDrawer.test.tsx +81 -12
  223. package/src/Chat/ChatComposerDrawer.tsx +38 -9
  224. package/src/Chat/ChatComposerInput.doc.mjs +114 -26
  225. package/src/Chat/ChatComposerInput.spec.md +185 -0
  226. package/src/Chat/ChatComposerInput.test.tsx +113 -3
  227. package/src/Chat/ChatComposerInput.tsx +78 -13
  228. package/src/Chat/ChatComposerTokenElement.spec.md +152 -0
  229. package/src/Chat/ChatComposerTokenElement.test.tsx +85 -0
  230. package/src/Chat/ChatDictationButton.doc.mjs +3 -3
  231. package/src/Chat/ChatDictationButton.spec.md +160 -0
  232. package/src/Chat/ChatDictationButton.test.tsx +92 -27
  233. package/src/Chat/ChatDictationButton.tsx +8 -6
  234. package/src/Chat/ChatSendButton.test.tsx +1 -4
  235. package/src/Chat/ChatSendButton.tsx +1 -1
  236. package/src/Chat/index.ts +1 -0
  237. package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
  238. package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
  239. package/src/CheckboxInput/CheckboxInput.tsx +21 -1
  240. package/src/ClickableCard/ClickableCard.test.tsx +102 -5
  241. package/src/Collapsible/Collapsible.doc.mjs +11 -0
  242. package/src/Collapsible/Collapsible.test.tsx +21 -0
  243. package/src/Collapsible/Collapsible.tsx +5 -0
  244. package/src/CommandPalette/CommandPaletteInput.tsx +6 -1
  245. package/src/ComplexSelector/ComplexSelector.tsx +6 -1
  246. package/src/DateInput/DateInput.tsx +6 -1
  247. package/src/DateInput/NativeDateField.tsx +24 -8
  248. package/src/DateInput/TouchDateField.tsx +6 -2
  249. package/src/DateRangeInput/DateRangeInput.tsx +6 -1
  250. package/src/DateTimeInput/DateTimeInput.tsx +6 -1
  251. package/src/DateTimeInput/TouchDateTimeField.tsx +6 -1
  252. package/src/DateTimeInput/nativePickerSegmentStyles.ts +24 -8
  253. package/src/Dialog/DialogHeader.doc.mjs +12 -0
  254. package/src/Dialog/DialogHeader.test.tsx +97 -0
  255. package/src/Dialog/DialogHeader.tsx +25 -3
  256. package/src/Dialog/modules/DialogHeader.spec.md +75 -38
  257. package/src/Field/InputClearButton.test.tsx +17 -3
  258. package/src/Field/InputClearButton.tsx +5 -2
  259. package/src/Field/PanelSearchInput.tsx +5 -2
  260. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +1 -1
  261. package/src/FileInput/FileInput.tsx +11 -2
  262. package/src/Kbd/Kbd.doc.mjs +3 -3
  263. package/src/Kbd/Kbd.test.tsx +57 -1
  264. package/src/Kbd/Kbd.tsx +57 -37
  265. package/src/Layout/LayoutFooter.doc.mjs +17 -0
  266. package/src/Link/Link.doc.mjs +11 -0
  267. package/src/Link/Link.test.tsx +24 -0
  268. package/src/Link/Link.tsx +5 -0
  269. package/src/List/List.spec.md +200 -0
  270. package/src/Markdown/Markdown.doc.mjs +272 -0
  271. package/src/Markdown/Markdown.fr23.bench.ts +174 -0
  272. package/src/Markdown/Markdown.fr23.perf.test.ts +249 -0
  273. package/src/Markdown/Markdown.fr23.sampling.ts +49 -0
  274. package/src/Markdown/Markdown.helpers.perf.test.ts +489 -0
  275. package/src/Markdown/Markdown.public.test.ts +126 -3
  276. package/src/Markdown/Markdown.spec.md +197 -44
  277. package/src/Markdown/Markdown.test.tsx +11 -0
  278. package/src/Markdown/Markdown.tsx +414 -135
  279. package/src/Markdown/ast.test.ts +307 -0
  280. package/src/Markdown/ast.ts +337 -0
  281. package/src/Markdown/incremental.test.ts +12 -0
  282. package/src/Markdown/index.ts +37 -1
  283. package/src/Markdown/modules/remark.spec.md +269 -0
  284. package/src/Markdown/parser/index.ts +64 -0
  285. package/src/Markdown/parser.public.test.ts +103 -0
  286. package/src/Markdown/parser.ts +1180 -235
  287. package/src/Markdown/plugins/frontmatter.test.tsx +125 -0
  288. package/src/Markdown/plugins/frontmatter.ts +198 -0
  289. package/src/Markdown/plugins/index.ts +53 -0
  290. package/src/Markdown/plugins/protocol.test.tsx +1022 -0
  291. package/src/Markdown/plugins/protocol.ts +1618 -0
  292. package/src/Markdown/plugins/semanticFence.test.tsx +546 -0
  293. package/src/Markdown/plugins/semanticFence.ts +424 -0
  294. package/src/Markdown/plugins/sourceDecoration.test.tsx +799 -0
  295. package/src/Markdown/plugins/sourceDecoration.ts +539 -0
  296. package/src/Markdown/plugins/textTransform.test.ts +467 -0
  297. package/src/Markdown/plugins/textTransform.ts +554 -0
  298. package/src/Markdown/remark.test.tsx +1877 -0
  299. package/src/Markdown/remark.ts +1574 -0
  300. package/src/Markdown/url.ts +30 -0
  301. package/src/Markdown/utils.ts +13 -1
  302. package/src/MultiSelector/MultiSelector.test.tsx +1 -35
  303. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +128 -0
  304. package/src/NumberInput/NumberInput.tsx +6 -1
  305. package/src/Outline/Outline.doc.mjs +7 -5
  306. package/src/Outline/Outline.spec.md +1 -1
  307. package/src/Outline/index.ts +1 -0
  308. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
  309. package/src/Outline/parseOutlineFromMarkdown.ts +40 -10
  310. package/src/Outline/useOutlineFromMarkdown.ts +15 -3
  311. package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
  312. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
  313. package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
  314. package/src/ProgressBar/ProgressBar.test.tsx +29 -11
  315. package/src/ProgressBar/ProgressBar.tsx +59 -72
  316. package/src/RadioList/RadioList.doc.mjs +11 -0
  317. package/src/RadioList/RadioList.test.tsx +32 -0
  318. package/src/RadioList/RadioListItem.tsx +25 -1
  319. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  320. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  321. package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
  322. package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
  323. package/src/Selector/Selector.doc.mjs +2 -2
  324. package/src/Selector/Selector.spec.md +51 -49
  325. package/src/Selector/Selector.test.tsx +61 -55
  326. package/src/Selector/Selector.tsx +23 -14
  327. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +130 -0
  328. package/src/Selector/__tests__/Listbox.a11y.dom.ts +38 -0
  329. package/src/Selector/__tests__/Listbox.a11y.inventory.test.ts +63 -0
  330. package/src/Selector/__tests__/Listbox.a11y.known-failures.ts +37 -0
  331. package/src/Selector/__tests__/Listbox.a11y.states.ts +232 -0
  332. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +121 -0
  333. package/src/SideNav/SideNav.doc.mjs +1 -1
  334. package/src/SideNav/SideNav.test.tsx +10 -0
  335. package/src/SideNav/SideNav.tsx +14 -2
  336. package/src/Slider/Slider.doc.mjs +17 -3
  337. package/src/Slider/Slider.test.tsx +221 -0
  338. package/src/Slider/Slider.tsx +40 -9
  339. package/src/Spinner/Spinner.test.tsx +4 -0
  340. package/src/Spinner/Spinner.tsx +31 -18
  341. package/src/Switch/Switch.doc.mjs +11 -0
  342. package/src/Switch/Switch.test.tsx +16 -0
  343. package/src/Switch/Switch.tsx +28 -0
  344. package/src/TabList/Tab.tsx +35 -7
  345. package/src/TabList/TabList.doc.mjs +11 -0
  346. package/src/TabList/TabList.spec.md +204 -0
  347. package/src/TabList/TabList.test.tsx +66 -0
  348. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
  349. package/src/Table/Table.doc.mjs +1 -1
  350. package/src/Table/Table.spec.md +54 -40
  351. package/src/Table/Table.test.tsx +83 -10
  352. package/src/Table/Table.tsx +30 -22
  353. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +137 -0
  354. package/src/TextArea/TextArea.tsx +6 -1
  355. package/src/TextInput/TextInput.test.tsx +20 -1
  356. package/src/TextInput/TextInput.tsx +6 -1
  357. package/src/TimeInput/TimeInput.tsx +6 -1
  358. package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
  359. package/src/ToggleButton/ToggleButton.test.tsx +299 -4
  360. package/src/ToggleButton/ToggleButton.tsx +26 -33
  361. package/src/ToggleButton/ToggleButtonGroup.doc.mjs +3 -3
  362. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
  363. package/src/Tokenizer/Tokenizer.spec.md +142 -75
  364. package/src/TreeList/TreeList.doc.mjs +3 -3
  365. package/src/TreeList/TreeList.spec.md +123 -75
  366. package/src/TreeList/TreeList.test.tsx +29 -0
  367. package/src/TreeList/TreeList.tsx +3 -0
  368. package/src/TreeList/TreeListItem.tsx +15 -1
  369. package/src/TreeList/TreeListTypes.ts +11 -1
  370. package/src/Typeahead/BaseTypeahead.spec.md +4 -3
  371. package/src/Typeahead/BaseTypeahead.tsx +21 -7
  372. package/src/Typeahead/Typeahead.test.tsx +53 -0
  373. package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
  374. package/src/__tests__/pressState.ts +93 -0
  375. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  376. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  377. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  378. package/src/hooks/useScrollableArea.test.tsx +59 -1
  379. package/src/hooks/useScrollableArea.ts +34 -10
  380. package/src/inputFontFloor.test.ts +106 -0
  381. package/src/tailwind-theme.css +0 -6
  382. package/src/theme/generateThemeRules.test.ts +30 -0
  383. package/src/theme/generateThemeRules.ts +10 -0
  384. package/src/utils/interactionOverlay.stylex.ts +20 -0
@@ -0,0 +1,467 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file textTransform.test.ts
5
+ * @input Text-transform helper selectors, callbacks, and protected contexts
6
+ * @output Behavioral, ordering, typing, and work-count regression coverage
7
+ * @position Acceptance tests for the optional Markdown text helper
8
+ */
9
+
10
+ import {describe, expect, expectTypeOf, it, vi} from 'vitest';
11
+ import {parseInline, parseMarkdown, parseMarkdownAst} from '../parser';
12
+ import {createMarkdownPlugin} from './protocol';
13
+ import type {MarkdownExtensionNode} from './protocol';
14
+ import {createMarkdownTextTransform} from './textTransform';
15
+ import type {MarkdownTextTransformContext} from './textTransform';
16
+
17
+ type TodoNode = MarkdownExtensionNode<
18
+ 'todo-labels',
19
+ 'todo',
20
+ {readonly label: string},
21
+ 'inline'
22
+ >;
23
+
24
+ function todoPlugin(
25
+ onReplace?: (context: MarkdownTextTransformContext) => void,
26
+ ) {
27
+ return createMarkdownPlugin<'todo-labels', TodoNode>({
28
+ name: 'todo-labels',
29
+ apiVersion: 1,
30
+ transform: createMarkdownTextTransform<TodoNode>({
31
+ pattern: /TODO/g,
32
+ requiredSubstrings: ['TODO'],
33
+ replace(_match, context) {
34
+ onReplace?.(context);
35
+ return {
36
+ type: 'extension',
37
+ plugin: 'todo-labels',
38
+ name: 'todo',
39
+ display: 'inline',
40
+ data: {label: 'TODO'},
41
+ };
42
+ },
43
+ }),
44
+ renderers: {
45
+ todo: {
46
+ render: ({node}) => node.data.label,
47
+ toText: node => node.data.label,
48
+ },
49
+ },
50
+ });
51
+ }
52
+
53
+ function extensionCount(value: unknown): number {
54
+ if (Array.isArray(value)) {
55
+ return value.reduce<number>(
56
+ (count, child) => count + extensionCount(child),
57
+ 0,
58
+ );
59
+ }
60
+ if (value == null || typeof value !== 'object') {
61
+ return 0;
62
+ }
63
+ const record = value as Record<string, unknown>;
64
+ const own = record.type === 'extension' ? 1 : 0;
65
+ return (
66
+ own +
67
+ Object.values(record).reduce<number>(
68
+ (count, child) => count + extensionCount(child),
69
+ 0,
70
+ )
71
+ );
72
+ }
73
+
74
+ describe('createMarkdownTextTransform', () => {
75
+ it('replaces eligible prose and preserves protected contexts', () => {
76
+ const parents: string[] = [];
77
+ const plugin = todoPlugin(context => parents.push(context.parentType));
78
+ const blocks = parseMarkdown(
79
+ [
80
+ 'TODO **TODO** [TODO](/tasks) `TODO` [source]',
81
+ '',
82
+ '> TODO',
83
+ '',
84
+ '| Item |',
85
+ '| --- |',
86
+ '| TODO |',
87
+ '',
88
+ '```text',
89
+ 'TODO',
90
+ '```',
91
+ ].join('\n'),
92
+ {plugins: [plugin], sourceIds: new Set(['source'])},
93
+ );
94
+
95
+ expect(extensionCount(blocks)).toBe(4);
96
+ expect(parents).toEqual(['paragraph', 'strong', 'paragraph', 'tableCell']);
97
+ expect(JSON.stringify(blocks)).toContain('"type":"link","href":"/tasks"');
98
+ expect(JSON.stringify(blocks)).toContain('"type":"code","content":"TODO"');
99
+ });
100
+
101
+ it('runs helpers in plugin order and supports removal', () => {
102
+ const replace = (name: string, pattern: RegExp, value: string) =>
103
+ createMarkdownPlugin({
104
+ name,
105
+ apiVersion: 1,
106
+ transform: createMarkdownTextTransform({
107
+ pattern,
108
+ requiredSubstrings: [pattern.source],
109
+ replace: () => (value === '' ? [] : {type: 'text' as const, value}),
110
+ }),
111
+ });
112
+
113
+ expect(
114
+ parseMarkdown('A', {
115
+ plugins: [replace('a-to-b', /A/g, 'B'), replace('b-to-c', /B/g, 'C')],
116
+ }),
117
+ ).toMatchObject([
118
+ {
119
+ type: 'paragraph',
120
+ children: [{type: 'text', content: 'C'}],
121
+ },
122
+ ]);
123
+ expect(
124
+ parseMarkdown('Remove me', {
125
+ plugins: [replace('remove', /Remove /g, '')],
126
+ }),
127
+ ).toMatchObject([
128
+ {type: 'paragraph', children: [{type: 'text', content: 'me'}]},
129
+ ]);
130
+ });
131
+
132
+ it('clones a hoisted replacement for each claim', () => {
133
+ const replacement = {type: 'text' as const, value: 'done'};
134
+ const plugin = createMarkdownPlugin({
135
+ name: 'hoisted-replacement',
136
+ apiVersion: 1,
137
+ transform: createMarkdownTextTransform({
138
+ pattern: /X/g,
139
+ requiredSubstrings: ['X'],
140
+ replace: () => replacement,
141
+ }),
142
+ });
143
+
144
+ expect(parseMarkdown('X X', {plugins: [plugin]})).toMatchObject([
145
+ {
146
+ type: 'paragraph',
147
+ children: [
148
+ {type: 'text', content: 'done'},
149
+ {type: 'text', content: ' '},
150
+ {type: 'text', content: 'done'},
151
+ ],
152
+ },
153
+ ]);
154
+ });
155
+
156
+ it('does not invoke callbacks for absent or protected-only matches', () => {
157
+ let replacements = 0;
158
+ const plugin = todoPlugin(() => replacements++);
159
+
160
+ parseMarkdown('No work here.', {plugins: [plugin]});
161
+ expect(replacements).toBe(0);
162
+ parseMarkdown('`TODO`\n\n```text\nTODO\n```', {plugins: [plugin]});
163
+ expect(replacements).toBe(0);
164
+ });
165
+
166
+ it('uses case-insensitive source claims with case-insensitive patterns', () => {
167
+ const plugin = createMarkdownPlugin({
168
+ name: 'case-insensitive',
169
+ apiVersion: 1,
170
+ transform: createMarkdownTextTransform({
171
+ pattern: /todo/gi,
172
+ requiredSubstrings: ['todo'],
173
+ replace: () => ({type: 'text', value: 'done'}),
174
+ }),
175
+ });
176
+
177
+ expect(parseMarkdown('TODO', {plugins: [plugin]})).toMatchObject([
178
+ {type: 'paragraph', children: [{type: 'text', content: 'done'}]},
179
+ ]);
180
+ const unicodeCaseFold = createMarkdownPlugin({
181
+ name: 'unicode-case-fold',
182
+ apiVersion: 1,
183
+ transform: createMarkdownTextTransform({
184
+ pattern: /Σ/gi,
185
+ requiredSubstrings: ['Σ'],
186
+ replace: () => ({type: 'text', value: 'sigma'}),
187
+ }),
188
+ });
189
+ expect(parseMarkdown('ς', {plugins: [unicodeCaseFold]})).toMatchObject([
190
+ {type: 'paragraph', children: [{type: 'text', content: 'sigma'}]},
191
+ ]);
192
+ const digits = createMarkdownPlugin({
193
+ name: 'digits-without-prefilter',
194
+ apiVersion: 1,
195
+ transform: createMarkdownTextTransform({
196
+ pattern: /\d+/g,
197
+ replace: match => ({type: 'text', value: `[${match[0]}]`}),
198
+ }),
199
+ });
200
+ expect(parseMarkdown('Item 42', {plugins: [digits]})).toMatchObject([
201
+ {
202
+ type: 'paragraph',
203
+ children: [
204
+ {type: 'text', content: 'Item '},
205
+ {type: 'text', content: '[42]'},
206
+ ],
207
+ },
208
+ ]);
209
+ });
210
+
211
+ it('supports bounded claim extension and decline', () => {
212
+ let replacements = 0;
213
+ const plugin = createMarkdownPlugin({
214
+ name: 'hash-tags',
215
+ apiVersion: 1,
216
+ transform: createMarkdownTextTransform({
217
+ pattern: /#/g,
218
+ requiredSubstrings: ['#'],
219
+ getEndIndex(text, match) {
220
+ const end = text.indexOf(' ', match.index);
221
+ return end < 0 ? text.length : end;
222
+ },
223
+ replace(match) {
224
+ replacements++;
225
+ return {type: 'text', value: match.index === 0 ? 'tag' : 'nested'};
226
+ },
227
+ }),
228
+ });
229
+
230
+ expect(parseInline('#one #two', {plugins: [plugin]})).toMatchObject([
231
+ {type: 'text', content: 'tag'},
232
+ {type: 'text', content: ' '},
233
+ {type: 'text', content: 'nested'},
234
+ ]);
235
+ expect(replacements).toBe(2);
236
+ });
237
+
238
+ it('supports accepted zero-width insertions at text boundaries', () => {
239
+ const start = createMarkdownPlugin({
240
+ name: 'insert-start',
241
+ apiVersion: 1,
242
+ transform: createMarkdownTextTransform({
243
+ pattern: /^/g,
244
+ replace: () => ({type: 'text', value: '['}),
245
+ }),
246
+ });
247
+ const end = createMarkdownPlugin({
248
+ name: 'insert-end',
249
+ apiVersion: 1,
250
+ transform: createMarkdownTextTransform({
251
+ pattern: /$/g,
252
+ replace: () => ({type: 'text', value: ']'}),
253
+ }),
254
+ });
255
+
256
+ expect(parseMarkdown('value', {plugins: [start]})).toMatchObject([
257
+ {
258
+ type: 'paragraph',
259
+ children: [
260
+ {type: 'text', content: '['},
261
+ {type: 'text', content: 'value'},
262
+ ],
263
+ },
264
+ ]);
265
+ expect(parseMarkdown('value', {plugins: [end]})).toMatchObject([
266
+ {
267
+ type: 'paragraph',
268
+ children: [
269
+ {type: 'text', content: 'value'},
270
+ {type: 'text', content: ']'},
271
+ ],
272
+ },
273
+ ]);
274
+ });
275
+
276
+ it('advances declined zero-width matches by Unicode code point', () => {
277
+ let replacements = 0;
278
+ const astral = createMarkdownPlugin({
279
+ name: 'astral-zero-width',
280
+ apiVersion: 1,
281
+ transform: createMarkdownTextTransform({
282
+ pattern: /(?=😀)/gu,
283
+ requiredSubstrings: ['😀'],
284
+ getEndIndex: () => false,
285
+ replace: () => {
286
+ replacements++;
287
+ return {type: 'text', value: 'unexpected'};
288
+ },
289
+ }),
290
+ });
291
+ const end = createMarkdownPlugin({
292
+ name: 'end-zero-width',
293
+ apiVersion: 1,
294
+ transform: createMarkdownTextTransform({
295
+ pattern: /$/gu,
296
+ requiredSubstrings: ['😀'],
297
+ getEndIndex: () => false,
298
+ replace: () => {
299
+ replacements++;
300
+ return {type: 'text', value: 'unexpected'};
301
+ },
302
+ }),
303
+ });
304
+
305
+ expect(parseMarkdown('😀', {plugins: [astral, end]})).toMatchObject([
306
+ {type: 'paragraph', children: [{type: 'text', content: '😀'}]},
307
+ ]);
308
+ expect(replacements).toBe(0);
309
+ });
310
+
311
+ it('requires a global pattern and keeps the helper typed as a transform', () => {
312
+ expect(() =>
313
+ createMarkdownTextTransform({
314
+ pattern: /TODO/,
315
+ requiredSubstrings: ['TODO'],
316
+ replace: () => ({type: 'text', value: 'done'}),
317
+ }),
318
+ ).toThrow(/global flag/);
319
+ expect(() =>
320
+ createMarkdownTextTransform({
321
+ pattern: /TODO/g,
322
+ requiredSubstrings: [] as never,
323
+ replace: () => ({type: 'text', value: 'done'}),
324
+ }),
325
+ ).toThrow(/requiredSubstring/);
326
+ expect(() =>
327
+ createMarkdownTextTransform({
328
+ pattern: /TODO/g,
329
+ requiredSubstrings: [42] as never,
330
+ replace: () => ({type: 'text', value: 'done'}),
331
+ }),
332
+ ).toThrow(/requiredSubstrings/);
333
+ const ownedTransform = createMarkdownTextTransform<TodoNode>({
334
+ pattern: /TODO/g,
335
+ requiredSubstrings: ['TODO'],
336
+ replace: () => ({
337
+ type: 'extension',
338
+ plugin: 'todo-labels',
339
+ name: 'todo',
340
+ display: 'inline',
341
+ data: {label: 'TODO'},
342
+ }),
343
+ });
344
+ function compileOnlyRendererRequirement() {
345
+ // @ts-expect-error a helper that owns extension nodes requires renderers
346
+ createMarkdownPlugin({
347
+ name: 'todo-labels',
348
+ apiVersion: 1,
349
+ transform: ownedTransform,
350
+ });
351
+ }
352
+ expectTypeOf(compileOnlyRendererRequirement).toBeFunction();
353
+ expectTypeOf(createMarkdownTextTransform).toBeFunction();
354
+ });
355
+
356
+ it('adopts a fresh replacement node and freezes it against later writes', () => {
357
+ // A callback that builds a node per match hands over a fresh object, so
358
+ // the helper puts it straight into the tree rather than copying it. That
359
+ // is only safe because the node is frozen on the way in: whoever still
360
+ // holds the reference cannot reach into the document afterwards.
361
+ const handedOver: {type: 'text'; value: string}[] = [];
362
+ const plugin = createMarkdownPlugin({
363
+ name: 'fresh-nodes',
364
+ apiVersion: 1,
365
+ transform: createMarkdownTextTransform({
366
+ pattern: /TODO/g,
367
+ requiredSubstrings: ['TODO'],
368
+ replace: () => {
369
+ const node = {type: 'text' as const, value: 'done'};
370
+ handedOver.push(node);
371
+ return node;
372
+ },
373
+ }),
374
+ });
375
+
376
+ const blocks = parseMarkdown('TODO and TODO again', {plugins: [plugin]});
377
+ expect(handedOver).toHaveLength(2);
378
+ expect(handedOver.every(node => Object.isFrozen(node))).toBe(true);
379
+
380
+ // A late write by the caller is rejected and the document is unaffected.
381
+ expect(() => {
382
+ 'use strict';
383
+ handedOver[0].value = 'HACKED';
384
+ }).toThrow(TypeError);
385
+ expect(blocks).toEqual([
386
+ {
387
+ type: 'paragraph',
388
+ children: [
389
+ {type: 'text', content: 'done'},
390
+ {type: 'text', content: ' and '},
391
+ {type: 'text', content: 'done'},
392
+ {type: 'text', content: ' again'},
393
+ ],
394
+ },
395
+ ]);
396
+ });
397
+
398
+ it('copies a replacement node the callback hands over more than once', () => {
399
+ // One object cannot occupy two positions in the tree, and the first
400
+ // position's node is already frozen. A callback that returns the same
401
+ // object for every match therefore gets a copy from the second match on.
402
+ const shared = {type: 'text' as const, value: 'done'};
403
+ const plugin = createMarkdownPlugin({
404
+ name: 'shared-node',
405
+ apiVersion: 1,
406
+ transform: createMarkdownTextTransform({
407
+ pattern: /TODO/g,
408
+ requiredSubstrings: ['TODO'],
409
+ replace: () => shared,
410
+ }),
411
+ });
412
+
413
+ const root = parseMarkdownAst('TODO and TODO again', {plugins: [plugin]});
414
+ const paragraph = root.children[0];
415
+ if (paragraph.type !== 'paragraph') {
416
+ throw new Error('Expected a paragraph');
417
+ }
418
+ const [first, , third] = paragraph.children;
419
+ expect(first).not.toBe(third);
420
+ expect(first).toEqual({type: 'text', value: 'done'});
421
+ expect(third).toEqual({type: 'text', value: 'done'});
422
+
423
+ // Both documents agree with a run whose callback allocates per match.
424
+ expect(parseMarkdown('TODO and TODO again', {plugins: [plugin]})).toEqual(
425
+ parseMarkdown('TODO and TODO again', {
426
+ plugins: [
427
+ createMarkdownPlugin({
428
+ name: 'per-match-node',
429
+ apiVersion: 1,
430
+ transform: createMarkdownTextTransform({
431
+ pattern: /TODO/g,
432
+ requiredSubstrings: ['TODO'],
433
+ replace: () => ({type: 'text', value: 'done'}),
434
+ }),
435
+ }),
436
+ ],
437
+ }),
438
+ );
439
+ });
440
+
441
+ it('still rejects an unrepresentable node without freezing the batch', () => {
442
+ const rejected = {
443
+ type: 'text' as const,
444
+ value: 'ok',
445
+ position: {start: {offset: 0}, end: {offset: 2}},
446
+ };
447
+ const warning = vi.spyOn(console, 'warn').mockImplementation(() => {});
448
+ const plugin = createMarkdownPlugin({
449
+ name: 'forged-provenance',
450
+ apiVersion: 1,
451
+ transform: createMarkdownTextTransform({
452
+ pattern: /TODO/g,
453
+ requiredSubstrings: ['TODO'],
454
+ replace: () => rejected as never,
455
+ }),
456
+ });
457
+
458
+ // Authored provenance is refused, the document keeps its source text,
459
+ // and the caller's object is left exactly as it was.
460
+ expect(parseMarkdown('TODO', {plugins: [plugin]})).toEqual(
461
+ parseMarkdown('TODO'),
462
+ );
463
+ expect(Object.isFrozen(rejected)).toBe(false);
464
+ expect(warning).toHaveBeenCalled();
465
+ warning.mockRestore();
466
+ });
467
+ });