@astryxdesign/core 0.3.0 → 0.4.0-canary.058f476

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 (664) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +10 -2
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +22 -3
  5. package/dist/AppShell/AppShell.d.ts +2 -2
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +40 -9
  8. package/dist/AspectRatio/AspectRatio.d.ts +13 -0
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +10 -2
  11. package/dist/AspectRatio/index.d.ts.map +1 -1
  12. package/dist/AspectRatio/index.js +1 -2
  13. package/dist/Avatar/Avatar.d.ts.map +1 -1
  14. package/dist/Avatar/Avatar.js +33 -20
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  17. package/dist/Badge/Badge.d.ts.map +1 -1
  18. package/dist/Badge/Badge.js +1 -2
  19. package/dist/Badge/index.d.ts.map +1 -1
  20. package/dist/Badge/index.js +1 -2
  21. package/dist/Banner/Banner.d.ts +3 -0
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +32 -17
  24. package/dist/Blockquote/Blockquote.d.ts.map +1 -1
  25. package/dist/Blockquote/Blockquote.js +1 -2
  26. package/dist/Blockquote/index.d.ts.map +1 -1
  27. package/dist/Blockquote/index.js +1 -2
  28. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  29. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  30. package/dist/Breadcrumbs/index.d.ts +2 -1
  31. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  32. package/dist/Breadcrumbs/index.js +1 -0
  33. package/dist/Button/Button.d.ts.map +1 -1
  34. package/dist/Button/Button.js +12 -16
  35. package/dist/Calendar/Calendar.d.ts.map +1 -1
  36. package/dist/Calendar/Calendar.js +2 -1
  37. package/dist/Calendar/styles.d.ts +0 -2
  38. package/dist/Calendar/styles.d.ts.map +1 -1
  39. package/dist/Calendar/styles.js +0 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +1 -2
  42. package/dist/Card/index.d.ts.map +1 -1
  43. package/dist/Card/index.js +1 -2
  44. package/dist/Carousel/Carousel.d.ts.map +1 -1
  45. package/dist/Carousel/Carousel.js +8 -12
  46. package/dist/Center/Center.d.ts.map +1 -1
  47. package/dist/Center/Center.js +1 -2
  48. package/dist/Center/index.d.ts.map +1 -1
  49. package/dist/Center/index.js +1 -2
  50. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  51. package/dist/Chat/ChatDictationButton.js +2 -1
  52. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  53. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  54. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  55. package/dist/Chat/ChatSendButton.js +4 -3
  56. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  57. package/dist/Chat/ChatToolCalls.js +17 -17
  58. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  59. package/dist/Chat/useTriggerMenu.js +2 -6
  60. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  61. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  62. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  63. package/dist/ClickableCard/ClickableCard.js +3 -11
  64. package/dist/Code/Code.d.ts.map +1 -1
  65. package/dist/Code/Code.js +1 -2
  66. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  67. package/dist/CodeBlock/CodeBlock.js +84 -67
  68. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  69. package/dist/Collapsible/Collapsible.js +35 -15
  70. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  71. package/dist/CommandPalette/CommandPalette.js +5 -0
  72. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  73. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  75. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  76. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +32 -31
  79. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  80. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  81. package/dist/ContextMenu/ContextMenu.js +1 -1
  82. package/dist/ContextMenu/index.d.ts +2 -1
  83. package/dist/ContextMenu/index.d.ts.map +1 -1
  84. package/dist/ContextMenu/index.js +1 -0
  85. package/dist/DateInput/DateInput.d.ts +9 -2
  86. package/dist/DateInput/DateInput.d.ts.map +1 -1
  87. package/dist/DateInput/DateInput.js +47 -33
  88. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  89. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  90. package/dist/DateRangeInput/DateRangeInput.js +55 -32
  91. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  92. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  93. package/dist/DateTimeInput/DateTimeInput.js +54 -30
  94. package/dist/Dialog/Dialog.d.ts.map +1 -1
  95. package/dist/Dialog/Dialog.js +4 -4
  96. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  97. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  98. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  99. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  100. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  101. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  102. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  103. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  104. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  105. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  106. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  108. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  109. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  110. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
  111. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  112. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  113. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  114. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  115. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  116. package/dist/DropdownMenu/index.d.ts +2 -1
  117. package/dist/DropdownMenu/index.d.ts.map +1 -1
  118. package/dist/DropdownMenu/index.js +4 -0
  119. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  120. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  121. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  122. package/dist/EmptyState/EmptyState.js +9 -5
  123. package/dist/Field/InputClearButton.d.ts +16 -3
  124. package/dist/Field/InputClearButton.d.ts.map +1 -1
  125. package/dist/Field/InputClearButton.js +15 -4
  126. package/dist/Field/PanelSearchInput.d.ts +81 -0
  127. package/dist/Field/PanelSearchInput.d.ts.map +1 -0
  128. package/dist/Field/PanelSearchInput.js +151 -0
  129. package/dist/FileInput/FileInput.d.ts.map +1 -1
  130. package/dist/FileInput/FileInput.js +21 -10
  131. package/dist/Grid/Grid.d.ts.map +1 -1
  132. package/dist/Grid/Grid.js +1 -2
  133. package/dist/Grid/index.d.ts.map +1 -1
  134. package/dist/Grid/index.js +1 -2
  135. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  136. package/dist/HoverCard/useHoverCard.js +3 -19
  137. package/dist/Icon/globalIconRegistry.d.ts +5 -4
  138. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  139. package/dist/Icon/globalIconRegistry.js +5 -4
  140. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  141. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  142. package/dist/Indicator/CheckIndicator.js +155 -0
  143. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  144. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  145. package/dist/Indicator/CheckboxIndicator.js +173 -0
  146. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  147. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  148. package/dist/Indicator/RadioIndicator.js +137 -0
  149. package/dist/Indicator/index.d.ts +24 -0
  150. package/dist/Indicator/index.d.ts.map +1 -0
  151. package/dist/Indicator/index.js +26 -0
  152. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  153. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  154. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  155. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  156. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  157. package/dist/Indicator/indicatorRegistry.js +93 -0
  158. package/dist/Indicator/types.d.ts +177 -0
  159. package/dist/Indicator/types.d.ts.map +1 -0
  160. package/dist/Indicator/types.js +1 -0
  161. package/dist/Indicator/useIndicator.d.ts +18 -0
  162. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  163. package/dist/Indicator/useIndicator.js +30 -0
  164. package/dist/Item/Item.d.ts.map +1 -1
  165. package/dist/Item/Item.js +4 -8
  166. package/dist/Layer/useLayer.d.ts +14 -0
  167. package/dist/Layer/useLayer.d.ts.map +1 -1
  168. package/dist/Layer/useLayer.js +25 -2
  169. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  170. package/dist/Lightbox/Lightbox.js +80 -103
  171. package/dist/Link/Link.d.ts.map +1 -1
  172. package/dist/Link/Link.js +4 -5
  173. package/dist/MobileNav/MobileNav.js +8 -8
  174. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  175. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  176. package/dist/MoreMenu/MoreMenu.js +4 -0
  177. package/dist/MultiSelector/MultiSelector.d.ts +8 -1
  178. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  179. package/dist/MultiSelector/MultiSelector.js +205 -170
  180. package/dist/NumberInput/NumberInput.d.ts +27 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +230 -42
  183. package/dist/Outline/Outline.d.ts.map +1 -1
  184. package/dist/Outline/Outline.js +2 -3
  185. package/dist/Pagination/Pagination.d.ts.map +1 -1
  186. package/dist/Pagination/Pagination.js +61 -63
  187. package/dist/Popover/Popover.d.ts.map +1 -1
  188. package/dist/Popover/Popover.js +6 -8
  189. package/dist/Popover/usePopover.d.ts +15 -0
  190. package/dist/Popover/usePopover.d.ts.map +1 -1
  191. package/dist/Popover/usePopover.js +14 -2
  192. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  193. package/dist/PowerSearch/PowerSearch.js +1 -1
  194. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  195. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  196. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  197. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  198. package/dist/ProgressBar/ProgressBar.js +95 -6
  199. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  200. package/dist/RadioList/RadioListItem.js +29 -84
  201. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  202. package/dist/Resizable/ResizeHandle.js +2 -3
  203. package/dist/Section/Section.d.ts.map +1 -1
  204. package/dist/Section/Section.js +1 -2
  205. package/dist/Section/index.d.ts.map +1 -1
  206. package/dist/Section/index.js +1 -2
  207. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  208. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  209. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  210. package/dist/SelectableCard/SelectableCard.js +3 -11
  211. package/dist/Selector/Selector.d.ts +12 -1
  212. package/dist/Selector/Selector.d.ts.map +1 -1
  213. package/dist/Selector/Selector.js +293 -183
  214. package/dist/Selector/hooks.d.ts +18 -6
  215. package/dist/Selector/hooks.d.ts.map +1 -1
  216. package/dist/Selector/hooks.js +57 -40
  217. package/dist/SideNav/SideNav.d.ts.map +1 -1
  218. package/dist/SideNav/SideNav.js +1 -1
  219. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  220. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  221. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  222. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  223. package/dist/SideNav/SideNavHeading.js +56 -20
  224. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  225. package/dist/SideNav/SideNavItem.js +28 -22
  226. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  227. package/dist/Skeleton/Skeleton.js +1 -2
  228. package/dist/Skeleton/index.d.ts.map +1 -1
  229. package/dist/Skeleton/index.js +1 -2
  230. package/dist/Slider/Slider.d.ts.map +1 -1
  231. package/dist/Slider/Slider.js +2 -6
  232. package/dist/Stack/stack.stylex.d.ts +3 -3
  233. package/dist/Switch/Switch.d.ts.map +1 -1
  234. package/dist/Switch/Switch.js +14 -13
  235. package/dist/TabList/Tab.d.ts.map +1 -1
  236. package/dist/TabList/Tab.js +2 -3
  237. package/dist/TabList/TabMenu.d.ts.map +1 -1
  238. package/dist/TabList/TabMenu.js +41 -19
  239. package/dist/Table/BaseTable.d.ts.map +1 -1
  240. package/dist/Table/BaseTable.js +8 -0
  241. package/dist/Table/TableRow.d.ts +1 -1
  242. package/dist/Table/TableRow.d.ts.map +1 -1
  243. package/dist/Table/TableRow.js +4 -2
  244. package/dist/Table/index.d.ts +1 -1
  245. package/dist/Table/index.d.ts.map +1 -1
  246. package/dist/Table/index.js +1 -1
  247. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  248. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  249. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  250. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  251. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  252. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  255. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  256. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  257. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  258. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  259. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  260. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  261. package/dist/Table/tableContextMenu.js +2 -1
  262. package/dist/Table/types.d.ts +11 -0
  263. package/dist/Table/types.d.ts.map +1 -1
  264. package/dist/TextArea/TextArea.d.ts +10 -1
  265. package/dist/TextArea/TextArea.d.ts.map +1 -1
  266. package/dist/TextArea/TextArea.js +16 -6
  267. package/dist/TextInput/TextInput.d.ts +10 -1
  268. package/dist/TextInput/TextInput.d.ts.map +1 -1
  269. package/dist/TextInput/TextInput.js +13 -19
  270. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  271. package/dist/Thumbnail/Thumbnail.js +32 -26
  272. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  273. package/dist/TimeInput/TimeInput.js +14 -17
  274. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  275. package/dist/Timestamp/Timestamp.js +14 -3
  276. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  277. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  278. package/dist/Timestamp/formatInstant.d.ts +11 -1
  279. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  280. package/dist/Timestamp/formatInstant.js +3 -1
  281. package/dist/Token/Token.d.ts.map +1 -1
  282. package/dist/Token/Token.js +20 -11
  283. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  284. package/dist/Tokenizer/Tokenizer.js +4 -2
  285. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  286. package/dist/Tooltip/useTooltip.js +3 -19
  287. package/dist/TopNav/TopNav.d.ts.map +1 -1
  288. package/dist/TopNav/TopNav.js +6 -5
  289. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  290. package/dist/TopNav/TopNavHeading.js +54 -16
  291. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  292. package/dist/TopNav/TopNavItem.js +3 -9
  293. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  294. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  295. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  296. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  297. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  298. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  299. package/dist/TopNav/TopNavMenu.js +83 -38
  300. package/dist/TreeList/TreeList.d.ts.map +1 -1
  301. package/dist/TreeList/TreeList.js +13 -0
  302. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  303. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  304. package/dist/TreeList/TreeListBranches.js +14 -4
  305. package/dist/TreeList/TreeListItem.d.ts +11 -1
  306. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  307. package/dist/TreeList/TreeListItem.js +57 -30
  308. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  309. package/dist/Typeahead/BaseTypeahead.js +16 -8
  310. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  311. package/dist/VisuallyHidden/VisuallyHidden.js +1 -2
  312. package/dist/VisuallyHidden/index.d.ts.map +1 -1
  313. package/dist/VisuallyHidden/index.js +1 -2
  314. package/dist/astryx.css +86 -96
  315. package/dist/astryx.umd.js +56 -56
  316. package/dist/astryx.umd.js.map +4 -4
  317. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  318. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  319. package/dist/hooks/containerReveal.stylex.js +63 -0
  320. package/dist/hooks/index.d.ts +3 -0
  321. package/dist/hooks/index.d.ts.map +1 -1
  322. package/dist/hooks/index.js +2 -0
  323. package/dist/hooks/useClipboard.d.ts +59 -0
  324. package/dist/hooks/useClipboard.d.ts.map +1 -0
  325. package/dist/hooks/useClipboard.js +106 -0
  326. package/dist/hooks/useContainerReveal.d.ts +14 -8
  327. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  328. package/dist/hooks/useContainerReveal.js +28 -69
  329. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  330. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  331. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  332. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  333. package/dist/hooks/useInputStatusIcon.js +17 -4
  334. package/dist/hooks/useLongPress.d.ts.map +1 -1
  335. package/dist/hooks/useLongPress.js +12 -2
  336. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  337. package/dist/hooks/useScrollLock.js +33 -18
  338. package/dist/hooks/useStreamingText.d.ts +18 -3
  339. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  340. package/dist/hooks/useStreamingText.js +47 -7
  341. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  342. package/dist/hooks/useTreeFocus.js +9 -3
  343. package/dist/hooks/useTypeahead.d.ts +3 -2
  344. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  345. package/dist/hooks/useTypeahead.js +19 -7
  346. package/dist/index.d.ts +1 -0
  347. package/dist/index.d.ts.map +1 -1
  348. package/dist/index.js +1 -0
  349. package/dist/theme/defineTheme.d.ts +18 -2
  350. package/dist/theme/defineTheme.d.ts.map +1 -1
  351. package/dist/theme/defineTheme.js +10 -1
  352. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  353. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  354. package/dist/theme/derivedVarRegistry.js +14 -13
  355. package/dist/theme/expandColorScale.d.ts +3 -1
  356. package/dist/theme/expandColorScale.d.ts.map +1 -1
  357. package/dist/theme/expandColorScale.js +17 -7
  358. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  359. package/dist/theme/expandTypeScale.js +17 -0
  360. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  361. package/dist/theme/generateThemeRules.js +11 -0
  362. package/dist/theme/index.d.ts +2 -1
  363. package/dist/theme/index.d.ts.map +1 -1
  364. package/dist/theme/index.js +1 -1
  365. package/dist/theme/tokens.stylex.d.ts +12 -0
  366. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  367. package/dist/theme/tokens.stylex.js +23 -0
  368. package/dist/utils/focusOutline.stylex.d.ts +122 -0
  369. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  370. package/dist/utils/focusOutline.stylex.js +143 -0
  371. package/dist/utils/focusReturn.d.ts +24 -0
  372. package/dist/utils/focusReturn.d.ts.map +1 -0
  373. package/dist/utils/focusReturn.js +29 -0
  374. package/dist/utils/index.d.ts +2 -0
  375. package/dist/utils/index.d.ts.map +1 -1
  376. package/dist/utils/index.js +6 -1
  377. package/dist/utils/interactionModality.d.ts +34 -0
  378. package/dist/utils/interactionModality.d.ts.map +1 -0
  379. package/dist/utils/interactionModality.js +70 -0
  380. package/dist/utils/mergeRefs.d.ts.map +1 -1
  381. package/dist/utils/mergeRefs.js +7 -5
  382. package/dist/utils/rtlStyles.d.ts +2 -2
  383. package/dist/utils/rtlStyles.js +2 -2
  384. package/dist/utils/themeProps.d.ts +20 -1
  385. package/dist/utils/themeProps.d.ts.map +1 -1
  386. package/dist/utils/themeProps.js +8 -2
  387. package/locales/en.json +52 -0
  388. package/locales/pseudo.json +39 -0
  389. package/package.json +8 -3
  390. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  391. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  392. package/src/AlertDialog/AlertDialog.tsx +21 -3
  393. package/src/AppShell/AppShell.doc.mjs +14 -0
  394. package/src/AppShell/AppShell.test.tsx +139 -0
  395. package/src/AppShell/AppShell.tsx +32 -22
  396. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  397. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  398. package/src/AspectRatio/AspectRatio.tsx +13 -2
  399. package/src/AspectRatio/index.ts +0 -2
  400. package/src/Avatar/Avatar.doc.mjs +2 -13
  401. package/src/Avatar/Avatar.test.tsx +33 -8
  402. package/src/Avatar/Avatar.tsx +52 -50
  403. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  404. package/src/Badge/Badge.tsx +0 -2
  405. package/src/Badge/index.ts +0 -2
  406. package/src/Banner/Banner.test.tsx +58 -1
  407. package/src/Banner/Banner.tsx +33 -11
  408. package/src/Blockquote/Blockquote.tsx +0 -2
  409. package/src/Blockquote/index.ts +0 -2
  410. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  411. package/src/Breadcrumbs/index.ts +5 -1
  412. package/src/Button/Button.doc.mjs +2 -2
  413. package/src/Button/Button.tsx +22 -41
  414. package/src/Calendar/Calendar.tsx +2 -1
  415. package/src/Calendar/styles.ts +0 -8
  416. package/src/Card/Card.tsx +0 -2
  417. package/src/Card/index.ts +0 -2
  418. package/src/Carousel/Carousel.doc.mjs +3 -0
  419. package/src/Carousel/Carousel.tsx +10 -6
  420. package/src/Center/Center.tsx +0 -2
  421. package/src/Center/index.ts +0 -2
  422. package/src/Chat/Chat.doc.mjs +2 -0
  423. package/src/Chat/ChatDictationButton.tsx +7 -1
  424. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  425. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  426. package/src/Chat/ChatSendButton.tsx +2 -3
  427. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  428. package/src/Chat/ChatToolCalls.tsx +36 -16
  429. package/src/Chat/useTriggerMenu.tsx +2 -5
  430. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  431. package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
  432. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  433. package/src/ClickableCard/ClickableCard.tsx +6 -11
  434. package/src/Code/Code.tsx +0 -2
  435. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  436. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  437. package/src/CodeBlock/CodeBlock.tsx +57 -80
  438. package/src/Collapsible/Collapsible.tsx +22 -18
  439. package/src/CommandPalette/CommandPalette.test.tsx +83 -0
  440. package/src/CommandPalette/CommandPalette.tsx +5 -0
  441. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  442. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  443. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  444. package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
  445. package/src/ComplexSelector/ComplexSelector.tsx +41 -28
  446. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  447. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  448. package/src/ContextMenu/ContextMenu.tsx +3 -3
  449. package/src/ContextMenu/index.ts +5 -1
  450. package/src/DateInput/DateInput.doc.mjs +18 -3
  451. package/src/DateInput/DateInput.test.tsx +112 -11
  452. package/src/DateInput/DateInput.tsx +44 -25
  453. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  454. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  455. package/src/DateRangeInput/DateRangeInput.tsx +27 -21
  456. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  457. package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
  458. package/src/DateTimeInput/DateTimeInput.tsx +58 -17
  459. package/src/Dialog/Dialog.tsx +2 -9
  460. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  461. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  462. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  463. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  464. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  465. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  466. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  467. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  468. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
  469. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  470. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  471. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  472. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  473. package/src/DropdownMenu/index.ts +8 -1
  474. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  475. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  476. package/src/EmptyState/EmptyState.test.tsx +62 -0
  477. package/src/EmptyState/EmptyState.tsx +16 -6
  478. package/src/Field/Field.doc.mjs +1 -0
  479. package/src/Field/InputClearButton.test.tsx +117 -0
  480. package/src/Field/InputClearButton.tsx +30 -3
  481. package/src/Field/PanelSearchInput.tsx +271 -0
  482. package/src/FileInput/FileInput.tsx +21 -8
  483. package/src/Grid/Grid.tsx +0 -2
  484. package/src/Grid/index.ts +0 -2
  485. package/src/HoverCard/useHoverCard.tsx +2 -23
  486. package/src/Icon/Icon.doc.mjs +2 -1
  487. package/src/Icon/globalIconRegistry.tsx +5 -4
  488. package/src/Indicator/CheckIndicator.tsx +174 -0
  489. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  490. package/src/Indicator/Indicator.doc.mjs +344 -0
  491. package/src/Indicator/Indicator.test.tsx +393 -0
  492. package/src/Indicator/RadioIndicator.tsx +206 -0
  493. package/src/Indicator/index.ts +46 -0
  494. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  495. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  496. package/src/Indicator/indicatorRegistry.ts +120 -0
  497. package/src/Indicator/types.ts +197 -0
  498. package/src/Indicator/useIndicator.ts +39 -0
  499. package/src/Item/Item.doc.mjs +1 -1
  500. package/src/Item/Item.tsx +7 -14
  501. package/src/Layer/useLayer.doc.mjs +2 -2
  502. package/src/Layer/useLayer.test.tsx +85 -0
  503. package/src/Layer/useLayer.tsx +39 -1
  504. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  505. package/src/Lightbox/Lightbox.tsx +45 -49
  506. package/src/Link/Link.tsx +4 -11
  507. package/src/MobileNav/MobileNav.tsx +3 -3
  508. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  509. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  510. package/src/MoreMenu/MoreMenu.tsx +19 -0
  511. package/src/MultiSelector/MultiSelector.doc.mjs +18 -1
  512. package/src/MultiSelector/MultiSelector.test.tsx +387 -18
  513. package/src/MultiSelector/MultiSelector.tsx +267 -220
  514. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  515. package/src/NumberInput/NumberInput.test.tsx +726 -21
  516. package/src/NumberInput/NumberInput.tsx +353 -59
  517. package/src/Outline/Outline.tsx +2 -5
  518. package/src/Pagination/Pagination.doc.mjs +1 -1
  519. package/src/Pagination/Pagination.test.tsx +22 -7
  520. package/src/Pagination/Pagination.tsx +38 -35
  521. package/src/Popover/Popover.doc.mjs +2 -0
  522. package/src/Popover/Popover.tsx +6 -7
  523. package/src/Popover/usePopover.tsx +37 -4
  524. package/src/PowerSearch/PowerSearch.tsx +1 -1
  525. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  526. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  527. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  528. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  529. package/src/ProgressBar/ProgressBar.tsx +126 -30
  530. package/src/RadioList/RadioList.doc.mjs +4 -2
  531. package/src/RadioList/RadioListItem.tsx +31 -130
  532. package/src/Resizable/ResizeHandle.tsx +2 -9
  533. package/src/Section/Section.tsx +0 -2
  534. package/src/Section/index.ts +0 -2
  535. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  536. package/src/SelectableCard/SelectableCard.tsx +4 -9
  537. package/src/Selector/Selector.doc.mjs +17 -4
  538. package/src/Selector/Selector.test.tsx +1394 -100
  539. package/src/Selector/Selector.tsx +355 -212
  540. package/src/Selector/hooks.ts +77 -50
  541. package/src/SideNav/SideNav.test.tsx +46 -0
  542. package/src/SideNav/SideNav.tsx +1 -0
  543. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  544. package/src/SideNav/SideNavHeading.tsx +48 -10
  545. package/src/SideNav/SideNavItem.tsx +20 -12
  546. package/src/Skeleton/Skeleton.tsx +0 -2
  547. package/src/Skeleton/index.ts +0 -2
  548. package/src/Slider/Slider.tsx +2 -11
  549. package/src/Stack/Stack.doc.mjs +110 -0
  550. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  551. package/src/Switch/Switch.test.tsx +32 -0
  552. package/src/Switch/Switch.tsx +18 -10
  553. package/src/TabList/Tab.tsx +2 -9
  554. package/src/TabList/TabMenu.tsx +14 -21
  555. package/src/Table/BaseTable.tsx +11 -0
  556. package/src/Table/Table.test.tsx +31 -0
  557. package/src/Table/TableRow.tsx +6 -0
  558. package/src/Table/index.ts +1 -4
  559. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  560. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  561. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  562. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  563. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  564. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  565. package/src/Table/tableContextMenu.test.tsx +27 -0
  566. package/src/Table/tableContextMenu.tsx +1 -0
  567. package/src/Table/types.ts +11 -0
  568. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  569. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  570. package/src/TextArea/TextArea.doc.mjs +42 -2
  571. package/src/TextArea/TextArea.test.tsx +219 -0
  572. package/src/TextArea/TextArea.tsx +34 -7
  573. package/src/TextInput/TextInput.doc.mjs +18 -2
  574. package/src/TextInput/TextInput.test.tsx +189 -0
  575. package/src/TextInput/TextInput.tsx +25 -31
  576. package/src/Thumbnail/Thumbnail.tsx +2 -9
  577. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  578. package/src/TimeInput/TimeInput.test.tsx +84 -3
  579. package/src/TimeInput/TimeInput.tsx +26 -28
  580. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  581. package/src/Timestamp/Timestamp.test.tsx +91 -14
  582. package/src/Timestamp/Timestamp.tsx +14 -2
  583. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  584. package/src/Timestamp/formatInstant.ts +16 -1
  585. package/src/Token/Token.tsx +5 -28
  586. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  587. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  588. package/src/Tokenizer/Tokenizer.tsx +10 -2
  589. package/src/Tooltip/useTooltip.tsx +2 -23
  590. package/src/TopNav/TopNav.tsx +1 -3
  591. package/src/TopNav/TopNavHeading.tsx +42 -13
  592. package/src/TopNav/TopNavItem.tsx +3 -21
  593. package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
  594. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  595. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  596. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  597. package/src/TopNav/TopNavMenu.tsx +34 -37
  598. package/src/TreeList/TreeList.doc.mjs +5 -0
  599. package/src/TreeList/TreeList.test.tsx +208 -8
  600. package/src/TreeList/TreeList.tsx +22 -0
  601. package/src/TreeList/TreeListBranches.tsx +25 -2
  602. package/src/TreeList/TreeListItem.tsx +89 -52
  603. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  604. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  605. package/src/Typeahead/Typeahead.test.tsx +76 -3
  606. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -2
  607. package/src/VisuallyHidden/index.ts +0 -2
  608. package/src/hooks/containerReveal.stylex.ts +102 -0
  609. package/src/hooks/index.ts +4 -0
  610. package/src/hooks/useClipboard.doc.mjs +87 -0
  611. package/src/hooks/useClipboard.test.tsx +151 -0
  612. package/src/hooks/useClipboard.ts +135 -0
  613. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  614. package/src/hooks/useContainerReveal.test.tsx +42 -62
  615. package/src/hooks/useContainerReveal.ts +36 -91
  616. package/src/hooks/useImageMode.test.ts +1 -1
  617. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  618. package/src/hooks/useInputStatusIcon.tsx +8 -8
  619. package/src/hooks/useLongPress.test.tsx +18 -0
  620. package/src/hooks/useLongPress.ts +12 -2
  621. package/src/hooks/useScrollLock.test.ts +72 -0
  622. package/src/hooks/useScrollLock.ts +51 -19
  623. package/src/hooks/useStreamingText.test.ts +46 -1
  624. package/src/hooks/useStreamingText.ts +49 -7
  625. package/src/hooks/useTreeFocus.test.tsx +50 -0
  626. package/src/hooks/useTreeFocus.ts +14 -3
  627. package/src/hooks/useTypeahead.test.tsx +150 -0
  628. package/src/hooks/useTypeahead.ts +24 -9
  629. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  630. package/src/index.ts +1 -0
  631. package/src/serverSafeComponents.test.ts +665 -0
  632. package/src/theme/defineTheme.ts +27 -0
  633. package/src/theme/derivedVarRegistry.test.ts +21 -1
  634. package/src/theme/derivedVarRegistry.ts +19 -6
  635. package/src/theme/expandColorScale.test.ts +14 -0
  636. package/src/theme/expandColorScale.ts +24 -9
  637. package/src/theme/expandTypeScale.test.ts +43 -0
  638. package/src/theme/expandTypeScale.ts +17 -0
  639. package/src/theme/generateThemeRules.test.ts +78 -20
  640. package/src/theme/generateThemeRules.ts +11 -0
  641. package/src/theme/index.ts +15 -0
  642. package/src/theme/tokens.stylex.ts +18 -0
  643. package/src/theme/tokens.test.ts +37 -0
  644. package/src/utils/focusOutline.stylex.ts +177 -0
  645. package/src/utils/focusReturn.test.ts +42 -0
  646. package/src/utils/focusReturn.ts +31 -0
  647. package/src/utils/index.ts +5 -0
  648. package/src/utils/interactionModality.ts +74 -0
  649. package/src/utils/mergeRefs.test.ts +48 -0
  650. package/src/utils/mergeRefs.ts +12 -6
  651. package/src/utils/rtlStyles.ts +2 -2
  652. package/src/utils/themeProps.ts +26 -4
  653. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  654. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  655. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  656. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  657. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  658. package/dist/RadioList/radio.markers.stylex.js +0 -12
  659. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  660. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  661. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  662. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  663. package/src/RadioList/radio.markers.stylex.ts +0 -10
  664. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -1509,6 +1509,29 @@ describe('MultiSelector statusVariant forwarding', () => {
1509
1509
  });
1510
1510
  });
1511
1511
 
1512
+ describe('MultiSelector empty-state theme target', () => {
1513
+ const OPTIONS = ['Apple', 'Banana', 'Cherry'];
1514
+
1515
+ it('renders the astryx-multi-selector-empty-state target on the "No results found" element', async () => {
1516
+ const user = userEvent.setup();
1517
+ const {container} = render(
1518
+ <MultiSelector
1519
+ label="Fruit"
1520
+ options={OPTIONS}
1521
+ value={[]}
1522
+ onChange={() => {}}
1523
+ hasSearch
1524
+ />,
1525
+ );
1526
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
1527
+ await user.type(screen.getByRole('combobox', h), 'xyz');
1528
+
1529
+ const empty = container.querySelector('.astryx-multi-selector-empty-state');
1530
+ expect(empty).not.toBeNull();
1531
+ expect(empty).toHaveTextContent('No results found');
1532
+ });
1533
+ });
1534
+
1512
1535
  describe('MultiSelector clear icon theme target', () => {
1513
1536
  const ICON_OPTIONS = ['Apple', 'Banana', 'Orange'];
1514
1537
 
@@ -1523,7 +1546,7 @@ describe('MultiSelector clear icon theme target', () => {
1523
1546
  return icon as HTMLElement;
1524
1547
  };
1525
1548
 
1526
- it('renders the astryx-multi-selector-clear-icon target on the clear glyph', () => {
1549
+ it('renders the astryx-input-clear-icon target (plus the legacy alias) on the clear glyph', () => {
1527
1550
  render(
1528
1551
  <MultiSelector
1529
1552
  label="Fruit"
@@ -1533,11 +1556,13 @@ describe('MultiSelector clear icon theme target', () => {
1533
1556
  hasClear
1534
1557
  />,
1535
1558
  );
1536
- // The stable theme target lands on the icon element itself (not the
1537
- // button), so a theme can restyle just this glyph (color, size, hover)
1538
- // via `defineTheme` — a button-level target could not reach the icon's
1539
- // own color/size.
1559
+ // The canonical target lands on the icon element itself (not the button),
1560
+ // so a theme can restyle just this glyph (color, size, hover) via
1561
+ // `defineTheme` — a button-level target could not reach the icon's own
1562
+ // color/size. The original per-component name rides along for a
1563
+ // deprecation window.
1540
1564
  const icon = getClearIcon();
1565
+ expect(icon).toHaveClass('astryx-input-clear-icon');
1541
1566
  expect(icon).toHaveClass('astryx-multi-selector-clear-icon');
1542
1567
  expect(icon).toHaveClass('astryx-icon');
1543
1568
  });
@@ -1559,11 +1584,13 @@ describe('MultiSelector clear icon theme target', () => {
1559
1584
  expect(onChange).toHaveBeenCalledWith([]);
1560
1585
  });
1561
1586
 
1562
- it('renders the default icon (secondary color, sm size) byte-identically', () => {
1563
- // Pixel-identical default guard: the clear glyph must carry the exact same
1564
- // StyleX color/size classes as a standalone secondary/sm icon. The added
1565
- // target class is purely additive — it changes nothing until a theme
1566
- // targets it.
1587
+ it('routes the clear glyph through the shared clear button, keeping the legacy target', () => {
1588
+ // The clear affordance now composes the shared InputClearButton (a ghost
1589
+ // Button with a secondary/sm glyph), so the icon carries the canonical
1590
+ // `astryx-input-clear-icon` target and — for a deprecation window — the
1591
+ // original `astryx-multi-selector-clear-icon`. Aside from those target
1592
+ // classes it matches the shared button's own `close`/`sm`/`secondary`
1593
+ // glyph exactly, so the default look is defined in one place.
1567
1594
  render(
1568
1595
  <MultiSelector
1569
1596
  label="Fruit"
@@ -1574,6 +1601,8 @@ describe('MultiSelector clear icon theme target', () => {
1574
1601
  />,
1575
1602
  );
1576
1603
  const icon = getClearIcon();
1604
+ expect(icon).toHaveClass('astryx-input-clear-icon');
1605
+ expect(icon).toHaveClass('astryx-multi-selector-clear-icon');
1577
1606
 
1578
1607
  const {container: refContainer} = render(
1579
1608
  <Icon icon="close" size="sm" color="secondary" />,
@@ -1583,7 +1612,11 @@ describe('MultiSelector clear icon theme target', () => {
1583
1612
  const styleClasses = (el: HTMLElement) =>
1584
1613
  el.className
1585
1614
  .split(' ')
1586
- .filter(c => c !== 'astryx-multi-selector-clear-icon')
1615
+ .filter(
1616
+ c =>
1617
+ c !== 'astryx-input-clear-icon' &&
1618
+ c !== 'astryx-multi-selector-clear-icon',
1619
+ )
1587
1620
  .sort();
1588
1621
 
1589
1622
  expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
@@ -1671,9 +1704,12 @@ describe('MultiSelector indicator (chevron) icon theme target', () => {
1671
1704
  });
1672
1705
  });
1673
1706
 
1674
- it('renders the default icon (inherit color, sm size) byte-identically', () => {
1707
+ it('renders the default icon (secondary color, sm size) byte-identically', () => {
1675
1708
  // Pixel-identical default guard: the chevron glyph must carry the exact
1676
- // same StyleX color/size classes as a standalone inherit/sm icon. The added
1709
+ // same StyleX color/size classes as a standalone secondary/sm icon. The
1710
+ // glyph now sets --color-icon-secondary itself rather than inheriting it
1711
+ // from a wrapper span that set the same token, so the rendered color is
1712
+ // unchanged. The added
1677
1713
  // target class + data-state are purely additive — they change nothing until
1678
1714
  // a theme targets them.
1679
1715
  const {container} = render(
@@ -1687,12 +1723,12 @@ describe('MultiSelector indicator (chevron) icon theme target', () => {
1687
1723
  const icon = getIndicatorIcon(container);
1688
1724
 
1689
1725
  const {container: refContainer} = render(
1690
- <Icon icon="chevronDown" size="sm" color="inherit" />,
1726
+ <Icon icon="chevronDown" size="sm" color="secondary" />,
1691
1727
  );
1692
1728
  const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
1693
1729
 
1694
1730
  // Exclude the additive theme-target classes (the stable target + its
1695
- // reflected state class) so only the StyleX color/size classes remain.
1731
+ // reflected state class) so only StyleX classes remain.
1696
1732
  const themeTargetClasses = new Set([
1697
1733
  'astryx-multi-selector-indicator-icon',
1698
1734
  'collapsed',
@@ -1704,7 +1740,14 @@ describe('MultiSelector indicator (chevron) icon theme target', () => {
1704
1740
  .filter(c => !themeTargetClasses.has(c))
1705
1741
  .sort();
1706
1742
 
1707
- expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
1743
+ // A superset, not an exact match: the chevron additionally carries the
1744
+ // rotation styles, which live on the glyph precisely so a theme can reach
1745
+ // the transform through the same selector as the color. The guard that
1746
+ // matters is that every color/size class of a standalone icon is still
1747
+ // present — i.e. the default look has not drifted.
1748
+ expect(styleClasses(icon)).toEqual(
1749
+ expect.arrayContaining(styleClasses(refIcon)),
1750
+ );
1708
1751
  });
1709
1752
 
1710
1753
  it('exposes multi-selector-indicator-icon so a theme reaches the icon size and per-state color', () => {
@@ -1731,7 +1774,134 @@ describe('MultiSelector indicator (chevron) icon theme target', () => {
1731
1774
  });
1732
1775
  });
1733
1776
 
1777
+ describe('MultiSelector list structure', () => {
1778
+ it('does not draw a divider under select-all', async () => {
1779
+ const user = userEvent.setup();
1780
+ render(
1781
+ <MultiSelector
1782
+ label="Fruit"
1783
+ options={['Apple', 'Banana', 'Orange']}
1784
+ value={[]}
1785
+ onChange={() => {}}
1786
+ hasSelectAll
1787
+ />,
1788
+ );
1789
+ await user.click(screen.getByRole('combobox'));
1790
+ // Select-all is the first row of the list, not a section of its own. No
1791
+ // option here declares a divider and there is no search row, so the panel
1792
+ // should contain no rule at all.
1793
+ expect(document.querySelectorAll('[role="separator"]')).toHaveLength(0);
1794
+ const [first] = screen.getAllByRole('option', h);
1795
+ expect(first).toHaveTextContent('Select all');
1796
+ });
1797
+
1798
+ it('renders a section title as a plain heading inside the group, not a divider', async () => {
1799
+ const user = userEvent.setup();
1800
+ render(
1801
+ <MultiSelector
1802
+ label="Fruit"
1803
+ options={[
1804
+ {
1805
+ type: 'section',
1806
+ title: 'Citrus',
1807
+ options: [
1808
+ {value: 'orange', label: 'Orange'},
1809
+ {value: 'lemon', label: 'Lemon'},
1810
+ ],
1811
+ },
1812
+ ]}
1813
+ value={[]}
1814
+ onChange={() => {}}
1815
+ />,
1816
+ );
1817
+ await user.click(screen.getByRole('combobox'));
1818
+
1819
+ // A labeled Divider used to stand in for the heading; it rendered a
1820
+ // role="separator" as a direct child of the listbox and stacked a second
1821
+ // rule under the search row's own.
1822
+ expect(document.querySelectorAll('[role="separator"]')).toHaveLength(0);
1823
+
1824
+ const group = screen.getByRole('group', {name: 'Citrus', ...h});
1825
+ const heading = group.querySelector(
1826
+ '.astryx-multi-selector-section-heading',
1827
+ );
1828
+ expect(heading).toBeTruthy();
1829
+ expect(heading).toHaveTextContent('Citrus');
1830
+ // The group already carries the title as its accessible name, so the
1831
+ // visible heading must not announce it a second time.
1832
+ expect(heading).toHaveAttribute('aria-hidden', 'true');
1833
+ // ...and it precedes the options it heads.
1834
+ const [firstOption] = within(group).getAllByRole('option', h);
1835
+ expect(
1836
+ heading!.compareDocumentPosition(firstOption) &
1837
+ Node.DOCUMENT_POSITION_FOLLOWING,
1838
+ ).toBeTruthy();
1839
+ });
1840
+ });
1841
+
1734
1842
  describe('MultiSelector search affordances', () => {
1843
+ it('renders the search row seamlessly — no nested input box, a divider under it', async () => {
1844
+ const user = userEvent.setup();
1845
+ render(
1846
+ <MultiSelector
1847
+ label="Fruit"
1848
+ options={['Apple', 'Banana', 'Orange']}
1849
+ value={[]}
1850
+ onChange={() => {}}
1851
+ hasSearch
1852
+ />,
1853
+ );
1854
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
1855
+
1856
+ const search = screen.getByRole('combobox', h);
1857
+ // The row is the outer gutter; the input sits inside the rounded field.
1858
+ const row = search.closest('.astryx-multi-selector-search');
1859
+ const field = search.parentElement;
1860
+ if (!row || !field) {
1861
+ throw new Error('search row not found');
1862
+ }
1863
+ // The panel is already a bordered surface: the field inside it must not be
1864
+ // a second bordered box (this used to render a TextInput).
1865
+ expect(row).not.toHaveClass('astryx-text-input');
1866
+ expect(search.closest('.astryx-text-input')).toBeNull();
1867
+ // The field is a rounded box inset from the panel edge, shaped like the
1868
+ // option rows under it — not a full-bleed header strip.
1869
+ expect(field).not.toBe(row);
1870
+ // ...and a divider separates it from the options.
1871
+ const separator = document.querySelector('[role="separator"]');
1872
+ if (!separator) {
1873
+ throw new Error('divider not found');
1874
+ }
1875
+ // Order: row, then divider, then the listbox.
1876
+ expect(
1877
+ row.compareDocumentPosition(separator) & Node.DOCUMENT_POSITION_FOLLOWING,
1878
+ ).toBeTruthy();
1879
+ const listbox = screen.getByRole('listbox', h);
1880
+ expect(
1881
+ separator.compareDocumentPosition(listbox) &
1882
+ Node.DOCUMENT_POSITION_FOLLOWING,
1883
+ ).toBeTruthy();
1884
+ });
1885
+
1886
+ it('keeps the search row outside the scrolling option list', async () => {
1887
+ const user = userEvent.setup();
1888
+ render(
1889
+ <MultiSelector
1890
+ label="Fruit"
1891
+ options={['Apple', 'Banana', 'Orange']}
1892
+ value={[]}
1893
+ onChange={() => {}}
1894
+ hasSearch
1895
+ />,
1896
+ );
1897
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
1898
+ // The options scroll under the header rather than carrying it away, so the
1899
+ // field stays reachable in a long list.
1900
+ const search = screen.getByRole('combobox', h);
1901
+ const listbox = screen.getByRole('listbox', h);
1902
+ expect(listbox.contains(search)).toBe(false);
1903
+ });
1904
+
1735
1905
  it('renders a decorative (aria-hidden) magnifier icon whenever hasSearch is on', async () => {
1736
1906
  const user = userEvent.setup();
1737
1907
  render(
@@ -1745,8 +1915,7 @@ describe('MultiSelector search affordances', () => {
1745
1915
  );
1746
1916
  await user.click(screen.getByRole('button', {name: 'Fruit'}));
1747
1917
  const search = screen.getByRole('combobox', h);
1748
- // The search field is a TextInput; the magnifier is its startIcon, so it
1749
- // sits inside the input container as a sibling of the <input>.
1918
+ // The magnifier leads the search row, as a sibling of the <input>.
1750
1919
  const wrapper = search.parentElement;
1751
1920
  const magnifier = wrapper?.querySelector('.astryx-icon');
1752
1921
  expect(magnifier).toBeTruthy();
@@ -1871,3 +2040,203 @@ describe('MultiSelector search affordances', () => {
1871
2040
  expect(trigger).toHaveAttribute('aria-expanded', 'false');
1872
2041
  });
1873
2042
  });
2043
+
2044
+ describe('MultiSelector disabled state theme target', () => {
2045
+ const getSelectorRoot = (container: HTMLElement): HTMLElement => {
2046
+ const root = container.querySelector('.astryx-multi-selector');
2047
+ if (root == null) {
2048
+ throw new Error('multi-selector root not found');
2049
+ }
2050
+ return root as HTMLElement;
2051
+ };
2052
+
2053
+ it('reflects data-state="disabled" on the root when disabled', () => {
2054
+ const {container} = render(
2055
+ <MultiSelector
2056
+ label="Fruit"
2057
+ options={['Apple', 'Banana', 'Orange']}
2058
+ value={[]}
2059
+ onChange={() => {}}
2060
+ isDisabled
2061
+ />,
2062
+ );
2063
+ expect(getSelectorRoot(container)).toHaveAttribute(
2064
+ 'data-disabled',
2065
+ 'disabled',
2066
+ );
2067
+ });
2068
+
2069
+ it('omits the disabled class/attribute when enabled', () => {
2070
+ const {container} = render(
2071
+ <MultiSelector
2072
+ label="Fruit"
2073
+ options={['Apple', 'Banana', 'Orange']}
2074
+ value={[]}
2075
+ onChange={() => {}}
2076
+ />,
2077
+ );
2078
+ const root = getSelectorRoot(container);
2079
+ expect(root).not.toHaveAttribute('data-disabled');
2080
+ expect(root).not.toHaveClass('disabled');
2081
+ });
2082
+
2083
+ it('exposes the disabled state so a theme can key on it', () => {
2084
+ const theme = defineTheme({
2085
+ name: 'multi-selector-disabled-state-test',
2086
+ components: {
2087
+ 'multi-selector': {
2088
+ 'disabled:disabled': {opacity: '0.4'},
2089
+ },
2090
+ },
2091
+ });
2092
+ const css = generateThemeTestCSS(theme);
2093
+ expect(css).toContain('.astryx-multi-selector.disabled');
2094
+ expect(css).toContain('opacity: 0.4');
2095
+ });
2096
+ });
2097
+
2098
+ describe('MultiSelector dropdown option theme target', () => {
2099
+ const ROW_OPTIONS = ['Apple', 'Banana', 'Orange'];
2100
+
2101
+ it('renders astryx-multi-selector-option, with its size, on every dropdown row', async () => {
2102
+ const user = userEvent.setup();
2103
+ render(
2104
+ <MultiSelector
2105
+ label="Fruit"
2106
+ options={ROW_OPTIONS}
2107
+ value={[]}
2108
+ onChange={() => {}}
2109
+ size="lg"
2110
+ />,
2111
+ );
2112
+ await user.click(screen.getByRole('combobox'));
2113
+ const options = screen.getAllByRole('option', h);
2114
+ expect(options).toHaveLength(3);
2115
+ for (const option of options) {
2116
+ expect(option).toHaveClass('astryx-multi-selector-option');
2117
+ expect(option).toHaveClass('lg');
2118
+ expect(option).toHaveAttribute('data-size', 'lg');
2119
+ }
2120
+ });
2121
+
2122
+ it('carries the selected and disabled states a theme keys on', async () => {
2123
+ const user = userEvent.setup();
2124
+ render(
2125
+ <MultiSelector
2126
+ label="Fruit"
2127
+ options={[
2128
+ {value: 'apple', label: 'Apple'},
2129
+ {value: 'banana', label: 'Banana'},
2130
+ {value: 'orange', label: 'Orange', disabled: true},
2131
+ ]}
2132
+ value={['apple']}
2133
+ onChange={() => {}}
2134
+ />,
2135
+ );
2136
+ await user.click(screen.getByRole('combobox'));
2137
+ const [selected, plain, disabled] = screen.getAllByRole('option', h);
2138
+
2139
+ expect(selected).toHaveClass('selected');
2140
+ expect(selected).toHaveAttribute('data-selected', 'selected');
2141
+ expect(plain).not.toHaveClass('selected');
2142
+ expect(plain).not.toHaveAttribute('data-selected');
2143
+
2144
+ expect(disabled).toHaveClass('disabled');
2145
+ expect(disabled).toHaveAttribute('data-disabled', 'disabled');
2146
+ expect(plain).not.toHaveAttribute('data-disabled');
2147
+ });
2148
+
2149
+ it('marks the Select All row with the select-all state, not a separate target', async () => {
2150
+ const user = userEvent.setup();
2151
+ render(
2152
+ <MultiSelector
2153
+ label="Fruit"
2154
+ options={ROW_OPTIONS}
2155
+ value={[]}
2156
+ onChange={() => {}}
2157
+ hasSelectAll
2158
+ />,
2159
+ );
2160
+ await user.click(screen.getByRole('combobox'));
2161
+
2162
+ const [selectAllRow, ...regularRows] = screen.getAllByRole('option', h);
2163
+ expect(selectAllRow).toHaveTextContent('Select all');
2164
+ expect(selectAllRow).toHaveClass('astryx-multi-selector-option');
2165
+ expect(selectAllRow).toHaveClass('select-all');
2166
+ expect(selectAllRow).toHaveAttribute('data-select-all', 'select-all');
2167
+
2168
+ for (const row of regularRows) {
2169
+ expect(row).toHaveClass('astryx-multi-selector-option');
2170
+ expect(row).not.toHaveClass('select-all');
2171
+ expect(row).not.toHaveAttribute('data-select-all');
2172
+ }
2173
+ });
2174
+
2175
+ it('keeps the row targetable when renderOption replaces the label', async () => {
2176
+ const user = userEvent.setup();
2177
+ render(
2178
+ <MultiSelector
2179
+ label="Fruit"
2180
+ options={[{value: 'apple', label: 'Apple'}]}
2181
+ value={[]}
2182
+ onChange={() => {}}
2183
+ renderOption={option => (
2184
+ <span data-testid="custom-row">{option.label}</span>
2185
+ )}
2186
+ />,
2187
+ );
2188
+ await user.click(screen.getByRole('combobox'));
2189
+ const option = screen.getAllByRole('option', h)[0];
2190
+ // The row owns the typography, so custom content inherits the same
2191
+ // treatment the fallback label gets — and one row override reaches both.
2192
+ expect(option).toHaveClass('astryx-multi-selector-option');
2193
+ expect(within(option).getByTestId('custom-row')).toHaveTextContent('Apple');
2194
+ });
2195
+
2196
+ it('exposes the row target, its states and its size to defineTheme', () => {
2197
+ const theme = defineTheme({
2198
+ name: 'multi-selector-option-target-test',
2199
+ components: {
2200
+ 'multi-selector-option': {
2201
+ base: {borderRadius: '8px', fontWeight: '600'},
2202
+ selected: {backgroundColor: 'var(--color-background-muted)'},
2203
+ 'select-all': {fontWeight: '700'},
2204
+ 'size:lg': {borderRadius: '12px'},
2205
+ },
2206
+ },
2207
+ });
2208
+ const css = generateThemeTestCSS(theme);
2209
+ expect(css).toContain('.astryx-multi-selector-option {');
2210
+ expect(css).toContain('.astryx-multi-selector-option.selected');
2211
+ expect(css).toContain('.astryx-multi-selector-option.select-all');
2212
+ expect(css).toContain('.astryx-multi-selector-option.lg');
2213
+ });
2214
+ });
2215
+
2216
+ describe('MultiSelector popup theme target', () => {
2217
+ it('puts astryx-multi-selector-popup on the surface that paints, not the list inside it', async () => {
2218
+ const user = userEvent.setup();
2219
+ render(
2220
+ <MultiSelector
2221
+ label="Fruit"
2222
+ options={['Apple', 'Banana']}
2223
+ value={[]}
2224
+ onChange={() => {}}
2225
+ />,
2226
+ );
2227
+ await user.click(screen.getByRole('combobox', {name: /Fruit/}));
2228
+
2229
+ const popup = document.querySelector(
2230
+ '.astryx-multi-selector-popup',
2231
+ ) as HTMLElement;
2232
+ expect(popup).not.toBeNull();
2233
+ expect(popup).toHaveClass('astryx-popover-surface');
2234
+ // The scrolling list is a descendant, not the target itself.
2235
+ expect(popup.querySelector('[role="listbox"]')).not.toBeNull();
2236
+ expect(popup.getAttribute('role')).toBeNull();
2237
+
2238
+ const layer = document.querySelector('[popover]') as HTMLElement;
2239
+ expect(popup).not.toBe(layer);
2240
+ expect(layer.contains(popup)).toBe(true);
2241
+ });
2242
+ });