@astryxdesign/core 0.3.0 → 0.4.0-canary.3112e99

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 (594) 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 +9 -0
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +33 -20
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  15. package/dist/Banner/Banner.d.ts +3 -0
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -17
  18. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  20. package/dist/Breadcrumbs/index.d.ts +2 -1
  21. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/index.js +1 -0
  23. package/dist/Button/Button.d.ts.map +1 -1
  24. package/dist/Button/Button.js +12 -16
  25. package/dist/Calendar/Calendar.d.ts.map +1 -1
  26. package/dist/Calendar/Calendar.js +2 -1
  27. package/dist/Calendar/styles.d.ts +0 -2
  28. package/dist/Calendar/styles.d.ts.map +1 -1
  29. package/dist/Calendar/styles.js +0 -2
  30. package/dist/Carousel/Carousel.d.ts.map +1 -1
  31. package/dist/Carousel/Carousel.js +8 -12
  32. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  33. package/dist/Chat/ChatDictationButton.js +2 -1
  34. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  35. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  36. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  37. package/dist/Chat/ChatSendButton.js +4 -3
  38. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  39. package/dist/Chat/ChatToolCalls.js +17 -17
  40. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  41. package/dist/Chat/useTriggerMenu.js +2 -6
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  44. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  45. package/dist/ClickableCard/ClickableCard.js +3 -11
  46. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  47. package/dist/CodeBlock/CodeBlock.js +84 -67
  48. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  49. package/dist/Collapsible/Collapsible.js +35 -15
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  52. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  53. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +32 -31
  57. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  58. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  59. package/dist/ContextMenu/ContextMenu.js +1 -1
  60. package/dist/ContextMenu/index.d.ts +2 -1
  61. package/dist/ContextMenu/index.d.ts.map +1 -1
  62. package/dist/ContextMenu/index.js +1 -0
  63. package/dist/DateInput/DateInput.d.ts +9 -2
  64. package/dist/DateInput/DateInput.d.ts.map +1 -1
  65. package/dist/DateInput/DateInput.js +47 -33
  66. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  67. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  68. package/dist/DateRangeInput/DateRangeInput.js +55 -32
  69. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  70. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  71. package/dist/DateTimeInput/DateTimeInput.js +54 -30
  72. package/dist/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/Dialog/Dialog.js +4 -4
  74. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  75. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  76. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  79. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  82. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  84. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  86. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  88. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
  89. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  90. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  91. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  92. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  93. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  94. package/dist/DropdownMenu/index.d.ts +2 -1
  95. package/dist/DropdownMenu/index.d.ts.map +1 -1
  96. package/dist/DropdownMenu/index.js +4 -0
  97. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  98. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  99. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  100. package/dist/EmptyState/EmptyState.js +9 -5
  101. package/dist/Field/InputClearButton.d.ts +16 -3
  102. package/dist/Field/InputClearButton.d.ts.map +1 -1
  103. package/dist/Field/InputClearButton.js +15 -4
  104. package/dist/FileInput/FileInput.d.ts.map +1 -1
  105. package/dist/FileInput/FileInput.js +21 -10
  106. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  107. package/dist/HoverCard/useHoverCard.js +3 -19
  108. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  109. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/CheckIndicator.js +155 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  112. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  113. package/dist/Indicator/CheckboxIndicator.js +173 -0
  114. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  115. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  116. package/dist/Indicator/RadioIndicator.js +137 -0
  117. package/dist/Indicator/index.d.ts +24 -0
  118. package/dist/Indicator/index.d.ts.map +1 -0
  119. package/dist/Indicator/index.js +26 -0
  120. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  121. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  122. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  123. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  124. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  125. package/dist/Indicator/indicatorRegistry.js +93 -0
  126. package/dist/Indicator/types.d.ts +177 -0
  127. package/dist/Indicator/types.d.ts.map +1 -0
  128. package/dist/Indicator/types.js +1 -0
  129. package/dist/Indicator/useIndicator.d.ts +18 -0
  130. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  131. package/dist/Indicator/useIndicator.js +30 -0
  132. package/dist/Item/Item.d.ts.map +1 -1
  133. package/dist/Item/Item.js +4 -8
  134. package/dist/Layer/useLayer.d.ts +14 -0
  135. package/dist/Layer/useLayer.d.ts.map +1 -1
  136. package/dist/Layer/useLayer.js +25 -2
  137. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  138. package/dist/Lightbox/Lightbox.js +80 -103
  139. package/dist/Link/Link.d.ts.map +1 -1
  140. package/dist/Link/Link.js +4 -5
  141. package/dist/MobileNav/MobileNav.js +8 -8
  142. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  143. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  144. package/dist/MoreMenu/MoreMenu.js +4 -0
  145. package/dist/MultiSelector/MultiSelector.d.ts +8 -1
  146. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  147. package/dist/MultiSelector/MultiSelector.js +119 -95
  148. package/dist/NumberInput/NumberInput.d.ts +27 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +230 -42
  151. package/dist/Outline/Outline.d.ts.map +1 -1
  152. package/dist/Outline/Outline.js +2 -3
  153. package/dist/Pagination/Pagination.d.ts.map +1 -1
  154. package/dist/Pagination/Pagination.js +61 -63
  155. package/dist/Popover/Popover.d.ts.map +1 -1
  156. package/dist/Popover/Popover.js +6 -8
  157. package/dist/Popover/usePopover.d.ts +15 -0
  158. package/dist/Popover/usePopover.d.ts.map +1 -1
  159. package/dist/Popover/usePopover.js +14 -2
  160. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  161. package/dist/PowerSearch/PowerSearch.js +1 -1
  162. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  163. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  164. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  165. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  166. package/dist/ProgressBar/ProgressBar.js +95 -6
  167. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  168. package/dist/RadioList/RadioListItem.js +29 -84
  169. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  170. package/dist/Resizable/ResizeHandle.js +2 -3
  171. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  172. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  173. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  174. package/dist/SelectableCard/SelectableCard.js +3 -11
  175. package/dist/Selector/Selector.d.ts +12 -1
  176. package/dist/Selector/Selector.d.ts.map +1 -1
  177. package/dist/Selector/Selector.js +222 -111
  178. package/dist/Selector/hooks.d.ts +18 -6
  179. package/dist/Selector/hooks.d.ts.map +1 -1
  180. package/dist/Selector/hooks.js +57 -40
  181. package/dist/SideNav/SideNav.d.ts.map +1 -1
  182. package/dist/SideNav/SideNav.js +1 -1
  183. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  184. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  185. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  186. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  187. package/dist/SideNav/SideNavHeading.js +56 -20
  188. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  189. package/dist/SideNav/SideNavItem.js +28 -22
  190. package/dist/Slider/Slider.d.ts.map +1 -1
  191. package/dist/Slider/Slider.js +2 -6
  192. package/dist/Stack/stack.stylex.d.ts +3 -3
  193. package/dist/Switch/Switch.d.ts.map +1 -1
  194. package/dist/Switch/Switch.js +14 -13
  195. package/dist/TabList/Tab.d.ts.map +1 -1
  196. package/dist/TabList/Tab.js +2 -3
  197. package/dist/TabList/TabMenu.d.ts.map +1 -1
  198. package/dist/TabList/TabMenu.js +41 -19
  199. package/dist/Table/BaseTable.d.ts.map +1 -1
  200. package/dist/Table/BaseTable.js +8 -0
  201. package/dist/Table/TableRow.d.ts +1 -1
  202. package/dist/Table/TableRow.d.ts.map +1 -1
  203. package/dist/Table/TableRow.js +4 -2
  204. package/dist/Table/index.d.ts +1 -1
  205. package/dist/Table/index.d.ts.map +1 -1
  206. package/dist/Table/index.js +1 -1
  207. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  208. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  210. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  211. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  212. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  213. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  214. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  215. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  216. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  217. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  218. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  219. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  220. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  221. package/dist/Table/tableContextMenu.js +2 -1
  222. package/dist/Table/types.d.ts +11 -0
  223. package/dist/Table/types.d.ts.map +1 -1
  224. package/dist/TextArea/TextArea.d.ts +10 -1
  225. package/dist/TextArea/TextArea.d.ts.map +1 -1
  226. package/dist/TextArea/TextArea.js +16 -6
  227. package/dist/TextInput/TextInput.d.ts +10 -1
  228. package/dist/TextInput/TextInput.d.ts.map +1 -1
  229. package/dist/TextInput/TextInput.js +13 -19
  230. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  231. package/dist/Thumbnail/Thumbnail.js +32 -26
  232. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  233. package/dist/TimeInput/TimeInput.js +14 -17
  234. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  235. package/dist/Timestamp/Timestamp.js +14 -3
  236. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  237. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  238. package/dist/Timestamp/formatInstant.d.ts +11 -1
  239. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  240. package/dist/Timestamp/formatInstant.js +3 -1
  241. package/dist/Token/Token.d.ts.map +1 -1
  242. package/dist/Token/Token.js +20 -11
  243. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  244. package/dist/Tokenizer/Tokenizer.js +4 -2
  245. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  246. package/dist/Tooltip/useTooltip.js +3 -19
  247. package/dist/TopNav/TopNav.d.ts.map +1 -1
  248. package/dist/TopNav/TopNav.js +6 -5
  249. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavHeading.js +54 -16
  251. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavItem.js +3 -9
  253. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  254. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  255. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  256. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  258. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  259. package/dist/TopNav/TopNavMenu.js +83 -38
  260. package/dist/TreeList/TreeList.d.ts.map +1 -1
  261. package/dist/TreeList/TreeList.js +13 -0
  262. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  263. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  264. package/dist/TreeList/TreeListBranches.js +14 -4
  265. package/dist/TreeList/TreeListItem.d.ts +11 -1
  266. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  267. package/dist/TreeList/TreeListItem.js +57 -30
  268. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  269. package/dist/Typeahead/BaseTypeahead.js +16 -8
  270. package/dist/astryx.css +84 -96
  271. package/dist/astryx.umd.js +56 -56
  272. package/dist/astryx.umd.js.map +4 -4
  273. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  274. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  275. package/dist/hooks/containerReveal.stylex.js +63 -0
  276. package/dist/hooks/index.d.ts +3 -0
  277. package/dist/hooks/index.d.ts.map +1 -1
  278. package/dist/hooks/index.js +2 -0
  279. package/dist/hooks/useClipboard.d.ts +59 -0
  280. package/dist/hooks/useClipboard.d.ts.map +1 -0
  281. package/dist/hooks/useClipboard.js +106 -0
  282. package/dist/hooks/useContainerReveal.d.ts +14 -8
  283. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  284. package/dist/hooks/useContainerReveal.js +28 -69
  285. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  286. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  287. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  288. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  289. package/dist/hooks/useInputStatusIcon.js +17 -4
  290. package/dist/hooks/useLongPress.d.ts.map +1 -1
  291. package/dist/hooks/useLongPress.js +12 -2
  292. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  293. package/dist/hooks/useScrollLock.js +33 -18
  294. package/dist/hooks/useStreamingText.d.ts +18 -3
  295. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  296. package/dist/hooks/useStreamingText.js +47 -7
  297. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  298. package/dist/hooks/useTreeFocus.js +9 -3
  299. package/dist/hooks/useTypeahead.d.ts +3 -2
  300. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  301. package/dist/hooks/useTypeahead.js +19 -7
  302. package/dist/index.d.ts +1 -0
  303. package/dist/index.d.ts.map +1 -1
  304. package/dist/index.js +1 -0
  305. package/dist/theme/defineTheme.d.ts +18 -2
  306. package/dist/theme/defineTheme.d.ts.map +1 -1
  307. package/dist/theme/defineTheme.js +10 -1
  308. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  309. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  310. package/dist/theme/derivedVarRegistry.js +14 -13
  311. package/dist/theme/expandColorScale.d.ts +3 -1
  312. package/dist/theme/expandColorScale.d.ts.map +1 -1
  313. package/dist/theme/expandColorScale.js +17 -7
  314. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  315. package/dist/theme/expandTypeScale.js +17 -0
  316. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  317. package/dist/theme/generateThemeRules.js +11 -0
  318. package/dist/theme/index.d.ts +2 -1
  319. package/dist/theme/index.d.ts.map +1 -1
  320. package/dist/theme/index.js +1 -1
  321. package/dist/theme/tokens.stylex.d.ts +12 -0
  322. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  323. package/dist/theme/tokens.stylex.js +23 -0
  324. package/dist/utils/focusOutline.stylex.d.ts +122 -0
  325. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  326. package/dist/utils/focusOutline.stylex.js +143 -0
  327. package/dist/utils/focusReturn.d.ts +24 -0
  328. package/dist/utils/focusReturn.d.ts.map +1 -0
  329. package/dist/utils/focusReturn.js +29 -0
  330. package/dist/utils/index.d.ts +2 -0
  331. package/dist/utils/index.d.ts.map +1 -1
  332. package/dist/utils/index.js +6 -1
  333. package/dist/utils/mergeRefs.d.ts.map +1 -1
  334. package/dist/utils/mergeRefs.js +7 -5
  335. package/dist/utils/rtlStyles.d.ts +2 -2
  336. package/dist/utils/rtlStyles.js +2 -2
  337. package/dist/utils/themeProps.d.ts +20 -1
  338. package/dist/utils/themeProps.d.ts.map +1 -1
  339. package/dist/utils/themeProps.js +8 -2
  340. package/locales/en.json +52 -0
  341. package/locales/pseudo.json +39 -0
  342. package/package.json +8 -3
  343. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  344. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  345. package/src/AlertDialog/AlertDialog.tsx +21 -3
  346. package/src/AppShell/AppShell.doc.mjs +11 -0
  347. package/src/AppShell/AppShell.test.tsx +139 -0
  348. package/src/AppShell/AppShell.tsx +32 -22
  349. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  350. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  351. package/src/AspectRatio/AspectRatio.tsx +13 -0
  352. package/src/Avatar/Avatar.doc.mjs +2 -13
  353. package/src/Avatar/Avatar.test.tsx +33 -8
  354. package/src/Avatar/Avatar.tsx +52 -50
  355. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  356. package/src/Banner/Banner.test.tsx +58 -1
  357. package/src/Banner/Banner.tsx +33 -11
  358. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  359. package/src/Breadcrumbs/index.ts +5 -1
  360. package/src/Button/Button.doc.mjs +2 -2
  361. package/src/Button/Button.tsx +22 -41
  362. package/src/Calendar/Calendar.tsx +2 -1
  363. package/src/Calendar/styles.ts +0 -8
  364. package/src/Carousel/Carousel.doc.mjs +3 -0
  365. package/src/Carousel/Carousel.tsx +10 -6
  366. package/src/Chat/Chat.doc.mjs +2 -0
  367. package/src/Chat/ChatDictationButton.tsx +7 -1
  368. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  369. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  370. package/src/Chat/ChatSendButton.tsx +2 -3
  371. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  372. package/src/Chat/ChatToolCalls.tsx +36 -16
  373. package/src/Chat/useTriggerMenu.tsx +2 -5
  374. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  375. package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
  376. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  377. package/src/ClickableCard/ClickableCard.tsx +6 -11
  378. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  379. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  380. package/src/CodeBlock/CodeBlock.tsx +57 -80
  381. package/src/Collapsible/Collapsible.tsx +22 -18
  382. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  383. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  384. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  385. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  386. package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
  387. package/src/ComplexSelector/ComplexSelector.tsx +41 -28
  388. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  389. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  390. package/src/ContextMenu/ContextMenu.tsx +3 -3
  391. package/src/ContextMenu/index.ts +5 -1
  392. package/src/DateInput/DateInput.doc.mjs +18 -3
  393. package/src/DateInput/DateInput.test.tsx +112 -11
  394. package/src/DateInput/DateInput.tsx +44 -25
  395. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  396. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  397. package/src/DateRangeInput/DateRangeInput.tsx +27 -21
  398. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  399. package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
  400. package/src/DateTimeInput/DateTimeInput.tsx +58 -17
  401. package/src/Dialog/Dialog.tsx +2 -9
  402. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  403. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  404. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  405. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  406. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  407. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  408. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  409. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  410. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
  411. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  412. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  413. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  414. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  415. package/src/DropdownMenu/index.ts +8 -1
  416. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  417. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  418. package/src/EmptyState/EmptyState.test.tsx +62 -0
  419. package/src/EmptyState/EmptyState.tsx +16 -6
  420. package/src/Field/Field.doc.mjs +1 -0
  421. package/src/Field/InputClearButton.test.tsx +117 -0
  422. package/src/Field/InputClearButton.tsx +30 -3
  423. package/src/FileInput/FileInput.tsx +21 -8
  424. package/src/HoverCard/useHoverCard.tsx +2 -23
  425. package/src/Icon/Icon.doc.mjs +2 -1
  426. package/src/Indicator/CheckIndicator.tsx +174 -0
  427. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  428. package/src/Indicator/Indicator.doc.mjs +344 -0
  429. package/src/Indicator/Indicator.test.tsx +393 -0
  430. package/src/Indicator/RadioIndicator.tsx +206 -0
  431. package/src/Indicator/index.ts +46 -0
  432. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  433. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  434. package/src/Indicator/indicatorRegistry.ts +120 -0
  435. package/src/Indicator/types.ts +197 -0
  436. package/src/Indicator/useIndicator.ts +39 -0
  437. package/src/Item/Item.doc.mjs +1 -1
  438. package/src/Item/Item.tsx +7 -14
  439. package/src/Layer/useLayer.doc.mjs +2 -2
  440. package/src/Layer/useLayer.test.tsx +85 -0
  441. package/src/Layer/useLayer.tsx +39 -1
  442. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  443. package/src/Lightbox/Lightbox.tsx +45 -49
  444. package/src/Link/Link.tsx +4 -11
  445. package/src/MobileNav/MobileNav.tsx +3 -3
  446. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  447. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  448. package/src/MoreMenu/MoreMenu.tsx +19 -0
  449. package/src/MultiSelector/MultiSelector.doc.mjs +16 -1
  450. package/src/MultiSelector/MultiSelector.test.tsx +259 -16
  451. package/src/MultiSelector/MultiSelector.tsx +144 -121
  452. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  453. package/src/NumberInput/NumberInput.test.tsx +726 -21
  454. package/src/NumberInput/NumberInput.tsx +353 -59
  455. package/src/Outline/Outline.tsx +2 -5
  456. package/src/Pagination/Pagination.doc.mjs +1 -1
  457. package/src/Pagination/Pagination.test.tsx +22 -7
  458. package/src/Pagination/Pagination.tsx +38 -35
  459. package/src/Popover/Popover.doc.mjs +2 -0
  460. package/src/Popover/Popover.tsx +6 -7
  461. package/src/Popover/usePopover.tsx +37 -4
  462. package/src/PowerSearch/PowerSearch.tsx +1 -1
  463. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  464. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  465. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  466. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  467. package/src/ProgressBar/ProgressBar.tsx +126 -30
  468. package/src/RadioList/RadioList.doc.mjs +4 -2
  469. package/src/RadioList/RadioListItem.tsx +31 -130
  470. package/src/Resizable/ResizeHandle.tsx +2 -9
  471. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  472. package/src/SelectableCard/SelectableCard.tsx +4 -9
  473. package/src/Selector/Selector.doc.mjs +15 -4
  474. package/src/Selector/Selector.test.tsx +1234 -98
  475. package/src/Selector/Selector.tsx +254 -126
  476. package/src/Selector/hooks.ts +77 -50
  477. package/src/SideNav/SideNav.test.tsx +46 -0
  478. package/src/SideNav/SideNav.tsx +1 -0
  479. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  480. package/src/SideNav/SideNavHeading.tsx +48 -10
  481. package/src/SideNav/SideNavItem.tsx +20 -12
  482. package/src/Slider/Slider.tsx +2 -11
  483. package/src/Stack/Stack.doc.mjs +110 -0
  484. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  485. package/src/Switch/Switch.test.tsx +32 -0
  486. package/src/Switch/Switch.tsx +18 -10
  487. package/src/TabList/Tab.tsx +2 -9
  488. package/src/TabList/TabMenu.tsx +14 -21
  489. package/src/Table/BaseTable.tsx +11 -0
  490. package/src/Table/Table.test.tsx +31 -0
  491. package/src/Table/TableRow.tsx +6 -0
  492. package/src/Table/index.ts +1 -4
  493. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  494. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  495. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  496. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  497. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  498. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  499. package/src/Table/tableContextMenu.test.tsx +27 -0
  500. package/src/Table/tableContextMenu.tsx +1 -0
  501. package/src/Table/types.ts +11 -0
  502. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  503. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  504. package/src/TextArea/TextArea.doc.mjs +42 -2
  505. package/src/TextArea/TextArea.test.tsx +219 -0
  506. package/src/TextArea/TextArea.tsx +34 -7
  507. package/src/TextInput/TextInput.doc.mjs +18 -2
  508. package/src/TextInput/TextInput.test.tsx +189 -0
  509. package/src/TextInput/TextInput.tsx +25 -31
  510. package/src/Thumbnail/Thumbnail.tsx +2 -9
  511. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  512. package/src/TimeInput/TimeInput.test.tsx +84 -3
  513. package/src/TimeInput/TimeInput.tsx +26 -28
  514. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  515. package/src/Timestamp/Timestamp.test.tsx +91 -14
  516. package/src/Timestamp/Timestamp.tsx +14 -2
  517. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  518. package/src/Timestamp/formatInstant.ts +16 -1
  519. package/src/Token/Token.tsx +5 -28
  520. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  521. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  522. package/src/Tokenizer/Tokenizer.tsx +10 -2
  523. package/src/Tooltip/useTooltip.tsx +2 -23
  524. package/src/TopNav/TopNav.tsx +1 -3
  525. package/src/TopNav/TopNavHeading.tsx +42 -13
  526. package/src/TopNav/TopNavItem.tsx +3 -21
  527. package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
  528. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  529. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  530. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  531. package/src/TopNav/TopNavMenu.tsx +34 -37
  532. package/src/TreeList/TreeList.doc.mjs +5 -0
  533. package/src/TreeList/TreeList.test.tsx +208 -8
  534. package/src/TreeList/TreeList.tsx +22 -0
  535. package/src/TreeList/TreeListBranches.tsx +25 -2
  536. package/src/TreeList/TreeListItem.tsx +89 -52
  537. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  538. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  539. package/src/Typeahead/Typeahead.test.tsx +76 -3
  540. package/src/hooks/containerReveal.stylex.ts +102 -0
  541. package/src/hooks/index.ts +4 -0
  542. package/src/hooks/useClipboard.doc.mjs +87 -0
  543. package/src/hooks/useClipboard.test.tsx +151 -0
  544. package/src/hooks/useClipboard.ts +135 -0
  545. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  546. package/src/hooks/useContainerReveal.test.tsx +42 -62
  547. package/src/hooks/useContainerReveal.ts +36 -91
  548. package/src/hooks/useImageMode.test.ts +1 -1
  549. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  550. package/src/hooks/useInputStatusIcon.tsx +8 -8
  551. package/src/hooks/useLongPress.test.tsx +18 -0
  552. package/src/hooks/useLongPress.ts +12 -2
  553. package/src/hooks/useScrollLock.test.ts +72 -0
  554. package/src/hooks/useScrollLock.ts +51 -19
  555. package/src/hooks/useStreamingText.test.ts +46 -1
  556. package/src/hooks/useStreamingText.ts +49 -7
  557. package/src/hooks/useTreeFocus.test.tsx +50 -0
  558. package/src/hooks/useTreeFocus.ts +14 -3
  559. package/src/hooks/useTypeahead.test.tsx +150 -0
  560. package/src/hooks/useTypeahead.ts +24 -9
  561. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  562. package/src/index.ts +1 -0
  563. package/src/theme/defineTheme.ts +27 -0
  564. package/src/theme/derivedVarRegistry.test.ts +21 -1
  565. package/src/theme/derivedVarRegistry.ts +19 -6
  566. package/src/theme/expandColorScale.test.ts +14 -0
  567. package/src/theme/expandColorScale.ts +24 -9
  568. package/src/theme/expandTypeScale.test.ts +43 -0
  569. package/src/theme/expandTypeScale.ts +17 -0
  570. package/src/theme/generateThemeRules.test.ts +78 -20
  571. package/src/theme/generateThemeRules.ts +11 -0
  572. package/src/theme/index.ts +15 -0
  573. package/src/theme/tokens.stylex.ts +18 -0
  574. package/src/theme/tokens.test.ts +37 -0
  575. package/src/utils/focusOutline.stylex.ts +177 -0
  576. package/src/utils/focusReturn.test.ts +42 -0
  577. package/src/utils/focusReturn.ts +31 -0
  578. package/src/utils/index.ts +5 -0
  579. package/src/utils/mergeRefs.test.ts +48 -0
  580. package/src/utils/mergeRefs.ts +12 -6
  581. package/src/utils/rtlStyles.ts +2 -2
  582. package/src/utils/themeProps.ts +26 -4
  583. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  584. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  585. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  586. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  587. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  588. package/dist/RadioList/radio.markers.stylex.js +0 -12
  589. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  590. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  591. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  592. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  593. package/src/RadioList/radio.markers.stylex.ts +0 -10
  594. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -34,6 +34,7 @@ import {Icon, renderIconSlot, type IconType} from '../Icon';
34
34
  import type {IconName} from '../Icon';
35
35
  import {
36
36
  Field,
37
+ InputClearButton,
37
38
  inputStatusBorderStyles,
38
39
  inputStatusHoverShadowStyles,
39
40
  inputWrapperStyles,
@@ -43,6 +44,7 @@ import {Divider} from '../Divider';
43
44
  import {Spinner} from '../Spinner';
44
45
  import {TextInput} from '../TextInput';
45
46
  import {CheckboxInput} from '../CheckboxInput';
47
+ import type {IndicatorPosition} from '../Indicator';
46
48
  import {Badge} from '../Badge';
47
49
  import {
48
50
  colorVars,
@@ -75,6 +77,8 @@ import type {BaseProps} from '../BaseProps';
75
77
  import type {SizeValue} from '../utils/types';
76
78
  import {useSize} from '../SizeContext/SizeContext';
77
79
  import {themeProps} from '../utils/themeProps';
80
+ import {focusOutlineStyles} from '../utils/focusOutline.stylex';
81
+ import {stableClassName} from '../naming';
78
82
  import {groupStyles} from '../InputGroup/groupStyles';
79
83
  import {useInputGroup} from '../InputGroup/InputGroupContext';
80
84
  import {VisuallyHidden} from '../VisuallyHidden';
@@ -158,25 +162,27 @@ const styles = stylex.create({
158
162
  color: colorVars['--color-text-secondary'],
159
163
  fontWeight: fontWeightVars['--font-weight-medium'],
160
164
  },
165
+ // Only what Icon does not already provide: `size="sm"` gives the 16px box
166
+ // and `color` the token, but the glyph still must not shrink inside the flex
167
+ // trigger.
161
168
  triggerIcon: {
162
169
  flexShrink: 0,
163
- display: 'flex',
164
- alignItems: 'center',
165
- justifyContent: 'center',
166
- width: 16,
167
- height: 16,
170
+ },
171
+ // Rotation lives on the chevron glyph itself (passed through `xstyle`), not
172
+ // on the layout wrapper above, so the icon's `multi-selector-indicator-icon`
173
+ // theme target and the open/closed transform sit on one element — a theme can
174
+ // restyle the mark and its rotation through a single selector. The wrapper
175
+ // keeps only layout. The status branch renders a different icon, so it never
176
+ // picks these up and needs no transition opt-out.
177
+ triggerIconRotation: {
168
178
  transitionProperty: 'transform',
169
179
  transitionDuration: durationVars['--duration-fast'],
170
180
  transitionTimingFunction: easeVars['--ease-standard'],
171
181
  transformOrigin: 'center',
172
- color: colorVars['--color-icon-secondary'],
173
182
  },
174
183
  triggerIconOpen: {
175
184
  transform: 'rotate(180deg)',
176
185
  },
177
- triggerIconStatus: {
178
- transition: 'none',
179
- },
180
186
  triggerGhost: {
181
187
  width: 'auto',
182
188
  borderWidth: 0,
@@ -196,14 +202,6 @@ const styles = stylex.create({
196
202
  ':focus-within': 'none',
197
203
  },
198
204
  fontWeight: fontWeightVars['--font-weight-medium'],
199
- outline: {
200
- default: 'none',
201
- ':has(:focus-visible)': `2px solid ${colorVars['--color-accent']}`,
202
- },
203
- outlineOffset: {
204
- default: '0',
205
- ':has(:focus-visible)': '3px',
206
- },
207
205
  transitionProperty:
208
206
  'background-image, background-color, color, opacity, transform',
209
207
  transform: {
@@ -220,23 +218,6 @@ const styles = stylex.create({
220
218
  },
221
219
 
222
220
  // Clear button
223
- clearButton: {
224
- display: 'flex',
225
- alignItems: 'center',
226
- justifyContent: 'center',
227
- padding: 0,
228
- margin: 0,
229
- borderWidth: 0,
230
- borderStyle: 'none',
231
- backgroundColor: 'transparent',
232
- cursor: 'pointer',
233
- borderRadius: radiusVars['--radius-element'],
234
- outline: {
235
- default: 'none',
236
- ':focus-visible': `${borderVars['--border-width']} solid ${colorVars['--color-accent']}`,
237
- },
238
- outlineOffset: 1,
239
- },
240
221
  statusButton: {
241
222
  display: 'flex',
242
223
  alignItems: 'center',
@@ -249,11 +230,6 @@ const styles = stylex.create({
249
230
  color: 'inherit',
250
231
  cursor: 'pointer',
251
232
  borderRadius: radiusVars['--radius-element'],
252
- outline: {
253
- default: 'none',
254
- ':focus-visible': `${borderVars['--border-width']} solid ${colorVars['--color-accent']}`,
255
- },
256
- outlineOffset: 1,
257
233
  },
258
234
 
259
235
  // Dropdown container
@@ -267,7 +243,6 @@ const styles = stylex.create({
267
243
  // Popover container (for anchor positioning)
268
244
  popover: {
269
245
  minWidth: 'anchor-size(width)',
270
- marginBlockStart: spacingVars['--spacing-1'],
271
246
  },
272
247
 
273
248
  // Search field. The inner TextInput owns the border, focus ring, magnifier
@@ -307,6 +282,14 @@ const styles = stylex.create({
307
282
  width: '100%',
308
283
  borderRadius: radiusVars['--radius-element'],
309
284
  cursor: 'pointer',
285
+ // Row typography lives here, not on the label span, so a theme override on
286
+ // the row target reaches both the fallback label and renderOption output
287
+ // (a declaration on the span would win over the inherited row value).
288
+ // Matches Selector, whose option row owns its typography the same way.
289
+ fontFamily: typographyVars['--font-family-body'],
290
+ fontSize: typeScaleVars['--text-label-size'],
291
+ fontWeight: fontWeightVars['--font-weight-medium'],
292
+ color: colorVars['--color-text-primary'],
310
293
  backgroundColor: 'transparent',
311
294
  border: 'none',
312
295
  outline: 'none',
@@ -316,6 +299,7 @@ const styles = stylex.create({
316
299
  },
317
300
  itemDisabled: {
318
301
  opacity: 0.5,
302
+ color: colorVars['--color-text-disabled'],
319
303
  cursor: 'not-allowed',
320
304
  },
321
305
 
@@ -325,21 +309,24 @@ const styles = stylex.create({
325
309
  display: 'flex',
326
310
  flexShrink: 0,
327
311
  },
312
+ // Pushed to the row's far edge rather than sitting against the label, which
313
+ // is what an end-positioned control means here. The row is not
314
+ // `space-between` (a truncating label plus a trailing control is what wants
315
+ // the auto margin), and `renderOption` content is not wrapped in a growing
316
+ // span, so the margin has to live on the checkbox itself.
317
+ checkboxDecorativeEnd: {
318
+ marginInlineStart: 'auto',
319
+ },
328
320
 
329
- // Label text for items (rendered outside checkbox for correct click behavior)
321
+ // Label text for items (rendered outside checkbox for correct click
322
+ // behavior). Typography is inherited from the row; this only handles
323
+ // truncation.
330
324
  itemLabel: {
331
- fontFamily: typographyVars['--font-family-body'],
332
- fontSize: typeScaleVars['--text-label-size'],
333
- fontWeight: fontWeightVars['--font-weight-medium'],
334
- color: colorVars['--color-text-primary'],
335
325
  minWidth: 0,
336
326
  overflow: 'hidden',
337
327
  textOverflow: 'ellipsis',
338
328
  whiteSpace: 'nowrap',
339
329
  },
340
- itemLabelDisabled: {
341
- color: colorVars['--color-text-disabled'],
342
- },
343
330
 
344
331
  // Empty state
345
332
  emptyState: {
@@ -617,6 +604,13 @@ export interface MultiSelectorProps<
617
604
  */
618
605
  renderOption?: (option: MultiSelectorOptionData) => ReactNode;
619
606
 
607
+ /**
608
+ * Which edge of the option row carries the checkbox.
609
+ *
610
+ * @default 'start'
611
+ */
612
+ indicatorPosition?: IndicatorPosition;
613
+
620
614
  /**
621
615
  * Whether the dropdown starts open on mount.
622
616
  * Useful for showcases and previews.
@@ -702,6 +696,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
702
696
  triggerDisplay = 'count',
703
697
  maxBadges = 3,
704
698
  renderOption,
699
+ indicatorPosition = 'start',
705
700
  isDefaultOpen = false,
706
701
  'data-testid': testId,
707
702
  htmlName,
@@ -879,6 +874,9 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
879
874
  // The popup's own role="listbox" is the exposed semantics; the trigger
880
875
  // keeps DOM focus, so wrapping it in a modal dialog would misrepresent it.
881
876
  role: 'none',
877
+ // The theme target belongs on the SURFACE that paints the popup, which
878
+ // `usePopover` owns — not on the scrolling list inside it.
879
+ surfaceTarget: 'multi-selector-popup',
882
880
  });
883
881
 
884
882
  // Open dropdown on mount when isDefaultOpen is true
@@ -1244,6 +1242,24 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1244
1242
  const isPartiallySelected =
1245
1243
  isSelectAll && selectAllState === 'indeterminate';
1246
1244
 
1245
+ const checkbox = (
1246
+ <div
1247
+ inert
1248
+ {...stylex.props(
1249
+ styles.checkboxDecorative,
1250
+ indicatorPosition === 'end' && styles.checkboxDecorativeEnd,
1251
+ )}>
1252
+ <CheckboxInput
1253
+ label=""
1254
+ isLabelHidden
1255
+ value={checkboxValue}
1256
+ onChange={() => {}}
1257
+ isDisabled={item.disabled}
1258
+ size={size === 'lg' ? 'md' : size}
1259
+ />
1260
+ </div>
1261
+ );
1262
+
1247
1263
  return (
1248
1264
  <div
1249
1265
  key={item.value}
@@ -1264,39 +1280,40 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1264
1280
  }
1265
1281
  }}
1266
1282
  onMouseEnter={() => onItemMouseEnter(item, flatIndex)}
1267
- {...stylex.props(
1268
- styles.item,
1269
- isSelectAll ? selectAllSizeStyles[size] : itemSizeStyles[size],
1270
- isSelectAll && styles.selectAllWrapper,
1271
- isHighlighted && styles.itemHighlighted,
1272
- item.disabled && styles.itemDisabled,
1283
+ {...mergeProps(
1284
+ // One target for every dropdown row, carrying the row's size and
1285
+ // runtime state so a theme can express "selected option at large"
1286
+ // or restyle just the Select All row (`.select-all`) without
1287
+ // reaching for structural selectors.
1288
+ themeProps('multi-selector-option', {
1289
+ size,
1290
+ 'select-all': isSelectAll ? 'select-all' : null,
1291
+ selected: isSelected ? 'selected' : null,
1292
+ disabled: item.disabled ? 'disabled' : null,
1293
+ }),
1294
+ stylex.props(
1295
+ styles.item,
1296
+ isSelectAll ? selectAllSizeStyles[size] : itemSizeStyles[size],
1297
+ isSelectAll && styles.selectAllWrapper,
1298
+ isHighlighted && styles.itemHighlighted,
1299
+ item.disabled && styles.itemDisabled,
1300
+ ),
1273
1301
  )}>
1274
- <div inert {...stylex.props(styles.checkboxDecorative)}>
1275
- <CheckboxInput
1276
- label=""
1277
- isLabelHidden
1278
- value={checkboxValue}
1279
- onChange={() => {}}
1280
- isDisabled={item.disabled}
1281
- size={size === 'lg' ? 'md' : size}
1282
- />
1283
- </div>
1302
+ {indicatorPosition === 'start' && checkbox}
1284
1303
  {renderOption && !isSelectAll ? (
1285
1304
  renderOption(item)
1286
1305
  ) : (
1287
- <span
1288
- {...stylex.props(
1289
- styles.itemLabel,
1290
- item.disabled && styles.itemLabelDisabled,
1291
- )}>
1306
+ <span {...stylex.props(styles.itemLabel)}>
1292
1307
  {item.label ?? item.value}
1293
1308
  </span>
1294
1309
  )}
1310
+ {indicatorPosition === 'end' && checkbox}
1295
1311
  </div>
1296
1312
  );
1297
1313
  },
1298
1314
  [
1299
1315
  renderOption,
1316
+ indicatorPosition,
1300
1317
  highlightedIndex,
1301
1318
  optimisticValue,
1302
1319
  allEnabledSelected,
@@ -1343,7 +1360,10 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1343
1360
  <div
1344
1361
  key="empty"
1345
1362
  role="presentation"
1346
- {...stylex.props(styles.emptyState)}>
1363
+ {...mergeProps(
1364
+ themeProps('multi-selector-empty-state'),
1365
+ stylex.props(styles.emptyState),
1366
+ )}>
1347
1367
  No results found
1348
1368
  </div>,
1349
1369
  );
@@ -1445,12 +1465,14 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1445
1465
  variant,
1446
1466
  size,
1447
1467
  status: status?.type ?? null,
1468
+ disabled: isDisabled ? 'disabled' : null,
1448
1469
  }),
1449
1470
  stylex.props(
1450
1471
  inputWrapperStyles.base,
1451
1472
  styles.triggerContainer,
1452
1473
  sizeStyles[size],
1453
1474
  variant === 'ghost' && styles.triggerGhost,
1475
+ variant === 'ghost' && focusOutlineStyles.focusWithin,
1454
1476
  isDisabled && inputWrapperStyles.disabled,
1455
1477
  variant === 'ghost' && isDisabled && styles.triggerGhostDisabled,
1456
1478
  optimisticValue.length === 0 && styles.triggerPlaceholder,
@@ -1519,68 +1541,68 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1519
1541
  ))}
1520
1542
  {isBusy && <Spinner size="sm" />}
1521
1543
  {hasClear && value.length > 0 && !isDisabled && (
1522
- <button
1523
- type="button"
1544
+ <InputClearButton
1545
+ label={t('@astryx.multiSelector.clearAll', {label})}
1524
1546
  onClick={handleClear}
1525
- aria-label={t('@astryx.multiSelector.clearAll', {label})}
1526
- {...stylex.props(styles.clearButton)}>
1527
- <Icon
1528
- icon="close"
1529
- size="sm"
1530
- color="secondary"
1531
- // Stable theme target on the clear glyph itself, so a theme can
1532
- // restyle just this icon (color, size, hover) via `defineTheme`.
1533
- // Same-element rules in @layer astryx-theme win over the icon's
1534
- // own base color/size, which a button-level target could not
1535
- // reach.
1536
- {...themeProps('multi-selector-clear-icon')}
1537
- />
1538
- </button>
1547
+ iconClassName={stableClassName('multi-selector-clear-icon')}
1548
+ />
1539
1549
  )}
1540
- <span
1541
- {...stylex.props(
1542
- styles.triggerIcon,
1543
- !showStatusIcon && popover.isOpen && styles.triggerIconOpen,
1544
- showStatusIcon && styles.triggerIconStatus,
1545
- )}>
1546
- {showStatusIcon ? (
1547
- showStatusTooltip ? (
1548
- <button
1549
- ref={statusTooltip.ref}
1550
- type="button"
1551
- aria-label={t(STATUS_BUTTON_LABEL_KEY[status.type])}
1552
- aria-describedby={statusTooltip.describedBy}
1553
- onClick={e => e.stopPropagation()}
1554
- {...stylex.props(styles.statusButton)}>
1555
- <Icon
1556
- icon={STATUS_ICON_MAP[status.type]}
1557
- size="sm"
1558
- color={STATUS_ICON_COLOR_MAP[status.type]}
1559
- />
1560
- </button>
1561
- ) : (
1550
+ {/*
1551
+ No wrapper span: Icon's own span already provides the 16px box (`sm`)
1552
+ and the icon color, so the status glyph and the chevron are each
1553
+ directly targetable instead of sharing one untargetable parent — and
1554
+ the two affordances stop sharing a node.
1555
+ */}
1556
+ {showStatusIcon ? (
1557
+ showStatusTooltip ? (
1558
+ <button
1559
+ ref={statusTooltip.ref}
1560
+ type="button"
1561
+ aria-label={t(STATUS_BUTTON_LABEL_KEY[status.type])}
1562
+ aria-describedby={statusTooltip.describedBy}
1563
+ onClick={e => e.stopPropagation()}
1564
+ {...stylex.props(
1565
+ focusOutlineStyles.focusVisible,
1566
+ styles.statusButton,
1567
+ )}>
1562
1568
  <Icon
1563
1569
  icon={STATUS_ICON_MAP[status.type]}
1564
1570
  size="sm"
1565
1571
  color={STATUS_ICON_COLOR_MAP[status.type]}
1572
+ xstyle={styles.triggerIcon}
1566
1573
  />
1567
- )
1574
+ </button>
1568
1575
  ) : (
1569
1576
  <Icon
1570
- icon="chevronDown"
1577
+ icon={STATUS_ICON_MAP[status.type]}
1571
1578
  size="sm"
1572
- color="inherit"
1573
- // Stable theme target on the chevron glyph itself, so a theme can
1574
- // restyle just this icon (color, size, hover) — and its
1575
- // open/closed state — via `defineTheme`. Same-element rules in
1576
- // @layer astryx-theme win over the icon's own base color/size,
1577
- // which a button-level target could not reach.
1578
- {...themeProps('multi-selector-indicator-icon', {
1579
- state: popover.isOpen ? 'expanded' : 'collapsed',
1580
- })}
1579
+ color={STATUS_ICON_COLOR_MAP[status.type]}
1580
+ xstyle={styles.triggerIcon}
1581
1581
  />
1582
- )}
1583
- </span>
1582
+ )
1583
+ ) : (
1584
+ <Icon
1585
+ icon="chevronDown"
1586
+ size="sm"
1587
+ color="secondary"
1588
+ // The rotation rides on the glyph, alongside the box and color
1589
+ // the wrapper used to provide, so one element carries the mark,
1590
+ // its open/closed transform, and the theme target.
1591
+ xstyle={[
1592
+ styles.triggerIcon,
1593
+ styles.triggerIconRotation,
1594
+ popover.isOpen && styles.triggerIconOpen,
1595
+ ]}
1596
+ // Stable theme target on the chevron glyph itself, so a theme can
1597
+ // restyle just this icon (color, size, hover) — and its
1598
+ // open/closed state — via `defineTheme`. Same-element rules in
1599
+ // @layer astryx-theme win over the icon's own base color/size,
1600
+ // which a button-level target could not reach.
1601
+ {...themeProps('multi-selector-indicator-icon', {
1602
+ state: popover.isOpen ? 'expanded' : 'collapsed',
1603
+ })}
1604
+ />
1605
+ )}
1584
1606
  </div>
1585
1607
 
1586
1608
  {popover.render(
@@ -1597,6 +1619,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1597
1619
  {
1598
1620
  placement: 'below',
1599
1621
  alignment: 'start',
1622
+ offset: spacingVars['--spacing-1'],
1600
1623
  xstyle: styles.popover,
1601
1624
  },
1602
1625
  )}