@astryxdesign/core 0.1.2 → 0.1.3-canary.6d57c8d

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 (567) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +12 -12
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +11 -5
  5. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
  6. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  7. package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
  8. package/dist/Button/Button.d.ts.map +1 -1
  9. package/dist/Button/Button.js +2 -4
  10. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  11. package/dist/ButtonGroup/ButtonGroup.js +0 -1
  12. package/dist/Calendar/Calendar.d.ts +5 -4
  13. package/dist/Calendar/Calendar.d.ts.map +1 -1
  14. package/dist/Calendar/Calendar.js +82 -43
  15. package/dist/Calendar/hooks/index.d.ts +0 -2
  16. package/dist/Calendar/hooks/index.d.ts.map +1 -1
  17. package/dist/Calendar/hooks/index.js +1 -2
  18. package/dist/Calendar/index.d.ts +3 -3
  19. package/dist/Calendar/index.d.ts.map +1 -1
  20. package/dist/Calendar/index.js +1 -1
  21. package/dist/Calendar/styles.d.ts +3 -9
  22. package/dist/Calendar/styles.d.ts.map +1 -1
  23. package/dist/Calendar/styles.js +3 -11
  24. package/dist/Carousel/Carousel.d.ts.map +1 -1
  25. package/dist/Carousel/Carousel.js +17 -3
  26. package/dist/Center/Center.d.ts +11 -1
  27. package/dist/Center/Center.d.ts.map +1 -1
  28. package/dist/Center/Center.js +9 -3
  29. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  30. package/dist/Chat/ChatComposerInput.js +0 -1
  31. package/dist/Chat/ChatMessageList.d.ts +14 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +2 -0
  34. package/dist/Chat/useTriggerMenu.d.ts +8 -1
  35. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  36. package/dist/Chat/useTriggerMenu.js +15 -3
  37. package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
  38. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  39. package/dist/CheckboxInput/CheckboxInput.js +51 -9
  40. package/dist/CheckboxList/CheckboxList.d.ts +13 -1
  41. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  42. package/dist/CheckboxList/CheckboxList.js +39 -9
  43. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  44. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  45. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  46. package/dist/CheckboxList/CheckboxListItem.js +0 -1
  47. package/dist/Citation/Citation.d.ts.map +1 -1
  48. package/dist/Citation/Citation.js +9 -5
  49. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  50. package/dist/CodeBlock/CodeBlock.js +51 -37
  51. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  52. package/dist/CommandPalette/CommandPalette.js +5 -5
  53. package/dist/ContextMenu/ContextMenu.d.ts +4 -5
  54. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  55. package/dist/ContextMenu/ContextMenu.js +93 -11
  56. package/dist/DateInput/DateInput.d.ts +23 -1
  57. package/dist/DateInput/DateInput.d.ts.map +1 -1
  58. package/dist/DateInput/DateInput.js +167 -99
  59. package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
  60. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  61. package/dist/DateRangeInput/DateRangeInput.js +42 -9
  62. package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
  63. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  64. package/dist/DateTimeInput/DateTimeInput.js +78 -15
  65. package/dist/Dialog/Dialog.d.ts.map +1 -1
  66. package/dist/Dialog/Dialog.js +12 -0
  67. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
  68. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  69. package/dist/DropdownMenu/DropdownMenu.js +42 -14
  70. package/dist/Field/Field.d.ts +19 -2
  71. package/dist/Field/Field.d.ts.map +1 -1
  72. package/dist/Field/Field.js +4 -0
  73. package/dist/Field/FieldLabel.d.ts +21 -2
  74. package/dist/Field/FieldLabel.d.ts.map +1 -1
  75. package/dist/Field/FieldLabel.js +41 -26
  76. package/dist/FileInput/FileInput.d.ts +22 -1
  77. package/dist/FileInput/FileInput.d.ts.map +1 -1
  78. package/dist/FileInput/FileInput.js +56 -10
  79. package/dist/Grid/Grid.d.ts +11 -1
  80. package/dist/Grid/Grid.d.ts.map +1 -1
  81. package/dist/Grid/Grid.js +32 -6
  82. package/dist/InputGroup/InputGroup.d.ts +4 -3
  83. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  84. package/dist/InputGroup/InputGroup.js +16 -6
  85. package/dist/InputGroup/InputGroupContext.d.ts +4 -0
  86. package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
  87. package/dist/InputGroup/InputGroupContext.js +2 -2
  88. package/dist/InputGroup/groupStyles.d.ts +1 -1
  89. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  90. package/dist/InputGroup/groupStyles.js +3 -3
  91. package/dist/InputGroup/index.d.ts +1 -0
  92. package/dist/InputGroup/index.d.ts.map +1 -1
  93. package/dist/Kbd/Kbd.d.ts.map +1 -1
  94. package/dist/Kbd/Kbd.js +33 -1
  95. package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
  96. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  97. package/dist/Layer/layerAnimations.stylex.js +8 -4
  98. package/dist/Layer/useLayer.d.ts +10 -0
  99. package/dist/Layer/useLayer.d.ts.map +1 -1
  100. package/dist/Layer/useLayer.js +64 -9
  101. package/dist/Layout/Layout.d.ts +4 -11
  102. package/dist/Layout/Layout.d.ts.map +1 -1
  103. package/dist/Layout/Layout.js +10 -11
  104. package/dist/Layout/LayoutFooter.d.ts +2 -2
  105. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  106. package/dist/Layout/LayoutHeader.d.ts +2 -2
  107. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  108. package/dist/Layout/LayoutPanel.d.ts +2 -2
  109. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  110. package/dist/Layout/padding.stylex.d.ts +51 -0
  111. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  112. package/dist/Layout/padding.stylex.js +63 -0
  113. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  114. package/dist/Lightbox/Lightbox.js +4 -2
  115. package/dist/Link/Link.d.ts +16 -1
  116. package/dist/Link/Link.d.ts.map +1 -1
  117. package/dist/Link/Link.js +18 -7
  118. package/dist/Markdown/Markdown.d.ts.map +1 -1
  119. package/dist/Markdown/Markdown.js +7 -0
  120. package/dist/MoreMenu/MoreMenu.d.ts +1 -7
  121. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  122. package/dist/MoreMenu/MoreMenu.js +0 -2
  123. package/dist/MultiSelector/MultiSelector.d.ts +27 -2
  124. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  125. package/dist/MultiSelector/MultiSelector.js +141 -42
  126. package/dist/MultiSelector/hooks.d.ts +12 -1
  127. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  128. package/dist/MultiSelector/hooks.js +14 -1
  129. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  130. package/dist/NavMenu/NavHeadingMenu.js +34 -3
  131. package/dist/NumberInput/NumberInput.d.ts +23 -2
  132. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  133. package/dist/NumberInput/NumberInput.js +62 -12
  134. package/dist/Pagination/Pagination.d.ts +1 -1
  135. package/dist/Pagination/Pagination.d.ts.map +1 -1
  136. package/dist/Pagination/Pagination.js +15 -1
  137. package/dist/Popover/Popover.d.ts +18 -2
  138. package/dist/Popover/Popover.d.ts.map +1 -1
  139. package/dist/Popover/Popover.js +5 -2
  140. package/dist/Popover/usePopover.d.ts +38 -3
  141. package/dist/Popover/usePopover.d.ts.map +1 -1
  142. package/dist/Popover/usePopover.js +24 -9
  143. package/dist/PowerSearch/PowerSearch.d.ts +11 -1
  144. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  145. package/dist/PowerSearch/PowerSearch.js +6 -1
  146. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  147. package/dist/ProgressBar/ProgressBar.js +3 -5
  148. package/dist/RadioList/RadioList.d.ts +20 -2
  149. package/dist/RadioList/RadioList.d.ts.map +1 -1
  150. package/dist/RadioList/RadioList.js +105 -9
  151. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  152. package/dist/RadioList/RadioListItem.js +13 -2
  153. package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
  154. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  155. package/dist/SegmentedControl/SegmentedControl.js +78 -44
  156. package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
  157. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  158. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  159. package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
  160. package/dist/Selector/Selector.d.ts +24 -1
  161. package/dist/Selector/Selector.d.ts.map +1 -1
  162. package/dist/Selector/Selector.js +122 -43
  163. package/dist/Selector/hooks.d.ts +8 -1
  164. package/dist/Selector/hooks.d.ts.map +1 -1
  165. package/dist/Selector/hooks.js +14 -1
  166. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  167. package/dist/SideNav/SideNavHeading.js +2 -0
  168. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  169. package/dist/SideNav/SideNavItem.js +1 -1
  170. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  171. package/dist/Skeleton/Skeleton.js +8 -2
  172. package/dist/Slider/Slider.d.ts +21 -0
  173. package/dist/Slider/Slider.d.ts.map +1 -1
  174. package/dist/Slider/Slider.js +36 -9
  175. package/dist/Spinner/Spinner.d.ts.map +1 -1
  176. package/dist/Spinner/Spinner.js +1 -1
  177. package/dist/Stack/Stack.d.ts +38 -23
  178. package/dist/Stack/Stack.d.ts.map +1 -1
  179. package/dist/Stack/Stack.js +25 -1
  180. package/dist/Stack/StackItem.d.ts +12 -23
  181. package/dist/Stack/StackItem.d.ts.map +1 -1
  182. package/dist/Stack/StackItem.js +8 -1
  183. package/dist/Switch/Switch.d.ts +23 -2
  184. package/dist/Switch/Switch.d.ts.map +1 -1
  185. package/dist/Switch/Switch.js +41 -11
  186. package/dist/TabList/Tab.d.ts.map +1 -1
  187. package/dist/TabList/Tab.js +6 -0
  188. package/dist/TabList/TabList.d.ts +16 -4
  189. package/dist/TabList/TabList.d.ts.map +1 -1
  190. package/dist/TabList/TabList.js +87 -10
  191. package/dist/TabList/TabListContext.d.ts +5 -0
  192. package/dist/TabList/TabListContext.d.ts.map +1 -1
  193. package/dist/TabList/TabListContext.js +5 -0
  194. package/dist/TabList/TabMenu.d.ts.map +1 -1
  195. package/dist/TabList/TabMenu.js +6 -1
  196. package/dist/Table/BaseTable.d.ts.map +1 -1
  197. package/dist/Table/BaseTable.js +11 -8
  198. package/dist/Table/Table.d.ts.map +1 -1
  199. package/dist/Table/Table.js +10 -1
  200. package/dist/Table/TableCell.d.ts +8 -1
  201. package/dist/Table/TableCell.d.ts.map +1 -1
  202. package/dist/Table/TableCell.js +10 -10
  203. package/dist/Table/TableHeaderCell.d.ts +8 -1
  204. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  205. package/dist/Table/TableHeaderCell.js +16 -16
  206. package/dist/Table/index.d.ts +2 -1
  207. package/dist/Table/index.d.ts.map +1 -1
  208. package/dist/Table/index.js +2 -2
  209. package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
  210. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  211. package/dist/Table/plugins/pagination/paginateData.js +8 -3
  212. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  213. package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
  214. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  215. package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
  216. package/dist/Table/tableContextMenu.d.ts +33 -0
  217. package/dist/Table/tableContextMenu.d.ts.map +1 -0
  218. package/dist/Table/tableContextMenu.js +133 -0
  219. package/dist/Table/types.d.ts +66 -0
  220. package/dist/Table/types.d.ts.map +1 -1
  221. package/dist/TextArea/TextArea.d.ts +22 -1
  222. package/dist/TextArea/TextArea.d.ts.map +1 -1
  223. package/dist/TextArea/TextArea.js +41 -9
  224. package/dist/TextInput/TextInput.d.ts +23 -2
  225. package/dist/TextInput/TextInput.d.ts.map +1 -1
  226. package/dist/TextInput/TextInput.js +55 -10
  227. package/dist/TimeInput/TimeInput.d.ts +23 -1
  228. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  229. package/dist/TimeInput/TimeInput.js +147 -76
  230. package/dist/Toast/Toast.d.ts.map +1 -1
  231. package/dist/Toast/Toast.js +14 -0
  232. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  233. package/dist/Toast/ToastViewport.js +131 -3
  234. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  235. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  236. package/dist/Tokenizer/Tokenizer.js +26 -4
  237. package/dist/Toolbar/Toolbar.d.ts +3 -3
  238. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  239. package/dist/Toolbar/Toolbar.js +51 -7
  240. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  241. package/dist/Tooltip/useTooltip.js +56 -9
  242. package/dist/TopNav/TopNavHeading.d.ts +7 -1
  243. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  244. package/dist/TopNav/TopNavHeading.js +8 -0
  245. package/dist/TreeList/TreeList.d.ts +1 -1
  246. package/dist/TreeList/TreeList.d.ts.map +1 -1
  247. package/dist/TreeList/TreeList.js +72 -2
  248. package/dist/TreeList/TreeListItem.d.ts +11 -1
  249. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  250. package/dist/TreeList/TreeListItem.js +51 -12
  251. package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
  252. package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
  253. package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
  254. package/dist/Typeahead/BaseTypeahead.d.ts +13 -0
  255. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  256. package/dist/Typeahead/BaseTypeahead.js +69 -6
  257. package/dist/Typeahead/Typeahead.d.ts +26 -3
  258. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  259. package/dist/Typeahead/Typeahead.js +65 -29
  260. package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
  261. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  262. package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
  263. package/dist/VisuallyHidden/index.d.ts +11 -0
  264. package/dist/VisuallyHidden/index.d.ts.map +1 -0
  265. package/dist/VisuallyHidden/index.js +13 -0
  266. package/dist/astryx.css +18 -0
  267. package/dist/astryx.umd.js +55 -55
  268. package/dist/astryx.umd.js.map +4 -4
  269. package/dist/hooks/focusableSelector.d.ts +22 -0
  270. package/dist/hooks/focusableSelector.d.ts.map +1 -0
  271. package/dist/hooks/focusableSelector.js +24 -0
  272. package/dist/hooks/index.d.ts +12 -2
  273. package/dist/hooks/index.d.ts.map +1 -1
  274. package/dist/hooks/index.js +7 -2
  275. package/dist/hooks/useAnnounce.d.ts +40 -0
  276. package/dist/hooks/useAnnounce.d.ts.map +1 -0
  277. package/dist/hooks/useAnnounce.js +142 -0
  278. package/dist/hooks/useClickableContainer.d.ts +16 -1
  279. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  280. package/dist/hooks/useClickableContainer.js +16 -4
  281. package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
  282. package/dist/hooks/useEntryAnimation.js +4 -4
  283. package/dist/hooks/useFocusTrap.d.ts +18 -0
  284. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  285. package/dist/hooks/useFocusTrap.js +87 -3
  286. package/dist/hooks/useGridFocus.d.ts +88 -1
  287. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  288. package/dist/hooks/useGridFocus.js +261 -62
  289. package/dist/hooks/useKeyboardHint.d.ts +82 -0
  290. package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
  291. package/dist/hooks/useKeyboardHint.js +220 -0
  292. package/dist/hooks/useListFocus.d.ts +78 -7
  293. package/dist/hooks/useListFocus.d.ts.map +1 -1
  294. package/dist/hooks/useListFocus.js +305 -52
  295. package/dist/hooks/useLongPress.d.ts +21 -0
  296. package/dist/hooks/useLongPress.d.ts.map +1 -0
  297. package/dist/hooks/useLongPress.js +89 -0
  298. package/dist/hooks/useTreeFocus.d.ts +157 -0
  299. package/dist/hooks/useTreeFocus.d.ts.map +1 -0
  300. package/dist/hooks/useTreeFocus.js +337 -0
  301. package/dist/hooks/useTypeahead.d.ts +63 -0
  302. package/dist/hooks/useTypeahead.d.ts.map +1 -0
  303. package/dist/hooks/useTypeahead.js +117 -0
  304. package/dist/index.d.ts +1 -0
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +1 -0
  307. package/dist/utils/dateTypes.d.ts +12 -0
  308. package/dist/utils/dateTypes.d.ts.map +1 -1
  309. package/dist/utils/dateTypes.js +41 -1
  310. package/dist/utils/index.d.ts +4 -0
  311. package/dist/utils/index.d.ts.map +1 -1
  312. package/dist/utils/index.js +3 -1
  313. package/dist/utils/inputAria.d.ts +29 -0
  314. package/dist/utils/inputAria.d.ts.map +1 -0
  315. package/dist/utils/inputAria.js +30 -0
  316. package/dist/utils/timeParser.d.ts.map +1 -1
  317. package/dist/utils/timeParser.js +5 -2
  318. package/docs.mjs +2 -2
  319. package/package.json +12 -8
  320. package/src/Avatar/Avatar.test.tsx +37 -0
  321. package/src/Avatar/Avatar.tsx +10 -5
  322. package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
  323. package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
  324. package/src/Button/Button.tsx +3 -16
  325. package/src/ButtonGroup/ButtonGroup.test.tsx +9 -9
  326. package/src/ButtonGroup/ButtonGroup.tsx +0 -1
  327. package/src/Calendar/Calendar.doc.mjs +4 -4
  328. package/src/Calendar/Calendar.test.tsx +168 -30
  329. package/src/Calendar/Calendar.tsx +121 -66
  330. package/src/Calendar/hooks/index.ts +0 -6
  331. package/src/Calendar/index.ts +1 -3
  332. package/src/Calendar/styles.ts +4 -9
  333. package/src/Carousel/Carousel.doc.mjs +7 -1
  334. package/src/Carousel/Carousel.test.tsx +20 -0
  335. package/src/Carousel/Carousel.tsx +16 -1
  336. package/src/Center/Center.doc.mjs +12 -2
  337. package/src/Center/Center.tsx +28 -3
  338. package/src/Chat/ChatComposerInput.test.tsx +26 -7
  339. package/src/Chat/ChatComposerInput.tsx +0 -1
  340. package/src/Chat/ChatDictationButton.doc.mjs +1 -1
  341. package/src/Chat/ChatMessageList.doc.mjs +8 -0
  342. package/src/Chat/ChatMessageList.test.tsx +18 -0
  343. package/src/Chat/ChatMessageList.tsx +16 -0
  344. package/src/Chat/useTriggerMenu.tsx +22 -4
  345. package/src/CheckboxInput/CheckboxInput.doc.mjs +10 -0
  346. package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
  347. package/src/CheckboxInput/CheckboxInput.tsx +78 -6
  348. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  349. package/src/CheckboxList/CheckboxList.test.tsx +192 -26
  350. package/src/CheckboxList/CheckboxList.tsx +56 -3
  351. package/src/CheckboxList/CheckboxListContext.tsx +7 -0
  352. package/src/CheckboxList/CheckboxListItem.tsx +0 -3
  353. package/src/Citation/Citation.doc.mjs +10 -0
  354. package/src/Citation/Citation.test.tsx +121 -0
  355. package/src/Citation/Citation.tsx +15 -3
  356. package/src/CodeBlock/CodeBlock.test.tsx +115 -0
  357. package/src/CodeBlock/CodeBlock.tsx +63 -33
  358. package/src/CommandPalette/CommandPalette.test.tsx +47 -1
  359. package/src/CommandPalette/CommandPalette.tsx +9 -21
  360. package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
  361. package/src/ContextMenu/ContextMenu.test.tsx +155 -1
  362. package/src/ContextMenu/ContextMenu.tsx +113 -16
  363. package/src/DateInput/DateInput.doc.mjs +286 -56
  364. package/src/DateInput/DateInput.test.tsx +248 -2
  365. package/src/DateInput/DateInput.tsx +196 -100
  366. package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
  367. package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
  368. package/src/DateRangeInput/DateRangeInput.tsx +63 -5
  369. package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
  370. package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
  371. package/src/DateTimeInput/DateTimeInput.tsx +125 -17
  372. package/src/Dialog/Dialog.doc.mjs +2 -2
  373. package/src/Dialog/Dialog.tsx +12 -0
  374. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
  375. package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
  376. package/src/DropdownMenu/DropdownMenu.tsx +52 -18
  377. package/src/Field/Field.doc.mjs +59 -18
  378. package/src/Field/Field.test.tsx +32 -0
  379. package/src/Field/Field.tsx +23 -5
  380. package/src/Field/FieldLabel.tsx +55 -17
  381. package/src/FileInput/FileInput.doc.mjs +17 -0
  382. package/src/FileInput/FileInput.test.tsx +283 -49
  383. package/src/FileInput/FileInput.tsx +76 -4
  384. package/src/Grid/Grid.doc.mjs +17 -4
  385. package/src/Grid/Grid.test.tsx +43 -30
  386. package/src/Grid/Grid.tsx +38 -3
  387. package/src/Icon/Icon.doc.mjs +3 -3
  388. package/src/InputGroup/InputGroup.doc.mjs +111 -23
  389. package/src/InputGroup/InputGroup.test.tsx +257 -60
  390. package/src/InputGroup/InputGroup.tsx +23 -5
  391. package/src/InputGroup/InputGroupContext.ts +9 -4
  392. package/src/InputGroup/groupStyles.ts +7 -1
  393. package/src/InputGroup/index.ts +1 -0
  394. package/src/Kbd/Kbd.test.tsx +22 -4
  395. package/src/Kbd/Kbd.tsx +35 -3
  396. package/src/Layer/layerAnimations.stylex.ts +20 -4
  397. package/src/Layer/useLayer.doc.mjs +5 -0
  398. package/src/Layer/useLayer.test.tsx +111 -0
  399. package/src/Layer/useLayer.tsx +90 -9
  400. package/src/Layout/Layout.tsx +8 -16
  401. package/src/Layout/LayoutFooter.doc.mjs +4 -4
  402. package/src/Layout/LayoutFooter.tsx +3 -3
  403. package/src/Layout/LayoutHeader.doc.mjs +4 -4
  404. package/src/Layout/LayoutHeader.tsx +3 -3
  405. package/src/Layout/LayoutPanel.tsx +3 -3
  406. package/src/Layout/padding.stylex.ts +52 -0
  407. package/src/Lightbox/Lightbox.doc.mjs +9 -0
  408. package/src/Lightbox/Lightbox.test.tsx +53 -5
  409. package/src/Lightbox/Lightbox.tsx +9 -4
  410. package/src/Link/Link.doc.mjs +14 -0
  411. package/src/Link/Link.test.tsx +50 -0
  412. package/src/Link/Link.tsx +39 -4
  413. package/src/Markdown/Markdown.test.tsx +11 -0
  414. package/src/Markdown/Markdown.tsx +7 -0
  415. package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
  416. package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
  417. package/src/MoreMenu/MoreMenu.tsx +0 -9
  418. package/src/MultiSelector/MultiSelector.doc.mjs +30 -0
  419. package/src/MultiSelector/MultiSelector.test.tsx +375 -8
  420. package/src/MultiSelector/MultiSelector.tsx +194 -48
  421. package/src/MultiSelector/hooks.ts +27 -0
  422. package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
  423. package/src/NavMenu/NavHeadingMenu.tsx +50 -3
  424. package/src/NumberInput/NumberInput.doc.mjs +17 -0
  425. package/src/NumberInput/NumberInput.test.tsx +242 -40
  426. package/src/NumberInput/NumberInput.tsx +89 -11
  427. package/src/Pagination/Pagination.doc.mjs +3 -3
  428. package/src/Pagination/Pagination.test.tsx +117 -5
  429. package/src/Pagination/Pagination.tsx +21 -1
  430. package/src/Popover/Popover.doc.mjs +26 -0
  431. package/src/Popover/Popover.test.tsx +121 -0
  432. package/src/Popover/Popover.tsx +23 -2
  433. package/src/Popover/usePopover.doc.mjs +9 -3
  434. package/src/Popover/usePopover.tsx +70 -12
  435. package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
  436. package/src/PowerSearch/PowerSearch.test.tsx +97 -1
  437. package/src/PowerSearch/PowerSearch.tsx +16 -3
  438. package/src/ProgressBar/ProgressBar.test.tsx +34 -26
  439. package/src/ProgressBar/ProgressBar.tsx +3 -4
  440. package/src/RadioList/RadioList.doc.mjs +9 -0
  441. package/src/RadioList/RadioList.test.tsx +252 -16
  442. package/src/RadioList/RadioList.tsx +166 -10
  443. package/src/RadioList/RadioListItem.tsx +14 -2
  444. package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
  445. package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
  446. package/src/SegmentedControl/SegmentedControl.tsx +102 -54
  447. package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
  448. package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
  449. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  450. package/src/Selector/Selector.doc.mjs +26 -0
  451. package/src/Selector/Selector.test.tsx +387 -15
  452. package/src/Selector/Selector.tsx +175 -67
  453. package/src/Selector/hooks.ts +23 -0
  454. package/src/SideNav/SideNav.test.tsx +48 -0
  455. package/src/SideNav/SideNavHeading.tsx +8 -2
  456. package/src/SideNav/SideNavItem.tsx +2 -4
  457. package/src/Skeleton/Skeleton.test.tsx +25 -0
  458. package/src/Skeleton/Skeleton.tsx +11 -1
  459. package/src/Slider/Slider.doc.mjs +15 -0
  460. package/src/Slider/Slider.test.tsx +155 -2
  461. package/src/Slider/Slider.tsx +53 -5
  462. package/src/Spinner/Spinner.tsx +7 -1
  463. package/src/Stack/Stack.doc.mjs +77 -0
  464. package/src/Stack/Stack.test.tsx +55 -5
  465. package/src/Stack/Stack.tsx +73 -24
  466. package/src/Stack/StackItem.test.tsx +23 -0
  467. package/src/Stack/StackItem.tsx +20 -23
  468. package/src/Switch/Switch.doc.mjs +15 -0
  469. package/src/Switch/Switch.test.tsx +162 -27
  470. package/src/Switch/Switch.tsx +61 -21
  471. package/src/TabList/Tab.tsx +6 -0
  472. package/src/TabList/TabList.doc.mjs +6 -0
  473. package/src/TabList/TabList.test.tsx +251 -0
  474. package/src/TabList/TabList.tsx +103 -12
  475. package/src/TabList/TabListContext.ts +7 -3
  476. package/src/TabList/TabMenu.tsx +6 -3
  477. package/src/Table/BaseTable.tsx +21 -17
  478. package/src/Table/Table.doc.mjs +2 -0
  479. package/src/Table/Table.test.tsx +10 -0
  480. package/src/Table/Table.tsx +8 -0
  481. package/src/Table/TableCell.tsx +25 -23
  482. package/src/Table/TableHeaderCell.tsx +28 -29
  483. package/src/Table/index.ts +3 -2
  484. package/src/Table/plugins/pagination/paginateData.ts +10 -3
  485. package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
  486. package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
  487. package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
  488. package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
  489. package/src/Table/tableContextMenu.test.tsx +157 -0
  490. package/src/Table/tableContextMenu.tsx +142 -0
  491. package/src/Table/types.ts +74 -0
  492. package/src/Table/useTableColumnResize.doc.mjs +3 -3
  493. package/src/Table/useTableStickyColumns.doc.mjs +2 -2
  494. package/src/Text/Text.doc.mjs +18 -18
  495. package/src/TextArea/TextArea.doc.mjs +17 -0
  496. package/src/TextArea/TextArea.test.tsx +167 -35
  497. package/src/TextArea/TextArea.tsx +62 -15
  498. package/src/TextInput/TextInput.doc.mjs +17 -0
  499. package/src/TextInput/TextInput.test.tsx +168 -34
  500. package/src/TextInput/TextInput.tsx +77 -9
  501. package/src/Thumbnail/Thumbnail.doc.mjs +4 -4
  502. package/src/TimeInput/TimeInput.doc.mjs +340 -60
  503. package/src/TimeInput/TimeInput.test.tsx +255 -7
  504. package/src/TimeInput/TimeInput.tsx +176 -70
  505. package/src/Timestamp/Timestamp.doc.mjs +19 -19
  506. package/src/Toast/Toast.tsx +14 -0
  507. package/src/Toast/ToastViewport.test.tsx +214 -0
  508. package/src/Toast/ToastViewport.tsx +167 -21
  509. package/src/Tokenizer/Tokenizer.doc.mjs +29 -14
  510. package/src/Tokenizer/Tokenizer.test.tsx +105 -1
  511. package/src/Tokenizer/Tokenizer.tsx +37 -1
  512. package/src/Toolbar/Toolbar.test.tsx +109 -6
  513. package/src/Toolbar/Toolbar.tsx +59 -5
  514. package/src/Tooltip/Tooltip.test.tsx +68 -0
  515. package/src/Tooltip/useTooltip.tsx +55 -8
  516. package/src/TopNav/TopNav.test.tsx +50 -0
  517. package/src/TopNav/TopNavHeading.tsx +17 -1
  518. package/src/TreeList/TreeList.test.tsx +295 -6
  519. package/src/TreeList/TreeList.tsx +73 -1
  520. package/src/TreeList/TreeListItem.tsx +51 -5
  521. package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
  522. package/src/Typeahead/BaseTypeahead.tsx +93 -9
  523. package/src/Typeahead/Typeahead.doc.mjs +141 -30
  524. package/src/Typeahead/Typeahead.test.tsx +331 -1
  525. package/src/Typeahead/Typeahead.tsx +105 -33
  526. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
  527. package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
  528. package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
  529. package/src/VisuallyHidden/index.ts +15 -0
  530. package/src/docs-script.test.mjs +50 -0
  531. package/src/hooks/focusableSelector.ts +25 -0
  532. package/src/hooks/index.ts +28 -2
  533. package/src/hooks/useAnnounce.test.tsx +101 -0
  534. package/src/hooks/useAnnounce.ts +168 -0
  535. package/src/hooks/useClickableContainer.ts +16 -4
  536. package/src/hooks/useEntryAnimation.ts +16 -4
  537. package/src/hooks/useFocusTrap.test.tsx +132 -0
  538. package/src/hooks/useFocusTrap.ts +98 -4
  539. package/src/hooks/useGridFocus.doc.mjs +40 -2
  540. package/src/hooks/useGridFocus.test.tsx +132 -0
  541. package/src/hooks/useGridFocus.ts +343 -67
  542. package/src/hooks/useKeyboardHint.doc.mjs +101 -0
  543. package/src/hooks/useKeyboardHint.test.tsx +70 -0
  544. package/src/hooks/useKeyboardHint.tsx +332 -0
  545. package/src/hooks/useListFocus.doc.mjs +50 -10
  546. package/src/hooks/useListFocus.test.tsx +375 -0
  547. package/src/hooks/useListFocus.ts +395 -57
  548. package/src/hooks/useLongPress.test.tsx +134 -0
  549. package/src/hooks/useLongPress.ts +119 -0
  550. package/src/hooks/useTreeFocus.doc.mjs +140 -0
  551. package/src/hooks/useTreeFocus.test.tsx +214 -0
  552. package/src/hooks/useTreeFocus.ts +559 -0
  553. package/src/hooks/useTypeahead.test.tsx +109 -0
  554. package/src/hooks/useTypeahead.ts +183 -0
  555. package/src/index.ts +1 -0
  556. package/src/theme/derivedVarRegistry.test.ts +10 -5
  557. package/src/utils/dateTypes.test.ts +40 -0
  558. package/src/utils/dateTypes.ts +40 -0
  559. package/src/utils/index.ts +9 -0
  560. package/src/utils/inputAria.test.ts +39 -0
  561. package/src/utils/inputAria.ts +58 -0
  562. package/src/utils/timeParser.test.ts +10 -0
  563. package/src/utils/timeParser.ts +5 -2
  564. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
  565. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
  566. package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
  567. package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
@@ -17,6 +17,7 @@ export const docs = {
17
17
  { guidance: true, description: 'Use `repeat: \'fill\'` (the default) for consistent item widths. Use `\'fit\'` when items should stretch to fill leftover space.' },
18
18
  { guidance: false, description: 'Write manual CSS grid; Grid handles spacing and responsive behavior for you.' },
19
19
  { guidance: false, description: 'Use `HStack` with wrapping for grids; use Grid instead.' },
20
+ { guidance: true, description: 'Track templates use CSS-variable indirection (not raw inline styles), so `xstyle` overrides of `gridTemplateColumns` — including inside `@media` queries — take effect.' },
20
21
  ],
21
22
  },
22
23
  theming: {
@@ -39,13 +40,23 @@ export const docs = {
39
40
  },
40
41
  {
41
42
  name: 'width',
42
- type: 'number | string',
43
- description: 'Container width.',
43
+ type: 'SizeValue',
44
+ description: 'Container width. Numbers are treated as pixels, strings are used as-is.',
44
45
  },
45
46
  {
46
47
  name: 'height',
47
- type: 'number | string',
48
- description: 'Container height.',
48
+ type: 'SizeValue',
49
+ description: 'Container height. Numbers are treated as pixels, strings are used as-is.',
50
+ },
51
+ {
52
+ name: 'maxWidth',
53
+ type: 'SizeValue',
54
+ description: 'Maximum container width. Numbers are treated as pixels, strings are used as-is.',
55
+ },
56
+ {
57
+ name: 'minHeight',
58
+ type: 'SizeValue',
59
+ description: 'Minimum container height. Numbers are treated as pixels, strings are used as-is.',
49
60
  },
50
61
  {
51
62
  name: 'gap',
@@ -101,6 +112,7 @@ export const docsZh = {
101
112
  { guidance: true, description: 'Use `repeat: \'fill\'` (the default) for consistent item widths. Use `\'fit\'` when items should stretch to fill leftover space.' },
102
113
  { guidance: false, description: 'Write manual CSS grid; Grid handles spacing and responsive behavior for you.' },
103
114
  { guidance: false, description: 'Use `HStack` with wrapping for grids; use Grid instead.' },
115
+ { guidance: true, description: 'Track templates use CSS-variable indirection (not raw inline styles), so `xstyle` overrides of `gridTemplateColumns` — including inside `@media` queries — take effect.' },
104
116
  ],
105
117
  },
106
118
  };
@@ -116,6 +128,7 @@ export const docsDense = {
116
128
  { guidance: true, description: 'Use repeat: \'fill\' (the default) for consistent item widths. Use \'fit\' when items should stretch to fill leftover space.' },
117
129
  { guidance: false, description: 'Write manual CSS grid; Grid handles spacing and responsive behavior for you.' },
118
130
  { guidance: false, description: 'Use HStack with wrapping for grids; use Grid instead.' },
131
+ { guidance: true, description: 'track templates use CSS-var indirection, not inline styles — xstyle/@media overrides of gridTemplateColumns work.' },
119
132
  ],
120
133
  },
121
134
  };
@@ -14,6 +14,17 @@ import {render, screen} from '@testing-library/react';
14
14
  import {Grid} from './Grid';
15
15
  import {GridSpan} from './GridSpan';
16
16
 
17
+ /**
18
+ * The track template is applied via a StyleX dynamic style: the element
19
+ * carries an inline CSS variable while the `grid-template-columns`
20
+ * declaration lives in a class (so consumer xstyle/@media overrides can
21
+ * win). `--x-gridTemplateColumns` is the debug-mode variable name emitted
22
+ * by the StyleX transform in tests.
23
+ */
24
+ function templateColumns(el: HTMLElement): string {
25
+ return el.style.getPropertyValue('--x-gridTemplateColumns');
26
+ }
27
+
17
28
  describe('Grid', () => {
18
29
  it('renders with fixed columns', () => {
19
30
  render(
@@ -25,7 +36,22 @@ describe('Grid', () => {
25
36
  );
26
37
  const grid = screen.getByTestId('grid');
27
38
  expect(grid).toBeInTheDocument();
28
- expect(grid.style.gridTemplateColumns).toBe('repeat(3, 1fr)');
39
+ expect(templateColumns(grid)).toBe('repeat(3, 1fr)');
40
+ });
41
+
42
+ it('does not write grid-template-columns as a raw inline style (regression: inline style defeats xstyle/@media overrides)', () => {
43
+ render(
44
+ <Grid columns={3} rowHeight={80} data-testid="grid">
45
+ <div>Item 1</div>
46
+ </Grid>,
47
+ );
48
+ const grid = screen.getByTestId('grid');
49
+ // The declaration must live in a class (via CSS-var indirection), never
50
+ // as a raw inline property — inline would beat any consumer override.
51
+ expect(grid.style.gridTemplateColumns).toBe('');
52
+ expect(grid.style.gridAutoRows).toBe('');
53
+ expect(templateColumns(grid)).toBe('repeat(3, 1fr)');
54
+ expect(grid.style.getPropertyValue('--x-gridAutoRows')).toBe('80px');
29
55
  });
30
56
 
31
57
  it('renders with columns object (auto-fill default)', () => {
@@ -36,9 +62,7 @@ describe('Grid', () => {
36
62
  </Grid>,
37
63
  );
38
64
  const grid = screen.getByTestId('grid');
39
- expect(grid.style.gridTemplateColumns).toBe(
40
- 'repeat(auto-fill, minmax(250px, 1fr))',
41
- );
65
+ expect(templateColumns(grid)).toBe('repeat(auto-fill, minmax(250px, 1fr))');
42
66
  });
43
67
 
44
68
  it('renders with columns object max (capped via track-max)', () => {
@@ -51,7 +75,7 @@ describe('Grid', () => {
51
75
  );
52
76
  const grid = screen.getByTestId('grid');
53
77
  // Track max caps at (100% - 2 * gap) / 3 — no maxWidth on container
54
- expect(grid.style.gridTemplateColumns).toBe(
78
+ expect(templateColumns(grid)).toBe(
55
79
  'repeat(auto-fill, minmax(250px, calc((100% - 2 * var(--spacing-4)) / 3)))',
56
80
  );
57
81
  expect(grid.style.maxWidth).toBe('');
@@ -59,17 +83,14 @@ describe('Grid', () => {
59
83
 
60
84
  it('renders with columns object max using columnGap', () => {
61
85
  render(
62
- <Grid
63
- columns={{minWidth: 200, max: 4}}
64
- columnGap={6}
65
- data-testid="grid">
86
+ <Grid columns={{minWidth: 200, max: 4}} columnGap={6} data-testid="grid">
66
87
  <div>Item 1</div>
67
88
  <div>Item 2</div>
68
89
  </Grid>,
69
90
  );
70
91
  const grid = screen.getByTestId('grid');
71
92
  // columnGap takes precedence for track-max calculation
72
- expect(grid.style.gridTemplateColumns).toBe(
93
+ expect(templateColumns(grid)).toBe(
73
94
  'repeat(auto-fill, minmax(200px, calc((100% - 3 * var(--spacing-6)) / 4)))',
74
95
  );
75
96
  expect(grid.style.maxWidth).toBe('');
@@ -118,7 +139,7 @@ describe('Grid', () => {
118
139
  </Grid>,
119
140
  );
120
141
  const grid = screen.getByTestId('grid');
121
- expect(grid.style.gridTemplateColumns).toBe('1fr');
142
+ expect(templateColumns(grid)).toBe('1fr');
122
143
  });
123
144
 
124
145
  // --- P1: columns={0} guard (hardening #719) ---
@@ -131,7 +152,7 @@ describe('Grid', () => {
131
152
  );
132
153
  const grid = screen.getByTestId('grid');
133
154
  // columns={0} must not produce repeat(0, 1fr) — should fall back to default
134
- expect(grid.style.gridTemplateColumns).toBe('1fr');
155
+ expect(templateColumns(grid)).toBe('1fr');
135
156
  });
136
157
 
137
158
  it('falls back to 1fr when columns is negative', () => {
@@ -141,7 +162,7 @@ describe('Grid', () => {
141
162
  </Grid>,
142
163
  );
143
164
  const grid = screen.getByTestId('grid');
144
- expect(grid.style.gridTemplateColumns).toBe('1fr');
165
+ expect(templateColumns(grid)).toBe('1fr');
145
166
  });
146
167
 
147
168
  it('uses auto-fill without track-max cap when no max specified', () => {
@@ -151,9 +172,7 @@ describe('Grid', () => {
151
172
  </Grid>,
152
173
  );
153
174
  const grid = screen.getByTestId('grid');
154
- expect(grid.style.gridTemplateColumns).toBe(
155
- 'repeat(auto-fill, minmax(200px, 1fr))',
156
- );
175
+ expect(templateColumns(grid)).toBe('repeat(auto-fill, minmax(200px, 1fr))');
157
176
  expect(grid.style.maxWidth).toBe('');
158
177
  });
159
178
 
@@ -213,7 +232,7 @@ describe('Grid', () => {
213
232
  );
214
233
  const grid = screen.getByTestId('grid');
215
234
  // columnGap takes precedence over gap in track-max
216
- expect(grid.style.gridTemplateColumns).toBe(
235
+ expect(templateColumns(grid)).toBe(
217
236
  'repeat(auto-fill, minmax(200px, calc((100% - 2 * var(--spacing-6)) / 3)))',
218
237
  );
219
238
  expect(grid.style.maxWidth).toBe('');
@@ -226,7 +245,7 @@ describe('Grid', () => {
226
245
  </Grid>,
227
246
  );
228
247
  const grid = screen.getByTestId('grid');
229
- expect(grid.style.gridTemplateColumns).toBe(
248
+ expect(templateColumns(grid)).toBe(
230
249
  'repeat(auto-fill, minmax(150px, calc((100% - 1 * var(--spacing-3)) / 2)))',
231
250
  );
232
251
  expect(grid.style.maxWidth).toBe('');
@@ -239,7 +258,7 @@ describe('Grid', () => {
239
258
  </Grid>,
240
259
  );
241
260
  const grid = screen.getByTestId('grid');
242
- expect(grid.style.gridTemplateColumns).toBe(
261
+ expect(templateColumns(grid)).toBe(
243
262
  'repeat(auto-fill, minmax(100px, calc(100% / 3)))',
244
263
  );
245
264
  expect(grid.style.maxWidth).toBe('');
@@ -288,9 +307,7 @@ describe('Grid', () => {
288
307
  </Grid>,
289
308
  );
290
309
  const grid = screen.getByTestId('grid');
291
- expect(grid.style.gridTemplateColumns).toBe(
292
- 'repeat(auto-fill, minmax(280px, 1fr))',
293
- );
310
+ expect(templateColumns(grid)).toBe('repeat(auto-fill, minmax(280px, 1fr))');
294
311
  });
295
312
 
296
313
  it('renders with columns={{minWidth, repeat: "fit"}} using auto-fit', () => {
@@ -301,9 +318,7 @@ describe('Grid', () => {
301
318
  </Grid>,
302
319
  );
303
320
  const grid = screen.getByTestId('grid');
304
- expect(grid.style.gridTemplateColumns).toBe(
305
- 'repeat(auto-fit, minmax(280px, 1fr))',
306
- );
321
+ expect(templateColumns(grid)).toBe('repeat(auto-fit, minmax(280px, 1fr))');
307
322
  });
308
323
 
309
324
  it('renders with columns={{minWidth, repeat: "fill"}} using auto-fill', () => {
@@ -314,9 +329,7 @@ describe('Grid', () => {
314
329
  </Grid>,
315
330
  );
316
331
  const grid = screen.getByTestId('grid');
317
- expect(grid.style.gridTemplateColumns).toBe(
318
- 'repeat(auto-fill, minmax(280px, 1fr))',
319
- );
332
+ expect(templateColumns(grid)).toBe('repeat(auto-fill, minmax(280px, 1fr))');
320
333
  });
321
334
 
322
335
  it('renders with columns={{minWidth, max}} capping via track-max', () => {
@@ -328,7 +341,7 @@ describe('Grid', () => {
328
341
  );
329
342
  const grid = screen.getByTestId('grid');
330
343
  // Track-max limits columns — grid stays full width
331
- expect(grid.style.gridTemplateColumns).toBe(
344
+ expect(templateColumns(grid)).toBe(
332
345
  'repeat(auto-fill, minmax(280px, calc((100% - 2 * var(--spacing-4)) / 3)))',
333
346
  );
334
347
  expect(grid.style.maxWidth).toBe('');
@@ -345,7 +358,7 @@ describe('Grid', () => {
345
358
  </Grid>,
346
359
  );
347
360
  const grid = screen.getByTestId('grid');
348
- expect(grid.style.gridTemplateColumns).toBe(
361
+ expect(templateColumns(grid)).toBe(
349
362
  'repeat(auto-fit, minmax(280px, calc((100% - 2 * var(--spacing-4)) / 3)))',
350
363
  );
351
364
  expect(grid.style.maxWidth).toBe('');
package/src/Grid/Grid.tsx CHANGED
@@ -83,6 +83,18 @@ export interface GridProps extends BaseProps<HTMLDivElement> {
83
83
  */
84
84
  height?: SizeValue;
85
85
 
86
+ /**
87
+ * Maximum width of the grid container.
88
+ * Numbers are treated as pixels, strings are used as-is (e.g., '100%').
89
+ */
90
+ maxWidth?: SizeValue;
91
+
92
+ /**
93
+ * Minimum height of the grid container.
94
+ * Numbers are treated as pixels, strings are used as-is (e.g., '100%').
95
+ */
96
+ minHeight?: SizeValue;
97
+
86
98
  /**
87
99
  * Spacing between all grid items (both row and column).
88
100
  * Accepts numeric spacing steps: 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10.
@@ -140,6 +152,19 @@ const baseStyles = stylex.create({
140
152
  },
141
153
  });
142
154
 
155
+ // Dynamic track values compile to CSS variables + a class-level declaration
156
+ // (grid-template-columns: var(--x)) instead of a raw inline style, so
157
+ // consumer `xstyle` overrides — including ones inside @media queries — can
158
+ // still win. A raw inline `grid-template-columns` would beat any class.
159
+ const dynamicStyles = stylex.create({
160
+ templateColumns: (value: string) => ({
161
+ gridTemplateColumns: value,
162
+ }),
163
+ autoRows: (value: number) => ({
164
+ gridAutoRows: `${value}px`,
165
+ }),
166
+ });
167
+
143
168
  const alignStyles = stylex.create({
144
169
  start: {
145
170
  alignItems: 'start',
@@ -346,6 +371,8 @@ export function Grid({
346
371
  rowHeight,
347
372
  width,
348
373
  height,
374
+ maxWidth,
375
+ minHeight,
349
376
  gap,
350
377
  rowGap,
351
378
  columnGap,
@@ -399,16 +426,22 @@ export function Grid({
399
426
  gridTemplateColumns = '1fr';
400
427
  }
401
428
 
402
- // Build inline style for dynamic values
429
+ // Build inline style for dynamic values. Track templates go through
430
+ // dynamicStyles (CSS-var indirection) so xstyle/@media overrides work;
431
+ // width/height stay inline as explicit caller-set dimensions.
403
432
  const inlineStyle: React.CSSProperties = {
404
- gridTemplateColumns,
405
- ...(rowHeight != null && {gridAutoRows: `${rowHeight}px`}),
406
433
  ...(width != null && {
407
434
  width: typeof width === 'number' ? `${width}px` : width,
408
435
  }),
409
436
  ...(height != null && {
410
437
  height: typeof height === 'number' ? `${height}px` : height,
411
438
  }),
439
+ ...(maxWidth != null && {
440
+ maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth,
441
+ }),
442
+ ...(minHeight != null && {
443
+ minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,
444
+ }),
412
445
  };
413
446
 
414
447
  // For themeProps, extract numeric columns value for variant tracking
@@ -426,6 +459,8 @@ export function Grid({
426
459
  themeProps('grid', {columns: columnsVariant, gap, align, justify}),
427
460
  stylex.props(
428
461
  baseStyles.grid,
462
+ dynamicStyles.templateColumns(gridTemplateColumns),
463
+ rowHeight != null && dynamicStyles.autoRows(rowHeight),
429
464
  gap != null && gapStyles[gap],
430
465
  rowGap != null && rowGapStyles[rowGap],
431
466
  columnGap != null && columnGapStyles[columnGap],
@@ -51,7 +51,7 @@ export const docs = {
51
51
  { guidance: false, description: 'Resize icons with arbitrary pixel values; use the provided size props.' },
52
52
  { guidance: false, description: 'Mix icon styles (e.g. outline and filled) within the same context.' },
53
53
  { guidance: false, description: 'Render raw SVG elements; always wrap in Icon for consistent sizing and color.' },
54
- { guidance: false, description: 'Pass a `name` prop \u2014 Icon uses `icon` (not `name`) to specify which icon to render.' },
54
+ { guidance: false, description: 'Pass a `name` prop; Icon uses `icon` (not `name`) to specify which icon to render.' },
55
55
  ],
56
56
  },
57
57
  };
@@ -96,7 +96,7 @@ export const docsZh = {
96
96
  { guidance: false, description: 'Resize icons with arbitrary pixel values; use the provided size props.' },
97
97
  { guidance: false, description: 'Mix icon styles (e.g. outline and filled) within the same context.' },
98
98
  { guidance: false, description: 'Render raw SVG elements; always wrap in Icon for consistent sizing and color.' },
99
- { guidance: false, description: 'Pass a `name` prop \u2014 Icon uses `icon` (not `name`) to specify which icon to render.' },
99
+ { guidance: false, description: 'Pass a `name` prop; Icon uses `icon` (not `name`) to specify which icon to render.' },
100
100
  ],
101
101
  },
102
102
  };
@@ -116,7 +116,7 @@ export const docsDense = {
116
116
  { guidance: false, description: 'Resize icons with arbitrary pixel values; use the provided size props.' },
117
117
  { guidance: false, description: 'Mix icon styles (e.g. outline and filled) within the same context.' },
118
118
  { guidance: false, description: 'Render raw SVG elements; always wrap in Icon for consistent sizing and color.' },
119
- { guidance: false, description: '`name` prop \u2014 does not exist. Use `icon` to specify which icon to render.' },
119
+ { guidance: false, description: '`name` prop, which does not exist. Use `icon` to specify which icon to render.' },
120
120
  ],
121
121
  },
122
122
  propDescriptions: {
@@ -8,18 +8,28 @@ export const docs = {
8
8
  group: 'Field',
9
9
  category: 'Data Input',
10
10
  isHiddenFromOverview: true,
11
- keywords: ["inputgroup","addon","prefix","suffix","connected","grouped","input"],
11
+ keywords: [
12
+ 'inputgroup',
13
+ 'addon',
14
+ 'prefix',
15
+ 'suffix',
16
+ 'connected',
17
+ 'grouped',
18
+ 'input',
19
+ ],
12
20
  theming: {
13
21
  targets: [
14
22
  {className: 'astryx-input-group', visualProps: ['size', 'status']},
15
23
  ],
16
24
  },
17
- description: 'Groups an input with prefix/suffix addons in a visually connected container with shared border and focus ring.',
25
+ description:
26
+ 'Groups an input with prefix/suffix addons in a visually connected container with shared border and focus ring.',
18
27
  props: [
19
28
  {
20
29
  name: 'children',
21
30
  type: 'ReactNode',
22
- description: 'Input and InputGroupText children.',
31
+ description:
32
+ 'InputGroupText and compatible input children: TextInput, NumberInput, TimeInput, DateInput, Typeahead, Selector, or MultiSelector.',
23
33
  required: true,
24
34
  },
25
35
  {
@@ -84,39 +94,117 @@ export const docs = {
84
94
  description: 'Test selector.',
85
95
  },
86
96
  ],
87
- components: [
88
- {name: 'InputGroupText'},
89
- ],
97
+ components: [{name: 'InputGroupText'}],
90
98
  usage: {
91
- description: 'InputGroup connects an input with prefix/suffix addons in a single visual unit. Use it for URL fields, currency inputs, search fields with action buttons, or any input that needs contextual decorations.',
99
+ description:
100
+ 'InputGroup connects an input with prefix/suffix addons in a single visual unit. Use it for URL fields, currency inputs, search fields with action buttons, or any input that needs contextual decorations.',
92
101
  bestPractices: [
93
- {guidance: true, description: 'Use text addons to show units, prefixes, or suffixes that clarify the input format (e.g., "$", "kg", "https://").'},
94
- {guidance: true, description: 'Use InputGroupText for static prefixes/suffixes like "$", "kg", or "https://".'},
95
- {guidance: true, description: 'Set isLabelHidden on the inner input and let the group label be visible.'},
96
- {guidance: false, description: 'Don\'t put multiple text inputs in one group; use separate fields instead.'},
97
- {guidance: false, description: 'Don\'t use InputGroup for unrelated inputs; it\'s for a single input with decorations.'},
102
+ {
103
+ guidance: true,
104
+ description:
105
+ 'Use text addons to show units, prefixes, or suffixes that clarify the input format (e.g., "$", "kg", "https://").',
106
+ },
107
+ {
108
+ guidance: true,
109
+ description:
110
+ 'Use InputGroupText for static prefixes/suffixes like "$", "kg", or "https://".',
111
+ },
112
+ {
113
+ guidance: true,
114
+ description:
115
+ 'Use InputGroup with compatible single-line inputs: TextInput, NumberInput, TimeInput, DateInput, Typeahead, Selector, and MultiSelector.',
116
+ },
117
+ {
118
+ guidance: true,
119
+ description:
120
+ "Keep each inner input's label specific; grouped inputs automatically combine the group label with their own label and inherit the group description/status context.",
121
+ },
122
+ {
123
+ guidance: false,
124
+ description:
125
+ "Don't put multiple text inputs in one group; use separate fields instead.",
126
+ },
127
+ {
128
+ guidance: false,
129
+ description:
130
+ "Don't use InputGroup for unrelated inputs; it's for a single input with decorations.",
131
+ },
132
+ {
133
+ guidance: false,
134
+ description:
135
+ "Don't use InputGroup with TextArea, Slider, Switch, CheckboxInput, or RadioList.",
136
+ },
98
137
  ],
99
138
  anatomy: [
100
139
  {name: 'Label', required: true, description: 'Text above the group.'},
101
- {name: 'Prefix addon', required: false, description: 'Content before the input (text, icon, or button).'},
102
- {name: 'Input', required: true, description: 'The main input element (TextInput, NumberInput, etc.).'},
103
- {name: 'Suffix addon', required: false, description: 'Content after the input (text, icon, or button).'},
104
- {name: 'Status message', required: false, description: 'An error, warning, or success message below the group.'},
140
+ {
141
+ name: 'Prefix addon',
142
+ required: false,
143
+ description: 'Content before the input (text, icon, or button).',
144
+ },
145
+ {
146
+ name: 'Input',
147
+ required: true,
148
+ description:
149
+ 'The main input element (TextInput, NumberInput, TimeInput, DateInput, Typeahead, Selector, or MultiSelector).',
150
+ },
151
+ {
152
+ name: 'Suffix addon',
153
+ required: false,
154
+ description: 'Content after the input (text, icon, or button).',
155
+ },
156
+ {
157
+ name: 'Status message',
158
+ required: false,
159
+ description: 'An error, warning, or success message below the group.',
160
+ },
105
161
  ],
106
162
  },
107
163
  };
108
164
 
109
165
  /** @type {import('../docs-types').TranslationDoc} */
110
166
  export const docsDense = {
111
- description: 'groups input with prefix/suffix addons in a connected container',
167
+ description:
168
+ 'groups input with prefix/suffix addons in a connected container',
112
169
  usage: {
113
- description: 'InputGroup connects an input with addons. Use for URL fields, currency inputs, search with actions.',
170
+ description:
171
+ 'InputGroup connects an input with addons. Use for URL fields, currency inputs, search with actions.',
114
172
  bestPractices: [
115
- {guidance: true, description: 'Use text addons to show units, prefixes, or suffixes that clarify input format (e.g. "$", "kg", "https://").'},
116
- {guidance: true, description: 'Use InputGroupText for static prefixes/suffixes like "$", "kg", or "https://".'},
117
- {guidance: true, description: 'Set isLabelHidden on the inner input and let the group label be visible.'},
118
- {guidance: false, description: 'Don\'t put multiple text inputs in one group; use separate fields instead.'},
119
- {guidance: false, description: 'Don\'t use InputGroup for unrelated inputs; it\'s for a single input with decorations.'},
173
+ {
174
+ guidance: true,
175
+ description:
176
+ 'Use text addons to show units, prefixes, or suffixes that clarify input format (e.g. "$", "kg", "https://").',
177
+ },
178
+ {
179
+ guidance: true,
180
+ description:
181
+ 'Use InputGroupText for static prefixes/suffixes like "$", "kg", or "https://".',
182
+ },
183
+ {
184
+ guidance: true,
185
+ description:
186
+ 'Use InputGroup with compatible single-line inputs: TextInput, NumberInput, TimeInput, DateInput, Typeahead, Selector, and MultiSelector.',
187
+ },
188
+ {
189
+ guidance: true,
190
+ description:
191
+ "Keep each inner input's label specific; grouped inputs combine the group label with their own label and inherit group description/status.",
192
+ },
193
+ {
194
+ guidance: false,
195
+ description:
196
+ "Don't put multiple text inputs in one group; use separate fields instead.",
197
+ },
198
+ {
199
+ guidance: false,
200
+ description:
201
+ "Don't use InputGroup for unrelated inputs; it's for a single input with decorations.",
202
+ },
203
+ {
204
+ guidance: false,
205
+ description:
206
+ "Don't use InputGroup with TextArea, Slider, Switch, CheckboxInput, or RadioList.",
207
+ },
120
208
  ],
121
209
  },
122
210
  };