@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
@@ -83,6 +83,40 @@ const MENU_TRIGGER_OPEN_BACKGROUND = `linear-gradient(${colorVars['--color-overl
83
83
  * aria-hidden subtrees) are not reachable, judged by the popover focus trap's
84
84
  * own test so the two never disagree about where Tab can go.
85
85
  */
86
+ /**
87
+ * Collapse each named radio group to the one Tab stop a browser gives it: the
88
+ * focused radio, else the checked one, else the first radio moving forward or
89
+ * the last moving backward. The stop takes the group's first position.
90
+ */
91
+ function collapseRadioGroups(elements, active, isBackward) {
92
+ const groups = new Map();
93
+ const groupKey = el => el instanceof HTMLInputElement && el.getAttribute('type') === 'radio' && el.name !== '' ? `${el.form?.id ?? ''}\u0000${el.name}` : null;
94
+ for (const el of elements) {
95
+ const key = groupKey(el);
96
+ if (key != null) {
97
+ const members = groups.get(key) ?? [];
98
+ members.push(el);
99
+ groups.set(key, members);
100
+ }
101
+ }
102
+ const placed = new Set();
103
+ const result = [];
104
+ for (const el of elements) {
105
+ const key = groupKey(el);
106
+ if (key == null) {
107
+ result.push(el);
108
+ continue;
109
+ }
110
+ if (placed.has(key)) {
111
+ continue;
112
+ }
113
+ placed.add(key);
114
+ const members = groups.get(key) ?? [];
115
+ const stop = members.find(radio => radio === active) ?? members.find(radio => radio.checked) ?? (isBackward ? members[members.length - 1] : members[0]);
116
+ result.push(stop);
117
+ }
118
+ return result;
119
+ }
86
120
  function tabbablesIn(region) {
87
121
  if (region == null) {
88
122
  return [];
@@ -108,8 +142,9 @@ function isInsideHiddenWrapper(element, region) {
108
142
  }
109
143
 
110
144
  /**
111
- * Move focus to a region control. Reports whether focus actually arrived, so a
112
- * caller can close the menu instead of stranding focus on the page.
145
+ * Move focus to a Tab stop in the dialog. Reports whether focus actually
146
+ * arrived, so a caller can fall back to the menu instead of stranding focus on
147
+ * the page.
113
148
  */
114
149
  function focusRegionControl(element) {
115
150
  element.focus();
@@ -320,6 +355,16 @@ function visibleText(element) {
320
355
  for (const hidden of copy.querySelectorAll('[aria-hidden="true"]')) {
321
356
  hidden.remove();
322
357
  }
358
+ // An icon-only control is named by its image's alt, an inner aria-label, or
359
+ // an svg title rather than by text, so those count as its contents too.
360
+ for (const named of copy.querySelectorAll('img[alt], [aria-label]')) {
361
+ const name = named.getAttribute(named.tagName === 'IMG' ? 'alt' : 'aria-label') ?? '';
362
+ named.replaceWith(copy.ownerDocument.createTextNode(` ${name} `));
363
+ }
364
+ for (const svg of copy.querySelectorAll('svg')) {
365
+ const title = svg.querySelector('title')?.textContent ?? '';
366
+ svg.replaceWith(copy.ownerDocument.createTextNode(` ${title} `));
367
+ }
323
368
  return (copy.textContent ?? '').replace(/\s+/g, ' ').trim();
324
369
  }
325
370
 
@@ -343,6 +388,18 @@ function readAccessibleName(element) {
343
388
  if (label) {
344
389
  return label;
345
390
  }
391
+ // A form control is named by its own <label>s; an input button by its value.
392
+ const labels = 'labels' in element ? Array.from(element.labels ?? []) : [];
393
+ const labelText = labels.map(visibleText).join(' ').trim();
394
+ if (labelText !== '') {
395
+ return labelText;
396
+ }
397
+ if (element instanceof HTMLInputElement && ['button', 'submit', 'reset'].includes(element.getAttribute('type') ?? '')) {
398
+ const value = element.value.trim();
399
+ if (value !== '') {
400
+ return value;
401
+ }
402
+ }
346
403
  const text = visibleText(element);
347
404
  if (text !== '') {
348
405
  return text;
@@ -465,7 +522,15 @@ function DropdownMenuBottomSheet({
465
522
  openModalityRef.current = 'keyboard';
466
523
  }
467
524
  };
468
- const handleSheetTriggerClick = () => {
525
+ const handleSheetTriggerClick = event => {
526
+ // A caller-rendered trigger that is natively or aria-disabled must not
527
+ // open the sheet; the default Button already refuses its own click.
528
+ // The DOM check covers the built-in Button too (it renders aria-disabled
529
+ // when focusable-disabled); a caller's own enabled control wins over a
530
+ // `button.isDisabled` left on the props.
531
+ if (event.currentTarget.matches(':disabled, [aria-disabled="true"]')) {
532
+ return;
533
+ }
469
534
  onClick?.();
470
535
  setOpen(!isOpen);
471
536
  };
@@ -677,6 +742,16 @@ function DropdownMenuPopover({
677
742
  const openModalityRef = useRef('keyboard');
678
743
  // ArrowUp opens with the LAST enabled row highlighted.
679
744
  const focusLastOnOpenRef = useRef(false);
745
+
746
+ // Synchronizes the dialog's name from the custom trigger's DOM, an external
747
+ // system React does not own: the rendered control's accessible name is only
748
+ // readable once it mounts. With a header or footer the dialog is named like
749
+ // the menu, so that name is needed before the first open, not only at it.
750
+ useIsomorphicLayoutEffect(() => {
751
+ if (renderTrigger != null && hasRegions && triggerName == null) {
752
+ setTriggerName(readAccessibleName(buttonRef.current));
753
+ }
754
+ }, [renderTrigger, hasRegions, triggerName]);
680
755
  const handleLayerShow = useCallback(() => {
681
756
  acceptedOpenRef.current = true;
682
757
  resetFocusReturn();
@@ -692,15 +767,29 @@ function DropdownMenuPopover({
692
767
  setInternalIsOpen(true);
693
768
  }
694
769
  }, [isControlled, onClick, onOpenChange, renderTrigger, resetFocusReturn]);
770
+
771
+ // The menu's name: the dialog around it with a header or footer, and the
772
+ // Back row of a drilled-in view ("Back to <this>"), both read it.
773
+ // The design system's button names the menu by its label. A custom trigger
774
+ // names it by reference (or the caller's `aria-label` does), so that name
775
+ // is read off the control as the menu opens.
776
+ const callerMenuLabel = rest['aria-label'];
777
+ const menuLabel = renderTrigger != null ? typeof callerMenuLabel === 'string' && callerMenuLabel.trim() !== '' ? callerMenuLabel : triggerName : typeof button.label === 'string' ? button.label : undefined;
695
778
  const popover = usePopover({
696
779
  onHide: handleLayerHide,
697
780
  onShow: handleLayerShow,
698
781
  hasLightDismiss: true,
699
782
  hasCloseButton: false,
700
783
  hasAutoFocus: false,
701
- // The popup's own role="menu" is the exposed semantics; wrapping it in a
702
- // modal dialog would announce an unnamed dialog around the menu.
703
- role: 'none'
784
+ // Without a header or footer the popup's own role="menu" is the exposed
785
+ // semantics; a dialog around it would announce an extra container. With
786
+ // either, the popover holds controls that are not menu items, so it is a
787
+ // modal dialog named like the menu, with the menu inside it. A custom
788
+ // trigger's name is read off the control once it mounts; until then, or
789
+ // when the control exposes no readable name, the dialog takes the default
790
+ // menu label, so it is never unnamed and never loses its role.
791
+ role: hasRegions ? 'dialog' : 'none',
792
+ dialogLabel: hasRegions ? menuLabel ?? t(DEFAULT_BUTTON_I18N_KEY) : undefined
704
793
  });
705
794
  const closeMenu = useCallback(() => {
706
795
  popover.hide();
@@ -793,6 +882,42 @@ function DropdownMenuPopover({
793
882
  });
794
883
  }, [popover.isOpen, focusFirst, focusLast, listRef]);
795
884
 
885
+ // With a header or footer the popover is a modal dialog: Tab and Shift+Tab
886
+ // walk the header's controls, the menu as one stop, then the footer's
887
+ // controls, and wrap at either end. The key is handled here in full, so the
888
+ // popover's own focus trap, which listens on the document, never reads it a
889
+ // second time.
890
+ const moveDialogTab = useCallback((e, isFromFlyout = false) => {
891
+ const menu = listRef.current;
892
+ if (menu == null) {
893
+ return;
894
+ }
895
+ e.preventDefault();
896
+ e.stopPropagation();
897
+ // A named radio group is one stop, as the browser's own Tab order has it.
898
+ const cycle = collapseRadioGroups([...tabbablesIn(headerRef.current), menu, ...tabbablesIn(footerRef.current)], document.activeElement, e.shiftKey);
899
+ if (cycle.length === 1) {
900
+ // Nothing else to reach: focus stays in the menu. From a flyout that
901
+ // has just closed itself, that is the menu's own stop.
902
+ if (isFromFlyout) {
903
+ menu.focus();
904
+ }
905
+ return;
906
+ }
907
+ const active = document.activeElement;
908
+ const menuIndex = cycle.indexOf(menu);
909
+ // A row, or a row of an open flyout, counts as the menu's stop.
910
+ let index = menu.contains(active) ? menuIndex : cycle.findIndex(el => el === active || el.contains(active));
911
+ if (index < 0) {
912
+ index = menuIndex;
913
+ }
914
+ const step = e.shiftKey ? -1 : 1;
915
+ const next = cycle[(index + step + cycle.length) % cycle.length];
916
+ if (!focusRegionControl(next)) {
917
+ menu.focus();
918
+ }
919
+ }, [listRef]);
920
+
796
921
  // Extend useListFocus with Enter/Space activation + typeahead
797
922
  const listKeyDown = useCallback(e => {
798
923
  // A submenu flyout renders inline inside this menu; its key events bubble
@@ -802,16 +927,7 @@ function DropdownMenuPopover({
802
927
  // itself as the key bubbled up, and the root moves focus on as Tab
803
928
  // from one of its own rows would.
804
929
  if (e.key === 'Tab' && hasRegions) {
805
- const region = e.shiftKey ? headerRef.current : footerRef.current;
806
- const tabbables = tabbablesIn(region);
807
- e.stopPropagation();
808
- const target = e.shiftKey ? tabbables[tabbables.length - 1] : tabbables[0];
809
- if (target != null) {
810
- e.preventDefault();
811
- }
812
- if (target == null || !focusRegionControl(target)) {
813
- closeMenu();
814
- }
930
+ moveDialogTab(e, true);
815
931
  }
816
932
  return;
817
933
  }
@@ -830,30 +946,15 @@ function DropdownMenuPopover({
830
946
  }
831
947
  return;
832
948
  }
833
- // APG menu-button pattern: Tab closes the menu. Menu items are
834
- // tabIndex={-1} so the focus trap has nothing trappable and Tab would
835
- // otherwise leak into the page while the menu stayed open (menus-5).
836
- // Do NOT preventDefault — closing restores focus to the trigger, and the
837
- // browser's default Tab then continues from there to the next element.
838
- // A header or footer with something Tab can reach in that direction
839
- // takes the Tab instead, and the menu stays open.
949
+ // With a header or footer the popover is a dialog and Tab wraps inside
950
+ // it. Without either, the APG menu-button pattern: Tab closes the menu.
951
+ // Menu items are tabIndex={-1} so the focus trap has nothing trappable
952
+ // and Tab would otherwise leak into the page while the menu stayed open
953
+ // (menus-5). Do NOT preventDefault — closing restores focus to the
954
+ // trigger, and the browser's default Tab then continues from there.
840
955
  if (e.key === 'Tab') {
841
- const region = e.shiftKey ? headerRef.current : footerRef.current;
842
- const tabbables = tabbablesIn(region);
843
- if (tabbables.length > 0) {
844
- // From a row, the browser's Shift+Tab would stop on the menu element
845
- // itself — the row's ancestor and a Tab stop — before reaching the
846
- // header. The menu is one stop, so go straight to the header.
847
- if (e.shiftKey && e.target !== listRef.current) {
848
- e.preventDefault();
849
- // The popover's focus trap listens on the document and would read
850
- // this same Shift+Tab against the field just focused — the trap's
851
- // first element — and wrap to the footer. This key is handled.
852
- e.stopPropagation();
853
- if (!focusRegionControl(tabbables[tabbables.length - 1])) {
854
- closeMenu();
855
- }
856
- }
956
+ if (hasRegions) {
957
+ moveDialogTab(e);
857
958
  return;
858
959
  }
859
960
  closeMenu();
@@ -865,25 +966,22 @@ function DropdownMenuPopover({
865
966
  return;
866
967
  }
867
968
  listNavKeyDown(e);
868
- }, [listNavKeyDown, closeMenu, typeahead, ownsEvent, listRef, hasRegions]);
969
+ }, [listNavKeyDown, closeMenu, typeahead, ownsEvent, hasRegions, moveDialogTab]);
869
970
 
870
- // Tab past the last control of the footer, or Shift+Tab before the first
871
- // control of the header, leaves the menu as Tab from its rows does: the
872
- // menu closes, focus returns to the trigger, and the browser's own Tab
873
- // continues from there. Between the regions, Tab moves through the menu
874
- // as one stop.
971
+ // Tab from a header or footer control moves through the same dialog cycle.
875
972
  const handleRegionKeyDown = useCallback(e => {
876
- if (e.key !== 'Tab') {
877
- return;
878
- }
879
- const tabbables = tabbablesIn(e.currentTarget);
880
- const isHeader = e.currentTarget === headerRef.current;
881
- const exit = isHeader ? e.shiftKey ? tabbables[0] : undefined : e.shiftKey ? undefined : tabbables[tabbables.length - 1];
882
- if (exit != null && exit === document.activeElement) {
883
- closeMenu();
973
+ if (e.key === 'Tab') {
974
+ moveDialogTab(e);
884
975
  }
885
- }, [closeMenu]);
976
+ }, [moveDialogTab]);
886
977
  const openAndFocus = useCallback((modality = 'keyboard', notifyClick = false) => {
978
+ // An unavailable trigger never opens the menu. Button keeps an
979
+ // aria-disabled trigger focusable for its tooltip and swallows only
980
+ // Enter and Space, so the arrow keys, a press and a click would still
981
+ // arrive here; a custom trigger may be natively disabled instead.
982
+ if (buttonRef.current?.matches(':disabled, [aria-disabled="true"]') === true) {
983
+ return false;
984
+ }
887
985
  acceptedOpenRef.current = false;
888
986
  notifyClickOnShowRef.current = notifyClick;
889
987
  pendingControlledOpenRef.current = isControlled;
@@ -993,7 +1091,11 @@ function DropdownMenuPopover({
993
1091
  return;
994
1092
  }
995
1093
  focusLastOnOpenRef.current = e.key === 'ArrowUp';
996
- openAndFocus();
1094
+ if (!openAndFocus()) {
1095
+ // A refused open (disabled trigger) must not leave ArrowUp's
1096
+ // "land on the last row" armed for a later open.
1097
+ focusLastOnOpenRef.current = false;
1098
+ }
997
1099
  }
998
1100
  return;
999
1101
  }
@@ -1028,12 +1130,6 @@ function DropdownMenuPopover({
1028
1130
  drillIn,
1029
1131
  wrapContent
1030
1132
  } = useMenuDrillIn(isOpen);
1031
- // The name a drilled-in view's Back row returns to: the menu's own name.
1032
- // The design system's button names the menu by its label. A custom trigger
1033
- // names it by reference (or the caller's `aria-label` does), so that name
1034
- // is read off the control as the menu opens.
1035
- const callerMenuLabel = rest['aria-label'];
1036
- const menuLabel = renderTrigger != null ? typeof callerMenuLabel === 'string' && callerMenuLabel.trim() !== '' ? callerMenuLabel : triggerName : typeof button.label === 'string' ? button.label : undefined;
1037
1133
  const resolvedMaxHeight = menuMaxHeight == null ? null : `${menuMaxHeight}px`;
1038
1134
  // Context for compound items
1039
1135
  const contextValue = useMemo(() => ({
@@ -1082,9 +1178,9 @@ function DropdownMenuPopover({
1082
1178
  // keeps the browser from drawing one after pointer input (see
1083
1179
  // handleLayerHide), so its focus needs no bookkeeping here.
1084
1180
  onFocus: () => {},
1085
- 'aria-haspopup': 'menu',
1181
+ 'aria-haspopup': hasRegions ? 'dialog' : 'menu',
1086
1182
  'aria-expanded': isOpen,
1087
- 'aria-controls': menuId
1183
+ 'aria-controls': hasRegions ? popover.id : menuId
1088
1184
  };
1089
1185
  return /*#__PURE__*/_jsxs(_Fragment, {
1090
1186
  children: [renderTrigger != null ? renderTrigger(triggerProps) : /*#__PURE__*/_jsx(Button, {
@@ -1122,9 +1218,9 @@ function DropdownMenuPopover({
1122
1218
  button.onFocus?.(event);
1123
1219
  onFocusReturnTargetFocus();
1124
1220
  },
1125
- "aria-haspopup": "menu",
1221
+ "aria-haspopup": hasRegions ? 'dialog' : 'menu',
1126
1222
  "aria-expanded": isOpen,
1127
- "aria-controls": menuId,
1223
+ "aria-controls": hasRegions ? popover.id : menuId,
1128
1224
  "data-testid": testId
1129
1225
  }), popover.render(renderWithRegions(/*#__PURE__*/_jsx("div", {
1130
1226
  ...rest,
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @file DropdownMenuCheckboxItem.tsx
3
- * @input React, stylex, Item + CheckboxInput + DropdownMenu context + tokens from core
3
+ * @input React, stylex, Item + Indicator registry + DropdownMenu context + tokens from core
4
4
  * @output DropdownMenuCheckboxItem — a standalone checkable menu item.
5
5
  * @position Sub-component; used inside DropdownMenu.
6
6
  *
@@ -47,9 +47,8 @@ export interface DropdownMenuCheckboxItemProps extends Omit<BaseProps, 'onChange
47
47
  */
48
48
  onChange?: (checked: boolean) => void;
49
49
  /**
50
- * Whether the item is disabled. Disabled items stay focusable (via
51
- * `aria-disabled`) so they remain discoverable by keyboard and assistive
52
- * technology, but activation is blocked.
50
+ * Whether the item is disabled. Disabled items expose `aria-disabled`, block
51
+ * activation, and are currently skipped by DropdownMenu arrow-key navigation.
53
52
  * @default false
54
53
  */
55
54
  isDisabled?: boolean;
@@ -73,6 +72,9 @@ export interface DropdownMenuCheckboxItemProps extends Omit<BaseProps, 'onChange
73
72
  *
74
73
  * Must be used inside a DropdownMenu. Toggles an independent boolean; for a
75
74
  * one-of-N choice use DropdownMenuRadioGroup + DropdownMenuRadioItem instead.
75
+ * Consumer click and pointer-move handlers compose after the row's own
76
+ * activation and hover-focus behavior; disabled activation stops before the
77
+ * consumer click handler.
76
78
  *
77
79
  * @example
78
80
  * ```
@@ -86,7 +88,7 @@ export interface DropdownMenuCheckboxItemProps extends Omit<BaseProps, 'onChange
86
88
  * </DropdownMenu>
87
89
  * ```
88
90
  */
89
- export declare function DropdownMenuCheckboxItem({ label, description, icon, value, onChange, isDisabled, hasCloseOnSelect, endContent, xstyle, className, style, ...rest }: DropdownMenuCheckboxItemProps): import("react").JSX.Element;
91
+ export declare function DropdownMenuCheckboxItem({ label, description, icon, value, onChange, isDisabled, hasCloseOnSelect, endContent, xstyle, className, style, onClick, onPointerMove, ...rest }: DropdownMenuCheckboxItemProps): import("react").JSX.Element;
90
92
  export declare namespace DropdownMenuCheckboxItem {
91
93
  var displayName: string;
92
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenuCheckboxItem.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuCheckboxItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAErE,OAAO,EAAiB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAOtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA4C5C,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,SAAS,EACT,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAClD;IACC;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,UAAkB,EAClB,gBAAwB,EACxB,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,6BAA6B,+BA0D/B;yBAvEe,wBAAwB"}
1
+ {"version":3,"file":"DropdownMenuCheckboxItem.d.ts","sourceRoot":"","sources":["../../src/DropdownMenu/DropdownMenuCheckboxItem.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAiB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAOtD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA4C5C,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,SAAS,EACT,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAClD;IACC;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,UAAkB,EAClB,gBAAwB,EACxB,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,aAAa,EACb,GAAG,IAAI,EACR,EAAE,6BAA6B,+BA+D/B;yBA9Ee,wBAAwB"}
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file DropdownMenuCheckboxItem.tsx
7
- * @input React, stylex, Item + CheckboxInput + DropdownMenu context + tokens from core
7
+ * @input React, stylex, Item + Indicator registry + DropdownMenu context + tokens from core
8
8
  * @output DropdownMenuCheckboxItem — a standalone checkable menu item.
9
9
  * @position Sub-component; used inside DropdownMenu.
10
10
  *
@@ -34,7 +34,7 @@ import { useDropdownMenuContext } from "./DropdownMenuContext.js";
34
34
  import { focusMenuItemOnHover } from "./menuItemHover.js";
35
35
  import "../theme/tokens.stylex.js";
36
36
  import { colorVars, spacingVars } from "../theme/tokens.stylex.js";
37
- import { mergeProps, themeProps } from "../utils/index.js";
37
+ import { composeEventHandlers, mergeProps, themeProps } from "../utils/index.js";
38
38
  import { jsx as _jsx } from "react/jsx-runtime";
39
39
  const styles = {
40
40
  root: {
@@ -67,6 +67,9 @@ const styles = {
67
67
  *
68
68
  * Must be used inside a DropdownMenu. Toggles an independent boolean; for a
69
69
  * one-of-N choice use DropdownMenuRadioGroup + DropdownMenuRadioItem instead.
70
+ * Consumer click and pointer-move handlers compose after the row's own
71
+ * activation and hover-focus behavior; disabled activation stops before the
72
+ * consumer click handler.
70
73
  *
71
74
  * @example
72
75
  * ```
@@ -92,28 +95,32 @@ export function DropdownMenuCheckboxItem({
92
95
  xstyle,
93
96
  className,
94
97
  style,
98
+ onClick,
99
+ onPointerMove,
95
100
  ...rest
96
101
  }) {
97
102
  const ctx = useDropdownMenuContext();
98
103
  const menuSize = ctx?.menuSize ?? 'md';
99
104
  const controlSize = menuSize === 'sm' ? 'sm' : 'md';
100
105
  const CheckboxControl = useIndicator('checkbox');
101
- const handleClick = useCallback(() => {
106
+ const handleClick = useCallback(event => {
102
107
  if (isDisabled) {
108
+ event.preventDefault();
103
109
  return;
104
110
  }
105
111
  onChange?.(!value);
106
112
  if (hasCloseOnSelect) {
107
113
  ctx?.closeMenu();
108
114
  }
109
- }, [isDisabled, onChange, value, hasCloseOnSelect, ctx]);
115
+ onClick?.(event);
116
+ }, [isDisabled, onChange, value, hasCloseOnSelect, ctx, onClick]);
110
117
  const handlePointerMove = useCallback(e => focusMenuItemOnHover(e, isDisabled), [isDisabled]);
111
118
  return /*#__PURE__*/_jsx(Item, {
112
119
  ...rest,
113
120
  role: "menuitemcheckbox",
114
121
  "aria-checked": value,
115
122
  tabIndex: isDisabled ? undefined : -1,
116
- onPointerMove: handlePointerMove,
123
+ onPointerMove: composeEventHandlers(handlePointerMove, onPointerMove),
117
124
  marker:
118
125
  /*#__PURE__*/
119
126
  // No wrapper, and no menu-specific theme target: the shared
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * @file InputClearButton.tsx
3
- * @input Uses React, Button, and Icon
4
- * @output Exports the public InputClearButton and an internal popup-aware variant,
5
- * both with a contextual tooltip matching their required label.
3
+ * @input Uses React, Button, Icon, and the i18n translator
4
+ * @output Exports the public InputClearButton and an internal popup-aware variant.
5
+ * Both show the localized generic "Clear" tooltip and keep the caller's
6
+ * contextual label as the accessible name.
6
7
  * @position Shared primitive. Every input that renders a clear affordance —
7
8
  * TextInput, NumberInput, TimeInput, DateInput, DateTimeInput,
8
9
  * DateRangeInput, Selector, MultiSelector, Typeahead, Tokenizer, FileInput —
@@ -13,7 +14,10 @@
13
14
  import type { ReactNode } from 'react';
14
15
  import * as stylex from '@stylexjs/stylex';
15
16
  export interface InputClearButtonProps {
16
- /** Contextual accessible name for the button, such as "Clear Search". */
17
+ /**
18
+ * Contextual accessible name for the button, such as "Clear Search". The
19
+ * visible tooltip is always the localized generic "Clear".
20
+ */
17
21
  label: string;
18
22
  onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
19
23
  xstyle?: stylex.StyleXStyles;
@@ -1 +1 @@
1
- {"version":3,"file":"InputClearButton.d.ts","sourceRoot":"","sources":["../../src/Field/InputClearButton.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAkD3C,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;IAC7B,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,6BAA8B,SAAQ,qBAAqB;IACnE,aAAa,EAAE,KAAK,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;CACtD;AAiDD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAExE;yBAFe,gBAAgB;;;AAIhC,4EAA4E;AAC5E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,GACnC,SAAS,CAEX"}
1
+ {"version":3,"file":"InputClearButton.d.ts","sourceRoot":"","sources":["../../src/Field/InputClearButton.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAmD3C,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;IAC7B,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,6BAA8B,SAAQ,qBAAqB;IACnE,aAAa,EAAE,KAAK,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;CACtD;AAsDD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAMxE;yBANe,gBAAgB;;;AAQhC,4EAA4E;AAC5E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,GACnC,SAAS,CAMX"}
@@ -4,9 +4,10 @@
4
4
 
5
5
  /**
6
6
  * @file InputClearButton.tsx
7
- * @input Uses React, Button, and Icon
8
- * @output Exports the public InputClearButton and an internal popup-aware variant,
9
- * both with a contextual tooltip matching their required label.
7
+ * @input Uses React, Button, Icon, and the i18n translator
8
+ * @output Exports the public InputClearButton and an internal popup-aware variant.
9
+ * Both show the localized generic "Clear" tooltip and keep the caller's
10
+ * contextual label as the accessible name.
10
11
  * @position Shared primitive. Every input that renders a clear affordance —
11
12
  * TextInput, NumberInput, TimeInput, DateInput, DateTimeInput,
12
13
  * DateRangeInput, Selector, MultiSelector, Typeahead, Tokenizer, FileInput —
@@ -17,6 +18,7 @@
17
18
  import * as stylex from '@stylexjs/stylex';
18
19
  import { Button } from "../Button/index.js";
19
20
  import { Icon } from "../Icon/index.js";
21
+ import { useTranslator } from "../i18n/index.js";
20
22
  import { themeProps } from "../utils/themeProps.js";
21
23
  import { jsx as _jsx } from "react/jsx-runtime";
22
24
  const styles = {
@@ -34,6 +36,7 @@ const styles = {
34
36
  };
35
37
  function renderInputClearButton({
36
38
  label,
39
+ tooltip,
37
40
  onClick,
38
41
  onPointerDown,
39
42
  onClickCapture,
@@ -49,8 +52,13 @@ function renderInputClearButton({
49
52
  return /*#__PURE__*/_jsx(Button, {
50
53
  variant: "ghost",
51
54
  size: "sm",
52
- label: label,
53
- tooltip: label,
55
+ label: label
56
+ // The field's label already sits beside the glyph, so the tooltip names
57
+ // only the action; repeating a long label reads as awkward copy. The
58
+ // contextual label stays the accessible name, which still contains
59
+ // the visible word (WCAG 2.5.3, label in name).
60
+ ,
61
+ tooltip: tooltip,
54
62
  className: buttonTargetClassName,
55
63
  icon: /*#__PURE__*/_jsx(Icon, {
56
64
  icon: "close",
@@ -70,11 +78,19 @@ function renderInputClearButton({
70
78
  });
71
79
  }
72
80
  export function InputClearButton(props) {
73
- return renderInputClearButton(props);
81
+ const t = useTranslator();
82
+ return renderInputClearButton({
83
+ ...props,
84
+ tooltip: t('@astryx.inputClearButton.tooltip')
85
+ });
74
86
  }
75
87
 
76
88
  /** Internal variant used while popup-aware clear behavior is rolled out. */
77
89
  export function InternalInputClearButton(props) {
78
- return renderInputClearButton(props);
90
+ const t = useTranslator();
91
+ return renderInputClearButton({
92
+ ...props,
93
+ tooltip: t('@astryx.inputClearButton.tooltip')
94
+ });
79
95
  }
80
96
  InputClearButton.displayName = 'InputClearButton';
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/FormLayout/FormLayout.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAU,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AA0C7B,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAEhC;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAAC,EAAE,eAAe,CAAC;CACtC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,SAAsB,EACtB,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BA0BjB;yBAnCe,UAAU"}
1
+ {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/FormLayout/FormLayout.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAU,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AA2C7B,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAEhC;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAAC,EAAE,eAAe,CAAC;CACtC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,SAAsB,EACtB,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BA0BjB;yBAnCe,UAAU"}
@@ -56,6 +56,7 @@ const styles = {
56
56
  k41HbU: "xedohl4",
57
57
  kUxVDj: "x1rpgqan",
58
58
  k3RL8M: "x1a1jff",
59
+ kjFzOW: "x1q32nj3",
59
60
  $$css: true
60
61
  }
61
62
  };
@@ -21,7 +21,13 @@ export type GridAlignment = 'start' | 'center' | 'end' | 'stretch';
21
21
  /**
22
22
  * Column configuration for Grid.
23
23
  *
24
- * - `number` — fixed equal-width columns (e.g. `columns={3}`)
24
+ * A number means exactly N equal columns at every width; it never reflows, so
25
+ * `columns={4}` on a phone renders four narrow tracks. For columns that reflow
26
+ * on small screens, use the object form: `{minWidth: 240, max: 4}` renders at
27
+ * most four columns, each at least 240px, and fewer when the container is
28
+ * narrower.
29
+ *
30
+ * - `number` — exactly N equal-width columns (e.g. `columns={3}`); never reflows
25
31
  * - `object` — responsive columns based on minimum child width:
26
32
  * - `minWidth` — minimum width (px) for each column track
27
33
  * - `repeat` — `'fill'` (default) preserves empty tracks for consistent widths;
@@ -40,9 +46,12 @@ export interface GridProps extends BaseProps<HTMLDivElement> {
40
46
  /** Ref forwarded to the root element */
41
47
  ref?: React.Ref<HTMLDivElement>;
42
48
  /**
43
- * Column configuration.
44
- * - `number` — fixed equal-width columns
45
- * - `{minWidth, max?, repeat?}` — responsive columns
49
+ * Column configuration. A number is exactly N equal columns and never
50
+ * reflows; for columns that reflow on small screens, use
51
+ * `{minWidth, max}`.
52
+ * - `number` — exactly N equal-width columns at every width
53
+ * - `{minWidth, max?, repeat?}` — responsive columns with a px floor and an
54
+ * optional cap
46
55
  *
47
56
  * @see GridColumns
48
57
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../src/Grid/Grid.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAI9C;;GAEG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACzB,CAAC;AAEN,MAAM,WAAW,SAAU,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC1D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;OAGG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC;IAExB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA2ND;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,SAAS,EACT,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,SAAS,+BA6EX;yBA/Fe,IAAI"}
1
+ {"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../src/Grid/Grid.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAI9C;;GAEG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACzB,CAAC;AAEN,MAAM,WAAW,SAAU,SAAQ,SAAS,CAAC,cAAc,CAAC;IAC1D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;OAGG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC;IAExB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA2ND;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,SAAS,EACT,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,KAAK,EACT,EAAE,SAAS,+BA6EX;yBA/Fe,IAAI"}
package/dist/Grid/Grid.js CHANGED
@@ -26,7 +26,13 @@ import { themeProps } from "../utils/themeProps.js";
26
26
  /**
27
27
  * Column configuration for Grid.
28
28
  *
29
- * - `number` — fixed equal-width columns (e.g. `columns={3}`)
29
+ * A number means exactly N equal columns at every width; it never reflows, so
30
+ * `columns={4}` on a phone renders four narrow tracks. For columns that reflow
31
+ * on small screens, use the object form: `{minWidth: 240, max: 4}` renders at
32
+ * most four columns, each at least 240px, and fewer when the container is
33
+ * narrower.
34
+ *
35
+ * - `number` — exactly N equal-width columns (e.g. `columns={3}`); never reflows
30
36
  * - `object` — responsive columns based on minimum child width:
31
37
  * - `minWidth` — minimum width (px) for each column track
32
38
  * - `repeat` — `'fill'` (default) preserves empty tracks for consistent widths;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @file useHoverCard.ts
3
3
  * @input Uses useLayer, useTouchTrigger, React hooks
4
- * @output Exports useHoverCard hook for hover/focus/tap triggered layers
4
+ * @output Exports useHoverCard hook with stable trigger refs for hover/focus/tap layers
5
5
  * @position Layer hook; builds on useLayer for hover card behavior
6
6
  *
7
7
  * SYNC: When modified, update:
@@ -1 +1 @@
1
- {"version":3,"file":"useHoverCard.d.ts","sourceRoot":"","sources":["../../src/HoverCard/useHoverCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AA6BlC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAE9B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEtC;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;;OAOG;IACH,eAAe,EAAE,CACf,QAAQ,EAAE,SAAS,EACnB,KAAK,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,KAC5C,SAAS,CAAC;IAEf;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAyBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA6a5E"}
1
+ {"version":3,"file":"useHoverCard.d.ts","sourceRoot":"","sources":["../../src/HoverCard/useHoverCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AA6BlC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAE9B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEtC;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;;OAOG;IACH,eAAe,EAAE,CACf,QAAQ,EAAE,SAAS,EACnB,KAAK,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,KAC5C,SAAS,CAAC;IAEf;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAyBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAic5E"}