@astryxdesign/core 0.7.1-canary.ff40b78 → 0.7.1

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 (348) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/dist/Button/Button.d.ts +1 -1
  3. package/dist/Button/Button.d.ts.map +1 -1
  4. package/dist/Button/Button.js +5 -2
  5. package/dist/Calendar/Calendar.d.ts.map +1 -1
  6. package/dist/Calendar/Calendar.js +191 -32
  7. package/dist/Chat/ChatComposerInput.d.ts +9 -0
  8. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  9. package/dist/Chat/ChatComposerInput.js +5 -0
  10. package/dist/Chat/ChatMessage.d.ts +11 -0
  11. package/dist/Chat/ChatMessage.d.ts.map +1 -1
  12. package/dist/Chat/ChatMessage.js +18 -9
  13. package/dist/Chat/useTriggerMenu.d.ts +9 -2
  14. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  15. package/dist/Chat/useTriggerMenu.js +222 -50
  16. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  17. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  18. package/dist/CodeBlock/CodeBlock.js +158 -38
  19. package/dist/CodeBlock/tokenizer.d.ts +39 -0
  20. package/dist/CodeBlock/tokenizer.d.ts.map +1 -1
  21. package/dist/CodeBlock/tokenizer.js +108 -0
  22. package/dist/CommandPalette/CommandPalette.d.ts +9 -5
  23. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  24. package/dist/CommandPalette/CommandPalette.js +38 -20
  25. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +4 -3
  26. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  27. package/dist/CommandPalette/CommandPaletteEmpty.js +4 -3
  28. package/dist/CommandPalette/CommandPaletteInput.d.ts +5 -4
  29. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  30. package/dist/CommandPalette/CommandPaletteInput.js +35 -18
  31. package/dist/CommandPalette/CommandPaletteItem.d.ts +11 -6
  32. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  33. package/dist/CommandPalette/CommandPaletteItem.js +8 -9
  34. package/dist/CommandPalette/CommandPaletteList.d.ts +4 -2
  35. package/dist/CommandPalette/CommandPaletteList.d.ts.map +1 -1
  36. package/dist/CommandPalette/CommandPaletteList.js +10 -5
  37. package/dist/ComplexSelector/ComplexSelector.d.ts +8 -5
  38. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  39. package/dist/ComplexSelector/ComplexSelector.js +12 -3
  40. package/dist/ContextMenu/ContextMenu.d.ts +3 -3
  41. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  42. package/dist/ContextMenu/ContextMenu.js +62 -48
  43. package/dist/DateInput/DateInput.js +1 -1
  44. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  45. package/dist/DateInput/MonthScroller.js +12 -4
  46. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  47. package/dist/DateRangeInput/DateRangeInput.js +12 -2
  48. package/dist/Dialog/Dialog.d.ts +1 -1
  49. package/dist/Dialog/Dialog.d.ts.map +1 -1
  50. package/dist/Dialog/Dialog.js +16 -5
  51. package/dist/Dialog/DialogHeader.d.ts +1 -1
  52. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  53. package/dist/Dialog/DialogHeader.js +7 -7
  54. package/dist/Divider/Divider.d.ts +1 -0
  55. package/dist/Divider/Divider.d.ts.map +1 -1
  56. package/dist/Divider/Divider.js +5 -4
  57. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  58. package/dist/DropdownMenu/DropdownMenu.js +161 -65
  59. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +7 -5
  60. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  61. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +12 -5
  62. package/dist/Field/InputClearButton.d.ts +8 -4
  63. package/dist/Field/InputClearButton.d.ts.map +1 -1
  64. package/dist/Field/InputClearButton.js +23 -7
  65. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  66. package/dist/FormLayout/FormLayout.js +1 -0
  67. package/dist/Grid/Grid.d.ts +13 -4
  68. package/dist/Grid/Grid.d.ts.map +1 -1
  69. package/dist/Grid/Grid.js +7 -1
  70. package/dist/HoverCard/useHoverCard.d.ts +1 -1
  71. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  72. package/dist/HoverCard/useHoverCard.js +67 -49
  73. package/dist/InputGroup/InputGroup.d.ts +2 -4
  74. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  75. package/dist/InputGroup/InputGroup.js +2 -4
  76. package/dist/InputGroup/groupStyles.d.ts +10 -2
  77. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  78. package/dist/InputGroup/groupStyles.js +19 -2
  79. package/dist/Layer/useLayerDismissal.d.ts +9 -9
  80. package/dist/Layer/useLayerDismissal.js +9 -9
  81. package/dist/Markdown/Markdown.d.ts.map +1 -1
  82. package/dist/Markdown/Markdown.js +25 -4
  83. package/dist/MobileNav/MobileNav.d.ts +7 -0
  84. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  85. package/dist/MobileNav/MobileNav.js +45 -2
  86. package/dist/MultiSelector/MultiSelector.d.ts +7 -4
  87. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  88. package/dist/MultiSelector/MultiSelector.js +24 -3
  89. package/dist/NumberInput/NumberInput.js +1 -1
  90. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  91. package/dist/PowerSearch/PowerSearchEditPopover.js +6 -0
  92. package/dist/Resizable/ResizeHandle.d.ts +1 -1
  93. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  94. package/dist/Resizable/ResizeHandle.js +83 -15
  95. package/dist/Resizable/useResizable.d.ts +23 -0
  96. package/dist/Resizable/useResizable.d.ts.map +1 -1
  97. package/dist/Resizable/useResizable.js +78 -0
  98. package/dist/Selector/Selector.d.ts +6 -3
  99. package/dist/Selector/Selector.d.ts.map +1 -1
  100. package/dist/Selector/Selector.js +28 -6
  101. package/dist/SideNav/SideNav.d.ts.map +1 -1
  102. package/dist/SideNav/SideNav.js +10 -2
  103. package/dist/Slider/Slider.d.ts.map +1 -1
  104. package/dist/Slider/Slider.js +18 -7
  105. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  106. package/dist/Tokenizer/Tokenizer.js +16 -4
  107. package/dist/Toolbar/Toolbar.d.ts +2 -1
  108. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  109. package/dist/Toolbar/Toolbar.js +3 -1
  110. package/dist/TreeList/TreeList.d.ts.map +1 -1
  111. package/dist/TreeList/TreeList.js +6 -3
  112. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  113. package/dist/TreeList/TreeListItem.js +7 -1
  114. package/dist/astryx.css +22 -0
  115. package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
  116. package/dist/hooks/useScrollOverflow.js +55 -12
  117. package/dist/hooks/useTreeFocus.d.ts +21 -0
  118. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  119. package/dist/hooks/useTreeFocus.js +40 -2
  120. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  121. package/dist/i18n/generated-locales/en.generated.js +3 -0
  122. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  123. package/dist/i18n/generated-locales/pseudo.generated.js +3 -0
  124. package/dist/reset.a11y.chromium.spec.js +6 -1
  125. package/dist/reset.until-found.a11y.browser.spec.d.ts +2 -0
  126. package/dist/reset.until-found.a11y.browser.spec.d.ts.map +1 -0
  127. package/dist/reset.until-found.a11y.browser.spec.js +71 -0
  128. package/dist/theme/syntax/SyntaxTheme.d.ts.map +1 -1
  129. package/dist/theme/syntax/SyntaxTheme.js +43 -2
  130. package/dist/theme/syntax/defineSyntaxTheme.d.ts +18 -5
  131. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  132. package/dist/theme/syntax/defineSyntaxTheme.js +38 -9
  133. package/dist/theme/syntax/index.d.ts +1 -1
  134. package/dist/theme/syntax/index.d.ts.map +1 -1
  135. package/dist/theme/syntax/tokens.d.ts +12 -2
  136. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  137. package/dist/theme/syntax/tokens.js +25 -4
  138. package/dist/utils/plainDate.d.ts +12 -0
  139. package/dist/utils/plainDate.d.ts.map +1 -1
  140. package/dist/utils/plainDate.js +63 -10
  141. package/locales/en.json +13 -1
  142. package/locales/pseudo.json +9 -0
  143. package/package.json +4 -4
  144. package/src/AlertDialog/AlertDialog.doc.mjs +6 -0
  145. package/src/AlertDialog/AlertDialog.spec.md +205 -0
  146. package/src/AlertDialog/AlertDialog.test.tsx +3 -14
  147. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +115 -0
  148. package/src/AlertDialog/__tests__/AlertDialog.a11y.renders.tsx +52 -0
  149. package/src/AlertDialog/__tests__/AlertDialog.a11y.states.ts +68 -0
  150. package/src/AlertDialog/__tests__/AlertDialog.a11y.test.tsx +144 -0
  151. package/src/Button/Button.test.tsx +37 -0
  152. package/src/Button/Button.tsx +5 -1
  153. package/src/Calendar/Calendar.doc.mjs +234 -60
  154. package/src/Calendar/Calendar.spec.md +209 -0
  155. package/src/Calendar/Calendar.test.tsx +559 -20
  156. package/src/Calendar/Calendar.tsx +258 -41
  157. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +126 -0
  158. package/src/Calendar/__tests__/Calendar.a11y.known-failures.ts +12 -0
  159. package/src/Calendar/__tests__/Calendar.a11y.renders.tsx +57 -0
  160. package/src/Calendar/__tests__/Calendar.a11y.states.ts +139 -0
  161. package/src/Calendar/__tests__/Calendar.a11y.test.tsx +137 -0
  162. package/src/Carousel/Carousel.test.tsx +54 -71
  163. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +192 -0
  164. package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +27 -0
  165. package/src/Carousel/__tests__/Carousel.a11y.renders.tsx +39 -0
  166. package/src/Carousel/__tests__/Carousel.a11y.states.ts +139 -0
  167. package/src/Carousel/__tests__/Carousel.a11y.test.tsx +127 -0
  168. package/src/Chat/ChatComposerInput.doc.mjs +1 -1
  169. package/src/Chat/ChatComposerInput.spec.md +94 -55
  170. package/src/Chat/ChatComposerInput.test.tsx +202 -1
  171. package/src/Chat/ChatComposerInput.tsx +13 -0
  172. package/src/Chat/ChatMessage.doc.mjs +31 -16
  173. package/src/Chat/ChatMessage.spec.md +265 -0
  174. package/src/Chat/ChatMessage.test.tsx +246 -0
  175. package/src/Chat/ChatMessage.tsx +30 -7
  176. package/src/Chat/ChatSystemMessage.spec.md +36 -37
  177. package/src/Chat/ChatSystemMessage.test.tsx +4 -4
  178. package/src/Chat/useTriggerMenu.test.tsx +994 -0
  179. package/src/Chat/useTriggerMenu.tsx +278 -46
  180. package/src/CodeBlock/CodeBlock.doc.mjs +7 -0
  181. package/src/CodeBlock/CodeBlock.spec.md +40 -41
  182. package/src/CodeBlock/CodeBlock.test.tsx +89 -9
  183. package/src/CodeBlock/CodeBlock.tsx +205 -25
  184. package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +125 -0
  185. package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +93 -0
  186. package/src/CodeBlock/tokenizer.test.ts +112 -0
  187. package/src/CodeBlock/tokenizer.ts +106 -0
  188. package/src/Collapsible/CollapsibleGroup.spec.md +17 -8
  189. package/src/Collapsible/__tests__/CollapsibleGroup.a11y.renders.tsx +45 -0
  190. package/src/Collapsible/__tests__/CollapsibleGroup.a11y.states.ts +139 -0
  191. package/src/Collapsible/__tests__/CollapsibleGroup.a11y.test.tsx +135 -0
  192. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +128 -0
  193. package/src/CommandPalette/CommandPalette.doc.mjs +126 -23
  194. package/src/CommandPalette/CommandPalette.spec.md +100 -49
  195. package/src/CommandPalette/CommandPalette.test.tsx +241 -2
  196. package/src/CommandPalette/CommandPalette.tsx +47 -21
  197. package/src/CommandPalette/CommandPaletteEmpty.tsx +4 -3
  198. package/src/CommandPalette/CommandPaletteInput.doc.mjs +61 -4
  199. package/src/CommandPalette/CommandPaletteInput.spec.md +215 -0
  200. package/src/CommandPalette/CommandPaletteInput.test.tsx +375 -51
  201. package/src/CommandPalette/CommandPaletteInput.tsx +74 -21
  202. package/src/CommandPalette/CommandPaletteItem.doc.mjs +73 -22
  203. package/src/CommandPalette/CommandPaletteItem.spec.md +223 -0
  204. package/src/CommandPalette/CommandPaletteItem.test.tsx +200 -5
  205. package/src/CommandPalette/CommandPaletteItem.tsx +16 -11
  206. package/src/CommandPalette/CommandPaletteList.doc.mjs +3 -3
  207. package/src/CommandPalette/CommandPaletteList.spec.md +41 -36
  208. package/src/CommandPalette/CommandPaletteList.test.tsx +80 -0
  209. package/src/CommandPalette/CommandPaletteList.tsx +10 -5
  210. package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +599 -0
  211. package/src/ComplexSelector/ComplexSelector.doc.mjs +10 -8
  212. package/src/ComplexSelector/ComplexSelector.spec.md +14 -9
  213. package/src/ComplexSelector/ComplexSelector.test.tsx +64 -16
  214. package/src/ComplexSelector/ComplexSelector.tsx +37 -8
  215. package/src/ContextMenu/ContextMenu.doc.mjs +6 -0
  216. package/src/ContextMenu/ContextMenu.spec.md +51 -53
  217. package/src/ContextMenu/ContextMenu.test.tsx +132 -1
  218. package/src/ContextMenu/ContextMenu.tsx +78 -48
  219. package/src/DateInput/DateInput.doc.mjs +52 -0
  220. package/src/DateInput/DateInput.spec.md +27 -15
  221. package/src/DateInput/DateInput.test.tsx +38 -0
  222. package/src/DateInput/DateInput.tsx +1 -1
  223. package/src/DateInput/DateInputTouch.test.tsx +22 -0
  224. package/src/DateInput/MonthScroller.tsx +12 -4
  225. package/src/DateRangeInput/DateRangeInput.test.tsx +49 -0
  226. package/src/DateRangeInput/DateRangeInput.tsx +20 -2
  227. package/src/Dialog/Dialog.test.tsx +27 -1
  228. package/src/Dialog/Dialog.tsx +16 -5
  229. package/src/Dialog/DialogHeader.test.tsx +27 -2
  230. package/src/Dialog/DialogHeader.tsx +7 -8
  231. package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +21 -14
  232. package/src/Divider/Divider.doc.mjs +5 -3
  233. package/src/Divider/Divider.spec.md +140 -54
  234. package/src/Divider/Divider.test.tsx +15 -0
  235. package/src/Divider/Divider.tsx +6 -4
  236. package/src/DropdownMenu/DropdownMenu.doc.mjs +2 -2
  237. package/src/DropdownMenu/DropdownMenu.spec.md +121 -45
  238. package/src/DropdownMenu/DropdownMenu.test.tsx +288 -23
  239. package/src/DropdownMenu/DropdownMenu.tsx +212 -81
  240. package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +38 -2
  241. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +32 -18
  242. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +146 -1
  243. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +136 -0
  244. package/src/DropdownMenu/__tests__/MenuButton.a11y.known-failures.ts +12 -0
  245. package/src/DropdownMenu/__tests__/MenuButton.a11y.renders.tsx +67 -0
  246. package/src/DropdownMenu/__tests__/MenuButton.a11y.states.ts +141 -0
  247. package/src/DropdownMenu/__tests__/MenuButton.a11y.test.tsx +138 -0
  248. package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +40 -5
  249. package/src/Field/InputClearButton.test.tsx +29 -4
  250. package/src/Field/InputClearButton.tsx +26 -8
  251. package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +21 -14
  252. package/src/FormLayout/FormLayout.tsx +1 -0
  253. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +1 -1
  254. package/src/Grid/Grid.doc.mjs +14 -11
  255. package/src/Grid/Grid.spec.md +50 -32
  256. package/src/Grid/Grid.tsx +13 -4
  257. package/src/HoverCard/HoverCard.test.tsx +46 -1
  258. package/src/HoverCard/useHoverCard.tsx +68 -48
  259. package/src/InputGroup/InputGroup.doc.mjs +11 -1
  260. package/src/InputGroup/InputGroup.tsx +2 -4
  261. package/src/InputGroup/groupStyles.ts +40 -2
  262. package/src/Layer/useLayerDismissal.ts +9 -9
  263. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +142 -0
  264. package/src/Link/__tests__/Link.a11y.renders.tsx +97 -0
  265. package/src/Link/__tests__/Link.a11y.states.ts +104 -0
  266. package/src/Link/__tests__/Link.a11y.test.tsx +127 -0
  267. package/src/Markdown/Markdown.doc.mjs +1 -1
  268. package/src/Markdown/Markdown.fr23.perf.test.ts +161 -40
  269. package/src/Markdown/Markdown.spec.md +45 -23
  270. package/src/Markdown/Markdown.test.tsx +38 -0
  271. package/src/Markdown/Markdown.tsx +24 -2
  272. package/src/Markdown/plugins/semanticFence.test.tsx +3 -2
  273. package/src/MobileNav/MobileNav.tsx +50 -2
  274. package/src/MobileNav/MobileNavFocus.test.tsx +553 -0
  275. package/src/MoreMenu/MoreMenu.spec.md +18 -7
  276. package/src/MoreMenu/MoreMenu.test.tsx +38 -0
  277. package/src/MultiSelector/MultiSelector.doc.mjs +8 -8
  278. package/src/MultiSelector/MultiSelector.spec.md +1 -1
  279. package/src/MultiSelector/MultiSelector.test.tsx +188 -21
  280. package/src/MultiSelector/MultiSelector.tsx +50 -11
  281. package/src/NumberInput/NumberInput.test.tsx +24 -0
  282. package/src/NumberInput/NumberInput.tsx +1 -1
  283. package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +22 -15
  284. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +78 -0
  285. package/src/PowerSearch/PowerSearchEditPopover.tsx +6 -0
  286. package/src/Resizable/Resizable.spec.md +41 -9
  287. package/src/Resizable/ResizeHandle.test.tsx +565 -2
  288. package/src/Resizable/ResizeHandle.tsx +126 -21
  289. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +119 -0
  290. package/src/Resizable/__tests__/ResizeHandle.a11y.known-failures.ts +39 -0
  291. package/src/Resizable/__tests__/ResizeHandle.a11y.renders.tsx +80 -0
  292. package/src/Resizable/__tests__/ResizeHandle.a11y.states.ts +197 -0
  293. package/src/Resizable/__tests__/ResizeHandle.a11y.test.tsx +123 -0
  294. package/src/Resizable/useResizable.ts +95 -0
  295. package/src/Selector/Selector.doc.mjs +7 -6
  296. package/src/Selector/Selector.spec.md +37 -24
  297. package/src/Selector/Selector.test.tsx +176 -10
  298. package/src/Selector/Selector.tsx +59 -14
  299. package/src/Selector/__tests__/Combobox.a11y.known-failures.ts +27 -0
  300. package/src/Selector/__tests__/Combobox.a11y.states.ts +145 -0
  301. package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +108 -0
  302. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +126 -0
  303. package/src/SideNav/SideNav.test.tsx +35 -0
  304. package/src/SideNav/SideNav.tsx +16 -2
  305. package/src/Slider/Slider.spec.md +43 -17
  306. package/src/Slider/Slider.test.tsx +134 -0
  307. package/src/Slider/Slider.tsx +29 -6
  308. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +112 -0
  309. package/src/Slider/__tests__/Slider.a11y.known-failures.ts +12 -0
  310. package/src/Slider/__tests__/Slider.a11y.renders.tsx +42 -0
  311. package/src/Slider/__tests__/Slider.a11y.states.ts +106 -0
  312. package/src/Slider/__tests__/Slider.a11y.test.tsx +105 -0
  313. package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +25 -18
  314. package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +19 -12
  315. package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +21 -14
  316. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +18 -11
  317. package/src/Tokenizer/Tokenizer.test.tsx +87 -0
  318. package/src/Tokenizer/Tokenizer.tsx +31 -3
  319. package/src/Toolbar/Toolbar.test.tsx +131 -4
  320. package/src/Toolbar/Toolbar.tsx +3 -1
  321. package/src/TreeList/TreeList.spec.md +33 -8
  322. package/src/TreeList/TreeList.test.tsx +72 -0
  323. package/src/TreeList/TreeList.tsx +10 -6
  324. package/src/TreeList/TreeListItem.tsx +5 -0
  325. package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +125 -0
  326. package/src/TreeList/__tests__/TreeList.a11y.renders.tsx +44 -0
  327. package/src/TreeList/__tests__/TreeList.a11y.states.ts +164 -0
  328. package/src/TreeList/__tests__/TreeList.a11y.test.tsx +138 -0
  329. package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +82 -0
  330. package/src/hooks/useScrollOverflow.test.tsx +222 -0
  331. package/src/hooks/useScrollOverflow.ts +55 -13
  332. package/src/hooks/useTreeFocus.test.tsx +37 -0
  333. package/src/hooks/useTreeFocus.ts +55 -2
  334. package/src/i18n/generated-locales/en.generated.ts +3 -0
  335. package/src/i18n/generated-locales/pseudo.generated.ts +3 -0
  336. package/src/reset.a11y.chromium.spec.ts +9 -1
  337. package/src/reset.css +8 -3
  338. package/src/reset.until-found.a11y.browser.spec.ts +75 -0
  339. package/src/reset.until-found.test.ts +32 -0
  340. package/src/stylexValidation.source-build.test.mjs +42 -0
  341. package/src/theme/syntax/SyntaxTheme.tsx +46 -5
  342. package/src/theme/syntax/defineSyntaxTheme.diff.test.ts +91 -0
  343. package/src/theme/syntax/defineSyntaxTheme.ts +75 -15
  344. package/src/theme/syntax/index.ts +5 -1
  345. package/src/theme/syntax/tokens.ts +32 -2
  346. package/src/theme/syntax/useSyntaxTheme.diff.test.tsx +40 -0
  347. package/src/utils/plainDate.test.ts +147 -0
  348. package/src/utils/plainDate.ts +75 -10
@@ -15,9 +15,10 @@ import "../theme/tokens.stylex.js";
15
15
  import { colorVars, spacingVars, radiusVars, typographyVars, fontWeightVars, typeScaleVars, borderVars, durationVars, easeVars } from "../theme/tokens.stylex.js";
16
16
  import { mergeProps } from "../utils/index.js";
17
17
  import { useClipboard } from "../hooks/useClipboard.js";
18
+ import { useScrollableArea } from "../hooks/useScrollableArea.js";
18
19
  import { Icon } from "../Icon/index.js";
19
20
  import { IconButton } from "../IconButton/index.js";
20
- import { tokenize, tokenizeAsync, flatTokensToLines, SYNC_TOKENIZE_THRESHOLD } from "./tokenizer.js";
21
+ import { tokenize, tokenizeAsync, splitDiffLines, flatTokensToLines, SYNC_TOKENIZE_THRESHOLD } from "./tokenizer.js";
21
22
  import { ensureHighlightStyles } from "./highlightStyles.js";
22
23
  import { applyHighlightRangesChunked } from "./highlightRanges.js";
23
24
  import { themeProps } from "../utils/themeProps.js";
@@ -114,6 +115,7 @@ const styles = {
114
115
  code: {
115
116
  k1xSpc: "x1lliihq",
116
117
  kUk6DE: "x98rzlu",
118
+ k7Eaqz: "xk8lq53",
117
119
  k8WAf4: "x8o8v82",
118
120
  kg3NbH: "x1pzlopt",
119
121
  kogj98: "x1ghz6dp",
@@ -126,6 +128,7 @@ const styles = {
126
128
  $$css: true
127
129
  },
128
130
  codeWrapped: {
131
+ k7Eaqz: "x15x72sd",
129
132
  khDVqt: "x126k92a",
130
133
  kTgw9: "x1yn0g08",
131
134
  kHjlTd: "x1mzt3pk",
@@ -144,6 +147,61 @@ const styles = {
144
147
  kloYau: "x2q1x1w",
145
148
  $$css: true
146
149
  },
150
+ line: {
151
+ kLWn49: "x17iicif",
152
+ $$css: true
153
+ },
154
+ lineNumbered: {
155
+ k1xSpc: "xrvj5dj",
156
+ kumcoG: "x1xx4m37",
157
+ k1C7PZ: "xf5zn4v",
158
+ kgeoSG: "x46gnpd",
159
+ krRUto: "x17gn2l9",
160
+ kOrBnS: "x19ds33d",
161
+ kKZZS1: "x1wnbjh8",
162
+ kxBb7d: "xtkarl4",
163
+ kUY6Iu: "x1rbqspl",
164
+ kQcDng: "x3nzp0f",
165
+ $$css: true
166
+ },
167
+ lineHighlighted: {
168
+ kWkggS: "xgcxg3y",
169
+ kUOVxO: "x1ng9b9t",
170
+ kg3NbH: "x1pzlopt",
171
+ $$css: true
172
+ },
173
+ lineAdded: {
174
+ kWkggS: "xjqijk9",
175
+ kUOVxO: "x1ng9b9t",
176
+ kg3NbH: "x1pzlopt",
177
+ kxBb7d: "x147exv5",
178
+ $$css: true
179
+ },
180
+ lineRemoved: {
181
+ kWkggS: "xv48ua2",
182
+ kUOVxO: "x1ng9b9t",
183
+ kg3NbH: "x1pzlopt",
184
+ kxBb7d: "x16hy5kr",
185
+ $$css: true
186
+ },
187
+ lineDiffHeader: {
188
+ kWkggS: "x11ds9ch",
189
+ kMwMTN: "xt5rlkq",
190
+ kUOVxO: "x1ng9b9t",
191
+ kg3NbH: "x1pzlopt",
192
+ $$css: true
193
+ },
194
+ lineDiff: {
195
+ k1xSpc: "xrvj5dj",
196
+ kumcoG: "xrnahuw",
197
+ k1C7PZ: "xak3so",
198
+ $$css: true
199
+ },
200
+ lineDiffNumbered: {
201
+ kumcoG: "x1v9b7p9",
202
+ k1C7PZ: "x1o1pmfc",
203
+ $$css: true
204
+ },
147
205
  sizeSm: {
148
206
  kGuDYH: "x141an7d",
149
207
  $$css: true
@@ -178,40 +236,34 @@ const CodeChunk = /*#__PURE__*/React.memo(function CodeChunk({
178
236
  lines,
179
237
  startIndex,
180
238
  highlightSet,
239
+ diffKinds,
181
240
  renderLineContent,
182
241
  lineNumbers
183
242
  }) {
184
243
  return /*#__PURE__*/_jsx(_Fragment, {
185
244
  children: lines.map((line, j) => {
186
245
  const i = startIndex + j;
246
+ const diffKind = diffKinds?.[i];
187
247
  return /*#__PURE__*/_jsx("div", {
188
248
  "data-line": i + 1,
189
- ...{
190
- 0: {
191
- className: "x17iicif"
192
- },
193
- 2: {
194
- className: "x17iicif xrvj5dj x1xx4m37 xf5zn4v x46gnpd x17gn2l9 x19ds33d x1wnbjh8 xtkarl4 x1rbqspl x3nzp0f"
195
- },
196
- 1: {
197
- className: "x17iicif xgcxg3y x1ng9b9t x1pzlopt"
198
- },
199
- 3: {
200
- className: "x17iicif xrvj5dj x1xx4m37 xf5zn4v x46gnpd x17gn2l9 x19ds33d x1wnbjh8 xtkarl4 x1rbqspl x3nzp0f xgcxg3y x1ng9b9t x1pzlopt"
201
- }
202
- }[!!lineNumbers << 1 | !!(highlightSet?.has(i + 1) ?? false) << 0],
249
+ "data-diff": diffKind === 'context' ? undefined : diffKind,
250
+ ...stylex.props(styles.line, lineNumbers && styles.lineNumbered, diffKinds != null && styles.lineDiff, diffKinds != null && lineNumbers && styles.lineDiffNumbered, diffKind === 'added' && styles.lineAdded, diffKind === 'removed' && styles.lineRemoved, diffKind === 'header' && styles.lineDiffHeader,
251
+ // Last on purpose: a highlight replaces a diff tint rather than
252
+ // stacking on it, so tokens keep their single-paint contrast.
253
+ (highlightSet?.has(i + 1) ?? false) && styles.lineHighlighted),
203
254
  children: renderLineContent(line, i)
204
255
  }, i);
205
256
  })
206
257
  });
207
258
  });
208
- function renderLines(lines, highlightSet, renderLineContent, lineNumbers, chunkSize = LINE_CHUNK_SIZE) {
259
+ function renderLines(lines, highlightSet, diffKinds, renderLineContent, lineNumbers, chunkSize = LINE_CHUNK_SIZE) {
209
260
  chunkSize = Math.max(1, Math.floor(chunkSize));
210
261
  if (lines.length < LINE_CHUNK_THRESHOLD) {
211
262
  return /*#__PURE__*/_jsx(CodeChunk, {
212
263
  lines: lines,
213
264
  startIndex: 0,
214
265
  highlightSet: highlightSet,
266
+ diffKinds: diffKinds,
215
267
  renderLineContent: renderLineContent,
216
268
  lineNumbers: lineNumbers
217
269
  });
@@ -233,6 +285,7 @@ function renderLines(lines, highlightSet, renderLineContent, lineNumbers, chunkS
233
285
  lines: chunkLines,
234
286
  startIndex: start,
235
287
  highlightSet: highlightSet,
288
+ diffKinds: diffKinds,
236
289
  renderLineContent: renderLineContent,
237
290
  lineNumbers: lineNumbers
238
291
  })
@@ -349,6 +402,8 @@ function SpanCodeContent({
349
402
  lines,
350
403
  tokenLines,
351
404
  highlightSet,
405
+ diffKinds,
406
+ diff,
352
407
  isWrapped,
353
408
  sizeStyle,
354
409
  hasLineNumbers,
@@ -359,6 +414,49 @@ function SpanCodeContent({
359
414
  }, []);
360
415
  const renderLineContent = useCallback((line, lineIndex) => {
361
416
  const tokens = tokenLines[lineIndex] ?? [];
417
+ if (diff) {
418
+ // Header rows show their raw text; every other row shows its glyph in
419
+ // the marker column and the base-language tokens of the rest.
420
+ const kind = diff.kinds[lineIndex];
421
+ const content = kind === 'header' ? line : diff.content[lineIndex];
422
+ return /*#__PURE__*/_jsxs(_Fragment, {
423
+ children: [/*#__PURE__*/_jsx("span", {
424
+ "data-diff-marker": "",
425
+ ...{
426
+ 0: {
427
+ className: "xv1l7n4 x87ps6o x1sdyfia"
428
+ },
429
+ 4: {
430
+ className: "xv1l7n4 x87ps6o x1sdyfia x6w1cxl x1pezmd8"
431
+ },
432
+ 2: {
433
+ className: "x87ps6o x1sdyfia x1wxerb0"
434
+ },
435
+ 6: {
436
+ className: "x87ps6o x1sdyfia x6w1cxl x1pezmd8 x1wxerb0"
437
+ },
438
+ 1: {
439
+ className: "x87ps6o x1sdyfia x103bwea"
440
+ },
441
+ 5: {
442
+ className: "x87ps6o x1sdyfia x6w1cxl x1pezmd8 x103bwea"
443
+ },
444
+ 3: {
445
+ className: "x87ps6o x1sdyfia x103bwea"
446
+ },
447
+ 7: {
448
+ className: "x87ps6o x1sdyfia x6w1cxl x1pezmd8 x103bwea"
449
+ }
450
+ }[!!hasLineNumbers << 2 | !!(kind === 'added') << 1 | !!(kind === 'removed') << 0],
451
+ children: diff.glyphs[lineIndex] || ' '
452
+ }), /*#__PURE__*/_jsx("span", {
453
+ ...{
454
+ className: "xeuugli"
455
+ },
456
+ children: kind === 'header' ? content || '\u200b' : buildSpanLine(content, tokens)
457
+ })]
458
+ });
459
+ }
362
460
  // Wrap tokens in a single element so they occupy one grid cell when line
363
461
  // numbers are on (see `lineNumbered`); an inline span is a no-op when off.
364
462
  return /*#__PURE__*/_jsx("span", {
@@ -367,10 +465,10 @@ function SpanCodeContent({
367
465
  },
368
466
  children: buildSpanLine(line, tokens)
369
467
  });
370
- }, [tokenLines]);
468
+ }, [tokenLines, diff, hasLineNumbers]);
371
469
  return /*#__PURE__*/_jsx("code", {
372
470
  ...stylex.props(styles.code, sizeStyle, isWrapped && styles.codeWrapped, hasLineNumbers && styles.codeNumbered, hasLineNumbers && dynamicStyles.gutterWidth(maxDigits)),
373
- children: renderLines(lines, highlightSet, renderLineContent, hasLineNumbers)
471
+ children: renderLines(lines, highlightSet, diffKinds, renderLineContent, hasLineNumbers)
374
472
  });
375
473
  }
376
474
 
@@ -382,6 +480,7 @@ function RangeCodeContent({
382
480
  lines,
383
481
  tokenLines,
384
482
  highlightSet,
483
+ diffKinds,
385
484
  isWrapped,
386
485
  sizeStyle,
387
486
  hasLineNumbers,
@@ -407,7 +506,7 @@ function RangeCodeContent({
407
506
  return /*#__PURE__*/_jsx("code", {
408
507
  ref: codeRef,
409
508
  ...stylex.props(styles.code, sizeStyle, isWrapped && styles.codeWrapped, hasLineNumbers && styles.codeNumbered, hasLineNumbers && dynamicStyles.gutterWidth(maxDigits)),
410
- children: renderLines(lines, highlightSet, renderLineContent, hasLineNumbers)
509
+ children: renderLines(lines, highlightSet, diffKinds, renderLineContent, hasLineNumbers)
411
510
  });
412
511
  }
413
512
 
@@ -431,6 +530,7 @@ export function CodeBlock({
431
530
  hasLanguageLabel = true,
432
531
  hasLineNumbers = false,
433
532
  highlightLines,
533
+ isDiff = false,
434
534
  hasCopyButton = true,
435
535
  onCopy,
436
536
  isWrapped = false,
@@ -459,7 +559,7 @@ export function CodeBlock({
459
559
  } = useClipboard({
460
560
  announce: t('@astryx.codeBlock.copied')
461
561
  });
462
- const useSpans = highlightMode === 'spans' || highlightMode === 'auto' && !hasHighlightAPI() || highlightMode === 'auto' && isSafari();
562
+ const useSpans = isDiff || highlightMode === 'spans' || highlightMode === 'auto' && !hasHighlightAPI() || highlightMode === 'auto' && isSafari();
463
563
  const lines = useMemo(() => {
464
564
  const l = code.split('\n');
465
565
  if (l.length > 1 && l[l.length - 1] === '') {
@@ -467,7 +567,13 @@ export function CodeBlock({
467
567
  }
468
568
  return l;
469
569
  }, [code]);
470
- const tokenLines = useTokenLines(code, language, customTokenizer);
570
+
571
+ // In diff mode the base language sees the code with the glyph column set
572
+ // aside, so a `tsx` diff still highlights as `tsx` on every line; headers
573
+ // contribute an empty line and are rendered as their raw text.
574
+ const diff = useMemo(() => isDiff ? splitDiffLines(lines) : null, [isDiff, lines]);
575
+ const tokenLines = useTokenLines(diff ? diff.content.join('\n') : code, language, customTokenizer);
576
+ const diffKinds = diff?.kinds ?? null;
471
577
  const highlightSet = useMemo(() => highlightLines ? new Set(highlightLines) : null, [highlightLines]);
472
578
  const handleCopy = useCallback(async () => {
473
579
  const didCopy = await copy(code);
@@ -478,7 +584,10 @@ export function CodeBlock({
478
584
  const sizeStyle = size === 'sm' ? styles.sizeSm : styles.sizeMd;
479
585
  // Digits in the largest line number — sizes the gutter column width.
480
586
  const maxLineDigits = String(lines.length).length;
481
- const languageLabel = hasLanguageLabel && language !== 'plaintext' ? language : null;
587
+ // With the diff layer on, the label and viewport name say so: `diff` over
588
+ // plaintext, `tsx diff` over a language — so a diff keeps its header,
589
+ // collapse control, and a name that still matches a `diff` fence.
590
+ const languageLabel = !hasLanguageLabel ? null : isDiff ? language === 'plaintext' ? 'diff' : `${language} diff` : language !== 'plaintext' ? language : null;
482
591
  const showHeader = title != null || languageLabel != null;
483
592
 
484
593
  // A collapsed body must never outlive the visible header that controls it.
@@ -494,7 +603,23 @@ export function CodeBlock({
494
603
  // pattern). The region stays mounted when collapsed (CSS grid animation), so
495
604
  // this is always a resolvable reference — aria-controls can be unconditional.
496
605
  const regionId = useId();
497
- const scrollContainerRef = useRef(null);
606
+
607
+ // The code viewport enters the Tab order only while its content actually
608
+ // overflows (AST-025 FR12–FR13): the shared scroll capability measures
609
+ // both axes, keeps focus where it is when overflow goes away, and owns the
610
+ // overflow declarations. role="group" (not "region") so several code
611
+ // blocks on a page don't create duplicate same-named landmarks.
612
+ const {
613
+ getViewportProps,
614
+ getContentProps
615
+ } = useScrollableArea({
616
+ axis: 'both',
617
+ keyboardAccess: {
618
+ owner: 'viewport',
619
+ role: 'group',
620
+ label: languageLabel ?? t('@astryx.codeBlock.code')
621
+ }
622
+ });
498
623
  const scrollStyle = maxHeight != null ? {
499
624
  maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight
500
625
  } : undefined;
@@ -570,33 +695,27 @@ export function CodeBlock({
570
695
  }), copyButtonEl]
571
696
  }) : null;
572
697
  const codeBody = /*#__PURE__*/_jsx("div", {
573
- ref: scrollContainerRef
574
- // The scroll container is keyboard-focusable so keyboard users can
575
- // scroll long or wide code that overflows the viewport. Uses
576
- // role="group" (not "region") so multiple code blocks on a page don't
577
- // create duplicate same-named landmarks (axe: landmark-unique).
578
- ,
579
- tabIndex: 0,
580
- role: "group",
581
- "aria-label": languageLabel ?? t('@astryx.codeBlock.code'),
582
- ...mergeProps({
583
- className: "xw2csxc x1odjw0f"
584
- }, {
698
+ ...getViewportProps({
699
+ ...{
700
+ className: "x2lwn1j"
701
+ },
585
702
  style: scrollStyle
586
703
  }),
587
704
  children: /*#__PURE__*/_jsx("div", {
588
- ...{
705
+ ...getContentProps({
589
706
  0: {
590
707
  className: "x78zum5 x1pshirs"
591
708
  },
592
709
  1: {
593
710
  className: "x78zum5 x1pshirs x1ajqlyv"
594
711
  }
595
- }[!!(showHeader && !hasLineNumbers) << 0],
712
+ }[!!(showHeader && !hasLineNumbers) << 0]),
596
713
  children: useSpans ? /*#__PURE__*/_jsx(SpanCodeContent, {
597
714
  lines: lines,
598
715
  tokenLines: tokenLines,
599
716
  highlightSet: highlightSet,
717
+ diffKinds: diffKinds,
718
+ diff: diff,
600
719
  isWrapped: isWrapped,
601
720
  sizeStyle: sizeStyle,
602
721
  hasLineNumbers: hasLineNumbers,
@@ -605,6 +724,7 @@ export function CodeBlock({
605
724
  lines: lines,
606
725
  tokenLines: tokenLines,
607
726
  highlightSet: highlightSet,
727
+ diffKinds: diffKinds,
608
728
  isWrapped: isWrapped,
609
729
  sizeStyle: sizeStyle,
610
730
  hasLineNumbers: hasLineNumbers,
@@ -625,7 +745,7 @@ export function CodeBlock({
625
745
  // While collapsed, the region is only hidden visually (0fr grid
626
746
  // row); inert also removes it from the tab order and accessibility
627
747
  // tree so keyboard users cannot Tab into the invisible scroll
628
- // container (tabIndex=0). aria-controls pointing at an inert
748
+ // container (a tab stop while it overflows). aria-controls pointing at an inert
629
749
  // element remains a valid, resolvable reference.
630
750
  ,
631
751
  inert: isCollapsed ? true : undefined,
@@ -8,6 +8,45 @@ export type SyntaxToken = {
8
8
  * line-relative start/end offsets (0 = start of line).
9
9
  */
10
10
  export type TokenLine = SyntaxToken[];
11
+ /** How a unified-diff line reads: what it adds, removes, frames, or keeps. */
12
+ export type DiffLineKind = 'added' | 'removed' | 'header' | 'context';
13
+ /**
14
+ * Read a Markdown fence info string the way CodeBlock renders it: `diff` is
15
+ * the diff layer over plaintext, `diff-<lang>` (the common convention) is the
16
+ * diff layer over `<lang>`, anything else is a language.
17
+ */
18
+ export declare function parseFenceLanguage(info: string | undefined): {
19
+ language: string;
20
+ isDiff: boolean;
21
+ };
22
+ /**
23
+ * Split a diff into the glyph column and the code the base language sees:
24
+ * every added, removed, or space-led context line loses its first character
25
+ * (the `+`, `-`, or space); a context line with no leading space keeps all
26
+ * of it; header lines contribute an empty line so offsets stay per line.
27
+ */
28
+ export declare function splitDiffLines(lines: ReadonlyArray<string>): {
29
+ kinds: DiffLineKind[];
30
+ glyphs: string[];
31
+ content: string[];
32
+ };
33
+ /**
34
+ * Classify one line of a unified diff by its first character: `+` added,
35
+ * `-` removed, `@@` header, anything else context. A `--- ` line (with its
36
+ * space) directly followed by a `+++ ` line and then an `@@` line is a file
37
+ * header (both lines), wherever it occurs; every other `---`/`+++` line is
38
+ * removed or added, so a removed line that starts with `--` — `---i;`
39
+ * included — is never misread. The glyph is part of the text and is never
40
+ * removed.
41
+ */
42
+ export declare function diffLineKind(line: string, { isFileHeader }?: {
43
+ isFileHeader?: boolean;
44
+ }): DiffLineKind;
45
+ /**
46
+ * The indexes of the `--- `/`+++ ` lines (unified-diff form, with the space)
47
+ * that form a file header directly before an `@@`; `---i;` is a change.
48
+ */
49
+ export declare function fileHeaderLines(lines: ReadonlyArray<string>): Set<number>;
11
50
  /** Threshold below which we tokenize synchronously (characters). */
12
51
  export declare const SYNC_TOKENIZE_THRESHOLD = 2000;
13
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/CodeBlock/tokenizer.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAsStC,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AA+D5C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAiBpE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BtB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,EACxD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,EAAE,EACpD,IAAI,EAAE,MAAM,GACX,SAAS,EAAE,CA4Bb"}
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/CodeBlock/tokenizer.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAsStC,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,CAUA;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAC5D,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAuBA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,EAAC,YAAoB,EAAC,GAAE;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAM,GACpD,YAAY,CAWd;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAazE;AAMD,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AA+D5C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAiBpE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BtB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,EACxD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,EAAE,EACpD,IAAI,EAAE,MAAM,GACX,SAAS,EAAE,CA4Bb"}
@@ -524,6 +524,114 @@ function buildLanguagePatterns(lang) {
524
524
  }
525
525
  }
526
526
 
527
+ // ---------------------------------------------------------------------------
528
+ // Diff lines
529
+ // ---------------------------------------------------------------------------
530
+
531
+ /** How a unified-diff line reads: what it adds, removes, frames, or keeps. */
532
+
533
+ /**
534
+ * Read a Markdown fence info string the way CodeBlock renders it: `diff` is
535
+ * the diff layer over plaintext, `diff-<lang>` (the common convention) is the
536
+ * diff layer over `<lang>`, anything else is a language.
537
+ */
538
+ export function parseFenceLanguage(info) {
539
+ const value = (info ?? '').trim();
540
+ if (value === 'diff') {
541
+ return {
542
+ language: 'plaintext',
543
+ isDiff: true
544
+ };
545
+ }
546
+ const layered = /^diff-(.+)$/.exec(value);
547
+ if (layered) {
548
+ return {
549
+ language: layered[1],
550
+ isDiff: true
551
+ };
552
+ }
553
+ return {
554
+ language: value || 'plaintext',
555
+ isDiff: false
556
+ };
557
+ }
558
+
559
+ /**
560
+ * Split a diff into the glyph column and the code the base language sees:
561
+ * every added, removed, or space-led context line loses its first character
562
+ * (the `+`, `-`, or space); a context line with no leading space keeps all
563
+ * of it; header lines contribute an empty line so offsets stay per line.
564
+ */
565
+ export function splitDiffLines(lines) {
566
+ const kinds = [];
567
+ const glyphs = [];
568
+ const content = [];
569
+ const fileHeaders = fileHeaderLines(lines);
570
+ lines.forEach((line, index) => {
571
+ const kind = diffLineKind(line, {
572
+ isFileHeader: fileHeaders.has(index)
573
+ });
574
+ kinds.push(kind);
575
+ if (kind === 'header') {
576
+ glyphs.push('');
577
+ content.push('');
578
+ } else if (kind === 'context' && !line.startsWith(' ')) {
579
+ // A context line without its leading space (an unindented diff, or
580
+ // an empty line) has no glyph: the marker column is empty and the
581
+ // whole line is code.
582
+ glyphs.push('');
583
+ content.push(line);
584
+ } else {
585
+ glyphs.push(line.slice(0, 1));
586
+ content.push(line.slice(1));
587
+ }
588
+ });
589
+ return {
590
+ kinds,
591
+ glyphs,
592
+ content
593
+ };
594
+ }
595
+
596
+ /**
597
+ * Classify one line of a unified diff by its first character: `+` added,
598
+ * `-` removed, `@@` header, anything else context. A `--- ` line (with its
599
+ * space) directly followed by a `+++ ` line and then an `@@` line is a file
600
+ * header (both lines), wherever it occurs; every other `---`/`+++` line is
601
+ * removed or added, so a removed line that starts with `--` — `---i;`
602
+ * included — is never misread. The glyph is part of the text and is never
603
+ * removed.
604
+ */
605
+ export function diffLineKind(line, {
606
+ isFileHeader = false
607
+ } = {}) {
608
+ if (line.startsWith('@@') || isFileHeader) {
609
+ return 'header';
610
+ }
611
+ if (line.startsWith('+')) {
612
+ return 'added';
613
+ }
614
+ if (line.startsWith('-')) {
615
+ return 'removed';
616
+ }
617
+ return 'context';
618
+ }
619
+
620
+ /**
621
+ * The indexes of the `--- `/`+++ ` lines (unified-diff form, with the space)
622
+ * that form a file header directly before an `@@`; `---i;` is a change.
623
+ */
624
+ export function fileHeaderLines(lines) {
625
+ const headers = new Set();
626
+ for (let i = 0; i + 2 < lines.length; i++) {
627
+ if (lines[i].startsWith('--- ') && lines[i + 1].startsWith('+++ ') && lines[i + 2].startsWith('@@')) {
628
+ headers.add(i);
629
+ headers.add(i + 1);
630
+ }
631
+ }
632
+ return headers;
633
+ }
634
+
527
635
  // ---------------------------------------------------------------------------
528
636
  // Core tokenizer
529
637
  // ---------------------------------------------------------------------------
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @file CommandPalette.tsx
3
- * @input Uses React, Dialog, Layout, CommandPaletteContext, SearchSource, useCombobox, useAnnounce
3
+ * @input Uses React, Dialog, Layout, CommandPaletteContext, SearchSource,
4
+ * useCombobox, useAnnounce, useAnnounceRenderedText
4
5
  * @output Exports CommandPalette root component and props
5
6
  * @position Core root component; dialog shell with searchSource-driven items
6
7
  *
@@ -42,7 +43,9 @@ export interface CommandPaletteProps<T extends SearchableItem = SearchableItem>
42
43
  footer?: ReactNode;
43
44
  /**
44
45
  * Per-item render function. Receives the item and whether it is currently selected.
45
- * Auto-grouping by `auxiliaryData.group` is preserved.
46
+ * Return non-interactive presentation content; buttons and links cannot be
47
+ * nested inside the rendered option. Auto-grouping by `auxiliaryData.group`
48
+ * is preserved.
46
49
  * When omitted, renders each item's `label` text.
47
50
  */
48
51
  renderItem?: (item: T, isSelected: boolean) => ReactNode;
@@ -82,9 +85,10 @@ export interface CommandPaletteProps<T extends SearchableItem = SearchableItem>
82
85
  * Uses `searchSource` for all search logic — same interface as Typeahead.
83
86
  * For static lists, use `createStaticSource` from `@astryxdesign/core/Typeahead`.
84
87
  *
85
- * Keyboard navigation is handled by `useCombobox` from Selector,
86
- * ensuring consistent arrow key, Home/End, Enter, and Escape behavior
87
- * across all combobox-pattern components.
88
+ * Keyboard navigation is handled by `useCombobox` from Selector for arrows,
89
+ * PageUp/PageDown, and Enter. Home/End remain native caret keys. Modal Escape
90
+ * dismissal delegates to Dialog's shared layer stack so nested surfaces handle
91
+ * the first press.
88
92
  *
89
93
  * Input and footer are rendered by default — only pass them to replace the defaults.
90
94
  *
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../src/CommandPalette/CommandPalette.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,YAAY,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAU/D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAI5C,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACtD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0DAA0D;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAExC;;;;OAIG;IACH,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAE9B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAiID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EACxE,GAAG,EACH,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,MAAM,EACN,UAAU,EACV,eAAe,EAAE,wBAAwB,EACzC,kBAAkB,EAAE,2BAA2B,EAC/C,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,KAAK,EAAE,cAAc,EACrB,KAAW,EACX,SAAe,EACf,GAAG,IAAI,EACR,EAAE,mBAAmB,CAAC,CAAC,CAAC,+BAsXxB;yBAvYe,cAAc"}
1
+ {"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../src/CommandPalette/CommandPalette.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AAEH,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,YAAY,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAU/D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACtD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0DAA0D;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAExC;;;;OAIG;IACH,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAE9B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAiID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EACxE,GAAG,EACH,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,MAAM,EACN,UAAU,EACV,eAAe,EAAE,wBAAwB,EACzC,kBAAkB,EAAE,2BAA2B,EAC/C,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,KAAK,EAAE,cAAc,EACrB,KAAW,EACX,SAAe,EACf,GAAG,IAAI,EACR,EAAE,mBAAmB,CAAC,CAAC,CAAC,+BA2YxB;yBA5Ze,cAAc"}