@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052

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 (728) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +6 -2
  4. package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
  5. package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
  6. package/dist/Avatar/Avatar.d.ts +58 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +240 -53
  9. package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
  10. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  11. package/dist/Avatar/AvatarStatusDot.js +144 -19
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
  17. package/dist/Banner/Banner.d.ts +9 -1
  18. package/dist/Banner/Banner.d.ts.map +1 -1
  19. package/dist/Banner/Banner.js +33 -4
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  21. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
  23. package/dist/Breadcrumbs/index.d.ts +6 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +10 -1
  26. package/dist/Button/Button.d.ts +8 -2
  27. package/dist/Button/Button.d.ts.map +1 -1
  28. package/dist/Button/Button.js +33 -4
  29. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  30. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  31. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  32. package/dist/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar/Calendar.js +80 -11
  34. package/dist/Calendar/dayCellUtils.d.ts +4 -4
  35. package/dist/Calendar/dayCellUtils.js +3 -3
  36. package/dist/Calendar/styles.d.ts +30 -31
  37. package/dist/Calendar/styles.d.ts.map +1 -1
  38. package/dist/Calendar/styles.js +30 -31
  39. package/dist/Card/Card.d.ts +8 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +28 -2
  42. package/dist/Carousel/Carousel.d.ts +4 -1
  43. package/dist/Carousel/Carousel.d.ts.map +1 -1
  44. package/dist/Carousel/Carousel.js +46 -16
  45. package/dist/Chat/ChatComposer.d.ts +8 -0
  46. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  47. package/dist/Chat/ChatComposer.js +46 -7
  48. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  49. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  50. package/dist/Chat/ChatComposerDrawer.js +11 -1
  51. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  52. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  53. package/dist/Chat/ChatComposerInput.js +36 -4
  54. package/dist/Chat/ChatContext.d.ts +33 -0
  55. package/dist/Chat/ChatContext.d.ts.map +1 -1
  56. package/dist/Chat/ChatContext.js +16 -2
  57. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatDictationButton.js +4 -2
  59. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  60. package/dist/Chat/ChatLayout.js +4 -4
  61. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  62. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  63. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  64. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  65. package/dist/Chat/ChatSendButton.js +7 -1
  66. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +27 -11
  69. package/dist/Chat/index.d.ts +2 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/index.js +1 -1
  72. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  73. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  74. package/dist/Chat/useChatStreamScroll.js +22 -8
  75. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  76. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  77. package/dist/Chat/useSpeechRecognition.js +1 -1
  78. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  79. package/dist/Chat/useTriggerMenu.js +2 -2
  80. package/dist/CheckboxInput/CheckboxInput.js +5 -5
  81. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  82. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  83. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  84. package/dist/Citation/Citation.d.ts +22 -1
  85. package/dist/Citation/Citation.d.ts.map +1 -1
  86. package/dist/Citation/Citation.js +20 -6
  87. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  88. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  89. package/dist/ClickableCard/ClickableCard.js +5 -2
  90. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  91. package/dist/CodeBlock/CodeBlock.js +22 -9
  92. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  93. package/dist/Collapsible/Collapsible.js +3 -1
  94. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  95. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  96. package/dist/CommandPalette/CommandPalette.js +45 -4
  97. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  98. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  99. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  100. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  101. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  102. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  103. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  104. package/dist/ContextMenu/ContextMenu.js +14 -5
  105. package/dist/ContextMenu/index.d.ts +1 -0
  106. package/dist/ContextMenu/index.d.ts.map +1 -1
  107. package/dist/ContextMenu/index.js +3 -1
  108. package/dist/DateInput/DateInput.d.ts +56 -2
  109. package/dist/DateInput/DateInput.d.ts.map +1 -1
  110. package/dist/DateInput/DateInput.js +59 -21
  111. package/dist/DateInput/index.d.ts +1 -1
  112. package/dist/DateInput/index.d.ts.map +1 -1
  113. package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
  114. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  115. package/dist/DateRangeInput/DateRangeInput.js +23 -20
  116. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  117. package/dist/DateTimeInput/DateTimeInput.js +33 -19
  118. package/dist/Dialog/Dialog.d.ts +3 -0
  119. package/dist/Dialog/Dialog.d.ts.map +1 -1
  120. package/dist/Dialog/Dialog.js +57 -6
  121. package/dist/Dialog/DialogContext.d.ts +7 -0
  122. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  123. package/dist/Dialog/DialogContext.js +2 -2
  124. package/dist/Dialog/DialogHeader.d.ts +5 -2
  125. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  126. package/dist/Dialog/DialogHeader.js +6 -1
  127. package/dist/Divider/Divider.js +1 -1
  128. package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
  129. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  130. package/dist/DropdownMenu/DropdownMenu.js +22 -5
  131. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  132. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  133. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
  134. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  135. package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
  136. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  137. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  138. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  139. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  140. package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
  141. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
  142. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
  143. package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
  144. package/dist/DropdownMenu/index.d.ts +10 -0
  145. package/dist/DropdownMenu/index.d.ts.map +1 -1
  146. package/dist/DropdownMenu/index.js +13 -0
  147. package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
  148. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
  149. package/dist/DropdownMenu/menuItemHover.js +33 -0
  150. package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
  151. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
  152. package/dist/DropdownMenu/menuItemRoles.js +10 -1
  153. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  154. package/dist/DropdownMenu/renderDropdownItems.js +21 -6
  155. package/dist/Field/Field.d.ts +3 -1
  156. package/dist/Field/Field.d.ts.map +1 -1
  157. package/dist/Field/Field.js +6 -4
  158. package/dist/Field/FieldLabel.d.ts +1 -1
  159. package/dist/Field/FieldLabel.d.ts.map +1 -1
  160. package/dist/Field/FieldLabel.js +43 -16
  161. package/dist/Field/inputStyles.stylex.d.ts +1 -0
  162. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  163. package/dist/Field/inputStyles.stylex.js +1 -0
  164. package/dist/FieldStatus/FieldStatus.d.ts +18 -0
  165. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  166. package/dist/FieldStatus/FieldStatus.js +60 -6
  167. package/dist/FileInput/FileInput.d.ts +10 -2
  168. package/dist/FileInput/FileInput.d.ts.map +1 -1
  169. package/dist/FileInput/FileInput.js +54 -35
  170. package/dist/HoverCard/HoverCard.d.ts +9 -1
  171. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  172. package/dist/HoverCard/HoverCard.js +2 -0
  173. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  174. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  175. package/dist/HoverCard/useHoverCard.js +17 -6
  176. package/dist/Icon/Icon.d.ts +22 -3
  177. package/dist/Icon/Icon.d.ts.map +1 -1
  178. package/dist/Icon/Icon.js +19 -3
  179. package/dist/Item/Item.d.ts +6 -1
  180. package/dist/Item/Item.d.ts.map +1 -1
  181. package/dist/Item/Item.js +22 -1
  182. package/dist/Layer/useLayer.d.ts +6 -0
  183. package/dist/Layer/useLayer.d.ts.map +1 -1
  184. package/dist/Layer/useLayer.js +2 -0
  185. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  186. package/dist/Lightbox/Lightbox.js +19 -13
  187. package/dist/Markdown/Markdown.d.ts.map +1 -1
  188. package/dist/Markdown/Markdown.js +7 -0
  189. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  190. package/dist/MobileNav/MobileNav.js +6 -1
  191. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  192. package/dist/MobileNav/MobileNavToggle.js +4 -0
  193. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  194. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  195. package/dist/MultiSelector/MultiSelector.js +104 -50
  196. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  197. package/dist/MultiSelector/hooks.js +16 -0
  198. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  199. package/dist/NumberInput/NumberInput.d.ts +10 -2
  200. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  201. package/dist/NumberInput/NumberInput.js +22 -17
  202. package/dist/Outline/Outline.d.ts +0 -1
  203. package/dist/Outline/Outline.d.ts.map +1 -1
  204. package/dist/Outline/Outline.js +0 -1
  205. package/dist/OverflowList/OverflowList.d.ts +20 -3
  206. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  207. package/dist/OverflowList/OverflowList.js +29 -4
  208. package/dist/Pagination/Pagination.d.ts.map +1 -1
  209. package/dist/Pagination/Pagination.js +11 -3
  210. package/dist/Popover/Popover.d.ts.map +1 -1
  211. package/dist/Popover/Popover.js +3 -2
  212. package/dist/Popover/usePopover.d.ts.map +1 -1
  213. package/dist/Popover/usePopover.js +3 -9
  214. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  215. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  216. package/dist/PowerSearch/PowerSearch.js +2 -0
  217. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  218. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  219. package/dist/RadioList/RadioList.d.ts +2 -2
  220. package/dist/RadioList/RadioListItem.js +4 -4
  221. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  222. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  223. package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
  224. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  225. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  226. package/dist/SelectableCard/SelectableCard.js +16 -13
  227. package/dist/Selector/Selector.d.ts +8 -0
  228. package/dist/Selector/Selector.d.ts.map +1 -1
  229. package/dist/Selector/Selector.js +65 -19
  230. package/dist/Selector/hooks.d.ts.map +1 -1
  231. package/dist/Selector/hooks.js +16 -0
  232. package/dist/SideNav/SideNav.d.ts.map +1 -1
  233. package/dist/SideNav/SideNav.js +5 -5
  234. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  235. package/dist/SideNav/SideNavCollapseButton.js +13 -10
  236. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  237. package/dist/SideNav/SideNavHeading.js +21 -8
  238. package/dist/SideNav/SideNavItem.d.ts +1 -1
  239. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  240. package/dist/SideNav/SideNavItem.js +12 -10
  241. package/dist/Slider/Slider.d.ts.map +1 -1
  242. package/dist/Slider/Slider.js +106 -36
  243. package/dist/Stack/stack.stylex.d.ts +9 -9
  244. package/dist/Switch/Switch.d.ts +8 -1
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +160 -91
  247. package/dist/TabList/Tab.js +2 -2
  248. package/dist/TabList/TabMenu.js +1 -1
  249. package/dist/Table/BaseTable.d.ts.map +1 -1
  250. package/dist/Table/BaseTable.js +33 -6
  251. package/dist/Table/TableCell.js +3 -3
  252. package/dist/Table/TableHeaderCell.js +3 -3
  253. package/dist/Table/index.d.ts +2 -0
  254. package/dist/Table/index.d.ts.map +1 -1
  255. package/dist/Table/index.js +1 -0
  256. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  257. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
  258. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  259. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
  260. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  261. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  262. package/dist/Table/plugins/rowStatus/index.js +3 -0
  263. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  264. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  265. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  266. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  267. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  268. package/dist/Table/plugins/selection/useTableSelection.js +7 -1
  269. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  270. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  271. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  272. package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
  273. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  274. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  275. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  276. package/dist/Table/types.d.ts +32 -0
  277. package/dist/Table/types.d.ts.map +1 -1
  278. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  279. package/dist/Table/useBaseTablePlugins.js +5 -3
  280. package/dist/TextArea/TextArea.d.ts +10 -1
  281. package/dist/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/TextArea/TextArea.js +18 -19
  283. package/dist/TextInput/TextInput.d.ts +10 -2
  284. package/dist/TextInput/TextInput.d.ts.map +1 -1
  285. package/dist/TextInput/TextInput.js +20 -17
  286. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  287. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  288. package/dist/Thumbnail/Thumbnail.js +97 -54
  289. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  290. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  291. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  292. package/dist/TimeInput/TimeInput.d.ts +10 -2
  293. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  294. package/dist/TimeInput/TimeInput.js +32 -21
  295. package/dist/Timestamp/Timestamp.d.ts +3 -1
  296. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  297. package/dist/Timestamp/Timestamp.js +8 -6
  298. package/dist/Toast/useToast.d.ts.map +1 -1
  299. package/dist/Toast/useToast.js +2 -5
  300. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  301. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  302. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  303. package/dist/Token/Token.d.ts +30 -3
  304. package/dist/Token/Token.d.ts.map +1 -1
  305. package/dist/Token/Token.js +17 -2
  306. package/dist/Token/index.d.ts +1 -1
  307. package/dist/Token/index.d.ts.map +1 -1
  308. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  309. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  310. package/dist/Tokenizer/Tokenizer.js +20 -6
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +17 -1
  313. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  314. package/dist/TopNav/TopNavHeading.js +18 -8
  315. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  316. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  319. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  320. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  321. package/dist/TopNav/TopNavMenu.js +68 -6
  322. package/dist/TreeList/TreeList.d.ts +12 -3
  323. package/dist/TreeList/TreeList.d.ts.map +1 -1
  324. package/dist/TreeList/TreeList.js +3 -0
  325. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  326. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  327. package/dist/TreeList/TreeListBranches.js +18 -10
  328. package/dist/TreeList/TreeListItem.d.ts +8 -2
  329. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  330. package/dist/TreeList/TreeListItem.js +59 -21
  331. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  332. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  333. package/dist/TreeList/index.d.ts +2 -2
  334. package/dist/TreeList/index.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  336. package/dist/Typeahead/BaseTypeahead.js +20 -11
  337. package/dist/Typeahead/Typeahead.d.ts +9 -2
  338. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  339. package/dist/Typeahead/Typeahead.js +3 -1
  340. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  341. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  342. package/dist/Typeahead/TypeaheadItem.js +20 -10
  343. package/dist/astryx.css +61 -39
  344. package/dist/astryx.umd.js +53 -53
  345. package/dist/astryx.umd.js.map +4 -4
  346. package/dist/authoring/doc.d.ts.map +1 -1
  347. package/dist/docs-types.d.ts +8 -0
  348. package/dist/docs-types.d.ts.map +1 -1
  349. package/dist/hooks/computeOverflow.d.ts +47 -0
  350. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  351. package/dist/hooks/computeOverflow.js +213 -0
  352. package/dist/hooks/index.d.ts +3 -0
  353. package/dist/hooks/index.d.ts.map +1 -1
  354. package/dist/hooks/index.js +3 -1
  355. package/dist/hooks/isRtlElement.d.ts +18 -0
  356. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  357. package/dist/hooks/isRtlElement.js +27 -0
  358. package/dist/hooks/useDevWarning.d.ts +18 -0
  359. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  360. package/dist/hooks/useDevWarning.js +49 -0
  361. package/dist/hooks/useGridFocus.d.ts +6 -1
  362. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  363. package/dist/hooks/useGridFocus.js +12 -9
  364. package/dist/hooks/useInputStatusIcon.d.ts +38 -0
  365. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
  366. package/dist/hooks/useInputStatusIcon.js +158 -0
  367. package/dist/hooks/useListFocus.d.ts +39 -1
  368. package/dist/hooks/useListFocus.d.ts.map +1 -1
  369. package/dist/hooks/useListFocus.js +54 -9
  370. package/dist/hooks/useOverflow.d.ts +19 -0
  371. package/dist/hooks/useOverflow.d.ts.map +1 -1
  372. package/dist/hooks/useOverflow.js +36 -25
  373. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  374. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  375. package/dist/i18n/InternationalizationContext.js +3 -0
  376. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  377. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  378. package/dist/i18n/InternationalizationProvider.js +5 -1
  379. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  380. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  381. package/dist/i18n/getLocaleDirection.js +29 -0
  382. package/dist/i18n/index.d.ts +6 -0
  383. package/dist/i18n/index.d.ts.map +1 -1
  384. package/dist/i18n/index.js +7 -1
  385. package/dist/i18n/resolve.d.ts.map +1 -1
  386. package/dist/i18n/resolve.js +7 -18
  387. package/dist/i18n/useDirection.d.ts +2 -0
  388. package/dist/i18n/useDirection.d.ts.map +1 -0
  389. package/dist/i18n/useDirection.js +27 -0
  390. package/dist/theme/Theme.d.ts.map +1 -1
  391. package/dist/theme/Theme.js +2 -7
  392. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  393. package/dist/theme/derivedVarRegistry.js +13 -0
  394. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  395. package/dist/theme/generateThemeRules.js +51 -0
  396. package/dist/theme/hct.d.ts +0 -1
  397. package/dist/theme/hct.d.ts.map +1 -1
  398. package/dist/theme/hct.js +1 -1
  399. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  400. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  401. package/dist/utils/devWarning.d.ts +42 -0
  402. package/dist/utils/devWarning.d.ts.map +1 -0
  403. package/dist/utils/devWarning.js +88 -0
  404. package/dist/utils/index.d.ts +4 -1
  405. package/dist/utils/index.d.ts.map +1 -1
  406. package/dist/utils/index.js +4 -2
  407. package/dist/utils/plainDate.d.ts +30 -0
  408. package/dist/utils/plainDate.d.ts.map +1 -1
  409. package/dist/utils/plainDate.js +65 -3
  410. package/dist/utils/rtlStyles.d.ts +24 -0
  411. package/dist/utils/rtlStyles.d.ts.map +1 -0
  412. package/dist/utils/rtlStyles.js +27 -0
  413. package/dist/utils/types.d.ts +13 -0
  414. package/dist/utils/types.d.ts.map +1 -1
  415. package/locales/en.json +104 -0
  416. package/locales/fr-FR.json +14 -0
  417. package/locales/pseudo.json +78 -0
  418. package/package.json +6 -1
  419. package/src/AppShell/AppShell.tsx +6 -0
  420. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  421. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  422. package/src/Avatar/Avatar.doc.mjs +64 -5
  423. package/src/Avatar/Avatar.test.tsx +374 -1
  424. package/src/Avatar/Avatar.tsx +367 -69
  425. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  426. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  427. package/src/Avatar/AvatarStatusDot.tsx +180 -21
  428. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  429. package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
  430. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  431. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  432. package/src/Banner/Banner.doc.mjs +9 -0
  433. package/src/Banner/Banner.test.tsx +30 -0
  434. package/src/Banner/Banner.tsx +53 -9
  435. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  436. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  437. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  438. package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
  439. package/src/Breadcrumbs/index.ts +31 -0
  440. package/src/Button/Button.doc.mjs +9 -4
  441. package/src/Button/Button.test.tsx +49 -0
  442. package/src/Button/Button.tsx +27 -3
  443. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  444. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  445. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  446. package/src/Calendar/Calendar.doc.mjs +12 -1
  447. package/src/Calendar/Calendar.test.tsx +362 -19
  448. package/src/Calendar/Calendar.tsx +111 -32
  449. package/src/Calendar/dayCellUtils.test.ts +23 -18
  450. package/src/Calendar/dayCellUtils.ts +3 -3
  451. package/src/Calendar/styles.ts +33 -39
  452. package/src/Card/Card.doc.mjs +9 -0
  453. package/src/Card/Card.test.tsx +21 -3
  454. package/src/Card/Card.tsx +35 -2
  455. package/src/Carousel/Carousel.doc.mjs +1 -0
  456. package/src/Carousel/Carousel.test.tsx +53 -0
  457. package/src/Carousel/Carousel.tsx +59 -10
  458. package/src/Chat/ChatComposer.doc.mjs +12 -3
  459. package/src/Chat/ChatComposer.test.tsx +115 -0
  460. package/src/Chat/ChatComposer.tsx +73 -9
  461. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  462. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  463. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  464. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  465. package/src/Chat/ChatComposerInput.tsx +51 -5
  466. package/src/Chat/ChatContext.tsx +37 -10
  467. package/src/Chat/ChatDictationButton.tsx +11 -2
  468. package/src/Chat/ChatLayout.tsx +7 -5
  469. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  470. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  471. package/src/Chat/ChatSendButton.tsx +11 -1
  472. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  473. package/src/Chat/ChatToolCalls.tsx +33 -5
  474. package/src/Chat/index.ts +5 -1
  475. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  476. package/src/Chat/useChatStreamScroll.ts +27 -10
  477. package/src/Chat/useSpeechRecognition.ts +1 -1
  478. package/src/Chat/useTriggerMenu.tsx +4 -2
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
  480. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  481. package/src/CheckboxInput/CheckboxInput.tsx +5 -5
  482. package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
  483. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  484. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  485. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  486. package/src/Citation/Citation.doc.mjs +4 -3
  487. package/src/Citation/Citation.test.tsx +97 -0
  488. package/src/Citation/Citation.tsx +43 -11
  489. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  490. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  491. package/src/ClickableCard/ClickableCard.tsx +13 -3
  492. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  493. package/src/CodeBlock/CodeBlock.tsx +45 -10
  494. package/src/Collapsible/Collapsible.doc.mjs +1 -0
  495. package/src/Collapsible/Collapsible.test.tsx +7 -0
  496. package/src/Collapsible/Collapsible.tsx +16 -6
  497. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  498. package/src/CommandPalette/CommandPalette.test.tsx +95 -1
  499. package/src/CommandPalette/CommandPalette.tsx +44 -3
  500. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  501. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  502. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  503. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  504. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  505. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  506. package/src/ContextMenu/ContextMenu.test.tsx +235 -0
  507. package/src/ContextMenu/ContextMenu.tsx +13 -11
  508. package/src/ContextMenu/index.ts +5 -0
  509. package/src/DateInput/DateInput.doc.mjs +41 -0
  510. package/src/DateInput/DateInput.test.tsx +338 -0
  511. package/src/DateInput/DateInput.tsx +119 -32
  512. package/src/DateInput/index.ts +1 -0
  513. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  514. package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
  515. package/src/DateRangeInput/DateRangeInput.tsx +42 -30
  516. package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
  517. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  518. package/src/DateTimeInput/DateTimeInput.tsx +58 -41
  519. package/src/Dialog/Dialog.doc.mjs +2 -2
  520. package/src/Dialog/Dialog.test.tsx +77 -4
  521. package/src/Dialog/Dialog.tsx +89 -5
  522. package/src/Dialog/DialogContext.ts +9 -2
  523. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  524. package/src/Dialog/DialogHeader.tsx +9 -2
  525. package/src/Divider/Divider.tsx +2 -2
  526. package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
  527. package/src/DropdownMenu/DropdownMenu.tsx +31 -12
  528. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
  529. package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
  530. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  531. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
  532. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
  533. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
  534. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
  535. package/src/DropdownMenu/index.ts +16 -0
  536. package/src/DropdownMenu/menuItemHover.ts +39 -0
  537. package/src/DropdownMenu/menuItemRoles.ts +9 -0
  538. package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
  539. package/src/Field/Field.test.tsx +57 -12
  540. package/src/Field/Field.tsx +20 -14
  541. package/src/Field/FieldLabel.tsx +9 -1
  542. package/src/Field/inputStyles.stylex.ts +2 -0
  543. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  544. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  545. package/src/FieldStatus/FieldStatus.tsx +69 -5
  546. package/src/FileInput/FileInput.doc.mjs +23 -2
  547. package/src/FileInput/FileInput.test.tsx +135 -12
  548. package/src/FileInput/FileInput.tsx +65 -51
  549. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  550. package/src/HoverCard/HoverCard.test.tsx +21 -2
  551. package/src/HoverCard/HoverCard.tsx +11 -0
  552. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  553. package/src/HoverCard/useHoverCard.tsx +39 -5
  554. package/src/Icon/Icon.doc.mjs +16 -2
  555. package/src/Icon/Icon.test.tsx +89 -0
  556. package/src/Icon/Icon.tsx +58 -5
  557. package/src/IconButton/IconButton.doc.mjs +8 -0
  558. package/src/IconButton/IconButton.test.tsx +15 -18
  559. package/src/Item/Item.test.tsx +40 -18
  560. package/src/Item/Item.tsx +38 -2
  561. package/src/Layer/useLayer.tsx +8 -0
  562. package/src/Lightbox/Lightbox.tsx +15 -7
  563. package/src/List/List.test.tsx +9 -8
  564. package/src/Markdown/Markdown.test.tsx +21 -0
  565. package/src/Markdown/Markdown.tsx +4 -0
  566. package/src/MobileNav/MobileNav.tsx +12 -1
  567. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  568. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  569. package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
  570. package/src/MultiSelector/MultiSelector.test.tsx +498 -3
  571. package/src/MultiSelector/MultiSelector.tsx +149 -65
  572. package/src/MultiSelector/hooks.ts +17 -0
  573. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  574. package/src/NumberInput/NumberInput.doc.mjs +21 -0
  575. package/src/NumberInput/NumberInput.test.tsx +82 -7
  576. package/src/NumberInput/NumberInput.tsx +36 -28
  577. package/src/Outline/Outline.tsx +0 -1
  578. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  579. package/src/OverflowList/OverflowList.test.tsx +111 -0
  580. package/src/OverflowList/OverflowList.tsx +48 -8
  581. package/src/Pagination/Pagination.tsx +11 -3
  582. package/src/Popover/Popover.tsx +7 -4
  583. package/src/Popover/usePopover.tsx +9 -13
  584. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  585. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  586. package/src/PowerSearch/PowerSearch.tsx +10 -1
  587. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  588. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  589. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  590. package/src/RadioList/RadioList.doc.mjs +6 -0
  591. package/src/RadioList/RadioList.tsx +2 -2
  592. package/src/RadioList/RadioListItem.tsx +4 -4
  593. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
  594. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  595. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  596. package/src/SelectableCard/SelectableCard.tsx +29 -16
  597. package/src/Selector/Selector.doc.mjs +15 -0
  598. package/src/Selector/Selector.test.tsx +417 -0
  599. package/src/Selector/Selector.tsx +86 -21
  600. package/src/Selector/hooks.ts +17 -0
  601. package/src/SideNav/SideNav.test.tsx +119 -3
  602. package/src/SideNav/SideNav.tsx +1 -8
  603. package/src/SideNav/SideNavCollapseButton.tsx +15 -8
  604. package/src/SideNav/SideNavHeading.tsx +24 -8
  605. package/src/SideNav/SideNavItem.tsx +10 -4
  606. package/src/Slider/Slider.doc.mjs +6 -0
  607. package/src/Slider/Slider.test.tsx +314 -13
  608. package/src/Slider/Slider.tsx +117 -28
  609. package/src/Switch/Switch.doc.mjs +142 -42
  610. package/src/Switch/Switch.test.tsx +54 -1
  611. package/src/Switch/Switch.tsx +90 -33
  612. package/src/TabList/Tab.tsx +2 -2
  613. package/src/TabList/TabMenu.tsx +2 -2
  614. package/src/Table/BaseTable.tsx +37 -7
  615. package/src/Table/Table.doc.mjs +11 -0
  616. package/src/Table/Table.test.tsx +85 -0
  617. package/src/Table/TableCell.tsx +3 -3
  618. package/src/Table/TableHeaderCell.tsx +3 -3
  619. package/src/Table/index.ts +5 -0
  620. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
  621. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
  622. package/src/Table/plugins/rowStatus/index.ts +7 -0
  623. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  624. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  625. package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
  626. package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
  627. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  628. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  629. package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
  630. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  631. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  632. package/src/Table/types.ts +33 -0
  633. package/src/Table/useBaseTablePlugins.ts +10 -6
  634. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  635. package/src/Table/useTableSelection.doc.mjs +65 -14
  636. package/src/Table/useTableTreeData.doc.mjs +29 -0
  637. package/src/Table/useTableTreeState.doc.mjs +2 -2
  638. package/src/TextArea/TextArea.doc.mjs +21 -0
  639. package/src/TextArea/TextArea.test.tsx +32 -1
  640. package/src/TextArea/TextArea.tsx +27 -26
  641. package/src/TextInput/TextInput.doc.mjs +21 -0
  642. package/src/TextInput/TextInput.test.tsx +150 -0
  643. package/src/TextInput/TextInput.tsx +28 -25
  644. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  645. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  646. package/src/Thumbnail/Thumbnail.tsx +142 -42
  647. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  648. package/src/TimeInput/TimeInput.doc.mjs +21 -0
  649. package/src/TimeInput/TimeInput.test.tsx +99 -1
  650. package/src/TimeInput/TimeInput.tsx +43 -31
  651. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  652. package/src/Timestamp/Timestamp.test.tsx +32 -0
  653. package/src/Timestamp/Timestamp.tsx +28 -8
  654. package/src/Toast/useToast.tsx +7 -8
  655. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  656. package/src/Token/Token.test.tsx +21 -15
  657. package/src/Token/Token.tsx +31 -14
  658. package/src/Token/index.ts +1 -1
  659. package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
  660. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  661. package/src/Tokenizer/Tokenizer.tsx +30 -6
  662. package/src/Tooltip/Tooltip.test.tsx +46 -0
  663. package/src/Tooltip/useTooltip.tsx +20 -0
  664. package/src/TopNav/TopNav.test.tsx +125 -1
  665. package/src/TopNav/TopNavHeading.tsx +24 -8
  666. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  667. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  668. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  669. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  670. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  671. package/src/TopNav/TopNavMenu.tsx +83 -5
  672. package/src/TreeList/TreeList.doc.mjs +28 -0
  673. package/src/TreeList/TreeList.test.tsx +272 -0
  674. package/src/TreeList/TreeList.tsx +23 -2
  675. package/src/TreeList/TreeListBranches.tsx +24 -8
  676. package/src/TreeList/TreeListItem.tsx +84 -22
  677. package/src/TreeList/TreeListTypes.ts +27 -1
  678. package/src/TreeList/index.ts +2 -2
  679. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  680. package/src/Typeahead/Typeahead.doc.mjs +13 -0
  681. package/src/Typeahead/Typeahead.test.tsx +50 -0
  682. package/src/Typeahead/Typeahead.tsx +11 -1
  683. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  684. package/src/__tests__/inputWidthContract.test.tsx +62 -0
  685. package/src/authoring/doc.ts +1 -3
  686. package/src/doc-mjs.d.ts +19 -0
  687. package/src/docs-types.ts +5 -0
  688. package/src/hooks/computeOverflow.test.ts +422 -0
  689. package/src/hooks/computeOverflow.ts +290 -0
  690. package/src/hooks/index.ts +8 -0
  691. package/src/hooks/isRtlElement.ts +27 -0
  692. package/src/hooks/useDevWarning.test.tsx +45 -0
  693. package/src/hooks/useDevWarning.ts +54 -0
  694. package/src/hooks/useGridFocus.doc.mjs +3 -3
  695. package/src/hooks/useGridFocus.test.tsx +41 -0
  696. package/src/hooks/useGridFocus.ts +21 -10
  697. package/src/hooks/useInputStatusIcon.test.tsx +162 -0
  698. package/src/hooks/useInputStatusIcon.tsx +224 -0
  699. package/src/hooks/useListFocus.doc.mjs +25 -3
  700. package/src/hooks/useListFocus.test.tsx +153 -1
  701. package/src/hooks/useListFocus.ts +102 -9
  702. package/src/hooks/useOverflow.test.ts +96 -4
  703. package/src/hooks/useOverflow.ts +74 -33
  704. package/src/i18n/InternationalizationContext.ts +4 -0
  705. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  706. package/src/i18n/InternationalizationProvider.tsx +12 -2
  707. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  708. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  709. package/src/i18n/getLocaleDirection.ts +29 -0
  710. package/src/i18n/index.ts +6 -0
  711. package/src/i18n/resolve.ts +9 -21
  712. package/src/i18n/useDirection.ts +29 -0
  713. package/src/reset.css +0 -26
  714. package/src/reset.test.ts +60 -0
  715. package/src/theme/Theme.tsx +11 -14
  716. package/src/theme/derivedVarRegistry.test.ts +1 -0
  717. package/src/theme/derivedVarRegistry.ts +6 -0
  718. package/src/theme/generateThemeRules.test.ts +107 -0
  719. package/src/theme/generateThemeRules.ts +56 -0
  720. package/src/theme/hct.ts +1 -1
  721. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  722. package/src/utils/devWarning.test.ts +56 -0
  723. package/src/utils/devWarning.ts +102 -0
  724. package/src/utils/index.ts +8 -0
  725. package/src/utils/plainDate.test.ts +46 -6
  726. package/src/utils/plainDate.ts +69 -3
  727. package/src/utils/rtlStyles.ts +27 -0
  728. package/src/utils/types.ts +14 -0
@@ -20,8 +20,11 @@ import {
20
20
  import userEvent from '@testing-library/user-event';
21
21
  import {Selector} from './Selector';
22
22
  import {SelectorOption} from './SelectorOption';
23
+ import {Icon} from '../Icon';
23
24
  import {InputGroup, InputGroupText} from '../InputGroup';
24
25
  import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
26
+ import {defineTheme} from '../theme/defineTheme';
27
+ import {generateThemeCSSFlat} from '../theme/generateThemeRules';
25
28
 
26
29
  function politeRegion(): HTMLElement | null {
27
30
  return document.querySelector('[data-astryx-live-region="polite"]');
@@ -503,6 +506,58 @@ describe('Selector', () => {
503
506
  expect(search).toHaveAttribute('aria-activedescendant');
504
507
  });
505
508
 
509
+ it('PageDown/PageUp jump the highlight to the last/first filtered option', async () => {
510
+ const user = userEvent.setup();
511
+ render(
512
+ <Selector
513
+ label="Fruit"
514
+ options={OPTIONS}
515
+ value="Apple"
516
+ onChange={() => {}}
517
+ hasSearch
518
+ />,
519
+ );
520
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
521
+ const search = screen.getByRole('combobox', h);
522
+ // Filter to Apple and Banana so "last" means last *visible* option.
523
+ await user.type(search, 'a');
524
+ const options = screen.getAllByRole('option', h);
525
+ expect(options).toHaveLength(2);
526
+ await user.keyboard('{PageDown}');
527
+ expect(search).toHaveAttribute(
528
+ 'aria-activedescendant',
529
+ options[options.length - 1].id,
530
+ );
531
+ await user.keyboard('{PageUp}');
532
+ expect(search).toHaveAttribute('aria-activedescendant', options[0].id);
533
+ });
534
+
535
+ it('Home/End move the search caret, not the option highlight', async () => {
536
+ const user = userEvent.setup();
537
+ render(
538
+ <Selector
539
+ label="Fruit"
540
+ options={OPTIONS}
541
+ value="Apple"
542
+ onChange={() => {}}
543
+ hasSearch
544
+ />,
545
+ );
546
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
547
+ const search = screen.getByRole<HTMLInputElement>('combobox', h);
548
+ await user.type(search, 'an');
549
+ expect(search.selectionStart).toBe(2);
550
+ const activeBefore = search.getAttribute('aria-activedescendant');
551
+ // Home/End stay on the input for caret movement (APG editable
552
+ // combobox); the option highlight must not move.
553
+ await user.keyboard('{Home}');
554
+ expect(search.selectionStart).toBe(0);
555
+ expect(search.getAttribute('aria-activedescendant')).toBe(activeBefore);
556
+ await user.keyboard('{End}');
557
+ expect(search.selectionStart).toBe(2);
558
+ expect(search.getAttribute('aria-activedescendant')).toBe(activeBefore);
559
+ });
560
+
506
561
  it('does not render search input when hasSearch is false', async () => {
507
562
  const user = userEvent.setup();
508
563
  render(
@@ -694,6 +749,119 @@ describe('Selector', () => {
694
749
  expect(politeRegion()?.textContent ?? '').toBe('');
695
750
  });
696
751
  });
752
+
753
+ describe('grouped search', () => {
754
+ const GROUPED = [
755
+ {
756
+ type: 'section' as const,
757
+ title: 'Citrus',
758
+ options: [
759
+ {value: 'orange', label: 'Orange'},
760
+ {value: 'lemon', label: 'Lemon'},
761
+ ],
762
+ },
763
+ {
764
+ type: 'section' as const,
765
+ title: 'Berries',
766
+ options: [
767
+ {value: 'strawberry', label: 'Strawberry'},
768
+ {value: 'blueberry', label: 'Blueberry'},
769
+ ],
770
+ },
771
+ ];
772
+
773
+ it('keeps the group header above matching items while searching', async () => {
774
+ const user = userEvent.setup();
775
+ render(
776
+ <Selector
777
+ label="Fruit"
778
+ options={GROUPED}
779
+ onChange={() => {}}
780
+ hasSearch
781
+ />,
782
+ );
783
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
784
+ // "orange" only matches within the Citrus group.
785
+ await user.type(screen.getByRole('combobox', h), 'orange');
786
+
787
+ expect(
788
+ screen.getByRole('group', {name: 'Citrus', ...h}),
789
+ ).toBeInTheDocument();
790
+ const options = screen.getAllByRole('option', h);
791
+ expect(options).toHaveLength(1);
792
+ expect(options[0]).toHaveTextContent('Orange');
793
+ });
794
+
795
+ it('hides a group whose items have no match', async () => {
796
+ const user = userEvent.setup();
797
+ render(
798
+ <Selector
799
+ label="Fruit"
800
+ options={GROUPED}
801
+ onChange={() => {}}
802
+ hasSearch
803
+ />,
804
+ );
805
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
806
+ // "berry" only matches items inside the Berries group.
807
+ await user.type(screen.getByRole('combobox', h), 'berry');
808
+
809
+ expect(
810
+ screen.getByRole('group', {name: 'Berries', ...h}),
811
+ ).toBeInTheDocument();
812
+ expect(
813
+ screen.queryByRole('group', {name: 'Citrus', ...h}),
814
+ ).not.toBeInTheDocument();
815
+ expect(screen.getAllByRole('option', h)).toHaveLength(2);
816
+ });
817
+
818
+ it('lands keyboard focus on the correct option after filtering', async () => {
819
+ const user = userEvent.setup();
820
+ render(
821
+ <Selector
822
+ label="Fruit"
823
+ options={GROUPED}
824
+ onChange={() => {}}
825
+ hasSearch
826
+ />,
827
+ );
828
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
829
+ const search = screen.getByRole('combobox', h);
830
+ // "berry" leaves Strawberry, Blueberry (in that document order).
831
+ await user.type(search, 'berry');
832
+ const options = screen.getAllByRole('option', h);
833
+ expect(options.map(o => o.textContent)).toEqual([
834
+ 'Strawberry',
835
+ 'Blueberry',
836
+ ]);
837
+ await user.keyboard('{ArrowDown}');
838
+ expect(search).toHaveAttribute('aria-activedescendant', options[0].id);
839
+ await user.keyboard('{ArrowDown}');
840
+ expect(search).toHaveAttribute('aria-activedescendant', options[1].id);
841
+ });
842
+
843
+ it('shows the empty state when no group has a match', async () => {
844
+ const user = userEvent.setup();
845
+ render(
846
+ <Selector
847
+ label="Fruit"
848
+ options={GROUPED}
849
+ onChange={() => {}}
850
+ hasSearch
851
+ />,
852
+ );
853
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
854
+ await user.type(screen.getByRole('combobox', h), 'zzz');
855
+ expect(screen.queryAllByRole('option', h)).toHaveLength(0);
856
+ expect(
857
+ screen.queryByRole('group', {name: 'Citrus', ...h}),
858
+ ).not.toBeInTheDocument();
859
+ const listbox = screen.getByRole('listbox', h);
860
+ expect(
861
+ within(listbox).getByText('No results found'),
862
+ ).toBeInTheDocument();
863
+ });
864
+ });
697
865
  });
698
866
 
699
867
  describe('keyboard accessibility', () => {
@@ -722,6 +890,23 @@ describe('Selector', () => {
722
890
  expect(trigger).toHaveAttribute('aria-expanded', 'true');
723
891
  });
724
892
 
893
+ it('End/Home jump the highlight to the last/first option (non-search)', async () => {
894
+ const user = userEvent.setup();
895
+ render(<Selector label="Fruit" options={OPTIONS} />);
896
+
897
+ const trigger = screen.getByRole('combobox');
898
+ await user.click(trigger);
899
+ const options = screen.getAllByRole('option', h);
900
+
901
+ await user.keyboard('{End}');
902
+ expect(trigger).toHaveAttribute(
903
+ 'aria-activedescendant',
904
+ options[options.length - 1].id,
905
+ );
906
+ await user.keyboard('{Home}');
907
+ expect(trigger).toHaveAttribute('aria-activedescendant', options[0].id);
908
+ });
909
+
725
910
  it('opens and selects an option with Enter (no mouse)', async () => {
726
911
  const user = userEvent.setup();
727
912
  const onChange = vi.fn();
@@ -1004,3 +1189,235 @@ describe('Selector', () => {
1004
1189
  });
1005
1190
  });
1006
1191
  });
1192
+
1193
+ describe('Selector statusVariant forwarding', () => {
1194
+ it('defaults to attached (status renders with data-variant="attached")', () => {
1195
+ const {container} = render(
1196
+ <Selector
1197
+ label="Fruit"
1198
+ options={['Apple', 'Banana']}
1199
+ status={{type: 'error', message: 'Required'}}
1200
+ />,
1201
+ );
1202
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
1203
+ 'data-variant',
1204
+ 'attached',
1205
+ );
1206
+ });
1207
+
1208
+ it('forwards statusVariant="detached" to the underlying Field status', () => {
1209
+ const {container} = render(
1210
+ <Selector
1211
+ label="Fruit"
1212
+ options={['Apple', 'Banana']}
1213
+ status={{type: 'error', message: 'Required'}}
1214
+ statusVariant="detached"
1215
+ />,
1216
+ );
1217
+ expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
1218
+ 'data-variant',
1219
+ 'detached',
1220
+ );
1221
+ });
1222
+ });
1223
+
1224
+ describe('Selector clear icon theme target', () => {
1225
+ // Resolve the clear glyph span (the astryx-icon element inside the clear
1226
+ // button), independent of the theme target class.
1227
+ const getClearIcon = (): HTMLElement => {
1228
+ const button = screen.getByRole('button', {name: 'Clear Fruit'});
1229
+ const icon = button.querySelector('.astryx-icon');
1230
+ if (icon == null) {
1231
+ throw new Error('clear icon not found');
1232
+ }
1233
+ return icon as HTMLElement;
1234
+ };
1235
+
1236
+ it('renders the astryx-selector-clear-icon target on the clear glyph', () => {
1237
+ render(
1238
+ <Selector
1239
+ label="Fruit"
1240
+ options={OPTIONS}
1241
+ value="Banana"
1242
+ onChange={() => {}}
1243
+ hasClear
1244
+ />,
1245
+ );
1246
+ // The stable theme target lands on the icon element itself (not the
1247
+ // button), so a theme can restyle just this glyph (color, size, hover)
1248
+ // via `defineTheme` — a button-level target could not reach the icon's
1249
+ // own color/size.
1250
+ const icon = getClearIcon();
1251
+ expect(icon).toHaveClass('astryx-selector-clear-icon');
1252
+ expect(icon).toHaveClass('astryx-icon');
1253
+ });
1254
+
1255
+ it('keeps the clear button functional alongside the target', () => {
1256
+ const onChange = vi.fn();
1257
+ render(
1258
+ <Selector
1259
+ label="Fruit"
1260
+ options={OPTIONS}
1261
+ value="Banana"
1262
+ onChange={onChange}
1263
+ hasClear
1264
+ />,
1265
+ );
1266
+ const clear = screen.getByRole('button', {name: 'Clear Fruit'});
1267
+ expect(clear.tagName).toBe('BUTTON');
1268
+ fireEvent.click(clear);
1269
+ expect(onChange).toHaveBeenCalledWith(null);
1270
+ });
1271
+
1272
+ it('renders the default icon (secondary color, sm size) byte-identically', () => {
1273
+ // Pixel-identical default guard: the clear glyph must carry the exact same
1274
+ // StyleX color/size classes as a standalone secondary/sm icon. The added
1275
+ // target class is purely additive — it changes nothing until a theme
1276
+ // targets it.
1277
+ render(
1278
+ <Selector
1279
+ label="Fruit"
1280
+ options={OPTIONS}
1281
+ value="Banana"
1282
+ onChange={() => {}}
1283
+ hasClear
1284
+ />,
1285
+ );
1286
+ const icon = getClearIcon();
1287
+
1288
+ const {container: refContainer} = render(
1289
+ <Icon icon="close" size="sm" color="secondary" />,
1290
+ );
1291
+ const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
1292
+
1293
+ const styleClasses = (el: HTMLElement) =>
1294
+ el.className
1295
+ .split(' ')
1296
+ .filter(c => c !== 'astryx-selector-clear-icon')
1297
+ .sort();
1298
+
1299
+ expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
1300
+ });
1301
+
1302
+ it('exposes selector-clear-icon so a theme reaches the icon color, size, and hover', () => {
1303
+ // jsdom cannot resolve the @layer cascade, so the DOM-class assertion above
1304
+ // (target lands on the icon element) plus this generation assertion (the
1305
+ // theme emits same-element icon rules in @layer astryx-theme) together
1306
+ // prove the seam: a same-element theme rule wins over the icon's own
1307
+ // base-layer color/size.
1308
+ const theme = defineTheme({
1309
+ name: 'selector-clear-icon-test',
1310
+ components: {
1311
+ 'selector-clear-icon': {
1312
+ base: {
1313
+ width: '12px',
1314
+ height: '12px',
1315
+ fontSize: '12px',
1316
+ color: 'var(--color-icon-secondary)',
1317
+ ':hover': {color: 'var(--color-icon-primary)'},
1318
+ },
1319
+ },
1320
+ },
1321
+ });
1322
+ const css = generateThemeCSSFlat(theme);
1323
+ expect(css).toContain('.astryx-selector-clear-icon {');
1324
+ expect(css).toContain('width: 12px');
1325
+ expect(css).toContain('height: 12px');
1326
+ expect(css).toContain('.astryx-selector-clear-icon:hover {');
1327
+ expect(css).toContain('color: var(--color-icon-primary)');
1328
+ });
1329
+ });
1330
+
1331
+ describe('Selector indicator (chevron) icon theme target', () => {
1332
+ const getIndicatorIcon = (container: HTMLElement): HTMLElement => {
1333
+ // The chevron is the only glyph carrying the indicator target class.
1334
+ const icon = container.querySelector('.astryx-selector-indicator-icon');
1335
+ if (icon == null) {
1336
+ throw new Error('indicator icon not found');
1337
+ }
1338
+ return icon as HTMLElement;
1339
+ };
1340
+
1341
+ it('renders the astryx-selector-indicator-icon target on the chevron glyph', () => {
1342
+ const {container} = render(
1343
+ <Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
1344
+ );
1345
+ // The stable theme target lands on the icon element itself (not the trigger
1346
+ // button), so a theme can restyle just this glyph (color, size, hover) —
1347
+ // and each open/closed state — via `defineTheme`. A button-level target
1348
+ // could not reach the icon's own color/size.
1349
+ const icon = getIndicatorIcon(container);
1350
+ expect(icon).toHaveClass('astryx-selector-indicator-icon');
1351
+ expect(icon).toHaveClass('astryx-icon');
1352
+ // Open/closed state is reflected so a theme can target each state alone.
1353
+ expect(icon).toHaveAttribute('data-state', 'collapsed');
1354
+ });
1355
+
1356
+ it('reflects the expanded state on the chevron when the popover is open', async () => {
1357
+ const user = userEvent.setup();
1358
+ const {container} = render(
1359
+ <Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
1360
+ );
1361
+ await user.click(screen.getByRole('combobox'));
1362
+ await waitFor(() => {
1363
+ expect(getIndicatorIcon(container)).toHaveAttribute(
1364
+ 'data-state',
1365
+ 'expanded',
1366
+ );
1367
+ });
1368
+ });
1369
+
1370
+ it('renders the default icon (inherit color, sm size) byte-identically', () => {
1371
+ // Pixel-identical default guard: the chevron glyph must carry the exact
1372
+ // same StyleX color/size classes as a standalone inherit/sm icon. The added
1373
+ // target class + data-state are purely additive — they change nothing until
1374
+ // a theme targets them.
1375
+ const {container} = render(
1376
+ <Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
1377
+ );
1378
+ const icon = getIndicatorIcon(container);
1379
+
1380
+ const {container: refContainer} = render(
1381
+ <Icon icon="chevronDown" size="sm" color="inherit" />,
1382
+ );
1383
+ const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
1384
+
1385
+ // Exclude the additive theme-target classes (the stable target + its
1386
+ // reflected state class) so only the StyleX color/size classes remain.
1387
+ const themeTargetClasses = new Set([
1388
+ 'astryx-selector-indicator-icon',
1389
+ 'collapsed',
1390
+ 'expanded',
1391
+ ]);
1392
+ const styleClasses = (el: HTMLElement) =>
1393
+ el.className
1394
+ .split(' ')
1395
+ .filter(c => !themeTargetClasses.has(c))
1396
+ .sort();
1397
+
1398
+ expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
1399
+ });
1400
+
1401
+ it('exposes selector-indicator-icon so a theme reaches the icon size and per-state color', () => {
1402
+ // jsdom cannot resolve the @layer cascade, so the DOM-class assertions
1403
+ // above (target lands on the icon element) plus this generation assertion
1404
+ // (the theme emits same-element icon rules in @layer astryx-theme) together
1405
+ // prove the seam: a same-element theme rule wins over the icon's own
1406
+ // base-layer color/size.
1407
+ const theme = defineTheme({
1408
+ name: 'selector-indicator-icon-test',
1409
+ components: {
1410
+ 'selector-indicator-icon': {
1411
+ base: {width: '14px', height: '14px', fontSize: '14px'},
1412
+ 'state:expanded': {color: 'var(--color-icon-primary)'},
1413
+ },
1414
+ },
1415
+ });
1416
+ const css = generateThemeCSSFlat(theme);
1417
+ expect(css).toContain('.astryx-selector-indicator-icon {');
1418
+ expect(css).toContain('width: 14px');
1419
+ expect(css).toContain('height: 14px');
1420
+ expect(css).toContain('.astryx-selector-indicator-icon.expanded');
1421
+ expect(css).toContain('color: var(--color-icon-primary)');
1422
+ });
1423
+ });
@@ -37,6 +37,7 @@ import {
37
37
  inputStatusBorderStyles,
38
38
  inputStatusHoverShadowStyles,
39
39
  inputWrapperStyles,
40
+ type FieldStatusVariant,
40
41
  } from '../Field';
41
42
  import {Divider} from '../Divider';
42
43
  import {layerAnimations} from '../Layer/layerAnimations.stylex';
@@ -253,7 +254,7 @@ const styles = stylex.create({
253
254
  backgroundColor: 'transparent',
254
255
  border: 'none',
255
256
  cursor: 'pointer',
256
- textAlign: 'left',
257
+ textAlign: 'start',
257
258
  outline: 'none',
258
259
  },
259
260
  itemContent: {
@@ -433,6 +434,13 @@ interface SelectorPropsBase<
433
434
  * If message is provided, displays a message box below the selector.
434
435
  */
435
436
  status?: SelectorStatus;
437
+ /**
438
+ * How the status message is placed relative to the input.
439
+ * - 'attached': message overlaps directly below the input (bordered treatment)
440
+ * - 'detached': message floats below as a separate element with spacing
441
+ * @default 'attached'
442
+ */
443
+ statusVariant?: FieldStatusVariant;
436
444
 
437
445
  /**
438
446
  * Width of the field. Numbers are treated as pixels, strings are used as-is
@@ -537,6 +545,21 @@ function DefaultOption({option}: {option: SelectorOptionData}) {
537
545
  );
538
546
  }
539
547
 
548
+ // Case-insensitive substring match for a single option. The one predicate used
549
+ // by both the flat filter (count + keyboard nav) and the grouped renderer, so
550
+ // what is shown while searching stays in lockstep with the announced count.
551
+ function optionMatchesQuery(
552
+ option: SelectorOptionData,
553
+ query: string,
554
+ ): boolean {
555
+ if (!query) {
556
+ return true;
557
+ }
558
+ return (option.label ?? option.value)
559
+ .toLowerCase()
560
+ .includes(query.toLowerCase());
561
+ }
562
+
540
563
  // Case-insensitive substring filter over the selectable options. Shared by the
541
564
  // `filteredItems` memo (rendering) and the search-change handler, which needs
542
565
  // the count for the *next* query synchronously to announce it exactly once per
@@ -548,10 +571,7 @@ function filterOptionsByQuery(
548
571
  if (!query) {
549
572
  return items;
550
573
  }
551
- const q = query.toLowerCase();
552
- return items.filter(item =>
553
- (item.label ?? item.value).toLowerCase().includes(q),
554
- );
574
+ return items.filter(item => optionMatchesQuery(item, query));
555
575
  }
556
576
 
557
577
  /**
@@ -588,6 +608,7 @@ export function Selector<T extends SelectorOptionType>(
588
608
  placeholder: placeholderFromProps,
589
609
  size: sizeProp,
590
610
  status,
611
+ statusVariant = 'attached',
591
612
  labelTooltip,
592
613
  startIcon,
593
614
  htmlName,
@@ -858,10 +879,14 @@ export function Selector<T extends SelectorOptionType>(
858
879
  onChange={handleSearchChange}
859
880
  onKeyDown={e => {
860
881
  // Arrow keys navigate options; Enter selects; Escape/Tab close.
861
- // Home/End are left to the input for caret movement.
882
+ // Home/End are left to the input for caret movement (APG editable
883
+ // combobox); PageUp/PageDown are the sanctioned substitute for
884
+ // jumping to the first/last option.
862
885
  if (
863
886
  e.key === 'ArrowDown' ||
864
887
  e.key === 'ArrowUp' ||
888
+ e.key === 'PageUp' ||
889
+ e.key === 'PageDown' ||
865
890
  e.key === 'Enter' ||
866
891
  e.key === 'Escape' ||
867
892
  e.key === 'Tab'
@@ -934,16 +959,15 @@ export function Selector<T extends SelectorOptionType>(
934
959
 
935
960
  // Render all options (handling sections/dividers)
936
961
  const renderOptions = useCallback(() => {
937
- // When search is active, render filtered items flat (no sections/dividers)
938
- if (hasSearch && searchQuery) {
939
- if (filteredItems.length === 0) {
940
- return [
941
- <div key="empty" {...stylex.props(styles.emptyState)}>
942
- No results found
943
- </div>,
944
- ];
945
- }
946
- return filteredItems.map((item, index) => renderItem(item, index));
962
+ const isSearching = hasSearch && Boolean(searchQuery);
963
+
964
+ // Nothing matched across every group/option: show the empty state.
965
+ if (isSearching && filteredItems.length === 0) {
966
+ return [
967
+ <div key="empty" {...stylex.props(styles.emptyState)}>
968
+ No results found
969
+ </div>,
970
+ ];
947
971
  }
948
972
 
949
973
  let flatIndex = 0;
@@ -953,13 +977,27 @@ export function Selector<T extends SelectorOptionType>(
953
977
  const option = options[i];
954
978
 
955
979
  if (isDivider(option)) {
980
+ // While searching, a standalone divider between groups would orphan
981
+ // itself once its neighbors are filtered out, so skip it.
982
+ if (isSearching) {
983
+ continue;
984
+ }
956
985
  elements.push(<Divider key={`divider-${i}`} xstyle={styles.divider} />);
957
986
  } else if (isSection(option)) {
958
987
  const sectionItems: ReactNode[] = [];
959
988
  for (const opt of option.options) {
960
- sectionItems.push(renderItem(normalizeOption(opt), flatIndex));
989
+ const normalized = normalizeOption(opt);
990
+ if (isSearching && !optionMatchesQuery(normalized, searchQuery)) {
991
+ continue;
992
+ }
993
+ sectionItems.push(renderItem(normalized, flatIndex));
961
994
  flatIndex++;
962
995
  }
996
+ // Hide a group entirely (header + wrapper) when none of its items
997
+ // match the query, so no header is left standing over nothing.
998
+ if (sectionItems.length === 0) {
999
+ continue;
1000
+ }
963
1001
  if (option.title) {
964
1002
  elements.push(
965
1003
  <Divider
@@ -975,7 +1013,11 @@ export function Selector<T extends SelectorOptionType>(
975
1013
  </div>,
976
1014
  );
977
1015
  } else if (isOptionData(option)) {
978
- elements.push(renderItem(normalizeOption(option), flatIndex));
1016
+ const normalized = normalizeOption(option);
1017
+ if (isSearching && !optionMatchesQuery(normalized, searchQuery)) {
1018
+ continue;
1019
+ }
1020
+ elements.push(renderItem(normalized, flatIndex));
979
1021
  flatIndex++;
980
1022
  }
981
1023
  }
@@ -1004,7 +1046,7 @@ export function Selector<T extends SelectorOptionType>(
1004
1046
  isDisabled && inputWrapperStyles.disabled,
1005
1047
  !selectedItem && styles.triggerPlaceholder,
1006
1048
  status && inputStatusBorderStyles[status.type],
1007
- status && inputStatusHoverShadowStyles[status.type],
1049
+ status && !isDisabled && inputStatusHoverShadowStyles[status.type],
1008
1050
  inputGroup && groupStyles.inGroup,
1009
1051
  xstyle,
1010
1052
  ),
@@ -1067,7 +1109,17 @@ export function Selector<T extends SelectorOptionType>(
1067
1109
  onClick={handleClear}
1068
1110
  aria-label={t('@astryx.selector.clearLabel', {label})}
1069
1111
  {...stylex.props(styles.clearButton)}>
1070
- <Icon icon="close" size="sm" color="secondary" />
1112
+ <Icon
1113
+ icon="close"
1114
+ size="sm"
1115
+ color="secondary"
1116
+ // Stable theme target on the clear glyph itself, so a theme can
1117
+ // restyle just this icon (color, size, hover) via `defineTheme`.
1118
+ // Same-element rules in @layer astryx-theme win over the icon's
1119
+ // own base color/size, which a button-level target could not
1120
+ // reach.
1121
+ {...themeProps('selector-clear-icon')}
1122
+ />
1071
1123
  </button>
1072
1124
  )}
1073
1125
  <span
@@ -1083,7 +1135,19 @@ export function Selector<T extends SelectorOptionType>(
1083
1135
  color={STATUS_ICON_COLOR_MAP[status.type]}
1084
1136
  />
1085
1137
  ) : (
1086
- <Icon icon="chevronDown" size="sm" color="inherit" />
1138
+ <Icon
1139
+ icon="chevronDown"
1140
+ size="sm"
1141
+ color="inherit"
1142
+ // Stable theme target on the chevron glyph itself, so a theme can
1143
+ // restyle just this icon (color, size, hover) — and its
1144
+ // open/closed state — via `defineTheme`. Same-element rules in
1145
+ // @layer astryx-theme win over the icon's own base color/size,
1146
+ // which a button-level target could not reach.
1147
+ {...themeProps('selector-indicator-icon', {
1148
+ state: popover.isOpen ? 'expanded' : 'collapsed',
1149
+ })}
1150
+ />
1087
1151
  )}
1088
1152
  </span>
1089
1153
  </div>
@@ -1150,6 +1214,7 @@ export function Selector<T extends SelectorOptionType>(
1150
1214
  }
1151
1215
  : undefined
1152
1216
  }
1217
+ statusVariant={statusVariant}
1153
1218
  labelTooltip={labelTooltip}
1154
1219
  width={width}>
1155
1220
  {selectorContent}
@@ -318,6 +318,23 @@ export function useCombobox({
318
318
  }
319
319
  break;
320
320
 
321
+ // PageUp/PageDown mirror Home/End. In search mode Home/End stay on
322
+ // the input for caret movement (APG editable combobox), so these are
323
+ // the sanctioned substitute for jumping to the first/last option.
324
+ case 'PageUp':
325
+ e.preventDefault();
326
+ if (isOpen && enabledIndices.length > 0) {
327
+ setHighlightedIndex(enabledIndices[0]);
328
+ }
329
+ break;
330
+
331
+ case 'PageDown':
332
+ e.preventDefault();
333
+ if (isOpen && enabledIndices.length > 0) {
334
+ setHighlightedIndex(enabledIndices[enabledIndices.length - 1]);
335
+ }
336
+ break;
337
+
321
338
  case 'Delete':
322
339
  case 'Backspace':
323
340
  // Keyboard equivalent of the clear button (comboboxes-2): clear the