@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,546 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file semanticFence.test.tsx
5
+ * @input Semantic-fence helper, canonical transforms, and standard plugin renderers
6
+ * @output Regression coverage for typing, immutability, precedence, fallback, and SSR
7
+ * @position Focused acceptance tests for AST-036 semantic code fences
8
+ */
9
+
10
+ import {render, screen} from '@testing-library/react';
11
+ import {renderToString} from 'react-dom/server';
12
+ import {describe, expect, expectTypeOf, it, vi} from 'vitest';
13
+ import {Markdown} from '../Markdown';
14
+ import type {MarkdownAstRoot} from '../ast';
15
+ import {parseMarkdown, parseMarkdownAst} from '../parser';
16
+ import {
17
+ applyMarkdownTransforms,
18
+ createMarkdownPlugin,
19
+ prepareMarkdownPlugins,
20
+ type MarkdownExtensionNode,
21
+ type MarkdownExtensionRenderer,
22
+ type MarkdownTransform,
23
+ type MarkdownTransformPluginDefinition,
24
+ } from './protocol';
25
+ import {
26
+ createMarkdownFenceTransform,
27
+ getMarkdownFenceProposal,
28
+ type MarkdownFenceContext,
29
+ type MarkdownFenceNode,
30
+ } from './semanticFence';
31
+
32
+ type DiagramData = {
33
+ readonly code: string;
34
+ readonly language: 'diagram';
35
+ readonly meta?: string;
36
+ };
37
+
38
+ type DiagramNode<Name extends string = 'diagram-fences'> =
39
+ MarkdownExtensionNode<Name, 'diagram', DiagramData, 'block'>;
40
+
41
+ function createDiagramNode<const Name extends string>(
42
+ plugin: Name,
43
+ context: MarkdownFenceContext<'diagram'>,
44
+ ): MarkdownFenceNode<DiagramNode<Name>> {
45
+ return {
46
+ type: 'extension',
47
+ plugin,
48
+ name: 'diagram',
49
+ display: 'block',
50
+ data: {
51
+ code: context.code,
52
+ language: context.language,
53
+ ...(context.meta == null ? {} : {meta: context.meta}),
54
+ },
55
+ };
56
+ }
57
+
58
+ function createFencePlugin<const Name extends string>(
59
+ name: Name,
60
+ render: MarkdownExtensionRenderer<DiagramNode<Name>>['render'],
61
+ createNode: (
62
+ context: MarkdownFenceContext<'diagram'>,
63
+ ) => MarkdownFenceNode<DiagramNode<Name>> | null | undefined = context =>
64
+ createDiagramNode(name, context),
65
+ ) {
66
+ return createMarkdownPlugin<Name, DiagramNode<Name>>({
67
+ name,
68
+ apiVersion: 1,
69
+ transform: createMarkdownFenceTransform({
70
+ languages: ['diagram'],
71
+ createNode,
72
+ }),
73
+ renderers: {
74
+ diagram: {
75
+ render,
76
+ toText: node => node.data.code,
77
+ },
78
+ },
79
+ });
80
+ }
81
+
82
+ function ThrowingFenceChild(): never {
83
+ throw new Error('broken semantic fence child');
84
+ }
85
+
86
+ describe('createMarkdownFenceTransform', () => {
87
+ it('narrows createNode input and returns the owned extension-node transform', () => {
88
+ type DiagramOrDotNode = MarkdownExtensionNode<
89
+ 'typed-fences',
90
+ 'diagram',
91
+ {
92
+ readonly code: string;
93
+ readonly language: 'mermaid' | 'dot';
94
+ readonly meta?: string;
95
+ },
96
+ 'block'
97
+ >;
98
+ const transform = createMarkdownFenceTransform({
99
+ languages: ['mermaid', 'dot'] as const,
100
+ createNode: context => {
101
+ expectTypeOf(context.language).toEqualTypeOf<'mermaid' | 'dot'>();
102
+ expectTypeOf(context.code).toBeString();
103
+ expectTypeOf(context.meta).toEqualTypeOf<string | undefined>();
104
+ return {
105
+ type: 'extension',
106
+ plugin: 'typed-fences',
107
+ name: 'diagram',
108
+ display: 'block',
109
+ data: {
110
+ code: context.code,
111
+ language: context.language,
112
+ ...(context.meta == null ? {} : {meta: context.meta}),
113
+ },
114
+ } satisfies MarkdownFenceNode<DiagramOrDotNode>;
115
+ },
116
+ });
117
+
118
+ const typedTransform: MarkdownTransform<DiagramOrDotNode> = transform;
119
+ expectTypeOf(typedTransform).toBeFunction();
120
+ });
121
+
122
+ it('annotates the original code node with frozen typed data', () => {
123
+ const position = {
124
+ start: {offset: 0},
125
+ end: {offset: 35},
126
+ } as const;
127
+ const code = {
128
+ type: 'code',
129
+ lang: 'diagram',
130
+ meta: 'title="Flow"',
131
+ value: 'start --> finish',
132
+ data: {owner: 'source'},
133
+ position,
134
+ } as const;
135
+ const root: MarkdownAstRoot = {type: 'root', children: [code]};
136
+ const plugin = createFencePlugin('diagram-fences', () => null);
137
+ const transformed = applyMarkdownTransforms(
138
+ root,
139
+ prepareMarkdownPlugins([plugin]),
140
+ '```diagram title="Flow"\nstart --> finish\n```',
141
+ true,
142
+ 'block',
143
+ );
144
+ const transformedCode = transformed.children[0];
145
+ const proposal =
146
+ transformedCode?.type === 'code'
147
+ ? getMarkdownFenceProposal(transformedCode)
148
+ : undefined;
149
+
150
+ expect(transformed).not.toBe(root);
151
+ expect(transformedCode).not.toBe(code);
152
+ expect(transformedCode).toMatchObject(code);
153
+ expect(getMarkdownFenceProposal(code)).toBeUndefined();
154
+ expect(proposal?.node).toEqual({
155
+ type: 'extension',
156
+ plugin: 'diagram-fences',
157
+ name: 'diagram',
158
+ display: 'block',
159
+ data: {
160
+ code: 'start --> finish',
161
+ language: 'diagram',
162
+ meta: 'title="Flow"',
163
+ },
164
+ });
165
+ expect(Object.isFrozen(transformed)).toBe(true);
166
+ expect(Object.isFrozen(transformedCode)).toBe(true);
167
+ expect(Object.isFrozen(proposal?.node)).toBe(true);
168
+ expect(Object.isFrozen(proposal?.node.data)).toBe(true);
169
+ });
170
+
171
+ it('preserves fence metadata in the canonical tree without changing legacy output', () => {
172
+ const source = '```diagram title="Flow"\nstart --> finish\n```';
173
+ expect(parseMarkdownAst(source).children[0]).toMatchObject({
174
+ type: 'code',
175
+ lang: 'diagram',
176
+ meta: 'title="Flow"',
177
+ value: 'start --> finish',
178
+ });
179
+ expect(parseMarkdown(source)).toEqual([
180
+ {
181
+ type: 'codeblock',
182
+ language: 'diagram',
183
+ content: 'start --> finish',
184
+ },
185
+ ]);
186
+ });
187
+
188
+ it('matches the complete declared language without prefix collisions', () => {
189
+ type CNode<Name extends string> = MarkdownExtensionNode<
190
+ Name,
191
+ 'code',
192
+ {readonly value: string},
193
+ 'block'
194
+ >;
195
+ const prefixRender = vi.fn(() => <div>C renderer</div>);
196
+ const exactRender = vi.fn(() => <div>C++ renderer</div>);
197
+ const prefix = createMarkdownPlugin<'c-fences', CNode<'c-fences'>>({
198
+ name: 'c-fences',
199
+ apiVersion: 1,
200
+ transform: createMarkdownFenceTransform({
201
+ languages: ['c'],
202
+ createNode: ({code}) => ({
203
+ type: 'extension',
204
+ plugin: 'c-fences',
205
+ name: 'code',
206
+ display: 'block',
207
+ data: {value: code},
208
+ }),
209
+ }),
210
+ renderers: {
211
+ code: {render: prefixRender, toText: node => node.data.value},
212
+ },
213
+ });
214
+ const exact = createMarkdownPlugin<'cpp-fences', CNode<'cpp-fences'>>({
215
+ name: 'cpp-fences',
216
+ apiVersion: 1,
217
+ transform: createMarkdownFenceTransform({
218
+ languages: ['c++'],
219
+ createNode: ({code}) => ({
220
+ type: 'extension',
221
+ plugin: 'cpp-fences',
222
+ name: 'code',
223
+ display: 'block',
224
+ data: {value: code},
225
+ }),
226
+ }),
227
+ renderers: {code: {render: exactRender, toText: node => node.data.value}},
228
+ });
229
+ const source = '```c++ title="Example"\nint main() {}\n```';
230
+
231
+ expect(parseMarkdownAst(source).children[0]).toMatchObject({
232
+ type: 'code',
233
+ lang: 'c++',
234
+ meta: 'title="Example"',
235
+ });
236
+ expect(parseMarkdown(source)).toEqual([
237
+ {type: 'codeblock', language: 'c', content: 'int main() {}'},
238
+ ]);
239
+ render(<Markdown plugins={[prefix, exact]}>{source}</Markdown>);
240
+ expect(screen.getByText('C++ renderer')).toBeInTheDocument();
241
+ expect(prefixRender).not.toHaveBeenCalled();
242
+ expect(exactRender).toHaveBeenCalledOnce();
243
+ });
244
+
245
+ it('renders typed proposal data through the standard renderer map', () => {
246
+ const renderFence = vi.fn(
247
+ ({node}: {node: DiagramNode<'typed-diagram-fences'>}) => (
248
+ <figure
249
+ aria-label={`${node.data.language}: ${node.data.meta ?? 'Untitled'}`}>
250
+ <code>{node.data.code}</code>
251
+ </figure>
252
+ ),
253
+ );
254
+ const plugin = createFencePlugin('typed-diagram-fences', renderFence);
255
+
256
+ render(
257
+ <Markdown plugins={[plugin]}>
258
+ {'```diagram title="Flow"\nstart --> finish\n```'}
259
+ </Markdown>,
260
+ );
261
+
262
+ expect(
263
+ screen.getByRole('figure', {name: 'diagram: title="Flow"'}),
264
+ ).toHaveTextContent('start --> finish');
265
+ expect(renderFence).toHaveBeenCalledOnce();
266
+ expect(renderFence.mock.calls[0]?.[0].node.data).toEqual({
267
+ code: 'start --> finish',
268
+ language: 'diagram',
269
+ meta: 'title="Flow"',
270
+ });
271
+ });
272
+
273
+ it('lets components.code win without invoking the proposal renderer', () => {
274
+ const renderFence = vi.fn(() => <div>Semantic</div>);
275
+ const plugin = createFencePlugin('override-fences', renderFence);
276
+ const CodeOverride = ({code}: {code: string; language?: string}) => (
277
+ <div data-testid="code-override">Override: {code}</div>
278
+ );
279
+
280
+ render(
281
+ <Markdown plugins={[plugin]} components={{code: CodeOverride}}>
282
+ {'```diagram\nstart --> finish\n```'}
283
+ </Markdown>,
284
+ );
285
+
286
+ expect(screen.getByTestId('code-override')).toHaveTextContent(
287
+ 'Override: start --> finish',
288
+ );
289
+ expect(renderFence).not.toHaveBeenCalled();
290
+ });
291
+
292
+ it('uses CodeBlock for undeclared or declined fences', () => {
293
+ const createNode = vi.fn(() => null);
294
+ const renderFence = vi.fn(() => <div>Semantic</div>);
295
+ const plugin = createFencePlugin(
296
+ 'declining-fences',
297
+ renderFence,
298
+ createNode,
299
+ );
300
+ const {rerender} = render(
301
+ <Markdown plugins={[plugin]}>{'```text\nplain source\n```'}</Markdown>,
302
+ );
303
+
304
+ expect(createNode).not.toHaveBeenCalled();
305
+ expect(document.querySelector('pre')).toHaveTextContent('plain source');
306
+ expect(screen.getByRole('button', {name: 'Copy code'})).toBeInTheDocument();
307
+ expect(screen.getByRole('group', {name: 'text'})).toHaveAttribute(
308
+ 'tabindex',
309
+ '0',
310
+ );
311
+
312
+ rerender(
313
+ <Markdown plugins={[plugin]}>
314
+ {'```diagram\nsemantic source\n```'}
315
+ </Markdown>,
316
+ );
317
+ expect(createNode).toHaveBeenCalledOnce();
318
+ expect(renderFence).not.toHaveBeenCalled();
319
+ expect(document.querySelector('pre')).toHaveTextContent('semantic source');
320
+ expect(screen.getByRole('button', {name: 'Copy code'})).toBeInTheDocument();
321
+ });
322
+
323
+ it('uses CodeBlock when the standard renderer is missing', () => {
324
+ const transform = createMarkdownFenceTransform({
325
+ languages: ['diagram'],
326
+ createNode: context => createDiagramNode('missing-renderer', context),
327
+ });
328
+ const plugin = createMarkdownPlugin({
329
+ name: 'missing-renderer',
330
+ apiVersion: 1,
331
+ transform,
332
+ } as unknown as MarkdownTransformPluginDefinition<
333
+ 'missing-renderer',
334
+ never
335
+ >);
336
+
337
+ render(
338
+ <Markdown plugins={[plugin]}>
339
+ {'```diagram\nstart --> finish\n```'}
340
+ </Markdown>,
341
+ );
342
+
343
+ expect(document.querySelector('pre')).toHaveTextContent('start --> finish');
344
+ expect(screen.getByRole('button', {name: 'Copy code'})).toBeInTheDocument();
345
+ });
346
+
347
+ it('fails the transform closed for foreign ownership or invalid data', () => {
348
+ const foreignCreateNode = () => ({
349
+ type: 'extension' as const,
350
+ plugin: 'foreign',
351
+ name: 'diagram' as const,
352
+ display: 'block' as const,
353
+ data: {code: 'forged', language: 'diagram' as const},
354
+ });
355
+ const invalidDataCreateNode = () => ({
356
+ type: 'extension' as const,
357
+ plugin: 'invalid-data-fences',
358
+ name: 'diagram' as const,
359
+ display: 'block' as const,
360
+ data: {run: () => 'not data'},
361
+ });
362
+ const foreign = createFencePlugin(
363
+ 'owned-fences',
364
+ () => <div>Foreign</div>,
365
+ foreignCreateNode as never,
366
+ );
367
+ const invalid = createFencePlugin(
368
+ 'invalid-data-fences',
369
+ () => <div>Invalid</div>,
370
+ invalidDataCreateNode as never,
371
+ );
372
+ const warning = vi.spyOn(console, 'warn').mockImplementation(() => {});
373
+ const source = '```diagram\nreadable source\n```';
374
+
375
+ const {rerender} = render(
376
+ <Markdown plugins={[foreign]}>{source}</Markdown>,
377
+ );
378
+ expect(document.querySelector('pre')).toHaveTextContent('readable source');
379
+ rerender(<Markdown plugins={[invalid]}>{source}</Markdown>);
380
+ expect(document.querySelector('pre')).toHaveTextContent('readable source');
381
+ expect(warning).toHaveBeenCalled();
382
+ warning.mockRestore();
383
+ });
384
+
385
+ it('consumes rejected async createNode values in client and SSR', async () => {
386
+ const source = '```diagram\nprivate source\n```';
387
+ const clientCreateNode = (async () => {
388
+ throw new Error('client rejection: private source');
389
+ }) as unknown as NonNullable<Parameters<typeof createFencePlugin>[2]>;
390
+ const serverCreateNode = (async () => {
391
+ throw new Error('server rejection: private source');
392
+ }) as unknown as NonNullable<Parameters<typeof createFencePlugin>[2]>;
393
+ const clientPlugin = createFencePlugin(
394
+ 'async-client-fences',
395
+ () => <div>Client proposal</div>,
396
+ clientCreateNode,
397
+ );
398
+ const serverPlugin = createFencePlugin(
399
+ 'async-server-fences',
400
+ () => <div>Server proposal</div>,
401
+ serverCreateNode,
402
+ );
403
+ const warning = vi.spyOn(console, 'warn').mockImplementation(() => {});
404
+
405
+ render(<Markdown plugins={[clientPlugin]}>{source}</Markdown>);
406
+ expect(document.querySelector('pre')).toHaveTextContent('private source');
407
+ expect(
408
+ renderToString(<Markdown plugins={[serverPlugin]}>{source}</Markdown>),
409
+ ).toContain('private source');
410
+ await Promise.resolve();
411
+
412
+ const warningText = warning.mock.calls.flat().map(String).join(' ');
413
+ expect(warningText).toContain('async-client-fences');
414
+ expect(warningText).toContain('async-server-fences');
415
+ expect(warningText).not.toContain('private source');
416
+ warning.mockRestore();
417
+ });
418
+
419
+ it('falls back when a standard proposal renderer throws', () => {
420
+ const plugin = createFencePlugin('throwing-fences', () => {
421
+ throw new Error('broken semantic fence');
422
+ });
423
+ const warning = vi.spyOn(console, 'warn').mockImplementation(() => {});
424
+
425
+ render(
426
+ <Markdown plugins={[plugin]}>
427
+ {'Before.\n\n```diagram\nstart --> finish\n```\n\nAfter.'}
428
+ </Markdown>,
429
+ );
430
+
431
+ expect(screen.getByText('Before.')).toBeInTheDocument();
432
+ expect(document.querySelector('pre')).toHaveTextContent('start --> finish');
433
+ expect(screen.getByText('After.')).toBeInTheDocument();
434
+ warning.mockRestore();
435
+ });
436
+
437
+ it('falls back for descendant errors and during server rendering', () => {
438
+ const plugin = createFencePlugin('descendant-fences', () => (
439
+ <ThrowingFenceChild />
440
+ ));
441
+ const warning = vi.spyOn(console, 'warn').mockImplementation(() => {});
442
+ const error = vi.spyOn(console, 'error').mockImplementation(() => {});
443
+ const source = '```diagram\nstart --> finish\n```';
444
+
445
+ expect(
446
+ renderToString(<Markdown plugins={[plugin]}>{source}</Markdown>),
447
+ ).toContain('start --&gt; finish');
448
+ render(<Markdown plugins={[plugin]}>{source}</Markdown>);
449
+ expect(document.querySelector('pre')).toHaveTextContent('start --> finish');
450
+
451
+ warning.mockRestore();
452
+ error.mockRestore();
453
+ });
454
+
455
+ it('keeps no-plugin and nonmatching-plugin server output identical', () => {
456
+ const plugin = createFencePlugin('nonmatching-fences', () => (
457
+ <div>Semantic</div>
458
+ ));
459
+ const source = '```text\nplain source\n```';
460
+
461
+ expect(
462
+ renderToString(<Markdown plugins={[plugin]}>{source}</Markdown>),
463
+ ).toBe(renderToString(<Markdown>{source}</Markdown>));
464
+ });
465
+
466
+ it('preserves the first proposal and legacy language through node rebuilds', () => {
467
+ const firstRender = vi.fn(() => <div>First renderer</div>);
468
+ const secondRender = vi.fn(() => <div>Second renderer</div>);
469
+ type CppNode<Name extends string> = MarkdownExtensionNode<
470
+ Name,
471
+ 'code',
472
+ {readonly value: string},
473
+ 'block'
474
+ >;
475
+ const first = createMarkdownPlugin<
476
+ 'first-cpp-fences',
477
+ CppNode<'first-cpp-fences'>
478
+ >({
479
+ name: 'first-cpp-fences',
480
+ apiVersion: 1,
481
+ transform: createMarkdownFenceTransform({
482
+ languages: ['c++'],
483
+ createNode: ({code}) => ({
484
+ type: 'extension',
485
+ plugin: 'first-cpp-fences',
486
+ name: 'code',
487
+ display: 'block',
488
+ data: {value: code},
489
+ }),
490
+ }),
491
+ renderers: {
492
+ code: {render: firstRender, toText: node => node.data.value},
493
+ },
494
+ });
495
+ const rebuild = createMarkdownPlugin({
496
+ name: 'rebuild-code-nodes',
497
+ apiVersion: 1,
498
+ transform: root => ({
499
+ ...root,
500
+ children: root.children.map(node =>
501
+ node.type === 'code'
502
+ ? {
503
+ type: 'code',
504
+ lang: node.lang,
505
+ ...(node.meta == null ? {} : {meta: node.meta}),
506
+ value: node.value,
507
+ ...(node.data == null ? {} : {data: node.data}),
508
+ ...(node.position == null ? {} : {position: node.position}),
509
+ }
510
+ : node,
511
+ ),
512
+ }),
513
+ });
514
+ const second = createMarkdownPlugin<
515
+ 'second-cpp-fences',
516
+ CppNode<'second-cpp-fences'>
517
+ >({
518
+ name: 'second-cpp-fences',
519
+ apiVersion: 1,
520
+ transform: createMarkdownFenceTransform({
521
+ languages: ['c++'],
522
+ createNode: ({code}) => ({
523
+ type: 'extension',
524
+ plugin: 'second-cpp-fences',
525
+ name: 'code',
526
+ display: 'block',
527
+ data: {value: code},
528
+ }),
529
+ }),
530
+ renderers: {
531
+ code: {render: secondRender, toText: node => node.data.value},
532
+ },
533
+ });
534
+ const plugins = [first, rebuild, second] as const;
535
+ const source = '```c++\nint main() {}\n```';
536
+
537
+ expect(parseMarkdown(source, {plugins})).toEqual([
538
+ {type: 'codeblock', language: 'c', content: 'int main() {}'},
539
+ ]);
540
+ render(<Markdown plugins={plugins}>{source}</Markdown>);
541
+
542
+ expect(screen.getByText('First renderer')).toBeInTheDocument();
543
+ expect(firstRender).toHaveBeenCalledOnce();
544
+ expect(secondRender).not.toHaveBeenCalled();
545
+ });
546
+ });