@salt-ds/core 1.70.0 → 1.72.0

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 (315) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/css/salt-core.css +466 -106
  3. package/dist-cjs/accordion/AccordionHeader.css.js +1 -1
  4. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js +8 -0
  5. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  6. package/dist-cjs/avatar/Avatar.css.js +1 -1
  7. package/dist-cjs/badge/Badge.css.js +1 -1
  8. package/dist-cjs/banner/Banner.css.js +1 -1
  9. package/dist-cjs/breadcrumbs/Breadcrumb.css.js +1 -1
  10. package/dist-cjs/breadcrumbs/Breadcrumbs.css.js +1 -1
  11. package/dist-cjs/card/Card.css.js +1 -1
  12. package/dist-cjs/card/Card.js +4 -0
  13. package/dist-cjs/card/Card.js.map +1 -1
  14. package/dist-cjs/checkbox/Checkbox.css.js +1 -1
  15. package/dist-cjs/checkbox/CheckboxIcon.css.js +1 -1
  16. package/dist-cjs/combo-box/ComboBox.js +18 -36
  17. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  18. package/dist-cjs/combo-box/useComboBox.js +21 -21
  19. package/dist-cjs/combo-box/useComboBox.js.map +1 -1
  20. package/dist-cjs/drawer/Drawer.css.js +1 -1
  21. package/dist-cjs/drawer/Drawer.js +30 -5
  22. package/dist-cjs/drawer/Drawer.js.map +1 -1
  23. package/dist-cjs/drawer/DrawerCloseButton.js +1 -1
  24. package/dist-cjs/drawer/DrawerCloseButton.js.map +1 -1
  25. package/dist-cjs/drawer/DrawerContent.css.js +6 -0
  26. package/dist-cjs/drawer/DrawerContent.css.js.map +1 -0
  27. package/dist-cjs/drawer/DrawerContent.js +75 -0
  28. package/dist-cjs/drawer/DrawerContent.js.map +1 -0
  29. package/dist-cjs/drawer/DrawerContext.js +30 -0
  30. package/dist-cjs/drawer/DrawerContext.js.map +1 -0
  31. package/dist-cjs/drawer/DrawerFooter.css.js +6 -0
  32. package/dist-cjs/drawer/DrawerFooter.css.js.map +1 -0
  33. package/dist-cjs/drawer/DrawerFooter.js +30 -0
  34. package/dist-cjs/drawer/DrawerFooter.js.map +1 -0
  35. package/dist-cjs/drawer/DrawerHeader.css.js +6 -0
  36. package/dist-cjs/drawer/DrawerHeader.css.js.map +1 -0
  37. package/dist-cjs/drawer/DrawerHeader.js +95 -0
  38. package/dist-cjs/drawer/DrawerHeader.js.map +1 -0
  39. package/dist-cjs/drawer/hasDrawerSection.js +22 -0
  40. package/dist-cjs/drawer/hasDrawerSection.js.map +1 -0
  41. package/dist-cjs/dropdown/Dropdown.js +29 -30
  42. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  43. package/dist-cjs/file-drop-zone/FileDropZone.css.js +1 -1
  44. package/dist-cjs/form-field/FormField.css.js +1 -1
  45. package/dist-cjs/form-field/FormField.js +15 -0
  46. package/dist-cjs/form-field/FormField.js.map +1 -1
  47. package/dist-cjs/form-field/FormFieldHelperText.css.js +1 -1
  48. package/dist-cjs/form-field/FormFieldLabel.css.js +1 -1
  49. package/dist-cjs/form-field/FormFieldLabel.js +1 -1
  50. package/dist-cjs/form-field/FormFieldLabel.js.map +1 -1
  51. package/dist-cjs/index.js +10 -0
  52. package/dist-cjs/index.js.map +1 -1
  53. package/dist-cjs/input/Input.css.js +1 -1
  54. package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
  55. package/dist-cjs/interactable-card/InteractableCard.js +23 -7
  56. package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
  57. package/dist-cjs/interactable-card/InteractableCardGroup.js +71 -39
  58. package/dist-cjs/interactable-card/InteractableCardGroup.js.map +1 -1
  59. package/dist-cjs/interactable-card/InteractableCardGroupContext.js.map +1 -1
  60. package/dist-cjs/interactable-card/useInteractableCard.js +2 -3
  61. package/dist-cjs/interactable-card/useInteractableCard.js.map +1 -1
  62. package/dist-cjs/kbd/Kbd.css.js +1 -1
  63. package/dist-cjs/link/Link.css.js +1 -1
  64. package/dist-cjs/link-button/LinkButton.css.js +6 -0
  65. package/dist-cjs/link-button/LinkButton.css.js.map +1 -0
  66. package/dist-cjs/link-button/LinkButton.js +87 -0
  67. package/dist-cjs/link-button/LinkButton.js.map +1 -0
  68. package/dist-cjs/link-card/LinkCard.css.js +1 -1
  69. package/dist-cjs/link-card/LinkCard.js +4 -0
  70. package/dist-cjs/link-card/LinkCard.js.map +1 -1
  71. package/dist-cjs/list-box/ListBox.js +19 -26
  72. package/dist-cjs/list-box/ListBox.js.map +1 -1
  73. package/dist-cjs/list-control/ListControlNavigationKeys.js +74 -0
  74. package/dist-cjs/list-control/ListControlNavigationKeys.js.map +1 -0
  75. package/dist-cjs/list-control/ListControlOptionContext.js +47 -0
  76. package/dist-cjs/list-control/ListControlOptionContext.js.map +1 -0
  77. package/dist-cjs/list-control/ListControlOptionStore.js +159 -0
  78. package/dist-cjs/list-control/ListControlOptionStore.js.map +1 -0
  79. package/dist-cjs/list-control/ListControlProvider.js +39 -0
  80. package/dist-cjs/list-control/ListControlProvider.js.map +1 -0
  81. package/dist-cjs/list-control/ListControlRegistry.js +161 -0
  82. package/dist-cjs/list-control/ListControlRegistry.js.map +1 -0
  83. package/dist-cjs/list-control/ListControlState.js +137 -109
  84. package/dist-cjs/list-control/ListControlState.js.map +1 -1
  85. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +1 -1
  86. package/dist-cjs/mega-menu/MegaMenuListItem.css.js +1 -1
  87. package/dist-cjs/menu/MenuGroup.css.js +1 -1
  88. package/dist-cjs/menu/MenuItem.css.js +1 -1
  89. package/dist-cjs/menu/MenuItem.js +0 -1
  90. package/dist-cjs/menu/MenuItem.js.map +1 -1
  91. package/dist-cjs/navigation-item/NavigationItem.css.js +1 -1
  92. package/dist-cjs/number-input/NumberInput.js +2 -2
  93. package/dist-cjs/number-input/NumberInput.js.map +1 -1
  94. package/dist-cjs/option/Option.js +58 -39
  95. package/dist-cjs/option/Option.js.map +1 -1
  96. package/dist-cjs/option/OptionGroup.css.js +1 -1
  97. package/dist-cjs/overlay/Overlay.js +12 -2
  98. package/dist-cjs/overlay/Overlay.js.map +1 -1
  99. package/dist-cjs/overlay/OverlayContext.js +6 -0
  100. package/dist-cjs/overlay/OverlayContext.js.map +1 -1
  101. package/dist-cjs/overlay/OverlayFooter.css.js +6 -0
  102. package/dist-cjs/overlay/OverlayFooter.css.js.map +1 -0
  103. package/dist-cjs/overlay/OverlayFooter.js +30 -0
  104. package/dist-cjs/overlay/OverlayFooter.js.map +1 -0
  105. package/dist-cjs/overlay/OverlayHeader.css.js +1 -1
  106. package/dist-cjs/overlay/OverlayHeader.js +51 -11
  107. package/dist-cjs/overlay/OverlayHeader.js.map +1 -1
  108. package/dist-cjs/overlay/OverlayPanel.css.js +1 -1
  109. package/dist-cjs/overlay/OverlayPanel.js +20 -7
  110. package/dist-cjs/overlay/OverlayPanel.js.map +1 -1
  111. package/dist-cjs/overlay/OverlayPanelContent.css.js +1 -1
  112. package/dist-cjs/overlay/OverlayPanelContent.js +11 -13
  113. package/dist-cjs/overlay/OverlayPanelContent.js.map +1 -1
  114. package/dist-cjs/overlay/hasOverlaySection.js +24 -0
  115. package/dist-cjs/overlay/hasOverlaySection.js.map +1 -0
  116. package/dist-cjs/panel/Panel.css.js +1 -1
  117. package/dist-cjs/panel/Panel.js +13 -2
  118. package/dist-cjs/panel/Panel.js.map +1 -1
  119. package/dist-cjs/pill-input/PillInput.css.js +1 -1
  120. package/dist-cjs/pill-input/PillInput.js +2 -2
  121. package/dist-cjs/pill-input/PillInput.js.map +1 -1
  122. package/dist-cjs/radio-button/RadioButton.css.js +1 -1
  123. package/dist-cjs/radio-button/RadioButtonIcon.css.js +1 -1
  124. package/dist-cjs/rating/Rating.css.js +1 -1
  125. package/dist-cjs/slider/internal/SliderTrack.css.js +1 -1
  126. package/dist-cjs/stepper/internal/StepText.css.js +1 -1
  127. package/dist-cjs/switch/Switch.css.js +1 -1
  128. package/dist-cjs/table/Table.css.js +1 -1
  129. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +10 -2
  130. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -1
  131. package/dist-cjs/tag/Tag.css.js +1 -1
  132. package/dist-cjs/text/Text.css.js +1 -1
  133. package/dist-cjs/toast/Toast.css.js +1 -1
  134. package/dist-cjs/toggle-button/ToggleButton.js +8 -2
  135. package/dist-cjs/toggle-button/ToggleButton.js.map +1 -1
  136. package/dist-cjs/toggle-button-group/ToggleButtonGroup.js +71 -8
  137. package/dist-cjs/toggle-button-group/ToggleButtonGroup.js.map +1 -1
  138. package/dist-cjs/toggle-button-group/ToggleButtonGroupContext.js.map +1 -1
  139. package/dist-cjs/toggletip/ToggletipPanel.css.js +1 -1
  140. package/dist-cjs/tooltip/Tooltip.css.js +1 -1
  141. package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js +1 -1
  142. package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js +1 -1
  143. package/dist-es/accordion/AccordionHeader.css.js +1 -1
  144. package/dist-es/aria-announcer/AriaAnnouncerProvider.js +8 -0
  145. package/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  146. package/dist-es/avatar/Avatar.css.js +1 -1
  147. package/dist-es/badge/Badge.css.js +1 -1
  148. package/dist-es/banner/Banner.css.js +1 -1
  149. package/dist-es/breadcrumbs/Breadcrumb.css.js +1 -1
  150. package/dist-es/breadcrumbs/Breadcrumbs.css.js +1 -1
  151. package/dist-es/card/Card.css.js +1 -1
  152. package/dist-es/card/Card.js +4 -0
  153. package/dist-es/card/Card.js.map +1 -1
  154. package/dist-es/checkbox/Checkbox.css.js +1 -1
  155. package/dist-es/checkbox/CheckboxIcon.css.js +1 -1
  156. package/dist-es/combo-box/ComboBox.js +18 -36
  157. package/dist-es/combo-box/ComboBox.js.map +1 -1
  158. package/dist-es/combo-box/useComboBox.js +21 -21
  159. package/dist-es/combo-box/useComboBox.js.map +1 -1
  160. package/dist-es/drawer/Drawer.css.js +1 -1
  161. package/dist-es/drawer/Drawer.js +31 -6
  162. package/dist-es/drawer/Drawer.js.map +1 -1
  163. package/dist-es/drawer/DrawerCloseButton.js +1 -1
  164. package/dist-es/drawer/DrawerCloseButton.js.map +1 -1
  165. package/dist-es/drawer/DrawerContent.css.js +4 -0
  166. package/dist-es/drawer/DrawerContent.css.js.map +1 -0
  167. package/dist-es/drawer/DrawerContent.js +73 -0
  168. package/dist-es/drawer/DrawerContent.js.map +1 -0
  169. package/dist-es/drawer/DrawerContext.js +27 -0
  170. package/dist-es/drawer/DrawerContext.js.map +1 -0
  171. package/dist-es/drawer/DrawerFooter.css.js +4 -0
  172. package/dist-es/drawer/DrawerFooter.css.js.map +1 -0
  173. package/dist-es/drawer/DrawerFooter.js +28 -0
  174. package/dist-es/drawer/DrawerFooter.js.map +1 -0
  175. package/dist-es/drawer/DrawerHeader.css.js +4 -0
  176. package/dist-es/drawer/DrawerHeader.css.js.map +1 -0
  177. package/dist-es/drawer/DrawerHeader.js +93 -0
  178. package/dist-es/drawer/DrawerHeader.js.map +1 -0
  179. package/dist-es/drawer/hasDrawerSection.js +20 -0
  180. package/dist-es/drawer/hasDrawerSection.js.map +1 -0
  181. package/dist-es/dropdown/Dropdown.js +29 -30
  182. package/dist-es/dropdown/Dropdown.js.map +1 -1
  183. package/dist-es/file-drop-zone/FileDropZone.css.js +1 -1
  184. package/dist-es/form-field/FormField.css.js +1 -1
  185. package/dist-es/form-field/FormField.js +16 -1
  186. package/dist-es/form-field/FormField.js.map +1 -1
  187. package/dist-es/form-field/FormFieldHelperText.css.js +1 -1
  188. package/dist-es/form-field/FormFieldLabel.css.js +1 -1
  189. package/dist-es/form-field/FormFieldLabel.js +1 -1
  190. package/dist-es/form-field/FormFieldLabel.js.map +1 -1
  191. package/dist-es/index.js +5 -0
  192. package/dist-es/index.js.map +1 -1
  193. package/dist-es/input/Input.css.js +1 -1
  194. package/dist-es/interactable-card/InteractableCard.css.js +1 -1
  195. package/dist-es/interactable-card/InteractableCard.js +23 -7
  196. package/dist-es/interactable-card/InteractableCard.js.map +1 -1
  197. package/dist-es/interactable-card/InteractableCardGroup.js +72 -40
  198. package/dist-es/interactable-card/InteractableCardGroup.js.map +1 -1
  199. package/dist-es/interactable-card/InteractableCardGroupContext.js.map +1 -1
  200. package/dist-es/interactable-card/useInteractableCard.js +2 -3
  201. package/dist-es/interactable-card/useInteractableCard.js.map +1 -1
  202. package/dist-es/kbd/Kbd.css.js +1 -1
  203. package/dist-es/link/Link.css.js +1 -1
  204. package/dist-es/link-button/LinkButton.css.js +4 -0
  205. package/dist-es/link-button/LinkButton.css.js.map +1 -0
  206. package/dist-es/link-button/LinkButton.js +85 -0
  207. package/dist-es/link-button/LinkButton.js.map +1 -0
  208. package/dist-es/link-card/LinkCard.css.js +1 -1
  209. package/dist-es/link-card/LinkCard.js +4 -0
  210. package/dist-es/link-card/LinkCard.js.map +1 -1
  211. package/dist-es/list-box/ListBox.js +19 -26
  212. package/dist-es/list-box/ListBox.js.map +1 -1
  213. package/dist-es/list-control/ListControlNavigationKeys.js +69 -0
  214. package/dist-es/list-control/ListControlNavigationKeys.js.map +1 -0
  215. package/dist-es/list-control/ListControlOptionContext.js +44 -0
  216. package/dist-es/list-control/ListControlOptionContext.js.map +1 -0
  217. package/dist-es/list-control/ListControlOptionStore.js +153 -0
  218. package/dist-es/list-control/ListControlOptionStore.js.map +1 -0
  219. package/dist-es/list-control/ListControlProvider.js +37 -0
  220. package/dist-es/list-control/ListControlProvider.js.map +1 -0
  221. package/dist-es/list-control/ListControlRegistry.js +158 -0
  222. package/dist-es/list-control/ListControlRegistry.js.map +1 -0
  223. package/dist-es/list-control/ListControlState.js +137 -110
  224. package/dist-es/list-control/ListControlState.js.map +1 -1
  225. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +1 -1
  226. package/dist-es/mega-menu/MegaMenuListItem.css.js +1 -1
  227. package/dist-es/menu/MenuGroup.css.js +1 -1
  228. package/dist-es/menu/MenuItem.css.js +1 -1
  229. package/dist-es/menu/MenuItem.js +0 -1
  230. package/dist-es/menu/MenuItem.js.map +1 -1
  231. package/dist-es/navigation-item/NavigationItem.css.js +1 -1
  232. package/dist-es/number-input/NumberInput.js +2 -2
  233. package/dist-es/number-input/NumberInput.js.map +1 -1
  234. package/dist-es/option/Option.js +59 -40
  235. package/dist-es/option/Option.js.map +1 -1
  236. package/dist-es/option/OptionGroup.css.js +1 -1
  237. package/dist-es/overlay/Overlay.js +13 -3
  238. package/dist-es/overlay/Overlay.js.map +1 -1
  239. package/dist-es/overlay/OverlayContext.js +6 -0
  240. package/dist-es/overlay/OverlayContext.js.map +1 -1
  241. package/dist-es/overlay/OverlayFooter.css.js +4 -0
  242. package/dist-es/overlay/OverlayFooter.css.js.map +1 -0
  243. package/dist-es/overlay/OverlayFooter.js +28 -0
  244. package/dist-es/overlay/OverlayFooter.js.map +1 -0
  245. package/dist-es/overlay/OverlayHeader.css.js +1 -1
  246. package/dist-es/overlay/OverlayHeader.js +51 -11
  247. package/dist-es/overlay/OverlayHeader.js.map +1 -1
  248. package/dist-es/overlay/OverlayPanel.css.js +1 -1
  249. package/dist-es/overlay/OverlayPanel.js +20 -7
  250. package/dist-es/overlay/OverlayPanel.js.map +1 -1
  251. package/dist-es/overlay/OverlayPanelContent.css.js +1 -1
  252. package/dist-es/overlay/OverlayPanelContent.js +11 -13
  253. package/dist-es/overlay/OverlayPanelContent.js.map +1 -1
  254. package/dist-es/overlay/hasOverlaySection.js +22 -0
  255. package/dist-es/overlay/hasOverlaySection.js.map +1 -0
  256. package/dist-es/panel/Panel.css.js +1 -1
  257. package/dist-es/panel/Panel.js +13 -2
  258. package/dist-es/panel/Panel.js.map +1 -1
  259. package/dist-es/pill-input/PillInput.css.js +1 -1
  260. package/dist-es/pill-input/PillInput.js +2 -2
  261. package/dist-es/pill-input/PillInput.js.map +1 -1
  262. package/dist-es/radio-button/RadioButton.css.js +1 -1
  263. package/dist-es/radio-button/RadioButtonIcon.css.js +1 -1
  264. package/dist-es/rating/Rating.css.js +1 -1
  265. package/dist-es/slider/internal/SliderTrack.css.js +1 -1
  266. package/dist-es/stepper/internal/StepText.css.js +1 -1
  267. package/dist-es/switch/Switch.css.js +1 -1
  268. package/dist-es/table/Table.css.js +1 -1
  269. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +10 -2
  270. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -1
  271. package/dist-es/tag/Tag.css.js +1 -1
  272. package/dist-es/text/Text.css.js +1 -1
  273. package/dist-es/toast/Toast.css.js +1 -1
  274. package/dist-es/toggle-button/ToggleButton.js +8 -2
  275. package/dist-es/toggle-button/ToggleButton.js.map +1 -1
  276. package/dist-es/toggle-button-group/ToggleButtonGroup.js +71 -8
  277. package/dist-es/toggle-button-group/ToggleButtonGroup.js.map +1 -1
  278. package/dist-es/toggle-button-group/ToggleButtonGroupContext.js.map +1 -1
  279. package/dist-es/toggletip/ToggletipPanel.css.js +1 -1
  280. package/dist-es/tooltip/Tooltip.css.js +1 -1
  281. package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js +1 -1
  282. package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js +1 -1
  283. package/dist-types/card/Card.d.ts +10 -0
  284. package/dist-types/combo-box/useComboBox.d.ts +3 -6
  285. package/dist-types/drawer/Drawer.d.ts +1 -1
  286. package/dist-types/drawer/DrawerCloseButton.d.ts +3 -0
  287. package/dist-types/drawer/DrawerContent.d.ts +3 -0
  288. package/dist-types/drawer/DrawerContext.d.ts +9 -0
  289. package/dist-types/drawer/DrawerFooter.d.ts +3 -0
  290. package/dist-types/drawer/DrawerHeader.d.ts +24 -0
  291. package/dist-types/drawer/hasDrawerSection.d.ts +2 -0
  292. package/dist-types/drawer/index.d.ts +3 -0
  293. package/dist-types/index.d.ts +1 -0
  294. package/dist-types/interactable-card/InteractableCard.d.ts +9 -1
  295. package/dist-types/interactable-card/InteractableCardGroupContext.d.ts +2 -0
  296. package/dist-types/interactable-card/useInteractableCard.d.ts +1 -2
  297. package/dist-types/link-button/LinkButton.d.ts +26 -0
  298. package/dist-types/link-button/index.d.ts +1 -0
  299. package/dist-types/link-card/LinkCard.d.ts +8 -0
  300. package/dist-types/list-control/ListControlNavigationKeys.d.ts +30 -0
  301. package/dist-types/list-control/ListControlOptionContext.d.ts +18 -0
  302. package/dist-types/list-control/ListControlOptionStore.d.ts +17 -0
  303. package/dist-types/list-control/ListControlProvider.d.ts +11 -0
  304. package/dist-types/list-control/ListControlRegistry.d.ts +22 -0
  305. package/dist-types/list-control/ListControlState.d.ts +6 -6
  306. package/dist-types/option/Option.d.ts +3 -1
  307. package/dist-types/overlay/Overlay.d.ts +2 -1
  308. package/dist-types/overlay/OverlayContext.d.ts +4 -0
  309. package/dist-types/overlay/OverlayFooter.d.ts +4 -0
  310. package/dist-types/overlay/hasOverlaySection.d.ts +2 -0
  311. package/dist-types/overlay/index.d.ts +1 -0
  312. package/dist-types/panel/Panel.d.ts +4 -0
  313. package/dist-types/toggle-button-group/ToggleButtonGroupContext.d.ts +2 -1
  314. package/dist-types/utils/useIsomorphicLayoutEffect.d.ts +2 -2
  315. package/package.json +14 -10
@@ -19,8 +19,10 @@ const LinkCard = React.forwardRef(
19
19
  function LinkCard2(props, ref) {
20
20
  const {
21
21
  accent,
22
+ borderColor,
22
23
  children,
23
24
  className,
25
+ elevation = "raised",
24
26
  href,
25
27
  variant = "primary",
26
28
  ...rest
@@ -38,9 +40,11 @@ const LinkCard = React.forwardRef(
38
40
  className: clsx.clsx(
39
41
  withBaseName(),
40
42
  withBaseName(variant),
43
+ borderColor && withBaseName(`borderColor${capitalize.capitalize(borderColor)}`),
41
44
  {
42
45
  [withBaseName("accent")]: accent,
43
46
  [withBaseName(`accent${capitalize.capitalize(accent ?? "")}`)]: accent,
47
+ [withBaseName(elevation || "")]: elevation,
44
48
  [withBaseName("sectioned")]: sectioned
45
49
  },
46
50
  className
@@ -1 +1 @@
1
- {"version":3,"file":"LinkCard.js","sources":["../src/link-card/LinkCard.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { hasCardSection } from \"../card/hasCardSection\";\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport linkCardCss from \"./LinkCard.css\";\n\nconst withBaseName = makePrefixer(\"saltLinkCard\");\n\nexport interface LinkCardProps extends ComponentPropsWithoutRef<\"a\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nexport const LinkCard = forwardRef<HTMLAnchorElement, LinkCardProps>(\n function LinkCard(props, ref) {\n const {\n accent,\n children,\n className,\n href,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-link-card\",\n css: linkCardCss,\n window: targetWindow,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n <a\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent ?? \"\")}`)]: accent,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n href={href}\n {...rest}\n ref={ref}\n >\n {children}\n </a>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","LinkCard","useWindow","useComponentCssInjection","linkCardCss","hasCardSection","jsx","clsx","capitalize"],"mappings":";;;;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAeA,0BAAa,cAAc,CAAA;AAazC,MAAM,QAAA,GAAWC,gBAAA;AAAA,EACtB,SAASC,SAAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,gBAAA;AAAA,MACR,GAAA,EAAKC,UAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,SAAA,GAAYC,8BAAe,QAAQ,CAAA;AAEzC,IAAA,uBACEC,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,SAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAASC,qBAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAA;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"LinkCard.js","sources":["../src/link-card/LinkCard.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { hasCardSection } from \"../card/hasCardSection\";\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport linkCardCss from \"./LinkCard.css\";\n\nconst withBaseName = makePrefixer(\"saltLinkCard\");\n\nexport interface LinkCardProps extends ComponentPropsWithoutRef<\"a\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * Visual elevation.\n */\n elevation?: \"flat\" | \"raised\";\n /**\n * Border color strength.\n */\n borderColor?: \"strong\" | \"subtle\" | \"none\";\n /**\n * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nexport const LinkCard = forwardRef<HTMLAnchorElement, LinkCardProps>(\n function LinkCard(props, ref) {\n const {\n accent,\n borderColor,\n children,\n className,\n elevation = \"raised\",\n href,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-link-card\",\n css: linkCardCss,\n window: targetWindow,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n <a\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent ?? \"\")}`)]: accent,\n [withBaseName(elevation || \"\")]: elevation,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n href={href}\n {...rest}\n ref={ref}\n >\n {children}\n </a>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","LinkCard","useWindow","useComponentCssInjection","linkCardCss","hasCardSection","jsx","clsx","capitalize"],"mappings":";;;;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAeA,0BAAa,cAAc,CAAA;AAqBzC,MAAM,QAAA,GAAWC,gBAAA;AAAA,EACtB,SAASC,SAAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,GAAY,QAAA;AAAA,MACZ,IAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,gBAAA;AAAA,MACR,GAAA,EAAKC,UAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,SAAA,GAAYC,8BAAe,QAAQ,CAAA;AAEzC,IAAA,uBACEC,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,SAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB,eAAe,YAAA,CAAa,CAAA,WAAA,EAAcC,qBAAA,CAAW,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,UACnE;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAASA,qBAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,SAAA,IAAa,EAAE,CAAC,GAAG,SAAA;AAAA,YACjC,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAA;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -5,7 +5,8 @@ var styles = require('@salt-ds/styles');
5
5
  var window$1 = require('@salt-ds/window');
6
6
  var clsx = require('clsx');
7
7
  var React = require('react');
8
- var ListControlContext = require('../list-control/ListControlContext.js');
8
+ var ListControlNavigationKeys = require('../list-control/ListControlNavigationKeys.js');
9
+ var ListControlProvider = require('../list-control/ListControlProvider.js');
9
10
  var ListControlState = require('../list-control/ListControlState.js');
10
11
  var makePrefixer = require('../utils/makePrefixer.js');
11
12
  require('../utils/useFloatingUI/useFloatingUI.js');
@@ -75,10 +76,7 @@ const ListBox = React.forwardRef(function ListBox2(props, ref) {
75
76
  typeaheadTimeout.current = window.setTimeout(() => {
76
77
  typeaheadString.current = "";
77
78
  }, 500);
78
- let newOption = getOptionFromSearch(typeaheadString.current, activeState);
79
- if (!newOption) {
80
- newOption = getOptionFromSearch(typeaheadString.current);
81
- }
79
+ const newOption = getOptionFromSearch(typeaheadString.current, activeState);
82
80
  if (newOption) {
83
81
  setActive(newOption);
84
82
  setFocusVisibleState(true);
@@ -87,6 +85,9 @@ const ListBox = React.forwardRef(function ListBox2(props, ref) {
87
85
  const handleKeyDown = (event) => {
88
86
  var _a;
89
87
  onKeyDown == null ? void 0 : onKeyDown(event);
88
+ if (ListControlNavigationKeys.isModifiedListControlNavigationKey(event)) {
89
+ return;
90
+ }
90
91
  if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
91
92
  event.preventDefault();
92
93
  event.stopPropagation();
@@ -96,26 +97,19 @@ const ListBox = React.forwardRef(function ListBox2(props, ref) {
96
97
  if (activeOption === void 0) {
97
98
  return;
98
99
  }
99
- let newActive;
100
+ const isNavigationKey = ListControlNavigationKeys.isListControlNavigationKey(event.key);
101
+ if (isNavigationKey) {
102
+ event.preventDefault();
103
+ }
104
+ const newActive = isNavigationKey ? ListControlNavigationKeys.getListControlNavigationTarget(event.key, activeOption, {
105
+ getFirstOption,
106
+ getLastOption,
107
+ getOptionAfter,
108
+ getOptionBefore,
109
+ getOptionPageAbove,
110
+ getOptionPageBelow
111
+ }) : void 0;
100
112
  switch (event.key) {
101
- case "ArrowDown":
102
- newActive = getOptionAfter(activeOption) ?? getLastOption();
103
- break;
104
- case "ArrowUp":
105
- newActive = getOptionBefore(activeOption) ?? getFirstOption();
106
- break;
107
- case "Home":
108
- newActive = getFirstOption();
109
- break;
110
- case "End":
111
- newActive = getLastOption();
112
- break;
113
- case "PageUp":
114
- newActive = getOptionPageAbove(activeOption);
115
- break;
116
- case "PageDown":
117
- newActive = getOptionPageBelow(activeOption);
118
- break;
119
113
  case "Enter":
120
114
  case " ":
121
115
  if ((activeState == null ? void 0 : activeState.disabled) || typeaheadString.current.trim().length > 0 && event.key === " ") {
@@ -130,7 +124,6 @@ const ListBox = React.forwardRef(function ListBox2(props, ref) {
130
124
  break;
131
125
  }
132
126
  if (newActive && newActive.data.id !== (activeState == null ? void 0 : activeState.id)) {
133
- event.preventDefault();
134
127
  setActive(newActive.data);
135
128
  setFocusVisibleState(true);
136
129
  }
@@ -173,7 +166,7 @@ const ListBox = React.forwardRef(function ListBox2(props, ref) {
173
166
  setActive(void 0);
174
167
  };
175
168
  const handleRef = useForkRef.useForkRef(setListRef, ref);
176
- return /* @__PURE__ */ jsxRuntime.jsx(ListControlContext.ListControlContext.Provider, { value: listControl, children: /* @__PURE__ */ jsxRuntime.jsx(
169
+ return /* @__PURE__ */ jsxRuntime.jsx(ListControlProvider.ListControlProvider, { value: listControl, children: /* @__PURE__ */ jsxRuntime.jsx(
177
170
  "div",
178
171
  {
179
172
  className: clsx.clsx(
@@ -1 +1 @@
1
- {"version":3,"file":"ListBox.js","sources":["../src/list-box/ListBox.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type ForwardedRef,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n useRef,\n} from \"react\";\nimport {\n ListControlContext,\n type OptionValue,\n} from \"../list-control/ListControlContext\";\nimport {\n defaultValueToString,\n type ListControlProps,\n useListControl,\n} from \"../list-control/ListControlState\";\nimport { makePrefixer, useForkRef } from \"../utils\";\n\nimport listBoxCss from \"./ListBox.css\";\n\nexport type ListBoxProps<Item = string> = {\n /**\n * If `true`, the list box will be disabled.\n */\n disabled?: boolean;\n /**\n * If `false`, the list box will have not a border.\n */\n bordered?: boolean;\n /**\n * The options to display in the list box.\n */\n children?: ReactNode;\n /**\n * If `true`, the list box will be multiselect.\n */\n multiselect?: boolean;\n} & ComponentPropsWithoutRef<\"div\"> &\n Omit<ListControlProps<Item>, \"onOpenChange\">;\n\nconst withBaseName = makePrefixer(\"saltListBox\");\n\nexport const ListBox = forwardRef(function ListBox<Item>(\n props: ListBoxProps<Item>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n bordered,\n className,\n children,\n defaultSelected,\n disabled,\n selected,\n onSelectionChange,\n multiselect,\n valueToString = defaultValueToString,\n onKeyDown,\n onFocus,\n onBlur,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-box\",\n css: listBoxCss,\n window: targetWindow,\n });\n\n const listControl = useListControl<Item>({\n multiselect,\n defaultSelected,\n selected,\n onSelectionChange,\n valueToString,\n disabled,\n });\n\n const {\n activeState,\n setActive,\n getOptionAtIndex,\n getIndexOfOption,\n getOptionsMatching,\n getOptionFromSearch,\n getFirstOption,\n getLastOption,\n getOptionAfter,\n getOptionBefore,\n getOptionPageAbove,\n getOptionPageBelow,\n selectedState,\n select,\n setFocusVisibleState,\n setFocusedState,\n setListRef,\n } = listControl;\n\n const typeaheadString = useRef(\"\");\n const typeaheadTimeout = useRef<number | undefined>();\n\n const handleTypeahead = (event: KeyboardEvent<HTMLDivElement>) => {\n if (typeaheadTimeout.current) {\n clearTimeout(typeaheadTimeout.current);\n }\n typeaheadString.current += event.key;\n typeaheadTimeout.current = window.setTimeout(() => {\n typeaheadString.current = \"\";\n }, 500);\n\n let newOption = getOptionFromSearch(typeaheadString.current, activeState);\n\n if (!newOption) {\n newOption = getOptionFromSearch(typeaheadString.current);\n }\n\n if (newOption) {\n setActive(newOption);\n setFocusVisibleState(true);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n event.preventDefault();\n event.stopPropagation();\n handleTypeahead(event);\n }\n\n const activeOption = activeState ?? getFirstOption()?.data;\n\n if (activeOption === undefined) {\n return;\n }\n\n let newActive:\n | { data: OptionValue<Item>; element: HTMLElement }\n | undefined;\n switch (event.key) {\n case \"ArrowDown\":\n newActive = getOptionAfter(activeOption) ?? getLastOption();\n break;\n case \"ArrowUp\":\n newActive = getOptionBefore(activeOption) ?? getFirstOption();\n break;\n case \"Home\":\n newActive = getFirstOption();\n break;\n case \"End\":\n newActive = getLastOption();\n break;\n case \"PageUp\":\n newActive = getOptionPageAbove(activeOption);\n break;\n case \"PageDown\":\n newActive = getOptionPageBelow(activeOption);\n break;\n case \"Enter\":\n case \" \":\n if (\n activeState?.disabled ||\n (typeaheadString.current.trim().length > 0 && event.key === \" \")\n ) {\n event.preventDefault();\n return;\n }\n\n if (!activeState) {\n return;\n }\n\n event.preventDefault();\n select(event, activeState);\n\n break;\n }\n\n if (newActive && newActive.data.id !== activeState?.id) {\n event.preventDefault();\n setActive(newActive.data);\n setFocusVisibleState(true);\n }\n };\n\n const wasMouseDown = useRef(false);\n\n const handleMouseDown = () => {\n wasMouseDown.current = true;\n };\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n if (wasMouseDown.current) {\n wasMouseDown.current = false;\n return;\n }\n\n setFocusVisibleState(true);\n wasMouseDown.current = false;\n\n // We check the active index because the active item may have been removed\n const activeIndex = activeState ? getIndexOfOption(activeState) : -1;\n let newActive: ReturnType<typeof getOptionAtIndex>;\n\n // If the active item is still in the list, we don't need to do anything\n if (activeIndex > 0) {\n return;\n }\n\n // If we have selected an item, we should make that the active item\n if (selectedState.length > 0) {\n newActive = getOptionsMatching(\n (option) => option.value === selectedState[0],\n ).pop();\n }\n\n // If we still don't have an active item, we should just select the first item\n if (!newActive) {\n newActive = getOptionAtIndex(0);\n }\n\n setActive(newActive?.data);\n setFocusedState(true);\n onFocus?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n setFocusedState(false);\n setActive(undefined);\n onBlur?.(event);\n };\n\n const handleListMouseOver = () => {\n setFocusVisibleState(false);\n setActive(undefined);\n };\n\n const handleRef = useForkRef(setListRef, ref);\n\n return (\n <ListControlContext.Provider value={listControl}>\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"bordered\")]: bordered },\n className,\n )}\n role=\"listbox\"\n aria-activedescendant={activeState?.id}\n aria-disabled={disabled || undefined}\n aria-multiselectable={multiselect}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onMouseOver={handleListMouseOver}\n onMouseDown={handleMouseDown}\n ref={handleRef}\n {...rest}\n >\n {children}\n </div>\n </ListControlContext.Provider>\n );\n}) as <Item = string>(\n props: ListBoxProps<Item> & { ref?: Ref<HTMLDivElement> },\n) => JSX.Element;\n"],"names":["makePrefixer","forwardRef","ListBox","defaultValueToString","useWindow","useComponentCssInjection","listBoxCss","useListControl","useRef","useForkRef","jsx","ListControlContext","clsx"],"mappings":"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"}
1
+ {"version":3,"file":"ListBox.js","sources":["../src/list-box/ListBox.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type ForwardedRef,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n useRef,\n} from \"react\";\nimport {\n getListControlNavigationTarget,\n isListControlNavigationKey,\n isModifiedListControlNavigationKey,\n type OptionAndElement,\n} from \"../list-control/ListControlNavigationKeys\";\nimport { ListControlProvider } from \"../list-control/ListControlProvider\";\nimport {\n defaultValueToString,\n type ListControlProps,\n useListControl,\n} from \"../list-control/ListControlState\";\nimport { makePrefixer, useForkRef } from \"../utils\";\n\nimport listBoxCss from \"./ListBox.css\";\n\nexport type ListBoxProps<Item = string> = {\n /**\n * If `true`, the list box will be disabled.\n */\n disabled?: boolean;\n /**\n * If `false`, the list box will have not a border.\n */\n bordered?: boolean;\n /**\n * The options to display in the list box.\n */\n children?: ReactNode;\n /**\n * If `true`, the list box will be multiselect.\n */\n multiselect?: boolean;\n} & ComponentPropsWithoutRef<\"div\"> &\n Omit<ListControlProps<Item>, \"onOpenChange\">;\n\nconst withBaseName = makePrefixer(\"saltListBox\");\n\nexport const ListBox = forwardRef(function ListBox<Item>(\n props: ListBoxProps<Item>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n bordered,\n className,\n children,\n defaultSelected,\n disabled,\n selected,\n onSelectionChange,\n multiselect,\n valueToString = defaultValueToString,\n onKeyDown,\n onFocus,\n onBlur,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-box\",\n css: listBoxCss,\n window: targetWindow,\n });\n\n const listControl = useListControl<Item>({\n multiselect,\n defaultSelected,\n selected,\n onSelectionChange,\n valueToString,\n disabled,\n });\n\n const {\n activeState,\n setActive,\n getOptionAtIndex,\n getIndexOfOption,\n getOptionsMatching,\n getOptionFromSearch,\n getFirstOption,\n getLastOption,\n getOptionAfter,\n getOptionBefore,\n getOptionPageAbove,\n getOptionPageBelow,\n selectedState,\n select,\n setFocusVisibleState,\n setFocusedState,\n setListRef,\n } = listControl;\n\n const typeaheadString = useRef(\"\");\n const typeaheadTimeout = useRef<number | undefined>();\n\n const handleTypeahead = (event: KeyboardEvent<HTMLDivElement>) => {\n if (typeaheadTimeout.current) {\n clearTimeout(typeaheadTimeout.current);\n }\n typeaheadString.current += event.key;\n typeaheadTimeout.current = window.setTimeout(() => {\n typeaheadString.current = \"\";\n }, 500);\n\n const newOption = getOptionFromSearch(typeaheadString.current, activeState);\n\n if (newOption) {\n setActive(newOption);\n setFocusVisibleState(true);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (isModifiedListControlNavigationKey(event)) {\n return;\n }\n\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n event.preventDefault();\n event.stopPropagation();\n handleTypeahead(event);\n }\n\n const activeOption = activeState ?? getFirstOption()?.data;\n\n if (activeOption === undefined) {\n return;\n }\n\n const isNavigationKey = isListControlNavigationKey(event.key);\n if (isNavigationKey) {\n event.preventDefault();\n }\n\n const newActive: OptionAndElement<Item> | undefined = isNavigationKey\n ? getListControlNavigationTarget(event.key, activeOption, {\n getFirstOption,\n getLastOption,\n getOptionAfter,\n getOptionBefore,\n getOptionPageAbove,\n getOptionPageBelow,\n })\n : undefined;\n\n switch (event.key) {\n case \"Enter\":\n case \" \":\n if (\n activeState?.disabled ||\n (typeaheadString.current.trim().length > 0 && event.key === \" \")\n ) {\n event.preventDefault();\n return;\n }\n\n if (!activeState) {\n return;\n }\n\n event.preventDefault();\n select(event, activeState);\n\n break;\n }\n\n if (newActive && newActive.data.id !== activeState?.id) {\n setActive(newActive.data);\n setFocusVisibleState(true);\n }\n };\n\n const wasMouseDown = useRef(false);\n\n const handleMouseDown = () => {\n wasMouseDown.current = true;\n };\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n if (wasMouseDown.current) {\n wasMouseDown.current = false;\n return;\n }\n\n setFocusVisibleState(true);\n wasMouseDown.current = false;\n\n // We check the active index because the active item may have been removed\n const activeIndex = activeState ? getIndexOfOption(activeState) : -1;\n let newActive: ReturnType<typeof getOptionAtIndex>;\n\n // If the active item is still in the list, we don't need to do anything\n if (activeIndex > 0) {\n return;\n }\n\n // If we have selected an item, we should make that the active item\n if (selectedState.length > 0) {\n newActive = getOptionsMatching(\n (option) => option.value === selectedState[0],\n ).pop();\n }\n\n // If we still don't have an active item, we should just select the first item\n if (!newActive) {\n newActive = getOptionAtIndex(0);\n }\n\n setActive(newActive?.data);\n setFocusedState(true);\n onFocus?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n setFocusedState(false);\n setActive(undefined);\n onBlur?.(event);\n };\n\n const handleListMouseOver = () => {\n setFocusVisibleState(false);\n setActive(undefined);\n };\n\n const handleRef = useForkRef(setListRef, ref);\n\n return (\n <ListControlProvider value={listControl}>\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"bordered\")]: bordered },\n className,\n )}\n role=\"listbox\"\n aria-activedescendant={activeState?.id}\n aria-disabled={disabled || undefined}\n aria-multiselectable={multiselect}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onMouseOver={handleListMouseOver}\n onMouseDown={handleMouseDown}\n ref={handleRef}\n {...rest}\n >\n {children}\n </div>\n </ListControlProvider>\n );\n}) as <Item = string>(\n props: ListBoxProps<Item> & { ref?: Ref<HTMLDivElement> },\n) => JSX.Element;\n"],"names":["makePrefixer","forwardRef","ListBox","defaultValueToString","useWindow","useComponentCssInjection","listBoxCss","useListControl","useRef","isModifiedListControlNavigationKey","isListControlNavigationKey","getListControlNavigationTarget","useForkRef","jsx","ListControlProvider","clsx"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ const LIST_CONTROL_NAVIGATION_KEYS = /* @__PURE__ */ new Set([
4
+ "ArrowDown",
5
+ "ArrowUp",
6
+ "Home",
7
+ "End",
8
+ "PageUp",
9
+ "PageDown"
10
+ ]);
11
+ function isListControlNavigationKey(key) {
12
+ return LIST_CONTROL_NAVIGATION_KEYS.has(key);
13
+ }
14
+ function isModifiedListControlNavigationKey(event) {
15
+ if (!isListControlNavigationKey(event.key)) {
16
+ return false;
17
+ }
18
+ if (event.ctrlKey || event.metaKey) {
19
+ return true;
20
+ }
21
+ return event.altKey && event.key !== "ArrowUp" && event.key !== "ArrowDown";
22
+ }
23
+ function getListControlNavigationTarget(key, activeOption, getters) {
24
+ switch (key) {
25
+ case "ArrowDown":
26
+ return getters.getOptionAfter(activeOption) ?? getters.getLastOption();
27
+ case "ArrowUp":
28
+ return getters.getOptionBefore(activeOption) ?? getters.getFirstOption();
29
+ case "Home":
30
+ return getters.getFirstOption();
31
+ case "End":
32
+ return getters.getLastOption();
33
+ case "PageUp":
34
+ return getters.getOptionPageAbove(activeOption);
35
+ case "PageDown":
36
+ return getters.getOptionPageBelow(activeOption);
37
+ default:
38
+ return void 0;
39
+ }
40
+ }
41
+ function getComboBoxNavigationTarget(key, activeOption, getters) {
42
+ switch (key) {
43
+ case "ArrowDown":
44
+ return activeOption ? getters.getOptionAfter(activeOption) : getters.getFirstOption();
45
+ case "ArrowUp":
46
+ return activeOption ? getters.getOptionBefore(activeOption) : getters.getLastOption();
47
+ case "Home":
48
+ return getters.getFirstOption();
49
+ case "End":
50
+ return getters.getLastOption();
51
+ case "PageUp": {
52
+ if (activeOption) {
53
+ return getters.getOptionPageAbove(activeOption);
54
+ }
55
+ const lastOption = getters.getLastOption();
56
+ return lastOption ? getters.getOptionPageAbove(lastOption.data) : void 0;
57
+ }
58
+ case "PageDown": {
59
+ if (activeOption) {
60
+ return getters.getOptionPageBelow(activeOption);
61
+ }
62
+ const firstOption = getters.getFirstOption();
63
+ return firstOption ? getters.getOptionPageBelow(firstOption.data) : void 0;
64
+ }
65
+ default:
66
+ return void 0;
67
+ }
68
+ }
69
+
70
+ exports.getComboBoxNavigationTarget = getComboBoxNavigationTarget;
71
+ exports.getListControlNavigationTarget = getListControlNavigationTarget;
72
+ exports.isListControlNavigationKey = isListControlNavigationKey;
73
+ exports.isModifiedListControlNavigationKey = isModifiedListControlNavigationKey;
74
+ //# sourceMappingURL=ListControlNavigationKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListControlNavigationKeys.js","sources":["../src/list-control/ListControlNavigationKeys.ts"],"sourcesContent":["import type { OptionValue } from \"./ListControlContext\";\n\n/**\n * Keys that move between options while the list is shown. When no list is\n * shown, Dropdown and ComboBox pass the keys they don't use to open the list\n * to the browser.\n */\nconst LIST_CONTROL_NAVIGATION_KEYS: ReadonlySet<string> = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n]);\n\nexport function isListControlNavigationKey(key: string): boolean {\n return LIST_CONTROL_NAVIGATION_KEYS.has(key);\n}\n\n/**\n * Navigation keys pressed with Ctrl or Meta (e.g. Ctrl+End, Cmd+ArrowDown,\n * Ctrl+PageDown) are browser or OS shortcuts, so list controls leave them to\n * the browser. Alt is only used with ArrowUp and ArrowDown, as in the ARIA\n * combobox pattern.\n */\nexport function isModifiedListControlNavigationKey(event: {\n key: string;\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n}): boolean {\n if (!isListControlNavigationKey(event.key)) {\n return false;\n }\n if (event.ctrlKey || event.metaKey) {\n return true;\n }\n return event.altKey && event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\";\n}\n\nexport interface OptionAndElement<Item> {\n data: OptionValue<Item>;\n element: HTMLElement;\n}\n\nexport interface ListControlNavigationGetters<Item> {\n getFirstOption: () => OptionAndElement<Item> | undefined;\n getLastOption: () => OptionAndElement<Item> | undefined;\n getOptionAfter: (\n option: OptionValue<Item>,\n ) => OptionAndElement<Item> | undefined;\n getOptionBefore: (\n option: OptionValue<Item>,\n ) => OptionAndElement<Item> | undefined;\n getOptionPageAbove: (\n option: OptionValue<Item>,\n ) => OptionAndElement<Item> | undefined;\n getOptionPageBelow: (\n option: OptionValue<Item>,\n ) => OptionAndElement<Item> | undefined;\n}\n\n/** Shared by Dropdown and ListBox, which always have an active option. */\nexport function getListControlNavigationTarget<Item>(\n key: string,\n activeOption: OptionValue<Item>,\n getters: ListControlNavigationGetters<Item>,\n): OptionAndElement<Item> | undefined {\n switch (key) {\n case \"ArrowDown\":\n return getters.getOptionAfter(activeOption) ?? getters.getLastOption();\n case \"ArrowUp\":\n return getters.getOptionBefore(activeOption) ?? getters.getFirstOption();\n case \"Home\":\n return getters.getFirstOption();\n case \"End\":\n return getters.getLastOption();\n case \"PageUp\":\n return getters.getOptionPageAbove(activeOption);\n case \"PageDown\":\n return getters.getOptionPageBelow(activeOption);\n default:\n return undefined;\n }\n}\n\n/** For ComboBox, where the active option may be undefined. */\nexport function getComboBoxNavigationTarget<Item>(\n key: string,\n activeOption: OptionValue<Item> | undefined,\n getters: ListControlNavigationGetters<Item>,\n): OptionAndElement<Item> | undefined {\n switch (key) {\n case \"ArrowDown\":\n return activeOption\n ? getters.getOptionAfter(activeOption)\n : getters.getFirstOption();\n case \"ArrowUp\":\n return activeOption\n ? getters.getOptionBefore(activeOption)\n : getters.getLastOption();\n case \"Home\":\n return getters.getFirstOption();\n case \"End\":\n return getters.getLastOption();\n case \"PageUp\": {\n if (activeOption) {\n return getters.getOptionPageAbove(activeOption);\n }\n const lastOption = getters.getLastOption();\n return lastOption\n ? getters.getOptionPageAbove(lastOption.data)\n : undefined;\n }\n case \"PageDown\": {\n if (activeOption) {\n return getters.getOptionPageBelow(activeOption);\n }\n const firstOption = getters.getFirstOption();\n return firstOption\n ? getters.getOptionPageBelow(firstOption.data)\n : undefined;\n }\n default:\n return undefined;\n }\n}\n"],"names":[],"mappings":";;AAOA,MAAM,4BAAA,uBAAwD,GAAA,CAAI;AAAA,EAChE,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,2BAA2B,GAAA,EAAsB;AAC/D,EAAA,OAAO,4BAAA,CAA6B,IAAI,GAAG,CAAA;AAC7C;AAQO,SAAS,mCAAmC,KAAA,EAKvC;AACV,EAAA,IAAI,CAAC,0BAAA,CAA2B,KAAA,CAAM,GAAG,CAAA,EAAG;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,EAAS;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAM,MAAA,IAAU,KAAA,CAAM,GAAA,KAAQ,SAAA,IAAa,MAAM,GAAA,KAAQ,WAAA;AAClE;AAyBO,SAAS,8BAAA,CACd,GAAA,EACA,YAAA,EACA,OAAA,EACoC;AACpC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,WAAA;AACH,MAAA,OAAO,OAAA,CAAQ,cAAA,CAAe,YAAY,CAAA,IAAK,QAAQ,aAAA,EAAc;AAAA,IACvE,KAAK,SAAA;AACH,MAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,YAAY,CAAA,IAAK,QAAQ,cAAA,EAAe;AAAA,IACzE,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,cAAA,EAAe;AAAA,IAChC,KAAK,KAAA;AACH,MAAA,OAAO,QAAQ,aAAA,EAAc;AAAA,IAC/B,KAAK,QAAA;AACH,MAAA,OAAO,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAAA,IAChD,KAAK,UAAA;AACH,MAAA,OAAO,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAAA,IAChD;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAGO,SAAS,2BAAA,CACd,GAAA,EACA,YAAA,EACA,OAAA,EACoC;AACpC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,WAAA;AACH,MAAA,OAAO,eACH,OAAA,CAAQ,cAAA,CAAe,YAAY,CAAA,GACnC,QAAQ,cAAA,EAAe;AAAA,IAC7B,KAAK,SAAA;AACH,MAAA,OAAO,eACH,OAAA,CAAQ,eAAA,CAAgB,YAAY,CAAA,GACpC,QAAQ,aAAA,EAAc;AAAA,IAC5B,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,cAAA,EAAe;AAAA,IAChC,KAAK,KAAA;AACH,MAAA,OAAO,QAAQ,aAAA,EAAc;AAAA,IAC/B,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAAA,MAChD;AACA,MAAA,MAAM,UAAA,GAAa,QAAQ,aAAA,EAAc;AACzC,MAAA,OAAO,UAAA,GACH,OAAA,CAAQ,kBAAA,CAAmB,UAAA,CAAW,IAAI,CAAA,GAC1C,MAAA;AAAA,IACN;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAAA,MAChD;AACA,MAAA,MAAM,WAAA,GAAc,QAAQ,cAAA,EAAe;AAC3C,MAAA,OAAO,WAAA,GACH,OAAA,CAAQ,kBAAA,CAAmB,WAAA,CAAY,IAAI,CAAA,GAC3C,MAAA;AAAA,IACN;AAAA,IACA;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;;;;;;;"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var createContext = require('../utils/createContext.js');
6
+ require('clsx');
7
+ require('../utils/useFloatingUI/useFloatingUI.js');
8
+ require('../utils/useId.js');
9
+ require('../salt-provider/SaltProvider.js');
10
+ require('../viewport/ViewportProvider.js');
11
+ var ListControlOptionStore = require('./ListControlOptionStore.js');
12
+
13
+ const fallbackOptionStateStore = new ListControlOptionStore.ListControlOptionStore();
14
+ const defaultListControlOptionContext = {
15
+ disabled: false,
16
+ listRef: void 0,
17
+ multiselect: false,
18
+ optionStateStore: fallbackOptionStateStore,
19
+ register: () => () => void 0,
20
+ select: () => void 0,
21
+ setActive: () => void 0,
22
+ valueToString: (item) => String(item)
23
+ };
24
+ const ListControlOptionContext = createContext.createContext(
25
+ "ListControlOptionContext",
26
+ defaultListControlOptionContext
27
+ );
28
+ function ListControlOptionContextProvider({
29
+ children,
30
+ value
31
+ }) {
32
+ return /* @__PURE__ */ jsxRuntime.jsx(
33
+ ListControlOptionContext.Provider,
34
+ {
35
+ value,
36
+ children
37
+ }
38
+ );
39
+ }
40
+ function useListControlOptionContext() {
41
+ const context = React.useContext(ListControlOptionContext);
42
+ return context;
43
+ }
44
+
45
+ exports.ListControlOptionContextProvider = ListControlOptionContextProvider;
46
+ exports.useListControlOptionContext = useListControlOptionContext;
47
+ //# sourceMappingURL=ListControlOptionContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListControlOptionContext.js","sources":["../src/list-control/ListControlOptionContext.tsx"],"sourcesContent":["import {\n type ReactNode,\n type RefObject,\n type SyntheticEvent,\n useContext,\n} from \"react\";\nimport { createContext } from \"../utils\";\nimport type { OptionValue } from \"./ListControlContext\";\nimport { ListControlOptionStore } from \"./ListControlOptionStore\";\n\nexport interface ListControlOptionContextValue<Item> {\n disabled?: boolean;\n listRef?: RefObject<HTMLDivElement>;\n multiselect: boolean;\n optionStateStore: ListControlOptionStore<Item>;\n register: (\n optionValue: OptionValue<Item>,\n element: HTMLElement,\n ) => () => void;\n select: (event: SyntheticEvent, option: OptionValue<Item>) => void;\n setActive: (option: OptionValue<Item>) => void;\n valueToString: (item: Item) => string;\n}\n\nconst fallbackOptionStateStore = new ListControlOptionStore<unknown>();\n\nconst defaultListControlOptionContext: ListControlOptionContextValue<unknown> =\n {\n disabled: false,\n listRef: undefined,\n multiselect: false,\n optionStateStore: fallbackOptionStateStore,\n register: () => () => undefined,\n select: () => undefined,\n setActive: () => undefined,\n valueToString: (item) => String(item),\n };\n\nconst ListControlOptionContext = createContext(\n \"ListControlOptionContext\",\n defaultListControlOptionContext,\n);\n\nexport function ListControlOptionContextProvider<Item>({\n children,\n value,\n}: {\n children: ReactNode;\n value: ListControlOptionContextValue<Item>;\n}) {\n return (\n <ListControlOptionContext.Provider\n value={value as unknown as ListControlOptionContextValue<unknown>}\n >\n {children}\n </ListControlOptionContext.Provider>\n );\n}\n\nexport function useListControlOptionContext<Item>() {\n const context = useContext(ListControlOptionContext);\n return context as unknown as ListControlOptionContextValue<Item>;\n}\n"],"names":["ListControlOptionStore","createContext","jsx","useContext"],"mappings":";;;;;;;;;;;;AAwBA,MAAM,wBAAA,GAA2B,IAAIA,6CAAA,EAAgC;AAErE,MAAM,+BAAA,GACJ;AAAA,EACE,QAAA,EAAU,KAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,WAAA,EAAa,KAAA;AAAA,EACb,gBAAA,EAAkB,wBAAA;AAAA,EAClB,QAAA,EAAU,MAAM,MAAM,MAAA;AAAA,EACtB,QAAQ,MAAM,MAAA;AAAA,EACd,WAAW,MAAM,MAAA;AAAA,EACjB,aAAA,EAAe,CAAC,IAAA,KAAS,MAAA,CAAO,IAAI;AACtC,CAAA;AAEF,MAAM,wBAAA,GAA2BC,2BAAA;AAAA,EAC/B,0BAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,gCAAA,CAAuC;AAAA,EACrD,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEC,cAAA;AAAA,IAAC,wBAAA,CAAyB,QAAA;AAAA,IAAzB;AAAA,MACC,KAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,2BAAA,GAAoC;AAClD,EAAA,MAAM,OAAA,GAAUC,iBAAW,wBAAwB,CAAA;AACnD,EAAA,OAAO,OAAA;AACT;;;;;"}
@@ -0,0 +1,159 @@
1
+ 'use strict';
2
+
3
+ var __typeError = (msg) => {
4
+ throw TypeError(msg);
5
+ };
6
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
7
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
8
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
9
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
10
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
11
+ var __privateWrapper = (obj, member, setter, getter) => ({
12
+ set _(value) {
13
+ __privateSet(obj, member, value);
14
+ },
15
+ get _() {
16
+ return __privateGet(obj, member, getter);
17
+ }
18
+ });
19
+ var _listeners, _options, _optionIdsByValue, _activeId, _focusVisible, _nextGeneration, _selected, _ListControlOptionStore_instances, notify_fn, deleteValueId_fn;
20
+ const OPTION_STATE_ACTIVE = 1;
21
+ const OPTION_STATE_SELECTED = 2;
22
+ const OPTION_STATE_FOCUS_VISIBLE = 4;
23
+ function hasOptionState(snapshot, state) {
24
+ return (snapshot & state) !== 0;
25
+ }
26
+ class ListControlOptionStore {
27
+ constructor(selected = []) {
28
+ __privateAdd(this, _ListControlOptionStore_instances);
29
+ __privateAdd(this, _listeners, /* @__PURE__ */ new Map());
30
+ __privateAdd(this, _options, /* @__PURE__ */ new Map());
31
+ __privateAdd(this, _optionIdsByValue, /* @__PURE__ */ new Map());
32
+ __privateAdd(this, _activeId);
33
+ __privateAdd(this, _focusVisible, false);
34
+ __privateAdd(this, _nextGeneration, 0);
35
+ __privateAdd(this, _selected);
36
+ __privateSet(this, _selected, new Set(selected));
37
+ }
38
+ subscribe(id, listener) {
39
+ let listeners = __privateGet(this, _listeners).get(id);
40
+ if (!listeners) {
41
+ listeners = /* @__PURE__ */ new Set();
42
+ __privateGet(this, _listeners).set(id, listeners);
43
+ }
44
+ listeners.add(listener);
45
+ return () => {
46
+ const currentListeners = __privateGet(this, _listeners).get(id);
47
+ currentListeners == null ? void 0 : currentListeners.delete(listener);
48
+ if ((currentListeners == null ? void 0 : currentListeners.size) === 0) {
49
+ __privateGet(this, _listeners).delete(id);
50
+ }
51
+ };
52
+ }
53
+ register(option) {
54
+ const previousEntry = __privateGet(this, _options).get(option.id);
55
+ const previousSnapshot = this.getSnapshot(option.id);
56
+ if (previousEntry) {
57
+ __privateMethod(this, _ListControlOptionStore_instances, deleteValueId_fn).call(this, previousEntry.option.value, option.id);
58
+ }
59
+ const entry = {
60
+ generation: __privateWrapper(this, _nextGeneration)._++,
61
+ option
62
+ };
63
+ __privateGet(this, _options).set(option.id, entry);
64
+ const valueIds = __privateGet(this, _optionIdsByValue).get(option.value);
65
+ if (valueIds === void 0) {
66
+ __privateGet(this, _optionIdsByValue).set(option.value, option.id);
67
+ } else if (typeof valueIds === "string") {
68
+ __privateGet(this, _optionIdsByValue).set(option.value, /* @__PURE__ */ new Set([valueIds, option.id]));
69
+ } else {
70
+ valueIds.add(option.id);
71
+ }
72
+ if (previousEntry !== void 0 || previousSnapshot !== this.getSnapshot(option.id)) {
73
+ __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, option.id);
74
+ }
75
+ return () => {
76
+ const current = __privateGet(this, _options).get(option.id);
77
+ if ((current == null ? void 0 : current.generation) !== entry.generation) return;
78
+ const previousSnapshot2 = this.getSnapshot(option.id);
79
+ __privateGet(this, _options).delete(option.id);
80
+ __privateMethod(this, _ListControlOptionStore_instances, deleteValueId_fn).call(this, option.value, option.id);
81
+ if (previousSnapshot2 !== 0) __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, option.id);
82
+ };
83
+ }
84
+ getSnapshot(id, currentOption) {
85
+ var _a;
86
+ const option = currentOption ?? ((_a = __privateGet(this, _options).get(id)) == null ? void 0 : _a.option);
87
+ if (!option) return 0;
88
+ let snapshot = 0;
89
+ if (id === __privateGet(this, _activeId)) {
90
+ snapshot |= OPTION_STATE_ACTIVE;
91
+ if (__privateGet(this, _focusVisible)) snapshot |= OPTION_STATE_FOCUS_VISIBLE;
92
+ }
93
+ if (__privateGet(this, _selected).has(option.value)) {
94
+ snapshot |= OPTION_STATE_SELECTED;
95
+ }
96
+ return snapshot;
97
+ }
98
+ setActiveId(id) {
99
+ if (id === __privateGet(this, _activeId)) return;
100
+ const previousId = __privateGet(this, _activeId);
101
+ __privateSet(this, _activeId, id);
102
+ if (previousId !== void 0) __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, previousId);
103
+ if (id !== void 0) __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, id);
104
+ }
105
+ setFocusVisible(focusVisible) {
106
+ if (focusVisible === __privateGet(this, _focusVisible)) return;
107
+ __privateSet(this, _focusVisible, focusVisible);
108
+ if (__privateGet(this, _activeId) !== void 0) __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, __privateGet(this, _activeId));
109
+ }
110
+ setSelected(selected) {
111
+ const previous = __privateGet(this, _selected);
112
+ const nextSelected = new Set(selected);
113
+ __privateSet(this, _selected, nextSelected);
114
+ const candidateValues = /* @__PURE__ */ new Set([...previous, ...nextSelected]);
115
+ for (const value of candidateValues) {
116
+ if (previous.has(value) !== nextSelected.has(value)) {
117
+ const ids = __privateGet(this, _optionIdsByValue).get(value);
118
+ if (typeof ids === "string") {
119
+ __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, ids);
120
+ } else if (ids !== void 0) {
121
+ for (const id of ids) __privateMethod(this, _ListControlOptionStore_instances, notify_fn).call(this, id);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ _listeners = new WeakMap();
128
+ _options = new WeakMap();
129
+ _optionIdsByValue = new WeakMap();
130
+ _activeId = new WeakMap();
131
+ _focusVisible = new WeakMap();
132
+ _nextGeneration = new WeakMap();
133
+ _selected = new WeakMap();
134
+ _ListControlOptionStore_instances = new WeakSet();
135
+ notify_fn = function(id) {
136
+ const listeners = __privateGet(this, _listeners).get(id);
137
+ if (!listeners) return;
138
+ for (const listener of [...listeners]) listener();
139
+ };
140
+ deleteValueId_fn = function(value, id) {
141
+ const ids = __privateGet(this, _optionIdsByValue).get(value);
142
+ if (typeof ids === "string") {
143
+ if (ids === id) __privateGet(this, _optionIdsByValue).delete(value);
144
+ return;
145
+ }
146
+ ids == null ? void 0 : ids.delete(id);
147
+ if ((ids == null ? void 0 : ids.size) === 1) {
148
+ __privateGet(this, _optionIdsByValue).set(value, ids.values().next().value);
149
+ } else if ((ids == null ? void 0 : ids.size) === 0) {
150
+ __privateGet(this, _optionIdsByValue).delete(value);
151
+ }
152
+ };
153
+
154
+ exports.ListControlOptionStore = ListControlOptionStore;
155
+ exports.OPTION_STATE_ACTIVE = OPTION_STATE_ACTIVE;
156
+ exports.OPTION_STATE_FOCUS_VISIBLE = OPTION_STATE_FOCUS_VISIBLE;
157
+ exports.OPTION_STATE_SELECTED = OPTION_STATE_SELECTED;
158
+ exports.hasOptionState = hasOptionState;
159
+ //# sourceMappingURL=ListControlOptionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListControlOptionStore.js","sources":["../src/list-control/ListControlOptionStore.ts"],"sourcesContent":["import type { OptionValue } from \"./ListControlContext\";\n\nexport const OPTION_STATE_ACTIVE = 1;\nexport const OPTION_STATE_SELECTED = 2;\nexport const OPTION_STATE_FOCUS_VISIBLE = 4;\n\nexport type OptionStateSnapshot = number;\n\nexport function hasOptionState(\n snapshot: OptionStateSnapshot,\n state: OptionStateSnapshot,\n): boolean {\n return (snapshot & state) !== 0;\n}\n\ninterface OptionEntry<Item> {\n generation: number;\n option: OptionValue<Item>;\n}\n\n/** Internal per-list store used to target updates at affected Options. */\nexport class ListControlOptionStore<Item> {\n readonly #listeners = new Map<string, Set<() => void>>();\n readonly #options = new Map<string, OptionEntry<Item>>();\n readonly #optionIdsByValue = new Map<Item, string | Set<string>>();\n #activeId: string | undefined;\n #focusVisible = false;\n #nextGeneration = 0;\n #selected: ReadonlySet<Item>;\n\n constructor(selected: readonly Item[] = []) {\n this.#selected = new Set(selected);\n }\n\n subscribe(id: string, listener: () => void): () => void {\n let listeners = this.#listeners.get(id);\n if (!listeners) {\n listeners = new Set();\n this.#listeners.set(id, listeners);\n }\n listeners.add(listener);\n\n return () => {\n const currentListeners = this.#listeners.get(id);\n currentListeners?.delete(listener);\n if (currentListeners?.size === 0) {\n this.#listeners.delete(id);\n }\n };\n }\n\n register(option: OptionValue<Item>): () => void {\n const previousEntry = this.#options.get(option.id);\n const previousSnapshot = this.getSnapshot(option.id);\n if (previousEntry) {\n this.#deleteValueId(previousEntry.option.value, option.id);\n }\n const entry = {\n generation: this.#nextGeneration++,\n option,\n };\n this.#options.set(option.id, entry);\n const valueIds = this.#optionIdsByValue.get(option.value);\n if (valueIds === undefined) {\n this.#optionIdsByValue.set(option.value, option.id);\n } else if (typeof valueIds === \"string\") {\n this.#optionIdsByValue.set(option.value, new Set([valueIds, option.id]));\n } else {\n valueIds.add(option.id);\n }\n\n if (\n previousEntry !== undefined ||\n previousSnapshot !== this.getSnapshot(option.id)\n ) {\n this.#notify(option.id);\n }\n\n return () => {\n const current = this.#options.get(option.id);\n if (current?.generation !== entry.generation) return;\n const previousSnapshot = this.getSnapshot(option.id);\n this.#options.delete(option.id);\n this.#deleteValueId(option.value, option.id);\n if (previousSnapshot !== 0) this.#notify(option.id);\n };\n }\n\n getSnapshot(\n id: string,\n currentOption?: OptionValue<Item>,\n ): OptionStateSnapshot {\n const option = currentOption ?? this.#options.get(id)?.option;\n if (!option) return 0;\n\n let snapshot = 0;\n if (id === this.#activeId) {\n snapshot |= OPTION_STATE_ACTIVE;\n if (this.#focusVisible) snapshot |= OPTION_STATE_FOCUS_VISIBLE;\n }\n if (this.#selected.has(option.value)) {\n snapshot |= OPTION_STATE_SELECTED;\n }\n return snapshot;\n }\n\n setActiveId(id: string | undefined): void {\n if (id === this.#activeId) return;\n const previousId = this.#activeId;\n this.#activeId = id;\n if (previousId !== undefined) this.#notify(previousId);\n if (id !== undefined) this.#notify(id);\n }\n\n setFocusVisible(focusVisible: boolean): void {\n if (focusVisible === this.#focusVisible) return;\n this.#focusVisible = focusVisible;\n if (this.#activeId !== undefined) this.#notify(this.#activeId);\n }\n\n setSelected(selected: readonly Item[]): void {\n const previous = this.#selected;\n const nextSelected = new Set(selected);\n this.#selected = nextSelected;\n\n const candidateValues = new Set([...previous, ...nextSelected]);\n for (const value of candidateValues) {\n if (previous.has(value) !== nextSelected.has(value)) {\n const ids = this.#optionIdsByValue.get(value);\n if (typeof ids === \"string\") {\n this.#notify(ids);\n } else if (ids !== undefined) {\n for (const id of ids) this.#notify(id);\n }\n }\n }\n }\n\n #notify(id: string): void {\n const listeners = this.#listeners.get(id);\n if (!listeners) return;\n for (const listener of [...listeners]) listener();\n }\n\n #deleteValueId(value: Item, id: string): void {\n const ids = this.#optionIdsByValue.get(value);\n if (typeof ids === \"string\") {\n if (ids === id) this.#optionIdsByValue.delete(value);\n return;\n }\n ids?.delete(id);\n if (ids?.size === 1) {\n this.#optionIdsByValue.set(value, ids.values().next().value as string);\n } else if (ids?.size === 0) {\n this.#optionIdsByValue.delete(value);\n }\n }\n}\n"],"names":["previousSnapshot"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var ListControlContext = require('./ListControlContext.js');
6
+ var ListControlOptionContext = require('./ListControlOptionContext.js');
7
+
8
+ function ListControlProvider({
9
+ children,
10
+ value
11
+ }) {
12
+ const { optionStateStore, ...publicValue } = value;
13
+ const optionValue = React.useMemo(
14
+ () => ({
15
+ disabled: value.disabled,
16
+ listRef: value.listRef,
17
+ multiselect: value.multiselect,
18
+ optionStateStore,
19
+ register: value.register,
20
+ select: value.select,
21
+ setActive: value.setActive,
22
+ valueToString: value.valueToString
23
+ }),
24
+ [
25
+ optionStateStore,
26
+ value.disabled,
27
+ value.listRef,
28
+ value.multiselect,
29
+ value.register,
30
+ value.select,
31
+ value.setActive,
32
+ value.valueToString
33
+ ]
34
+ );
35
+ return /* @__PURE__ */ jsxRuntime.jsx(ListControlContext.ListControlContext.Provider, { value: publicValue, children: /* @__PURE__ */ jsxRuntime.jsx(ListControlOptionContext.ListControlOptionContextProvider, { value: optionValue, children }) });
36
+ }
37
+
38
+ exports.ListControlProvider = ListControlProvider;
39
+ //# sourceMappingURL=ListControlProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListControlProvider.js","sources":["../src/list-control/ListControlProvider.tsx"],"sourcesContent":["import { type ReactNode, useMemo } from \"react\";\nimport {\n ListControlContext,\n type ListControlContextValue,\n} from \"./ListControlContext\";\nimport {\n ListControlOptionContextProvider,\n type ListControlOptionContextValue,\n} from \"./ListControlOptionContext\";\nimport type { ListControlOptionStore } from \"./ListControlOptionStore\";\n\ntype ListControlProviderValue<Item> = ListControlContextValue<Item> & {\n optionStateStore: ListControlOptionStore<Item>;\n};\n\nexport function ListControlProvider<Item>({\n children,\n value,\n}: {\n children: ReactNode;\n value: ListControlProviderValue<Item>;\n}) {\n const { optionStateStore, ...publicValue } = value;\n const optionValue = useMemo<ListControlOptionContextValue<Item>>(\n () => ({\n disabled: value.disabled,\n listRef: value.listRef,\n multiselect: value.multiselect,\n optionStateStore,\n register: value.register,\n select: value.select,\n setActive: value.setActive,\n valueToString: value.valueToString,\n }),\n [\n optionStateStore,\n value.disabled,\n value.listRef,\n value.multiselect,\n value.register,\n value.select,\n value.setActive,\n value.valueToString,\n ],\n );\n\n return (\n <ListControlContext.Provider value={publicValue}>\n <ListControlOptionContextProvider value={optionValue}>\n {children}\n </ListControlOptionContextProvider>\n </ListControlContext.Provider>\n );\n}\n"],"names":["useMemo","jsx","ListControlContext","ListControlOptionContextProvider"],"mappings":";;;;;;;AAeO,SAAS,mBAAA,CAA0B;AAAA,EACxC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,EAAE,gBAAA,EAAkB,GAAG,WAAA,EAAY,GAAI,KAAA;AAC7C,EAAA,MAAM,WAAA,GAAcA,aAAA;AAAA,IAClB,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,gBAAA;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,eAAe,KAAA,CAAM;AAAA,KACvB,CAAA;AAAA,IACA;AAAA,MACE,gBAAA;AAAA,MACA,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,OAAA;AAAA,MACN,KAAA,CAAM,WAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,MAAA;AAAA,MACN,KAAA,CAAM,SAAA;AAAA,MACN,KAAA,CAAM;AAAA;AACR,GACF;AAEA,EAAA,uBACEC,cAAA,CAACC,qCAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,WAAA,EAClC,QAAA,kBAAAD,cAAA,CAACE,yDAAA,EAAA,EAAiC,KAAA,EAAO,WAAA,EACtC,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;;;;"}