@salt-ds/lab 1.0.0-alpha.67 → 1.0.0-alpha.68

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 (547) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/css/salt-lab.css +24 -190
  3. package/dist-cjs/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
  4. package/dist-cjs/button-bar/ButtonBar.js.map +1 -1
  5. package/dist-cjs/button-bar/OrderedButton.js.map +1 -1
  6. package/dist-cjs/button-bar/internal/useDescendant.js.map +1 -1
  7. package/dist-cjs/calendar/Calendar.js +23 -8
  8. package/dist-cjs/calendar/Calendar.js.map +1 -1
  9. package/dist-cjs/calendar/CalendarGrid.js +56 -80
  10. package/dist-cjs/calendar/CalendarGrid.js.map +1 -1
  11. package/dist-cjs/calendar/CalendarMonthHeader.css.js +6 -0
  12. package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +1 -0
  13. package/dist-cjs/calendar/CalendarMonthHeader.js +48 -0
  14. package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -0
  15. package/dist-cjs/calendar/CalendarNavigation.js +30 -39
  16. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
  17. package/dist-cjs/calendar/CalendarWeekHeader.js +2 -6
  18. package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -1
  19. package/dist-cjs/calendar/internal/CalendarContext.js +3 -1
  20. package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -1
  21. package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
  22. package/dist-cjs/calendar/internal/CalendarDay.js +88 -76
  23. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
  24. package/dist-cjs/calendar/internal/CalendarMonth.js +13 -23
  25. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
  26. package/dist-cjs/calendar/internal/useFocusManagement.js +5 -6
  27. package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
  28. package/dist-cjs/calendar/internal/utils.js +8 -12
  29. package/dist-cjs/calendar/internal/utils.js.map +1 -1
  30. package/dist-cjs/calendar/useCalendar.js +69 -109
  31. package/dist-cjs/calendar/useCalendar.js.map +1 -1
  32. package/dist-cjs/calendar/useCalendarDay.js +21 -18
  33. package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
  34. package/dist-cjs/calendar/useCalendarSelection.js +146 -34
  35. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
  36. package/dist-cjs/carousel/CarouselContext.js.map +1 -1
  37. package/dist-cjs/carousel/CarouselControls.js.map +1 -1
  38. package/dist-cjs/carousel/CarouselReducer.js.map +1 -1
  39. package/dist-cjs/carousel/CarouselSlide.js.map +1 -1
  40. package/dist-cjs/carousel/CarouselSlider.js.map +1 -1
  41. package/dist-cjs/cascading-menu/CascadingMenu.js.map +1 -1
  42. package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
  43. package/dist-cjs/cascading-menu/CascadingMenuList.js.map +1 -1
  44. package/dist-cjs/cascading-menu/internal/keydownHandlers.js.map +1 -1
  45. package/dist-cjs/cascading-menu/internal/useClickAway.js.map +1 -1
  46. package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  47. package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  48. package/dist-cjs/cascading-menu/internal/useStateReducer.js.map +1 -1
  49. package/dist-cjs/cascading-menu/stateChangeTypes.js +0 -1
  50. package/dist-cjs/cascading-menu/stateChangeTypes.js.map +1 -1
  51. package/dist-cjs/color-chooser/Color.js.map +1 -1
  52. package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
  53. package/dist-cjs/color-chooser/ColorHelpers.js.map +1 -1
  54. package/dist-cjs/color-chooser/ColorPicker.js.map +1 -1
  55. package/dist-cjs/color-chooser/DictTabs.js.map +1 -1
  56. package/dist-cjs/color-chooser/HexInput.js.map +1 -1
  57. package/dist-cjs/color-chooser/Swatch.js.map +1 -1
  58. package/dist-cjs/color-chooser/Swatches.js.map +1 -1
  59. package/dist-cjs/color-chooser/SwatchesPicker.js.map +1 -1
  60. package/dist-cjs/combo-box/ComboBox.js +0 -2
  61. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  62. package/dist-cjs/combo-box/useCombobox.js.map +1 -1
  63. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +0 -4
  64. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  65. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -4
  66. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  67. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  68. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  69. package/dist-cjs/combo-box-deprecated/internal/usePopperStatus.js.map +1 -1
  70. package/dist-cjs/common-hooks/calcPreferredHeight.js.map +1 -1
  71. package/dist-cjs/common-hooks/collectionProvider.js.map +1 -1
  72. package/dist-cjs/common-hooks/list-dom-utils.js.map +1 -1
  73. package/dist-cjs/common-hooks/selectionTypes.js.map +1 -1
  74. package/dist-cjs/common-hooks/useCollapsibleGroups.js.map +1 -1
  75. package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
  76. package/dist-cjs/common-hooks/useImperativeScrollingAPI.js.map +1 -1
  77. package/dist-cjs/common-hooks/useKeyboardNavigation.js.map +1 -1
  78. package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  79. package/dist-cjs/common-hooks/useSelection.js.map +1 -1
  80. package/dist-cjs/common-hooks/useTypeahead.js +1 -1
  81. package/dist-cjs/common-hooks/useTypeahead.js.map +1 -1
  82. package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
  83. package/dist-cjs/common-hooks/utils/collection-item-utils.js.map +1 -1
  84. package/dist-cjs/contact-details/ContactPrimaryInfo.js.map +1 -1
  85. package/dist-cjs/contact-details/ContactSecondaryInfo.js.map +1 -1
  86. package/dist-cjs/contact-details/ContactTertiaryInfo.js.map +1 -1
  87. package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
  88. package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
  89. package/dist-cjs/date-input/DateInputRange.js +61 -51
  90. package/dist-cjs/date-input/DateInputRange.js.map +1 -1
  91. package/dist-cjs/date-input/DateInputSingle.js +33 -18
  92. package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
  93. package/dist-cjs/date-picker/DatePicker.js +9 -1
  94. package/dist-cjs/date-picker/DatePicker.js.map +1 -1
  95. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -1
  96. package/dist-cjs/date-picker/DatePickerContext.js.map +1 -1
  97. package/dist-cjs/date-picker/DatePickerHelperText.css.js +6 -0
  98. package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +1 -0
  99. package/dist-cjs/date-picker/DatePickerHelperText.js +36 -0
  100. package/dist-cjs/date-picker/DatePickerHelperText.js.map +1 -0
  101. package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -1
  102. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +40 -16
  103. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
  104. package/dist-cjs/date-picker/DatePickerPanel.css.js +1 -1
  105. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +247 -0
  106. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  107. package/dist-cjs/date-picker/DatePickerRangeInput.js +38 -6
  108. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
  109. package/dist-cjs/date-picker/DatePickerRangePanel.js +188 -32
  110. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
  111. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +255 -0
  112. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  113. package/dist-cjs/date-picker/DatePickerSingleInput.js +13 -5
  114. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
  115. package/dist-cjs/date-picker/DatePickerSinglePanel.js +6 -105
  116. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -1
  117. package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -1
  118. package/dist-cjs/date-picker/useDatePicker.js +71 -11
  119. package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
  120. package/dist-cjs/date-picker/useFocusOut.js +43 -0
  121. package/dist-cjs/date-picker/useFocusOut.js.map +1 -0
  122. package/dist-cjs/date-picker/useKeyboard.js +4 -5
  123. package/dist-cjs/date-picker/useKeyboard.js.map +1 -1
  124. package/dist-cjs/deck-item/DeckItem.js.map +1 -1
  125. package/dist-cjs/deck-layout/DeckLayout.js.map +1 -1
  126. package/dist-cjs/dropdown/Dropdown.js +0 -1
  127. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  128. package/dist-cjs/dropdown/DropdownBase.js +0 -1
  129. package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
  130. package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
  131. package/dist-cjs/dropdown/useClickAway.js.map +1 -1
  132. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  133. package/dist-cjs/dropdown/useDropdownBase.js.map +1 -1
  134. package/dist-cjs/editable-label/EditableLabel.js.map +1 -1
  135. package/dist-cjs/form-field-legacy/FormFieldLegacy.js.map +1 -1
  136. package/dist-cjs/form-field-legacy/StatusIndicator.js.map +1 -1
  137. package/dist-cjs/formatted-input/FormattedInput.js.map +1 -1
  138. package/dist-cjs/index.js +8 -8
  139. package/dist-cjs/input-legacy/InputLegacy.js.map +1 -1
  140. package/dist-cjs/input-legacy/useCursorOnFocus.js.map +1 -1
  141. package/dist-cjs/list/Highlighter.js.map +1 -1
  142. package/dist-cjs/list/List.js.map +1 -1
  143. package/dist-cjs/list/ListItem.js.map +1 -1
  144. package/dist-cjs/list/VirtualizedList.js.map +1 -1
  145. package/dist-cjs/list/useList.js +0 -1
  146. package/dist-cjs/list/useList.js.map +1 -1
  147. package/dist-cjs/list/useListHeight.js.map +1 -1
  148. package/dist-cjs/list-deprecated/ListBase.js +1 -3
  149. package/dist-cjs/list-deprecated/ListBase.js.map +1 -1
  150. package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
  151. package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
  152. package/dist-cjs/list-deprecated/ListItemContext.js.map +1 -1
  153. package/dist-cjs/list-deprecated/internal/DescendantContext.js.map +1 -1
  154. package/dist-cjs/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
  155. package/dist-cjs/list-deprecated/internal/useWidth.js.map +1 -1
  156. package/dist-cjs/list-deprecated/useList.js.map +1 -1
  157. package/dist-cjs/list-deprecated/useListItem.js.map +1 -1
  158. package/dist-cjs/list-deprecated/useTypeSelect.js.map +1 -1
  159. package/dist-cjs/list-next/ListItemNext.js.map +1 -1
  160. package/dist-cjs/list-next/ListNext.js.map +1 -1
  161. package/dist-cjs/list-next/ListNextContext.js.map +1 -1
  162. package/dist-cjs/list-next/useList.js.map +1 -1
  163. package/dist-cjs/localization-provider/LocalizationProvider.js +5 -2
  164. package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -1
  165. package/dist-cjs/menu-button/MenuButton.js.map +1 -1
  166. package/dist-cjs/metric/MetricContent.js.map +1 -1
  167. package/dist-cjs/number-input/NumberInput.js.map +1 -1
  168. package/dist-cjs/number-input/useNumberInput.js.map +1 -1
  169. package/dist-cjs/query-input/internal/CategoryListContext.js.map +1 -1
  170. package/dist-cjs/query-input/internal/CategoryListItem.js.map +1 -1
  171. package/dist-cjs/query-input/internal/usePopperStatus.js +2 -2
  172. package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
  173. package/dist-cjs/query-input/useQueryInput.js +0 -1
  174. package/dist-cjs/query-input/useQueryInput.js.map +1 -1
  175. package/dist-cjs/responsive/OverflowReducer.js +1 -3
  176. package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
  177. package/dist-cjs/responsive/useDynamicCollapse.js.map +1 -1
  178. package/dist-cjs/responsive/useInstantCollapse.js.map +1 -1
  179. package/dist-cjs/responsive/useOverflow.js.map +1 -1
  180. package/dist-cjs/responsive/useOverflowCollectionItems.js.map +1 -1
  181. package/dist-cjs/responsive/useOverflowLayout.js +0 -3
  182. package/dist-cjs/responsive/useOverflowLayout.js.map +1 -1
  183. package/dist-cjs/responsive/useReclaimSpace.js.map +1 -1
  184. package/dist-cjs/responsive/useResizeObserver.js.map +1 -1
  185. package/dist-cjs/responsive/useWidth.js.map +1 -1
  186. package/dist-cjs/responsive/utils.js.map +1 -1
  187. package/dist-cjs/search-input/SearchInput.js.map +1 -1
  188. package/dist-cjs/tabs/Tab.js.map +1 -1
  189. package/dist-cjs/tabs/Tabs.js.map +1 -1
  190. package/dist-cjs/tabs/Tabstrip.js +0 -1
  191. package/dist-cjs/tabs/Tabstrip.js.map +1 -1
  192. package/dist-cjs/tabs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  193. package/dist-cjs/tabs/drag-drop/useDragSpacers.js.map +1 -1
  194. package/dist-cjs/tabs/useEditableItem.js.map +1 -1
  195. package/dist-cjs/tabs/useKeyboardNavigation.js.map +1 -1
  196. package/dist-cjs/tabs/useSelection.js.map +1 -1
  197. package/dist-cjs/tabs/useTabs.js.map +1 -1
  198. package/dist-cjs/tabs/useTabstrip.js.map +1 -1
  199. package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
  200. package/dist-cjs/tabs-next/TabNext.js.map +1 -1
  201. package/dist-cjs/tabs-next/TabNextAction.js.map +1 -1
  202. package/dist-cjs/tabs-next/TabNextContext.js.map +1 -1
  203. package/dist-cjs/tabs-next/TabNextPanel.js.map +1 -1
  204. package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
  205. package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
  206. package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
  207. package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
  208. package/dist-cjs/tabs-next/hooks/useCollection.js +2 -2
  209. package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
  210. package/dist-cjs/tabs-next/hooks/useFocusOutside.js.map +1 -1
  211. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  212. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +1 -1
  213. package/dist-cjs/tokenized-input/TokenizedInputBase.js.map +1 -1
  214. package/dist-cjs/tokenized-input/internal/InputPill.js.map +1 -1
  215. package/dist-cjs/tokenized-input/internal/getCursorPosition.js.map +1 -1
  216. package/dist-cjs/tokenized-input/internal/useResizeObserver.js.map +1 -1
  217. package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
  218. package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -1
  219. package/dist-cjs/tokenized-input-next/internal/InputPill.js.map +1 -1
  220. package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
  221. package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js +1 -1
  222. package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
  223. package/dist-cjs/toolbar/Tooltray.js.map +1 -1
  224. package/dist-cjs/toolbar/internal/renderToolbarItems.js.map +1 -1
  225. package/dist-cjs/toolbar/internal/renderTrayTools.js.map +1 -1
  226. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  227. package/dist-cjs/toolbar/toolbar-field/useToolbarField.js.map +1 -1
  228. package/dist-cjs/tree/Tree.js +2 -6
  229. package/dist-cjs/tree/Tree.js.map +1 -1
  230. package/dist-cjs/tree/TreeNode.js.map +1 -1
  231. package/dist-cjs/tree/use-tree-keyboard-navigation.js.map +1 -1
  232. package/dist-cjs/tree/useTree.js.map +1 -1
  233. package/dist-cjs/utils/useClickOutside.js.map +1 -1
  234. package/dist-cjs/utils/useSlideSelection.js.map +1 -1
  235. package/dist-cjs/window/ElectronWindow.js.map +1 -1
  236. package/dist-es/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
  237. package/dist-es/button-bar/ButtonBar.js.map +1 -1
  238. package/dist-es/button-bar/OrderedButton.js.map +1 -1
  239. package/dist-es/button-bar/internal/useDescendant.js.map +1 -1
  240. package/dist-es/calendar/Calendar.js +24 -9
  241. package/dist-es/calendar/Calendar.js.map +1 -1
  242. package/dist-es/calendar/CalendarGrid.js +59 -83
  243. package/dist-es/calendar/CalendarGrid.js.map +1 -1
  244. package/dist-es/calendar/CalendarMonthHeader.css.js +4 -0
  245. package/dist-es/calendar/CalendarMonthHeader.css.js.map +1 -0
  246. package/dist-es/calendar/CalendarMonthHeader.js +46 -0
  247. package/dist-es/calendar/CalendarMonthHeader.js.map +1 -0
  248. package/dist-es/calendar/CalendarNavigation.js +30 -39
  249. package/dist-es/calendar/CalendarNavigation.js.map +1 -1
  250. package/dist-es/calendar/CalendarWeekHeader.js +2 -6
  251. package/dist-es/calendar/CalendarWeekHeader.js.map +1 -1
  252. package/dist-es/calendar/internal/CalendarContext.js +3 -1
  253. package/dist-es/calendar/internal/CalendarContext.js.map +1 -1
  254. package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
  255. package/dist-es/calendar/internal/CalendarDay.js +90 -78
  256. package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
  257. package/dist-es/calendar/internal/CalendarMonth.js +13 -23
  258. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
  259. package/dist-es/calendar/internal/useFocusManagement.js +5 -6
  260. package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
  261. package/dist-es/calendar/internal/utils.js +8 -12
  262. package/dist-es/calendar/internal/utils.js.map +1 -1
  263. package/dist-es/calendar/useCalendar.js +72 -112
  264. package/dist-es/calendar/useCalendar.js.map +1 -1
  265. package/dist-es/calendar/useCalendarDay.js +21 -18
  266. package/dist-es/calendar/useCalendarDay.js.map +1 -1
  267. package/dist-es/calendar/useCalendarSelection.js +146 -34
  268. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  269. package/dist-es/carousel/CarouselContext.js.map +1 -1
  270. package/dist-es/carousel/CarouselControls.js.map +1 -1
  271. package/dist-es/carousel/CarouselReducer.js.map +1 -1
  272. package/dist-es/carousel/CarouselSlide.js.map +1 -1
  273. package/dist-es/carousel/CarouselSlider.js.map +1 -1
  274. package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
  275. package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
  276. package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
  277. package/dist-es/cascading-menu/internal/keydownHandlers.js.map +1 -1
  278. package/dist-es/cascading-menu/internal/useClickAway.js.map +1 -1
  279. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  280. package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  281. package/dist-es/cascading-menu/internal/useStateReducer.js.map +1 -1
  282. package/dist-es/cascading-menu/stateChangeTypes.js +0 -1
  283. package/dist-es/cascading-menu/stateChangeTypes.js.map +1 -1
  284. package/dist-es/color-chooser/Color.js.map +1 -1
  285. package/dist-es/color-chooser/ColorChooser.js.map +1 -1
  286. package/dist-es/color-chooser/ColorHelpers.js.map +1 -1
  287. package/dist-es/color-chooser/ColorPicker.js.map +1 -1
  288. package/dist-es/color-chooser/DictTabs.js.map +1 -1
  289. package/dist-es/color-chooser/HexInput.js.map +1 -1
  290. package/dist-es/color-chooser/Swatch.js.map +1 -1
  291. package/dist-es/color-chooser/Swatches.js.map +1 -1
  292. package/dist-es/color-chooser/SwatchesPicker.js.map +1 -1
  293. package/dist-es/combo-box/ComboBox.js +0 -2
  294. package/dist-es/combo-box/ComboBox.js.map +1 -1
  295. package/dist-es/combo-box/useCombobox.js.map +1 -1
  296. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -5
  297. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  298. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -5
  299. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  300. package/dist-es/combo-box-deprecated/internal/useComboBox.js +1 -1
  301. package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  302. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +1 -1
  303. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  304. package/dist-es/combo-box-deprecated/internal/usePopperStatus.js.map +1 -1
  305. package/dist-es/common-hooks/calcPreferredHeight.js.map +1 -1
  306. package/dist-es/common-hooks/collectionProvider.js +1 -1
  307. package/dist-es/common-hooks/collectionProvider.js.map +1 -1
  308. package/dist-es/common-hooks/list-dom-utils.js.map +1 -1
  309. package/dist-es/common-hooks/selectionTypes.js.map +1 -1
  310. package/dist-es/common-hooks/useCollapsibleGroups.js.map +1 -1
  311. package/dist-es/common-hooks/useCollectionItems.js +1 -1
  312. package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
  313. package/dist-es/common-hooks/useImperativeScrollingAPI.js.map +1 -1
  314. package/dist-es/common-hooks/useKeyboardNavigation.js +1 -1
  315. package/dist-es/common-hooks/useKeyboardNavigation.js.map +1 -1
  316. package/dist-es/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  317. package/dist-es/common-hooks/useSelection.js.map +1 -1
  318. package/dist-es/common-hooks/useTypeahead.js +1 -1
  319. package/dist-es/common-hooks/useTypeahead.js.map +1 -1
  320. package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
  321. package/dist-es/common-hooks/utils/collection-item-utils.js.map +1 -1
  322. package/dist-es/contact-details/ContactPrimaryInfo.js.map +1 -1
  323. package/dist-es/contact-details/ContactSecondaryInfo.js.map +1 -1
  324. package/dist-es/contact-details/ContactTertiaryInfo.js.map +1 -1
  325. package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
  326. package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
  327. package/dist-es/date-input/DateInputRange.js +61 -51
  328. package/dist-es/date-input/DateInputRange.js.map +1 -1
  329. package/dist-es/date-input/DateInputSingle.js +34 -19
  330. package/dist-es/date-input/DateInputSingle.js.map +1 -1
  331. package/dist-es/date-picker/DatePicker.js +9 -1
  332. package/dist-es/date-picker/DatePicker.js.map +1 -1
  333. package/dist-es/date-picker/DatePickerActions.js.map +1 -1
  334. package/dist-es/date-picker/DatePickerContext.js.map +1 -1
  335. package/dist-es/date-picker/DatePickerHelperText.css.js +4 -0
  336. package/dist-es/date-picker/DatePickerHelperText.css.js.map +1 -0
  337. package/dist-es/date-picker/DatePickerHelperText.js +34 -0
  338. package/dist-es/date-picker/DatePickerHelperText.js.map +1 -0
  339. package/dist-es/date-picker/DatePickerOverlay.js.map +1 -1
  340. package/dist-es/date-picker/DatePickerOverlayProvider.js +41 -17
  341. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
  342. package/dist-es/date-picker/DatePickerPanel.css.js +1 -1
  343. package/dist-es/date-picker/DatePickerRangeGridPanel.js +245 -0
  344. package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  345. package/dist-es/date-picker/DatePickerRangeInput.js +39 -7
  346. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
  347. package/dist-es/date-picker/DatePickerRangePanel.js +190 -34
  348. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
  349. package/dist-es/date-picker/DatePickerSingleGridPanel.js +253 -0
  350. package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  351. package/dist-es/date-picker/DatePickerSingleInput.js +13 -5
  352. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
  353. package/dist-es/date-picker/DatePickerSinglePanel.js +8 -107
  354. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -1
  355. package/dist-es/date-picker/DatePickerTrigger.js.map +1 -1
  356. package/dist-es/date-picker/useDatePicker.js +71 -11
  357. package/dist-es/date-picker/useDatePicker.js.map +1 -1
  358. package/dist-es/date-picker/useFocusOut.js +41 -0
  359. package/dist-es/date-picker/useFocusOut.js.map +1 -0
  360. package/dist-es/date-picker/useKeyboard.js +4 -5
  361. package/dist-es/date-picker/useKeyboard.js.map +1 -1
  362. package/dist-es/deck-item/DeckItem.js.map +1 -1
  363. package/dist-es/deck-layout/DeckLayout.js.map +1 -1
  364. package/dist-es/dropdown/Dropdown.js +0 -1
  365. package/dist-es/dropdown/Dropdown.js.map +1 -1
  366. package/dist-es/dropdown/DropdownBase.js +1 -2
  367. package/dist-es/dropdown/DropdownBase.js.map +1 -1
  368. package/dist-es/dropdown/DropdownButton.js.map +1 -1
  369. package/dist-es/dropdown/useClickAway.js.map +1 -1
  370. package/dist-es/dropdown/useDropdown.js.map +1 -1
  371. package/dist-es/dropdown/useDropdownBase.js.map +1 -1
  372. package/dist-es/editable-label/EditableLabel.js.map +1 -1
  373. package/dist-es/form-field-legacy/FormFieldLegacy.js.map +1 -1
  374. package/dist-es/form-field-legacy/StatusIndicator.js +1 -1
  375. package/dist-es/form-field-legacy/StatusIndicator.js.map +1 -1
  376. package/dist-es/formatted-input/FormattedInput.js +1 -1
  377. package/dist-es/formatted-input/FormattedInput.js.map +1 -1
  378. package/dist-es/index.js +4 -4
  379. package/dist-es/input-legacy/InputLegacy.js.map +1 -1
  380. package/dist-es/input-legacy/useCursorOnFocus.js.map +1 -1
  381. package/dist-es/list/Highlighter.js.map +1 -1
  382. package/dist-es/list/List.js.map +1 -1
  383. package/dist-es/list/ListItem.js.map +1 -1
  384. package/dist-es/list/VirtualizedList.js.map +1 -1
  385. package/dist-es/list/useList.js +0 -1
  386. package/dist-es/list/useList.js.map +1 -1
  387. package/dist-es/list/useListHeight.js.map +1 -1
  388. package/dist-es/list-deprecated/ListBase.js +1 -3
  389. package/dist-es/list-deprecated/ListBase.js.map +1 -1
  390. package/dist-es/list-deprecated/ListItem.js.map +1 -1
  391. package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
  392. package/dist-es/list-deprecated/ListItemContext.js.map +1 -1
  393. package/dist-es/list-deprecated/internal/DescendantContext.js.map +1 -1
  394. package/dist-es/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
  395. package/dist-es/list-deprecated/internal/useWidth.js.map +1 -1
  396. package/dist-es/list-deprecated/useList.js.map +1 -1
  397. package/dist-es/list-deprecated/useListItem.js.map +1 -1
  398. package/dist-es/list-deprecated/useTypeSelect.js.map +1 -1
  399. package/dist-es/list-next/ListItemNext.js.map +1 -1
  400. package/dist-es/list-next/ListNext.js.map +1 -1
  401. package/dist-es/list-next/ListNextContext.js.map +1 -1
  402. package/dist-es/list-next/useList.js.map +1 -1
  403. package/dist-es/localization-provider/LocalizationProvider.js +6 -3
  404. package/dist-es/localization-provider/LocalizationProvider.js.map +1 -1
  405. package/dist-es/menu-button/MenuButton.js.map +1 -1
  406. package/dist-es/metric/MetricContent.js +2 -2
  407. package/dist-es/metric/MetricContent.js.map +1 -1
  408. package/dist-es/number-input/NumberInput.js +1 -1
  409. package/dist-es/number-input/NumberInput.js.map +1 -1
  410. package/dist-es/number-input/useNumberInput.js.map +1 -1
  411. package/dist-es/query-input/internal/CategoryListContext.js.map +1 -1
  412. package/dist-es/query-input/internal/CategoryListItem.js.map +1 -1
  413. package/dist-es/query-input/internal/usePopperStatus.js +2 -2
  414. package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
  415. package/dist-es/query-input/useQueryInput.js +0 -1
  416. package/dist-es/query-input/useQueryInput.js.map +1 -1
  417. package/dist-es/responsive/OverflowReducer.js +1 -3
  418. package/dist-es/responsive/OverflowReducer.js.map +1 -1
  419. package/dist-es/responsive/useDynamicCollapse.js.map +1 -1
  420. package/dist-es/responsive/useInstantCollapse.js.map +1 -1
  421. package/dist-es/responsive/useOverflow.js +1 -1
  422. package/dist-es/responsive/useOverflow.js.map +1 -1
  423. package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
  424. package/dist-es/responsive/useOverflowLayout.js +0 -3
  425. package/dist-es/responsive/useOverflowLayout.js.map +1 -1
  426. package/dist-es/responsive/useReclaimSpace.js.map +1 -1
  427. package/dist-es/responsive/useResizeObserver.js.map +1 -1
  428. package/dist-es/responsive/useWidth.js.map +1 -1
  429. package/dist-es/responsive/utils.js.map +1 -1
  430. package/dist-es/search-input/SearchInput.js.map +1 -1
  431. package/dist-es/tabs/Tab.js.map +1 -1
  432. package/dist-es/tabs/Tabs.js.map +1 -1
  433. package/dist-es/tabs/Tabstrip.js +0 -1
  434. package/dist-es/tabs/Tabstrip.js.map +1 -1
  435. package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js +1 -1
  436. package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  437. package/dist-es/tabs/drag-drop/useDragSpacers.js.map +1 -1
  438. package/dist-es/tabs/useEditableItem.js.map +1 -1
  439. package/dist-es/tabs/useKeyboardNavigation.js +1 -1
  440. package/dist-es/tabs/useKeyboardNavigation.js.map +1 -1
  441. package/dist-es/tabs/useSelection.js.map +1 -1
  442. package/dist-es/tabs/useTabs.js.map +1 -1
  443. package/dist-es/tabs/useTabstrip.js.map +1 -1
  444. package/dist-es/tabs-next/TabListNext.js.map +1 -1
  445. package/dist-es/tabs-next/TabNext.js.map +1 -1
  446. package/dist-es/tabs-next/TabNextAction.js.map +1 -1
  447. package/dist-es/tabs-next/TabNextContext.js.map +1 -1
  448. package/dist-es/tabs-next/TabNextPanel.js.map +1 -1
  449. package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
  450. package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
  451. package/dist-es/tabs-next/TabsNext.js.map +1 -1
  452. package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
  453. package/dist-es/tabs-next/hooks/useCollection.js +2 -2
  454. package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
  455. package/dist-es/tabs-next/hooks/useFocusOutside.js.map +1 -1
  456. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  457. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +1 -1
  458. package/dist-es/tokenized-input/TokenizedInputBase.js.map +1 -1
  459. package/dist-es/tokenized-input/internal/InputPill.js.map +1 -1
  460. package/dist-es/tokenized-input/internal/getCursorPosition.js.map +1 -1
  461. package/dist-es/tokenized-input/internal/useResizeObserver.js.map +1 -1
  462. package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
  463. package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -1
  464. package/dist-es/tokenized-input-next/internal/InputPill.js.map +1 -1
  465. package/dist-es/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
  466. package/dist-es/tokenized-input-next/useTokenizedInputNext.js +1 -1
  467. package/dist-es/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
  468. package/dist-es/toolbar/Tooltray.js.map +1 -1
  469. package/dist-es/toolbar/internal/renderToolbarItems.js.map +1 -1
  470. package/dist-es/toolbar/internal/renderTrayTools.js.map +1 -1
  471. package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  472. package/dist-es/toolbar/toolbar-field/useToolbarField.js.map +1 -1
  473. package/dist-es/tree/Tree.js +2 -6
  474. package/dist-es/tree/Tree.js.map +1 -1
  475. package/dist-es/tree/TreeNode.js.map +1 -1
  476. package/dist-es/tree/use-tree-keyboard-navigation.js.map +1 -1
  477. package/dist-es/tree/useTree.js.map +1 -1
  478. package/dist-es/utils/useClickOutside.js.map +1 -1
  479. package/dist-es/utils/useSlideSelection.js.map +1 -1
  480. package/dist-es/window/ElectronWindow.js +1 -1
  481. package/dist-es/window/ElectronWindow.js.map +1 -1
  482. package/dist-types/calendar/Calendar.d.ts +22 -3
  483. package/dist-types/calendar/CalendarGrid.d.ts +19 -3
  484. package/dist-types/calendar/CalendarMonthHeader.d.ts +18 -0
  485. package/dist-types/calendar/CalendarNavigation.d.ts +9 -0
  486. package/dist-types/calendar/index.d.ts +1 -0
  487. package/dist-types/calendar/internal/CalendarDay.d.ts +25 -6
  488. package/dist-types/calendar/internal/CalendarMonth.d.ts +2 -6
  489. package/dist-types/calendar/internal/utils.d.ts +3 -7
  490. package/dist-types/calendar/useCalendar.d.ts +34 -30
  491. package/dist-types/calendar/useCalendarDay.d.ts +3 -2
  492. package/dist-types/calendar/useCalendarSelection.d.ts +60 -8
  493. package/dist-types/date-input/DateInputRange.d.ts +12 -8
  494. package/dist-types/date-input/DateInputSingle.d.ts +12 -8
  495. package/dist-types/date-picker/DatePicker.d.ts +14 -6
  496. package/dist-types/date-picker/DatePickerContext.d.ts +29 -1
  497. package/dist-types/date-picker/DatePickerHelperText.d.ts +4 -0
  498. package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +9 -2
  499. package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +17 -0
  500. package/dist-types/date-picker/DatePickerRangeInput.d.ts +1 -0
  501. package/dist-types/date-picker/DatePickerRangePanel.d.ts +24 -20
  502. package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +65 -0
  503. package/dist-types/date-picker/DatePickerSingleInput.d.ts +1 -0
  504. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +6 -48
  505. package/dist-types/date-picker/index.d.ts +4 -1
  506. package/dist-types/date-picker/useDatePicker.d.ts +29 -9
  507. package/dist-types/date-picker/useFocusOut.d.ts +9 -0
  508. package/dist-types/date-picker/useKeyboard.d.ts +7 -1
  509. package/dist-types/index.d.ts +0 -1
  510. package/package.json +3 -4
  511. package/dist-cjs/calendar/CalendarGrid.css.js +0 -6
  512. package/dist-cjs/calendar/CalendarGrid.css.js.map +0 -1
  513. package/dist-cjs/combo-box-deprecated/internal/getAnnouncement.js +0 -8
  514. package/dist-cjs/combo-box-deprecated/internal/getAnnouncement.js.map +0 -1
  515. package/dist-cjs/splitter/SplitHandle.css.js +0 -6
  516. package/dist-cjs/splitter/SplitHandle.css.js.map +0 -1
  517. package/dist-cjs/splitter/SplitHandle.js +0 -60
  518. package/dist-cjs/splitter/SplitHandle.js.map +0 -1
  519. package/dist-cjs/splitter/SplitPanel.css.js +0 -6
  520. package/dist-cjs/splitter/SplitPanel.css.js.map +0 -1
  521. package/dist-cjs/splitter/SplitPanel.js +0 -37
  522. package/dist-cjs/splitter/SplitPanel.js.map +0 -1
  523. package/dist-cjs/splitter/Splitter.js +0 -31
  524. package/dist-cjs/splitter/Splitter.js.map +0 -1
  525. package/dist-cjs/splitter/utils.js +0 -18
  526. package/dist-cjs/splitter/utils.js.map +0 -1
  527. package/dist-es/calendar/CalendarGrid.css.js +0 -4
  528. package/dist-es/calendar/CalendarGrid.css.js.map +0 -1
  529. package/dist-es/combo-box-deprecated/internal/getAnnouncement.js +0 -6
  530. package/dist-es/combo-box-deprecated/internal/getAnnouncement.js.map +0 -1
  531. package/dist-es/splitter/SplitHandle.css.js +0 -4
  532. package/dist-es/splitter/SplitHandle.css.js.map +0 -1
  533. package/dist-es/splitter/SplitHandle.js +0 -58
  534. package/dist-es/splitter/SplitHandle.js.map +0 -1
  535. package/dist-es/splitter/SplitPanel.css.js +0 -4
  536. package/dist-es/splitter/SplitPanel.css.js.map +0 -1
  537. package/dist-es/splitter/SplitPanel.js +0 -35
  538. package/dist-es/splitter/SplitPanel.js.map +0 -1
  539. package/dist-es/splitter/Splitter.js +0 -27
  540. package/dist-es/splitter/Splitter.js.map +0 -1
  541. package/dist-es/splitter/utils.js +0 -15
  542. package/dist-es/splitter/utils.js.map +0 -1
  543. package/dist-types/splitter/SplitHandle.d.ts +0 -21
  544. package/dist-types/splitter/SplitPanel.d.ts +0 -10
  545. package/dist-types/splitter/Splitter.d.ts +0 -22
  546. package/dist-types/splitter/index.d.ts +0 -4
  547. package/dist-types/splitter/utils.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"useTypeSelect.js","sources":["../src/list-deprecated/useTypeSelect.js"],"sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { escapeRegExp } from \"../utils\";\n\nimport { itemToString as defaultItemToString } from \"./itemToString\";\n\nconst TYPE_SELECT_TIMEOUT = 1500;\n\nexport function useTypeSelect(options) {\n const {\n getItemAtIndex,\n highlightedIndex,\n itemCount,\n itemToString = defaultItemToString,\n onTypeSelect,\n setFocusVisible,\n setHighlightedIndex,\n } = options;\n\n const getItemIndexForSearch = useCallback(\n (searchTerm, fromIndex) => {\n if (itemCount === 0) {\n return null;\n }\n\n let index = fromIndex || 0;\n while (index < itemCount) {\n const item = getItemAtIndex(index);\n const textValue = itemToString ? itemToString(item) : item;\n if (textValue?.match(new RegExp(`^${escapeRegExp(searchTerm)}`, \"i\"))) {\n return index;\n }\n\n index = index + 1;\n }\n\n return null;\n },\n [itemCount, itemToString, getItemAtIndex],\n );\n\n const state = useRef({\n search: \"\",\n timeout: null,\n }).current;\n\n const onKeyDownCapture = (event) => {\n const character = getStringForKey(event.key);\n if (!character || event.ctrlKey || event.metaKey) {\n return;\n }\n\n // Do not propagate the Spacebar event if it's meant to be part of the search.\n // When we time out, the search term becomes empty, hence the check on length.\n // Trimming is to account for the case of pressing the Spacebar more than once,\n // which should cycle through the selection/deselection of the focused item.\n if (character !== \" \" || state.search.trim().length > 0) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n // When typing same character sebsequently and *quickly*, we treat it as cyling through items\n // starting with that char instead of seaching for double character, because in most cases\n // there won't be any option having same characters at the beginning. This should be only\n // impacting beginning of the words because length of `character` would be 1.\n if (character !== state.search) {\n state.search += character;\n }\n\n // Prioritize items after the currently focused item, falling back to searching the whole list.\n // We want to cycle through choices when keep typing the same first character, hence the +1\n // condition. All subsequent characters should stay at the current item otherwise it will\n // always jumping around.\n let index = getItemIndexForSearch(\n state.search,\n state.search.length > 1 ? highlightedIndex : highlightedIndex + 1,\n );\n\n // If no key found, search from the top.\n if (index == null) {\n index = getItemIndexForSearch(state.search);\n }\n\n if (index != null) {\n setFocusVisible(true);\n // TODO: Maybe we can repurpose this setHighlightedIndex so that the user controls it's meant to set\n // hightlighted index when expanded v.s. selected item when collapsed\n setHighlightedIndex(index);\n if (onTypeSelect) {\n onTypeSelect(index);\n }\n }\n\n clearTimeout(state.timeout);\n state.timeout = setTimeout(() => {\n state.search = \"\";\n }, TYPE_SELECT_TIMEOUT);\n };\n\n return {\n // Using a capturing listener to catch the keydown event before\n // other hooks in order to handle the Spacebar event.\n onKeyDownCapture,\n };\n}\n\nfunction getStringForKey(key) {\n // If the key is of length 1, it is an ASCII value.\n // Otherwise, if there are no ASCII characters in the key name,\n // it is a Unicode character.\n // See https://www.w3.org/TR/uievents-key/\n if (key.length === 1 || !/^[A-Z]/i.test(key)) {\n return key;\n }\n\n return \"\";\n}\n"],"names":["itemToString","defaultItemToString","useCallback","escapeRegExp","useRef"],"mappings":"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"}
1
+ {"version":3,"file":"useTypeSelect.js","sources":["../src/list-deprecated/useTypeSelect.js"],"sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { escapeRegExp } from \"../utils\";\n\nimport { itemToString as defaultItemToString } from \"./itemToString\";\n\nconst TYPE_SELECT_TIMEOUT = 1500;\n\nexport function useTypeSelect(options) {\n const {\n getItemAtIndex,\n highlightedIndex,\n itemCount,\n itemToString = defaultItemToString,\n onTypeSelect,\n setFocusVisible,\n setHighlightedIndex,\n } = options;\n\n const getItemIndexForSearch = useCallback(\n (searchTerm, fromIndex) => {\n if (itemCount === 0) {\n return null;\n }\n\n let index = fromIndex || 0;\n while (index < itemCount) {\n const item = getItemAtIndex(index);\n const textValue = itemToString ? itemToString(item) : item;\n if (textValue?.match(new RegExp(`^${escapeRegExp(searchTerm)}`, \"i\"))) {\n return index;\n }\n\n index = index + 1;\n }\n\n return null;\n },\n [itemCount, itemToString, getItemAtIndex],\n );\n\n const state = useRef({\n search: \"\",\n timeout: null,\n }).current;\n\n const onKeyDownCapture = (event) => {\n const character = getStringForKey(event.key);\n if (!character || event.ctrlKey || event.metaKey) {\n return;\n }\n\n // Do not propagate the Spacebar event if it's meant to be part of the search.\n // When we time out, the search term becomes empty, hence the check on length.\n // Trimming is to account for the case of pressing the Spacebar more than once,\n // which should cycle through the selection/deselection of the focused item.\n if (character !== \" \" || state.search.trim().length > 0) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n // When typing same character sebsequently and *quickly*, we treat it as cyling through items\n // starting with that char instead of seaching for double character, because in most cases\n // there won't be any option having same characters at the beginning. This should be only\n // impacting beginning of the words because length of `character` would be 1.\n if (character !== state.search) {\n state.search += character;\n }\n\n // Prioritize items after the currently focused item, falling back to searching the whole list.\n // We want to cycle through choices when keep typing the same first character, hence the +1\n // condition. All subsequent characters should stay at the current item otherwise it will\n // always jumping around.\n let index = getItemIndexForSearch(\n state.search,\n state.search.length > 1 ? highlightedIndex : highlightedIndex + 1,\n );\n\n // If no key found, search from the top.\n if (index == null) {\n index = getItemIndexForSearch(state.search);\n }\n\n if (index != null) {\n setFocusVisible(true);\n // TODO: Maybe we can repurpose this setHighlightedIndex so that the user controls it's meant to set\n // hightlighted index when expanded v.s. selected item when collapsed\n setHighlightedIndex(index);\n if (onTypeSelect) {\n onTypeSelect(index);\n }\n }\n\n clearTimeout(state.timeout);\n state.timeout = setTimeout(() => {\n state.search = \"\";\n }, TYPE_SELECT_TIMEOUT);\n };\n\n return {\n // Using a capturing listener to catch the keydown event before\n // other hooks in order to handle the Spacebar event.\n onKeyDownCapture,\n };\n}\n\nfunction getStringForKey(key) {\n // If the key is of length 1, it is an ASCII value.\n // Otherwise, if there are no ASCII characters in the key name,\n // it is a Unicode character.\n // See https://www.w3.org/TR/uievents-key/\n if (key.length === 1 || !/^[A-Z]/i.test(key)) {\n return key;\n }\n\n return \"\";\n}\n"],"names":["itemToString","defaultItemToString","useCallback","escapeRegExp","useRef"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListItemNext.js","sources":["../src/list-next/ListItemNext.tsx"],"sourcesContent":["import { makePrefixer, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { type HTMLAttributes, type MouseEvent, forwardRef } from \"react\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport listItemNextCss from \"./ListItemNext.css\";\nimport { useListItem } from \"./ListNextContext\";\n\nconst withBaseName = makePrefixer(\"saltListItemNext\");\n\nexport interface ListItemNextProps extends HTMLAttributes<HTMLLIElement> {\n /**\n * If true, the particular list item in list will be disabled.\n */\n disabled?: boolean;\n /**\n * List item id.\n */\n id?: string;\n /**\n * List item value.\n */\n value: string;\n}\n\nexport const ListItemNext = forwardRef<HTMLLIElement, ListItemNextProps>(\n function ListItemNext(\n {\n children,\n className,\n disabled: disabledProp,\n id: idProp,\n value,\n onClick,\n ...props\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-item-next\",\n css: listItemNextCss,\n window: targetWindow,\n });\n const id = useIdMemo(idProp);\n\n const listContext = useListItem();\n if (!listContext) return null;\n\n const {\n id: contextId,\n disabled: contextDisabled,\n select,\n isSelected,\n isFocused,\n highlight,\n isHighlighted,\n } = listContext;\n\n const itemId = `${contextId || \"listNext\"}--${id}`;\n const disabled = disabledProp || contextDisabled;\n const selected = isSelected(value);\n const focused = isFocused(value);\n const highlighted = isHighlighted(value);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n if (!disabled) {\n select(event);\n onClick?.(event);\n }\n };\n\n const handleMouseMove = (event: MouseEvent<HTMLLIElement>) => {\n if (!highlighted) {\n highlight(event);\n }\n };\n\n return (\n <li\n ref={ref}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"highlighted\")]: highlighted,\n [withBaseName(\"focused\")]: focused,\n },\n className,\n )}\n role=\"option\"\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n id={itemId}\n data-value={value}\n onClick={handleClick}\n onMouseMove={handleMouseMove}\n {...props}\n >\n {children}\n </li>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","ListItemNext","useWindow","useComponentCssInjection","listItemNextCss","useIdMemo","useListItem","jsx","clsx"],"mappings":";;;;;;;;;;;AASA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA;AAiB7C,MAAM,YAAe,GAAAC,gBAAA;AAAA,EAC1B,SAASC,aACP,CAAA;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,EAAI,EAAA,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,cAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AACD,IAAM,MAAA,EAAA,GAAKC,eAAU,MAAM,CAAA;AAE3B,IAAA,MAAM,cAAcC,2BAAY,EAAA;AAChC,IAAI,IAAA,CAAC,aAAoB,OAAA,IAAA;AAEzB,IAAM,MAAA;AAAA,MACJ,EAAI,EAAA,SAAA;AAAA,MACJ,QAAU,EAAA,eAAA;AAAA,MACV,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACE,GAAA,WAAA;AAEJ,IAAA,MAAM,MAAS,GAAA,CAAA,EAAG,SAAa,IAAA,UAAU,KAAK,EAAE,CAAA,CAAA;AAChD,IAAA,MAAM,WAAW,YAAgB,IAAA,eAAA;AACjC,IAAM,MAAA,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAM,MAAA,OAAA,GAAU,UAAU,KAAK,CAAA;AAC/B,IAAM,MAAA,WAAA,GAAc,cAAc,KAAK,CAAA;AAEvC,IAAM,MAAA,WAAA,GAAc,CAAC,KAAqC,KAAA;AACxD,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,MAAA,CAAO,KAAK,CAAA;AACZ,QAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA;AAAA;AACZ,KACF;AAEA,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAqC,KAAA;AAC5D,MAAA,IAAI,CAAC,WAAa,EAAA;AAChB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,KACF;AAEA,IACE,uBAAAC,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAAC,SAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,aAAa,CAAC,GAAG,WAAA;AAAA,YAC/B,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG;AAAA,WAC7B;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAK,EAAA,QAAA;AAAA,QACL,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,QAC3B,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,QAC3B,EAAI,EAAA,MAAA;AAAA,QACJ,YAAY,EAAA,KAAA;AAAA,QACZ,OAAS,EAAA,WAAA;AAAA,QACT,WAAa,EAAA,eAAA;AAAA,QACZ,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
1
+ {"version":3,"file":"ListItemNext.js","sources":["../src/list-next/ListItemNext.tsx"],"sourcesContent":["import { makePrefixer, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { type HTMLAttributes, type MouseEvent, forwardRef } from \"react\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport listItemNextCss from \"./ListItemNext.css\";\nimport { useListItem } from \"./ListNextContext\";\n\nconst withBaseName = makePrefixer(\"saltListItemNext\");\n\nexport interface ListItemNextProps extends HTMLAttributes<HTMLLIElement> {\n /**\n * If true, the particular list item in list will be disabled.\n */\n disabled?: boolean;\n /**\n * List item id.\n */\n id?: string;\n /**\n * List item value.\n */\n value: string;\n}\n\nexport const ListItemNext = forwardRef<HTMLLIElement, ListItemNextProps>(\n function ListItemNext(\n {\n children,\n className,\n disabled: disabledProp,\n id: idProp,\n value,\n onClick,\n ...props\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-item-next\",\n css: listItemNextCss,\n window: targetWindow,\n });\n const id = useIdMemo(idProp);\n\n const listContext = useListItem();\n if (!listContext) return null;\n\n const {\n id: contextId,\n disabled: contextDisabled,\n select,\n isSelected,\n isFocused,\n highlight,\n isHighlighted,\n } = listContext;\n\n const itemId = `${contextId || \"listNext\"}--${id}`;\n const disabled = disabledProp || contextDisabled;\n const selected = isSelected(value);\n const focused = isFocused(value);\n const highlighted = isHighlighted(value);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n if (!disabled) {\n select(event);\n onClick?.(event);\n }\n };\n\n const handleMouseMove = (event: MouseEvent<HTMLLIElement>) => {\n if (!highlighted) {\n highlight(event);\n }\n };\n\n return (\n <li\n ref={ref}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"highlighted\")]: highlighted,\n [withBaseName(\"focused\")]: focused,\n },\n className,\n )}\n role=\"option\"\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n id={itemId}\n data-value={value}\n onClick={handleClick}\n onMouseMove={handleMouseMove}\n {...props}\n >\n {children}\n </li>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","ListItemNext","useWindow","useComponentCssInjection","listItemNextCss","useIdMemo","useListItem","jsx","clsx"],"mappings":";;;;;;;;;;;AASA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA;AAiB7C,MAAM,YAAe,GAAAC,gBAAA;AAAA,EAC1B,SAASC,aACP,CAAA;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,EAAI,EAAA,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,cAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AACD,IAAM,MAAA,EAAA,GAAKC,eAAU,MAAM,CAAA;AAE3B,IAAA,MAAM,cAAcC,2BAAY,EAAA;AAChC,IAAI,IAAA,CAAC,aAAoB,OAAA,IAAA;AAEzB,IAAM,MAAA;AAAA,MACJ,EAAI,EAAA,SAAA;AAAA,MACJ,QAAU,EAAA,eAAA;AAAA,MACV,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACE,GAAA,WAAA;AAEJ,IAAA,MAAM,MAAS,GAAA,CAAA,EAAG,SAAa,IAAA,UAAU,KAAK,EAAE,CAAA,CAAA;AAChD,IAAA,MAAM,WAAW,YAAgB,IAAA,eAAA;AACjC,IAAM,MAAA,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAM,MAAA,OAAA,GAAU,UAAU,KAAK,CAAA;AAC/B,IAAM,MAAA,WAAA,GAAc,cAAc,KAAK,CAAA;AAEvC,IAAM,MAAA,WAAA,GAAc,CAAC,KAAqC,KAAA;AACxD,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,MAAA,CAAO,KAAK,CAAA;AACZ,QAAU,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,KAAA,CAAA;AAAA;AACZ,KACF;AAEA,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAqC,KAAA;AAC5D,MAAA,IAAI,CAAC,WAAa,EAAA;AAChB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,KACF;AAEA,IACE,uBAAAC,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAAC,SAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,aAAa,CAAC,GAAG,WAAA;AAAA,YAC/B,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG;AAAA,WAC7B;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAK,EAAA,QAAA;AAAA,QACL,iBAAe,QAAY,IAAA,MAAA;AAAA,QAC3B,iBAAe,QAAY,IAAA,MAAA;AAAA,QAC3B,EAAI,EAAA,MAAA;AAAA,QACJ,YAAY,EAAA,KAAA;AAAA,QACZ,OAAS,EAAA,WAAA;AAAA,QACT,WAAa,EAAA,eAAA;AAAA,QACZ,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListNext.js","sources":["../src/list-next/ListNext.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type SyntheticEvent,\n forwardRef,\n useRef,\n} from \"react\";\nimport listNextCss from \"./ListNext.css\";\nimport { ListNextContext } from \"./ListNextContext\";\nimport { useList } from \"./useList\";\n\nconst withBaseName = makePrefixer(\"saltListNext\");\n\nexport interface ListNextProps\n extends Omit<ComponentPropsWithoutRef<\"ul\">, \"onChange\" | \"onSelect\"> {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* If `true`, the component will not receive focus. */\n disableFocus?: boolean;\n /* Value for the controlled version. */\n highlightedItem?: string;\n /* Value for the controlled version. */\n selected?: string;\n /* Callback for change event. Returns current selection.*/\n onChange?: (\n event: SyntheticEvent,\n data: { value: string | undefined },\n ) => void;\n /* Callback for select event. Returns new selected item.*/\n onSelect?: (event: SyntheticEvent, data: { value: string }) => void;\n /* Initial selection. */\n defaultSelected?: string;\n}\n\nexport const ListNext = forwardRef<HTMLUListElement, ListNextProps>(\n function ListNext(\n {\n children,\n className,\n disabled,\n disableFocus,\n id,\n onSelect,\n onFocus,\n onBlur,\n onKeyDown,\n onMouseOver,\n highlightedItem,\n selected,\n defaultSelected,\n onChange,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-next\",\n css: listNextCss,\n window: targetWindow,\n });\n\n const listId = useId(id);\n const listRef = useRef<HTMLUListElement>(null);\n const handleRef = useForkRef(listRef, ref);\n const {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n activeDescendant,\n contextValue,\n focusVisibleRef,\n } = useList({\n disabled,\n highlightedItem,\n selected,\n defaultSelected,\n onChange,\n onSelect,\n id: listId,\n ref: listRef,\n });\n\n const setListRef = useForkRef(focusVisibleRef, handleRef);\n\n const handleFocus = (event: FocusEvent<HTMLUListElement>) => {\n focusHandler(event);\n onFocus?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n if (disableFocus) {\n event.preventDefault();\n return;\n }\n keyDownHandler(event);\n onKeyDown?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLUListElement>) => {\n blurHandler();\n onBlur?.(event);\n };\n\n const handleMouseOver = (event: MouseEvent<HTMLUListElement>) => {\n mouseOverHandler();\n onMouseOver?.(event);\n };\n\n return (\n <ListNextContext.Provider value={contextValue}>\n <ul\n // TODO: fix type from useIsFocusVisible\n // @ts-ignore\n ref={setListRef}\n id={listId}\n className={clsx(withBaseName(), className)}\n role=\"listbox\"\n tabIndex={disabled || disableFocus ? -1 : 0}\n aria-activedescendant={disabled ? undefined : activeDescendant}\n aria-disabled={disabled}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onMouseOver={handleMouseOver}\n {...rest}\n >\n {children}\n </ul>\n </ListNextContext.Provider>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","ListNext","useWindow","useComponentCssInjection","listNextCss","useId","useRef","useForkRef","useList","jsx","ListNextContext","clsx"],"mappings":"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"}
1
+ {"version":3,"file":"ListNext.js","sources":["../src/list-next/ListNext.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type SyntheticEvent,\n forwardRef,\n useRef,\n} from \"react\";\nimport listNextCss from \"./ListNext.css\";\nimport { ListNextContext } from \"./ListNextContext\";\nimport { useList } from \"./useList\";\n\nconst withBaseName = makePrefixer(\"saltListNext\");\n\nexport interface ListNextProps\n extends Omit<ComponentPropsWithoutRef<\"ul\">, \"onChange\" | \"onSelect\"> {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* If `true`, the component will not receive focus. */\n disableFocus?: boolean;\n /* Value for the controlled version. */\n highlightedItem?: string;\n /* Value for the controlled version. */\n selected?: string;\n /* Callback for change event. Returns current selection.*/\n onChange?: (\n event: SyntheticEvent,\n data: { value: string | undefined },\n ) => void;\n /* Callback for select event. Returns new selected item.*/\n onSelect?: (event: SyntheticEvent, data: { value: string }) => void;\n /* Initial selection. */\n defaultSelected?: string;\n}\n\nexport const ListNext = forwardRef<HTMLUListElement, ListNextProps>(\n function ListNext(\n {\n children,\n className,\n disabled,\n disableFocus,\n id,\n onSelect,\n onFocus,\n onBlur,\n onKeyDown,\n onMouseOver,\n highlightedItem,\n selected,\n defaultSelected,\n onChange,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-next\",\n css: listNextCss,\n window: targetWindow,\n });\n\n const listId = useId(id);\n const listRef = useRef<HTMLUListElement>(null);\n const handleRef = useForkRef(listRef, ref);\n const {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n activeDescendant,\n contextValue,\n focusVisibleRef,\n } = useList({\n disabled,\n highlightedItem,\n selected,\n defaultSelected,\n onChange,\n onSelect,\n id: listId,\n ref: listRef,\n });\n\n const setListRef = useForkRef(focusVisibleRef, handleRef);\n\n const handleFocus = (event: FocusEvent<HTMLUListElement>) => {\n focusHandler(event);\n onFocus?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n if (disableFocus) {\n event.preventDefault();\n return;\n }\n keyDownHandler(event);\n onKeyDown?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLUListElement>) => {\n blurHandler();\n onBlur?.(event);\n };\n\n const handleMouseOver = (event: MouseEvent<HTMLUListElement>) => {\n mouseOverHandler();\n onMouseOver?.(event);\n };\n\n return (\n <ListNextContext.Provider value={contextValue}>\n <ul\n // TODO: fix type from useIsFocusVisible\n // @ts-ignore\n ref={setListRef}\n id={listId}\n className={clsx(withBaseName(), className)}\n role=\"listbox\"\n tabIndex={disabled || disableFocus ? -1 : 0}\n aria-activedescendant={disabled ? undefined : activeDescendant}\n aria-disabled={disabled}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onMouseOver={handleMouseOver}\n {...rest}\n >\n {children}\n </ul>\n </ListNextContext.Provider>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","ListNext","useWindow","useComponentCssInjection","listNextCss","useId","useRef","useForkRef","useList","jsx","ListNextContext","clsx"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListNextContext.js","sources":["../src/list-next/ListNextContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { type SyntheticEvent, useContext } from \"react\";\n\nexport interface ListNextContextValue {\n disabled?: boolean;\n id?: string;\n select: (event: SyntheticEvent<HTMLLIElement>) => void;\n isSelected: (value: string) => boolean;\n isFocused: (value: string) => boolean;\n highlight: (event: SyntheticEvent<HTMLLIElement>) => void;\n isHighlighted: (value: string) => boolean;\n}\n\nexport const ListNextContext = createContext<ListNextContextValue | undefined>(\n \"ListNextContext\",\n undefined,\n);\n\nexport function useListItem() {\n return useContext(ListNextContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAaO,MAAM,eAAkB,GAAAA,kBAAA;AAAA,EAC7B,iBAAA;AAAA,EACA,KAAA;AACF;AAEO,SAAS,WAAc,GAAA;AAC5B,EAAA,OAAOC,iBAAW,eAAe,CAAA;AACnC;;;;;"}
1
+ {"version":3,"file":"ListNextContext.js","sources":["../src/list-next/ListNextContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { type SyntheticEvent, useContext } from \"react\";\n\nexport interface ListNextContextValue {\n disabled?: boolean;\n id?: string;\n select: (event: SyntheticEvent<HTMLLIElement>) => void;\n isSelected: (value: string) => boolean;\n isFocused: (value: string) => boolean;\n highlight: (event: SyntheticEvent<HTMLLIElement>) => void;\n isHighlighted: (value: string) => boolean;\n}\n\nexport const ListNextContext = createContext<ListNextContextValue | undefined>(\n \"ListNextContext\",\n undefined,\n);\n\nexport function useListItem() {\n return useContext(ListNextContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAaO,MAAM,eAAkB,GAAAA,kBAAA;AAAA,EAC7B,iBAAA;AAAA,EACA;AACF;AAEO,SAAS,WAAc,GAAA;AAC5B,EAAA,OAAOC,iBAAW,eAAe,CAAA;AACnC;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useList.js","sources":["../src/list-next/useList.ts"],"sourcesContent":["import { useControlled, useIsFocusVisible } from \"@salt-ds/core\";\nimport {\n type FocusEvent,\n type KeyboardEvent,\n type RefObject,\n type SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nexport interface UseListProps {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* Highlighted index for when the list is controlled. */\n highlightedItem?: string;\n /* Selected value for when the list is controlled. */\n selected?: string;\n /* Initial selected value for when the list is controlled. */\n defaultSelected?: string;\n /* Callback for change event. This is called when the selected value changes */\n onChange?: (e: SyntheticEvent, data: { value: string | undefined }) => void;\n /* Callback for select event. This is called when any selection occurs, even if a previously selected value is selected again. */\n onSelect?: (e: SyntheticEvent, data: { value: string }) => void;\n /* List id. */\n id?: string;\n /* List ref. */\n ref: RefObject<HTMLUListElement>;\n}\n\nexport const useList = ({\n disabled = false,\n highlightedItem: highlightedItemProp,\n selected: selectedProp,\n defaultSelected,\n onChange,\n onSelect,\n id,\n ref,\n}: UseListProps) => {\n const getOptions: () => HTMLElement[] = useCallback(() => {\n return Array.from(\n ref.current?.querySelectorAll('[role=\"option\"]:not([aria-disabled])') ??\n [],\n );\n }, [ref]);\n\n const [focusVisible, setFocusVisible] = useState(false);\n const [activeDescendant, setActiveDescendant] = useState<string | undefined>(\n undefined,\n );\n\n const [highlightedItem, setHighlightedItem] = useControlled({\n controlled: highlightedItemProp,\n default: undefined,\n name: \"ListNext\",\n state: \"highlighted\",\n });\n\n const [selectedItem, setSelectedItem] = useControlled({\n controlled: selectedProp,\n default: defaultSelected,\n name: \"ListNext\",\n state: \"selected\",\n });\n\n const {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref: focusVisibleRef,\n } = useIsFocusVisible();\n\n const updateScroll = useCallback(\n (currentTarget: Element) => {\n const list = ref.current;\n if (!list || !currentTarget) return;\n const { offsetTop, offsetHeight } = currentTarget as HTMLLIElement;\n const listHeight = list?.clientHeight;\n const listScrollTop = list?.scrollTop;\n if (offsetTop < listScrollTop) {\n list.scrollTop = offsetTop;\n } else if (offsetTop + offsetHeight > listScrollTop + listHeight) {\n list.scrollTop = offsetTop + offsetHeight - listHeight;\n }\n },\n [ref],\n );\n\n const updateHighlighted = useCallback(\n (element: HTMLElement) => {\n setHighlightedItem(element.dataset.value);\n setActiveDescendant(element.id);\n updateScroll(element);\n },\n [updateScroll],\n );\n\n const selectItem = useCallback(\n (element: HTMLElement) => {\n const newValue = element?.dataset.value;\n if (newValue) {\n setSelectedItem(newValue);\n updateHighlighted(element);\n }\n },\n [updateHighlighted],\n );\n\n // Effect to move the cursor when items change controlled.\n // this could be following active descendant if there is no better way of doing it when controlled\n useEffect(() => {\n const activeOptions = getOptions();\n const highlightedIndex = activeOptions.findIndex(\n (i) => i.dataset.value === highlightedItem,\n );\n if (highlightedIndex) {\n setActiveDescendant(activeOptions[highlightedIndex]?.id);\n highlightedItem && updateScroll(activeOptions[highlightedIndex]);\n }\n }, [highlightedItem, getOptions, updateScroll]);\n\n const focusFirstItem = () => {\n // Find first active item\n const activeOptions = getOptions();\n const firstItem = activeOptions[0];\n if (firstItem) {\n updateHighlighted(firstItem);\n }\n };\n const focusLastItem = () => {\n // Find last active item\n const activeOptions = getOptions();\n const lastItem = activeOptions[activeOptions.length - 1];\n if (lastItem) {\n updateHighlighted(lastItem);\n updateScroll(lastItem);\n }\n };\n\n const findNextOption = (\n currentOption: HTMLElement | null,\n moves: number,\n ): HTMLElement => {\n const activeOptions = getOptions();\n // Returns next item, if no current option it will return 0\n const nextOptionIndex = currentOption\n ? activeOptions.indexOf(currentOption) + moves\n : 0;\n return (\n activeOptions[nextOptionIndex] || activeOptions[activeOptions.length - 1]\n );\n };\n\n const findPreviousOption = (\n currentOption: HTMLElement,\n moves: number,\n ): HTMLElement => {\n // Return the previous option if it exists; otherwise, returns first option\n const activeOptions = getOptions();\n const currentOptionIndex = activeOptions.findIndex(\n (i) => i.id === currentOption.id,\n );\n return activeOptions[currentOptionIndex - moves] || activeOptions[0];\n };\n\n // CONTEXT CALLBACKS\n const select = useCallback(\n (event: SyntheticEvent<HTMLLIElement>) => {\n const newValue = event.currentTarget.dataset.value;\n const activeOptions = getOptions();\n const isActiveOption =\n activeOptions.findIndex((i) => i.id === event.currentTarget.id) !== -1;\n if (newValue && isActiveOption) {\n onSelect?.(event, { value: newValue });\n if (selectedItem !== newValue) {\n selectItem(event.currentTarget);\n onChange?.(event, { value: selectedItem });\n }\n }\n },\n [selectItem, selectedItem, onChange, onSelect, getOptions],\n );\n\n const isSelected = useCallback(\n (value: string) => selectedItem === value,\n [selectedItem],\n );\n\n const highlight = useCallback((event: SyntheticEvent<HTMLLIElement>) => {\n setHighlightedItem(event.currentTarget.dataset.value);\n }, []);\n\n const isHighlighted = useCallback(\n (value: string) => highlightedItem === value,\n [highlightedItem],\n );\n\n const isFocused = useCallback(\n (value: string) => isHighlighted(value) && focusVisible,\n [focusVisible, isHighlighted],\n );\n\n const getActiveItem = () => {\n const activeOptions = getOptions();\n const activeIndex = activeOptions.findIndex(\n (i) => i.id === activeDescendant,\n );\n return activeOptions[activeIndex];\n };\n\n // HANDLERS\n const blurHandler = () => {\n handleBlurVisible();\n if (!isFocusVisibleRef.current) {\n setFocusVisible(false);\n }\n };\n\n const mouseOverHandler = () => {\n if (focusVisible) {\n setFocusVisible(false);\n }\n };\n\n // takes care of focus when using keyboard navigation\n const focusHandler = (event: FocusEvent<HTMLUListElement | HTMLElement>) => {\n handleFocusVisible(event);\n if (isFocusVisibleRef.current) {\n setFocusVisible(true);\n }\n const activeElement = getActiveItem();\n if (activeElement) {\n updateHighlighted(activeElement);\n } else {\n focusFirstItem();\n }\n };\n\n // takes care of keydown when using keyboard navigation\n const keyDownHandler = (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n const currentItem = getActiveItem();\n let nextItem = currentItem;\n if (isFocusVisibleRef.current || !focusVisible) {\n setFocusVisible(true);\n }\n switch (key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (!currentItem) {\n focusFirstItem();\n break;\n }\n nextItem =\n key === \"ArrowUp\"\n ? findPreviousOption(currentItem, 1)\n : findNextOption(currentItem, 1);\n\n if (nextItem && nextItem !== currentItem) {\n event.preventDefault();\n updateHighlighted(nextItem);\n }\n break;\n case \"Home\":\n event.preventDefault();\n focusFirstItem();\n break;\n case \"End\":\n event.preventDefault();\n focusLastItem();\n break;\n case \" \":\n case \"Enter\":\n event.preventDefault();\n if (nextItem) {\n selectItem(nextItem);\n onChange?.(event, { value: nextItem.dataset.value || \"\" });\n }\n break;\n case \"PageDown\":\n case \"PageUp\":\n event.preventDefault();\n break;\n default:\n break;\n }\n };\n\n // CONTEXT\n const contextValue = useMemo(\n () => ({\n disabled,\n id,\n select,\n isSelected,\n isFocused,\n highlight,\n isHighlighted,\n }),\n [disabled, id, select, isSelected, isFocused, highlight, isHighlighted],\n );\n\n return {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n activeDescendant,\n selectedItem,\n highlightedItem,\n setSelectedItem,\n setHighlightedItem,\n contextValue,\n focusVisibleRef,\n };\n};\n"],"names":["useCallback","useState","useControlled","useIsFocusVisible","useEffect","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"useList.js","sources":["../src/list-next/useList.ts"],"sourcesContent":["import { useControlled, useIsFocusVisible } from \"@salt-ds/core\";\nimport {\n type FocusEvent,\n type KeyboardEvent,\n type RefObject,\n type SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nexport interface UseListProps {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* Highlighted index for when the list is controlled. */\n highlightedItem?: string;\n /* Selected value for when the list is controlled. */\n selected?: string;\n /* Initial selected value for when the list is controlled. */\n defaultSelected?: string;\n /* Callback for change event. This is called when the selected value changes */\n onChange?: (e: SyntheticEvent, data: { value: string | undefined }) => void;\n /* Callback for select event. This is called when any selection occurs, even if a previously selected value is selected again. */\n onSelect?: (e: SyntheticEvent, data: { value: string }) => void;\n /* List id. */\n id?: string;\n /* List ref. */\n ref: RefObject<HTMLUListElement>;\n}\n\nexport const useList = ({\n disabled = false,\n highlightedItem: highlightedItemProp,\n selected: selectedProp,\n defaultSelected,\n onChange,\n onSelect,\n id,\n ref,\n}: UseListProps) => {\n const getOptions: () => HTMLElement[] = useCallback(() => {\n return Array.from(\n ref.current?.querySelectorAll('[role=\"option\"]:not([aria-disabled])') ??\n [],\n );\n }, [ref]);\n\n const [focusVisible, setFocusVisible] = useState(false);\n const [activeDescendant, setActiveDescendant] = useState<string | undefined>(\n undefined,\n );\n\n const [highlightedItem, setHighlightedItem] = useControlled({\n controlled: highlightedItemProp,\n default: undefined,\n name: \"ListNext\",\n state: \"highlighted\",\n });\n\n const [selectedItem, setSelectedItem] = useControlled({\n controlled: selectedProp,\n default: defaultSelected,\n name: \"ListNext\",\n state: \"selected\",\n });\n\n const {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref: focusVisibleRef,\n } = useIsFocusVisible();\n\n const updateScroll = useCallback(\n (currentTarget: Element) => {\n const list = ref.current;\n if (!list || !currentTarget) return;\n const { offsetTop, offsetHeight } = currentTarget as HTMLLIElement;\n const listHeight = list?.clientHeight;\n const listScrollTop = list?.scrollTop;\n if (offsetTop < listScrollTop) {\n list.scrollTop = offsetTop;\n } else if (offsetTop + offsetHeight > listScrollTop + listHeight) {\n list.scrollTop = offsetTop + offsetHeight - listHeight;\n }\n },\n [ref],\n );\n\n const updateHighlighted = useCallback(\n (element: HTMLElement) => {\n setHighlightedItem(element.dataset.value);\n setActiveDescendant(element.id);\n updateScroll(element);\n },\n [updateScroll],\n );\n\n const selectItem = useCallback(\n (element: HTMLElement) => {\n const newValue = element?.dataset.value;\n if (newValue) {\n setSelectedItem(newValue);\n updateHighlighted(element);\n }\n },\n [updateHighlighted],\n );\n\n // Effect to move the cursor when items change controlled.\n // this could be following active descendant if there is no better way of doing it when controlled\n useEffect(() => {\n const activeOptions = getOptions();\n const highlightedIndex = activeOptions.findIndex(\n (i) => i.dataset.value === highlightedItem,\n );\n if (highlightedIndex) {\n setActiveDescendant(activeOptions[highlightedIndex]?.id);\n highlightedItem && updateScroll(activeOptions[highlightedIndex]);\n }\n }, [highlightedItem, getOptions, updateScroll]);\n\n const focusFirstItem = () => {\n // Find first active item\n const activeOptions = getOptions();\n const firstItem = activeOptions[0];\n if (firstItem) {\n updateHighlighted(firstItem);\n }\n };\n const focusLastItem = () => {\n // Find last active item\n const activeOptions = getOptions();\n const lastItem = activeOptions[activeOptions.length - 1];\n if (lastItem) {\n updateHighlighted(lastItem);\n updateScroll(lastItem);\n }\n };\n\n const findNextOption = (\n currentOption: HTMLElement | null,\n moves: number,\n ): HTMLElement => {\n const activeOptions = getOptions();\n // Returns next item, if no current option it will return 0\n const nextOptionIndex = currentOption\n ? activeOptions.indexOf(currentOption) + moves\n : 0;\n return (\n activeOptions[nextOptionIndex] || activeOptions[activeOptions.length - 1]\n );\n };\n\n const findPreviousOption = (\n currentOption: HTMLElement,\n moves: number,\n ): HTMLElement => {\n // Return the previous option if it exists; otherwise, returns first option\n const activeOptions = getOptions();\n const currentOptionIndex = activeOptions.findIndex(\n (i) => i.id === currentOption.id,\n );\n return activeOptions[currentOptionIndex - moves] || activeOptions[0];\n };\n\n // CONTEXT CALLBACKS\n const select = useCallback(\n (event: SyntheticEvent<HTMLLIElement>) => {\n const newValue = event.currentTarget.dataset.value;\n const activeOptions = getOptions();\n const isActiveOption =\n activeOptions.findIndex((i) => i.id === event.currentTarget.id) !== -1;\n if (newValue && isActiveOption) {\n onSelect?.(event, { value: newValue });\n if (selectedItem !== newValue) {\n selectItem(event.currentTarget);\n onChange?.(event, { value: selectedItem });\n }\n }\n },\n [selectItem, selectedItem, onChange, onSelect, getOptions],\n );\n\n const isSelected = useCallback(\n (value: string) => selectedItem === value,\n [selectedItem],\n );\n\n const highlight = useCallback((event: SyntheticEvent<HTMLLIElement>) => {\n setHighlightedItem(event.currentTarget.dataset.value);\n }, []);\n\n const isHighlighted = useCallback(\n (value: string) => highlightedItem === value,\n [highlightedItem],\n );\n\n const isFocused = useCallback(\n (value: string) => isHighlighted(value) && focusVisible,\n [focusVisible, isHighlighted],\n );\n\n const getActiveItem = () => {\n const activeOptions = getOptions();\n const activeIndex = activeOptions.findIndex(\n (i) => i.id === activeDescendant,\n );\n return activeOptions[activeIndex];\n };\n\n // HANDLERS\n const blurHandler = () => {\n handleBlurVisible();\n if (!isFocusVisibleRef.current) {\n setFocusVisible(false);\n }\n };\n\n const mouseOverHandler = () => {\n if (focusVisible) {\n setFocusVisible(false);\n }\n };\n\n // takes care of focus when using keyboard navigation\n const focusHandler = (event: FocusEvent<HTMLUListElement | HTMLElement>) => {\n handleFocusVisible(event);\n if (isFocusVisibleRef.current) {\n setFocusVisible(true);\n }\n const activeElement = getActiveItem();\n if (activeElement) {\n updateHighlighted(activeElement);\n } else {\n focusFirstItem();\n }\n };\n\n // takes care of keydown when using keyboard navigation\n const keyDownHandler = (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n const currentItem = getActiveItem();\n let nextItem = currentItem;\n if (isFocusVisibleRef.current || !focusVisible) {\n setFocusVisible(true);\n }\n switch (key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (!currentItem) {\n focusFirstItem();\n break;\n }\n nextItem =\n key === \"ArrowUp\"\n ? findPreviousOption(currentItem, 1)\n : findNextOption(currentItem, 1);\n\n if (nextItem && nextItem !== currentItem) {\n event.preventDefault();\n updateHighlighted(nextItem);\n }\n break;\n case \"Home\":\n event.preventDefault();\n focusFirstItem();\n break;\n case \"End\":\n event.preventDefault();\n focusLastItem();\n break;\n case \" \":\n case \"Enter\":\n event.preventDefault();\n if (nextItem) {\n selectItem(nextItem);\n onChange?.(event, { value: nextItem.dataset.value || \"\" });\n }\n break;\n case \"PageDown\":\n case \"PageUp\":\n event.preventDefault();\n break;\n default:\n break;\n }\n };\n\n // CONTEXT\n const contextValue = useMemo(\n () => ({\n disabled,\n id,\n select,\n isSelected,\n isFocused,\n highlight,\n isHighlighted,\n }),\n [disabled, id, select, isSelected, isFocused, highlight, isHighlighted],\n );\n\n return {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n activeDescendant,\n selectedItem,\n highlightedItem,\n setSelectedItem,\n setHighlightedItem,\n contextValue,\n focusVisibleRef,\n };\n};\n"],"names":["useCallback","useState","useControlled","useIsFocusVisible","useEffect","useMemo"],"mappings":"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"}
@@ -5,7 +5,10 @@ var react = require('react');
5
5
 
6
6
  const MIN_DATE = "1900-01-01T00:00:00.000";
7
7
  const MAX_DATE = "2099-12-31T00:00:00.000";
8
- const LocalizationProviderContext = react.createContext(null);
8
+ const LocalizationProviderContext = (
9
+ // biome-ignore lint/suspicious/noExplicitAny: date frameworl
10
+ react.createContext(null)
11
+ );
9
12
  if (process.env.NODE_ENV !== "production") {
10
13
  LocalizationProviderContext.displayName = "LocalizationProviderContext";
11
14
  }
@@ -16,7 +19,7 @@ const LocalizationProvider = function LocalizationProvider2(props) {
16
19
  locale,
17
20
  instance
18
21
  });
19
- }, [DateAdapter, locale]);
22
+ }, [DateAdapter, instance, locale]);
20
23
  const defaultDates = react.useMemo(
21
24
  () => ({
22
25
  minDate: minDate || dateAdapter.date(MIN_DATE),
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizationProvider.js","sources":["../src/localization-provider/LocalizationProvider.tsx"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nconst MIN_DATE = \"1900-01-01T00:00:00.000\";\nconst MAX_DATE = \"2099-12-31T00:00:00.000\";\n\nexport interface LocalizationProviderValue<TDate extends DateFrameworkType> {\n defaultDates: {\n minDate: TDate;\n maxDate: TDate;\n };\n dateAdapter: SaltDateAdapter<TDate>;\n}\n\n/**\n * Props for the LocalizationProvider component.\n *\n * @template TDate - The type of the date object used in the provider.\n * @template TLocale - The type of the locale, defaulting to string.\n */\nexport interface LocalizationProviderProps<\n TDate extends DateFrameworkType,\n TLocale = string,\n> {\n /**\n * The child components to be rendered within the provider.\n */\n children?: React.ReactNode;\n\n /**\n * The instance of the date library being used.\n */\n instance?: any;\n\n /**\n * The date adapter class, which provides methods for date manipulation and formatting.\n * This should be a constructor for a class implementing the SaltDateAdapter interface.\n */\n DateAdapter: new (\n ...args: any\n ) => SaltDateAdapter<TDate, TLocale>;\n\n /**\n * The locale to be used for date formatting and manipulation.\n */\n locale?: TLocale;\n\n /**\n * The minimum date allowed for all date selections.\n * Defaults to January 1, 1900.\n */\n minDate?: TDate;\n\n /**\n * The maximum date allowed for all date selections.\n * Defaults to December 31, 2099.\n */\n maxDate?: TDate;\n}\n\nexport type LocalizationProviderContext<TDate extends DateFrameworkType> = {\n [K in keyof LocalizationProviderValue<TDate>]:\n | LocalizationProviderValue<TDate>[K]\n | null;\n};\n\nexport const LocalizationProviderContext =\n createContext<LocalizationProviderValue<any> | null>(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n LocalizationProviderContext.displayName = \"LocalizationProviderContext\";\n}\n\nexport const LocalizationProvider = function LocalizationProvider<\n TDate extends DateFrameworkType,\n TLocale,\n>(props: LocalizationProviderProps<TDate, TLocale>) {\n const { children, DateAdapter, instance, locale, minDate, maxDate } = props;\n\n const dateAdapter = useMemo(() => {\n return new DateAdapter({\n locale,\n instance,\n });\n }, [DateAdapter, locale]);\n\n const defaultDates: LocalizationProviderValue<TDate>[\"defaultDates\"] =\n useMemo(\n () => ({\n minDate: minDate || dateAdapter.date(MIN_DATE),\n maxDate: maxDate || dateAdapter.date(MAX_DATE),\n }),\n [dateAdapter, minDate, maxDate],\n );\n\n const contextValue: LocalizationProviderValue<TDate> = useMemo(() => {\n return {\n dateAdapter,\n defaultDates,\n };\n }, [dateAdapter, defaultDates]);\n\n return (\n <LocalizationProviderContext.Provider value={contextValue}>\n {children}\n </LocalizationProviderContext.Provider>\n );\n};\n\n/**\n * Custom hook to access the localization context.\n *\n * This hook provides access to the localization settings and utilities\n * within the `LocalizationProviderContext`. It should be used within a\n * component that is a descendant of `LocalizationProviderContext.Provider`.\n *\n * @template TDate - The type of the date object used in the localization context.\n *\n * @returns The localization provider value, which includes date manipulation and formatting utilities.\n *\n * @throws Will throw an error if the hook is used outside of a `LocalizationProviderContext.Provider`.\n */\nexport const useLocalization = <\n TDate extends DateFrameworkType,\n>(): LocalizationProviderValue<TDate> => {\n const localization = useContext(LocalizationProviderContext);\n if (!localization) {\n throw new Error(\n \"useLocalization should be called inside LocalizationProviderContext.Provider\",\n );\n }\n return localization;\n};\n"],"names":["createContext","LocalizationProvider","useMemo","useContext"],"mappings":";;;;;AAMA,MAAM,QAAW,GAAA,yBAAA;AACjB,MAAM,QAAW,GAAA,yBAAA;AA8DJ,MAAA,2BAAA,GACXA,oBAAqD,IAAI;AAE3D,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,EAAA,2BAAA,CAA4B,WAAc,GAAA,6BAAA;AAC5C;AAEa,MAAA,oBAAA,GAAuB,SAASC,qBAAAA,CAG3C,KAAkD,EAAA;AAClD,EAAA,MAAM,EAAE,QAAU,EAAA,WAAA,EAAa,UAAU,MAAQ,EAAA,OAAA,EAAS,SAAY,GAAA,KAAA;AAEtE,EAAM,MAAA,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAA,OAAO,IAAI,WAAY,CAAA;AAAA,MACrB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,GACA,EAAA,CAAC,WAAa,EAAA,MAAM,CAAC,CAAA;AAExB,EAAA,MAAM,YACJ,GAAAA,aAAA;AAAA,IACE,OAAO;AAAA,MACL,OAAS,EAAA,OAAA,IAAW,WAAY,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC7C,OAAS,EAAA,OAAA,IAAW,WAAY,CAAA,IAAA,CAAK,QAAQ;AAAA,KAC/C,CAAA;AAAA,IACA,CAAC,WAAa,EAAA,OAAA,EAAS,OAAO;AAAA,GAChC;AAEF,EAAM,MAAA,YAAA,GAAiDA,cAAQ,MAAM;AACnE,IAAO,OAAA;AAAA,MACL,WAAA;AAAA,MACA;AAAA,KACF;AAAA,GACC,EAAA,CAAC,WAAa,EAAA,YAAY,CAAC,CAAA;AAE9B,EAAA,sCACG,2BAA4B,CAAA,QAAA,EAA5B,EAAqC,KAAA,EAAO,cAC1C,QACH,EAAA,CAAA;AAEJ;AAeO,MAAM,kBAAkB,MAEU;AACvC,EAAM,MAAA,YAAA,GAAeC,iBAAW,2BAA2B,CAAA;AAC3D,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,YAAA;AACT;;;;;;"}
1
+ {"version":3,"file":"LocalizationProvider.js","sources":["../src/localization-provider/LocalizationProvider.tsx"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nconst MIN_DATE = \"1900-01-01T00:00:00.000\";\nconst MAX_DATE = \"2099-12-31T00:00:00.000\";\n\nexport interface LocalizationProviderValue<TDate extends DateFrameworkType> {\n defaultDates: {\n minDate: TDate;\n maxDate: TDate;\n };\n dateAdapter: SaltDateAdapter<TDate>;\n}\n\n/**\n * Props for the LocalizationProvider component.\n *\n * @template TDate - The type of the date object used in the provider.\n * @template TLocale - The type of the locale, defaulting to string.\n */\nexport interface LocalizationProviderProps<\n TDate extends DateFrameworkType,\n TLocale = string,\n> {\n /**\n * The child components to be rendered within the provider.\n */\n children?: React.ReactNode;\n\n /**\n * The instance of the date library being used.\n */\n // biome-ignore lint/suspicious/noExplicitAny: date framework\n instance?: any;\n\n /**\n * The date adapter class, which provides methods for date manipulation and formatting.\n * This should be a constructor for a class implementing the SaltDateAdapter interface.\n */\n DateAdapter: new (\n // biome-ignore lint/suspicious/noExplicitAny: date framework\n ...args: any\n ) => SaltDateAdapter<TDate, TLocale>;\n\n /**\n * The locale to be used for date formatting and manipulation.\n */\n locale?: TLocale;\n\n /**\n * The minimum date allowed for all date selections.\n * Defaults to January 1, 1900.\n */\n minDate?: TDate;\n\n /**\n * The maximum date allowed for all date selections.\n * Defaults to December 31, 2099.\n */\n maxDate?: TDate;\n}\n\nexport type LocalizationProviderContext<TDate extends DateFrameworkType> = {\n [K in keyof LocalizationProviderValue<TDate>]:\n | LocalizationProviderValue<TDate>[K]\n | null;\n};\n\nexport const LocalizationProviderContext =\n // biome-ignore lint/suspicious/noExplicitAny: date frameworl\n createContext<LocalizationProviderValue<any> | null>(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n LocalizationProviderContext.displayName = \"LocalizationProviderContext\";\n}\n\nexport const LocalizationProvider = function LocalizationProvider<\n TDate extends DateFrameworkType,\n TLocale,\n>(props: LocalizationProviderProps<TDate, TLocale>) {\n const { children, DateAdapter, instance, locale, minDate, maxDate } = props;\n\n const dateAdapter = useMemo(() => {\n return new DateAdapter({\n locale,\n instance,\n });\n }, [DateAdapter, instance, locale]);\n\n const defaultDates: LocalizationProviderValue<TDate>[\"defaultDates\"] =\n useMemo(\n () => ({\n minDate: minDate || dateAdapter.date(MIN_DATE),\n maxDate: maxDate || dateAdapter.date(MAX_DATE),\n }),\n [dateAdapter, minDate, maxDate],\n );\n\n const contextValue: LocalizationProviderValue<TDate> = useMemo(() => {\n return {\n dateAdapter,\n defaultDates,\n };\n }, [dateAdapter, defaultDates]);\n\n return (\n <LocalizationProviderContext.Provider value={contextValue}>\n {children}\n </LocalizationProviderContext.Provider>\n );\n};\n\n/**\n * Custom hook to access the localization context.\n *\n * This hook provides access to the localization settings and utilities\n * within the `LocalizationProviderContext`. It should be used within a\n * component that is a descendant of `LocalizationProviderContext.Provider`.\n *\n * @template TDate - The type of the date object used in the localization context.\n *\n * @returns The localization provider value, which includes date manipulation and formatting utilities.\n *\n * @throws Will throw an error if the hook is used outside of a `LocalizationProviderContext.Provider`.\n */\nexport const useLocalization = <\n TDate extends DateFrameworkType,\n>(): LocalizationProviderValue<TDate> => {\n const localization = useContext(LocalizationProviderContext);\n if (!localization) {\n throw new Error(\n \"useLocalization should be called inside LocalizationProviderContext.Provider\",\n );\n }\n return localization;\n};\n"],"names":["createContext","LocalizationProvider","useMemo","useContext"],"mappings":";;;;;AAMA,MAAM,QAAW,GAAA,yBAAA;AACjB,MAAM,QAAW,GAAA,yBAAA;AAgEJ,MAAA,2BAAA;AAAA;AAAA,EAEXA,oBAAqD,IAAI;AAAA;AAE3D,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,EAAA,2BAAA,CAA4B,WAAc,GAAA,6BAAA;AAC5C;AAEa,MAAA,oBAAA,GAAuB,SAASC,qBAAAA,CAG3C,KAAkD,EAAA;AAClD,EAAA,MAAM,EAAE,QAAU,EAAA,WAAA,EAAa,UAAU,MAAQ,EAAA,OAAA,EAAS,SAAY,GAAA,KAAA;AAEtE,EAAM,MAAA,WAAA,GAAcC,cAAQ,MAAM;AAChC,IAAA,OAAO,IAAI,WAAY,CAAA;AAAA,MACrB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,GACA,EAAA,CAAC,WAAa,EAAA,QAAA,EAAU,MAAM,CAAC,CAAA;AAElC,EAAA,MAAM,YACJ,GAAAA,aAAA;AAAA,IACE,OAAO;AAAA,MACL,OAAS,EAAA,OAAA,IAAW,WAAY,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC7C,OAAS,EAAA,OAAA,IAAW,WAAY,CAAA,IAAA,CAAK,QAAQ;AAAA,KAC/C,CAAA;AAAA,IACA,CAAC,WAAa,EAAA,OAAA,EAAS,OAAO;AAAA,GAChC;AAEF,EAAM,MAAA,YAAA,GAAiDA,cAAQ,MAAM;AACnE,IAAO,OAAA;AAAA,MACL,WAAA;AAAA,MACA;AAAA,KACF;AAAA,GACC,EAAA,CAAC,WAAa,EAAA,YAAY,CAAC,CAAA;AAE9B,EAAA,sCACG,2BAA4B,CAAA,QAAA,EAA5B,EAAqC,KAAA,EAAO,cAC1C,QACH,EAAA,CAAA;AAEJ;AAeO,MAAM,kBAAkB,MAEU;AACvC,EAAM,MAAA,YAAA,GAAeC,iBAAW,2BAA2B,CAAA;AAC3D,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,YAAA;AACT;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuButton.js","sources":["../src/menu-button/MenuButton.tsx"],"sourcesContent":["import type { ButtonProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { type ReactNode, forwardRef, useCallback, useState } from \"react\";\nimport { CascadingMenu, type CascadingMenuProps } from \"../cascading-menu\";\nimport { MenuButtonTrigger } from \"./MenuButtonTrigger\";\n\nimport menuButtonCss from \"./MenuButton.css\";\n\nexport interface MenuButtonProps extends ButtonProps {\n CascadingMenuProps: CascadingMenuProps;\n children: ReactNode;\n className?: string;\n hideCaret?: boolean;\n}\n\nexport const MenuButton = forwardRef<HTMLButtonElement, MenuButtonProps>(\n function MenuButton(\n { variant = \"secondary\", CascadingMenuProps = {}, children, ...restProps },\n ref,\n ) {\n const {\n initialSource = { menuItems: [] },\n onOpen,\n onClose,\n ...restMenuProps\n } = CascadingMenuProps;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-menu-button\",\n css: menuButtonCss,\n window: targetWindow,\n });\n\n const [isMenuOpen, setMenuOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n setMenuOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n const handleClose = useCallback(() => {\n setMenuOpen(false);\n onClose?.();\n }, [onClose]);\n\n return (\n <CascadingMenu\n initialSource={initialSource}\n onClose={handleClose}\n onOpen={handleOpen}\n {...restMenuProps}\n >\n <MenuButtonTrigger\n aria-expanded={isMenuOpen}\n aria-haspopup\n isMenuOpen={isMenuOpen}\n ref={ref}\n variant={variant}\n {...restProps}\n >\n {children}\n </MenuButtonTrigger>\n </CascadingMenu>\n );\n },\n);\n"],"names":["forwardRef","MenuButton","useWindow","useComponentCssInjection","menuButtonCss","useState","useCallback","jsx","CascadingMenu","MenuButtonTrigger"],"mappings":";;;;;;;;;;AAgBO,MAAM,UAAa,GAAAA,gBAAA;AAAA,EACxB,SAASC,WAAAA,CACP,EAAE,OAAA,GAAU,WAAa,EAAA,kBAAA,GAAqB,EAAC,EAAG,QAAU,EAAA,GAAG,SAAU,EAAA,EACzE,GACA,EAAA;AACA,IAAM,MAAA;AAAA,MACJ,aAAgB,GAAA,EAAE,SAAW,EAAA,EAAG,EAAA;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,kBAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,kBAAA;AAAA,MACR,GAAK,EAAAC,YAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,IAAM,MAAA,UAAA,GAAaC,kBAAY,MAAM;AACnC,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,EAAA;AAAA,KACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,IAAM,MAAA,WAAA,GAAcA,kBAAY,MAAM;AACpC,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,EAAA;AAAA,KACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IACE,uBAAAC,cAAA;AAAA,MAACC,2BAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,OAAS,EAAA,WAAA;AAAA,QACT,MAAQ,EAAA,UAAA;AAAA,QACP,GAAG,aAAA;AAAA,QAEJ,QAAA,kBAAAD,cAAA;AAAA,UAACE,mCAAA;AAAA,UAAA;AAAA,YACC,eAAe,EAAA,UAAA;AAAA,YACf,eAAa,EAAA,IAAA;AAAA,YACb,UAAA;AAAA,YACA,GAAA;AAAA,YACA,OAAA;AAAA,YACC,GAAG,SAAA;AAAA,YAEH;AAAA;AAAA;AACH;AAAA,KACF;AAAA;AAGN;;;;"}
1
+ {"version":3,"file":"MenuButton.js","sources":["../src/menu-button/MenuButton.tsx"],"sourcesContent":["import type { ButtonProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { type ReactNode, forwardRef, useCallback, useState } from \"react\";\nimport { CascadingMenu, type CascadingMenuProps } from \"../cascading-menu\";\nimport { MenuButtonTrigger } from \"./MenuButtonTrigger\";\n\nimport menuButtonCss from \"./MenuButton.css\";\n\nexport interface MenuButtonProps extends ButtonProps {\n CascadingMenuProps: CascadingMenuProps;\n children: ReactNode;\n className?: string;\n hideCaret?: boolean;\n}\n\nexport const MenuButton = forwardRef<HTMLButtonElement, MenuButtonProps>(\n function MenuButton(\n { variant = \"secondary\", CascadingMenuProps = {}, children, ...restProps },\n ref,\n ) {\n const {\n initialSource = { menuItems: [] },\n onOpen,\n onClose,\n ...restMenuProps\n } = CascadingMenuProps;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-menu-button\",\n css: menuButtonCss,\n window: targetWindow,\n });\n\n const [isMenuOpen, setMenuOpen] = useState(false);\n\n const handleOpen = useCallback(() => {\n setMenuOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n const handleClose = useCallback(() => {\n setMenuOpen(false);\n onClose?.();\n }, [onClose]);\n\n return (\n <CascadingMenu\n initialSource={initialSource}\n onClose={handleClose}\n onOpen={handleOpen}\n {...restMenuProps}\n >\n <MenuButtonTrigger\n aria-expanded={isMenuOpen}\n aria-haspopup\n isMenuOpen={isMenuOpen}\n ref={ref}\n variant={variant}\n {...restProps}\n >\n {children}\n </MenuButtonTrigger>\n </CascadingMenu>\n );\n },\n);\n"],"names":["forwardRef","MenuButton","useWindow","useComponentCssInjection","menuButtonCss","useState","useCallback","jsx","CascadingMenu","MenuButtonTrigger"],"mappings":";;;;;;;;;;AAgBO,MAAM,UAAa,GAAAA,gBAAA;AAAA,EACxB,SAASC,WAAAA,CACP,EAAE,OAAA,GAAU,WAAa,EAAA,kBAAA,GAAqB,EAAC,EAAG,QAAU,EAAA,GAAG,SAAU,EAAA,EACzE,GACA,EAAA;AACA,IAAM,MAAA;AAAA,MACJ,aAAgB,GAAA,EAAE,SAAW,EAAA,EAAG,EAAA;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,kBAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,kBAAA;AAAA,MACR,GAAK,EAAAC,YAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,IAAM,MAAA,UAAA,GAAaC,kBAAY,MAAM;AACnC,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,EAAA;AAAA,KACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,IAAM,MAAA,WAAA,GAAcA,kBAAY,MAAM;AACpC,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,EAAA;AAAA,KACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IACE,uBAAAC,cAAA;AAAA,MAACC,2BAAA;AAAA,MAAA;AAAA,QACC,aAAA;AAAA,QACA,OAAS,EAAA,WAAA;AAAA,QACT,MAAQ,EAAA,UAAA;AAAA,QACP,GAAG,aAAA;AAAA,QAEJ,QAAA,kBAAAD,cAAA;AAAA,UAACE,mCAAA;AAAA,UAAA;AAAA,YACC,eAAe,EAAA,UAAA;AAAA,YACf,eAAa,EAAA,IAAA;AAAA,YACb,UAAA;AAAA,YACA,GAAA;AAAA,YACA,OAAA;AAAA,YACC,GAAG,SAAA;AAAA,YAEH;AAAA;AAAA;AACH;AAAA,KACF;AAAA;AAGN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MetricContent.js","sources":["../src/metric/MetricContent.tsx"],"sourcesContent":["import {\n Display1,\n Display2,\n Display3,\n Text,\n makePrefixer,\n} from \"@salt-ds/core\";\nimport { ArrowDownIcon, ArrowUpIcon, type IconProps } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport { type ComponentType, type HTMLAttributes, forwardRef } from \"react\";\nimport { useMetricContext } from \"./internal\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport metricContentCss from \"./MetricContent.css\";\n\nexport interface MetricContentProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * These props will be passed to the indicator icon. Use this to render a\n * custom icon.\n *\n * @see `Icon` for a list of valid props.\n */\n IndicatorIconProps?: Partial<IconProps>;\n /**\n * Replace the default Icon component\n */\n IndicatorIconComponent?: ComponentType<IconProps>;\n\n /**\n * Other data that may serve as additional information to the main value\n */\n subvalue?: string | number;\n /**\n * The main value to display in the metric\n */\n value: string | number;\n}\n\nconst iconComponentMap = {\n down: ArrowDownIcon,\n up: ArrowUpIcon,\n};\n\nconst withBaseName = makePrefixer(\"saltMetricContent\");\n\nexport const MetricContent = forwardRef<HTMLDivElement, MetricContentProps>(\n function MetricContent(\n {\n IndicatorIconProps,\n IndicatorIconComponent,\n className,\n value,\n subvalue,\n ...restProps\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-metric-content\",\n css: metricContentCss,\n window: targetWindow,\n });\n\n const {\n direction,\n showIndicator,\n indicatorPosition,\n size = \"medium\",\n valueId,\n titleId,\n subtitleId,\n } = useMetricContext();\n\n const iconSize = size === \"large\" ? 2 : 1;\n\n const valueComponentMap = {\n small: Display3,\n medium: Display2,\n large: Display1,\n };\n const ValueComponent = valueComponentMap[size];\n\n const iconProps = {\n \"aria-label\": direction,\n className: withBaseName(\"indicator\"),\n name: direction ? `movement-${direction}` : \"\",\n size: iconSize,\n ...IndicatorIconProps,\n };\n\n const IconComponent =\n IndicatorIconComponent ??\n (direction ? iconComponentMap[direction] : undefined);\n\n const icon =\n showIndicator && IconComponent ? <IconComponent {...iconProps} /> : null;\n\n return (\n <div\n {...restProps}\n className={clsx(withBaseName(), className)}\n aria-labelledby={`${titleId || \"\"} ${subtitleId || \"\"}`}\n ref={ref}\n >\n <div className={withBaseName(\"value-container\")}>\n {indicatorPosition === \"start\" && icon}\n <ValueComponent\n data-testid=\"metric-value\"\n id={valueId}\n className={withBaseName(\"value\")}\n >\n {value}\n </ValueComponent>\n {indicatorPosition === \"end\" && icon}\n </div>\n {subvalue && (\n <Text\n className={withBaseName(\"subvalue\")}\n data-testid=\"metric-subvalue\"\n >\n {subvalue}\n </Text>\n )}\n </div>\n );\n },\n);\n"],"names":["ArrowDownIcon","ArrowUpIcon","makePrefixer","forwardRef","MetricContent","useWindow","useComponentCssInjection","metricContentCss","useMetricContext","Display3","Display2","Display1","jsxs","clsx","jsx","Text"],"mappings":";;;;;;;;;;;;AAwCA,MAAM,gBAAmB,GAAA;AAAA,EACvB,IAAM,EAAAA,mBAAA;AAAA,EACN,EAAI,EAAAC;AACN,CAAA;AAEA,MAAM,YAAA,GAAeC,kBAAa,mBAAmB,CAAA;AAE9C,MAAM,aAAgB,GAAAC,gBAAA;AAAA,EAC3B,SAASC,cACP,CAAA;AAAA,IACE,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,eAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,IAAO,GAAA,QAAA;AAAA,MACP,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACEC,8BAAiB,EAAA;AAErB,IAAM,MAAA,QAAA,GAAW,IAAS,KAAA,OAAA,GAAU,CAAI,GAAA,CAAA;AAExC,IAAA,MAAM,iBAAoB,GAAA;AAAA,MACxB,KAAO,EAAAC,aAAA;AAAA,MACP,MAAQ,EAAAC,aAAA;AAAA,MACR,KAAO,EAAAC;AAAA,KACT;AACA,IAAM,MAAA,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAE7C,IAAA,MAAM,SAAY,GAAA;AAAA,MAChB,YAAc,EAAA,SAAA;AAAA,MACd,SAAA,EAAW,aAAa,WAAW,CAAA;AAAA,MACnC,IAAM,EAAA,SAAA,GAAY,CAAY,SAAA,EAAA,SAAS,CAAK,CAAA,GAAA,EAAA;AAAA,MAC5C,IAAM,EAAA,QAAA;AAAA,MACN,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,aACJ,GAAA,sBAAA,KACC,SAAY,GAAA,gBAAA,CAAiB,SAAS,CAAI,GAAA,KAAA,CAAA,CAAA;AAE7C,IAAA,MAAM,OACJ,aAAiB,IAAA,aAAA,kCAAiB,aAAe,EAAA,EAAA,GAAG,WAAW,CAAK,GAAA,IAAA;AAEtE,IACE,uBAAAC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,SAAA;AAAA,QACJ,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,mBAAiB,CAAG,EAAA,OAAA,IAAW,EAAE,CAAA,CAAA,EAAI,cAAc,EAAE,CAAA,CAAA;AAAA,QACrD,GAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,eAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,YAAa,CAAA,iBAAiB,CAC3C,EAAA,QAAA,EAAA;AAAA,YAAA,iBAAA,KAAsB,OAAW,IAAA,IAAA;AAAA,4BAClCE,cAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,aAAY,EAAA,cAAA;AAAA,gBACZ,EAAI,EAAA,OAAA;AAAA,gBACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,gBAE9B,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YACC,sBAAsB,KAAS,IAAA;AAAA,WAClC,EAAA,CAAA;AAAA,UACC,QACC,oBAAAA,cAAA;AAAA,YAACC,SAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,aAAa,UAAU,CAAA;AAAA,cAClC,aAAY,EAAA,iBAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA;AAGN;;;;"}
1
+ {"version":3,"file":"MetricContent.js","sources":["../src/metric/MetricContent.tsx"],"sourcesContent":["import {\n Display1,\n Display2,\n Display3,\n Text,\n makePrefixer,\n} from \"@salt-ds/core\";\nimport { ArrowDownIcon, ArrowUpIcon, type IconProps } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport { type ComponentType, type HTMLAttributes, forwardRef } from \"react\";\nimport { useMetricContext } from \"./internal\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport metricContentCss from \"./MetricContent.css\";\n\nexport interface MetricContentProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * These props will be passed to the indicator icon. Use this to render a\n * custom icon.\n *\n * @see `Icon` for a list of valid props.\n */\n IndicatorIconProps?: Partial<IconProps>;\n /**\n * Replace the default Icon component\n */\n IndicatorIconComponent?: ComponentType<IconProps>;\n\n /**\n * Other data that may serve as additional information to the main value\n */\n subvalue?: string | number;\n /**\n * The main value to display in the metric\n */\n value: string | number;\n}\n\nconst iconComponentMap = {\n down: ArrowDownIcon,\n up: ArrowUpIcon,\n};\n\nconst withBaseName = makePrefixer(\"saltMetricContent\");\n\nexport const MetricContent = forwardRef<HTMLDivElement, MetricContentProps>(\n function MetricContent(\n {\n IndicatorIconProps,\n IndicatorIconComponent,\n className,\n value,\n subvalue,\n ...restProps\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-metric-content\",\n css: metricContentCss,\n window: targetWindow,\n });\n\n const {\n direction,\n showIndicator,\n indicatorPosition,\n size = \"medium\",\n valueId,\n titleId,\n subtitleId,\n } = useMetricContext();\n\n const iconSize = size === \"large\" ? 2 : 1;\n\n const valueComponentMap = {\n small: Display3,\n medium: Display2,\n large: Display1,\n };\n const ValueComponent = valueComponentMap[size];\n\n const iconProps = {\n \"aria-label\": direction,\n className: withBaseName(\"indicator\"),\n name: direction ? `movement-${direction}` : \"\",\n size: iconSize,\n ...IndicatorIconProps,\n };\n\n const IconComponent =\n IndicatorIconComponent ??\n (direction ? iconComponentMap[direction] : undefined);\n\n const icon =\n showIndicator && IconComponent ? <IconComponent {...iconProps} /> : null;\n\n return (\n <div\n {...restProps}\n className={clsx(withBaseName(), className)}\n aria-labelledby={`${titleId || \"\"} ${subtitleId || \"\"}`}\n ref={ref}\n >\n <div className={withBaseName(\"value-container\")}>\n {indicatorPosition === \"start\" && icon}\n <ValueComponent\n data-testid=\"metric-value\"\n id={valueId}\n className={withBaseName(\"value\")}\n >\n {value}\n </ValueComponent>\n {indicatorPosition === \"end\" && icon}\n </div>\n {subvalue && (\n <Text\n className={withBaseName(\"subvalue\")}\n data-testid=\"metric-subvalue\"\n >\n {subvalue}\n </Text>\n )}\n </div>\n );\n },\n);\n"],"names":["ArrowDownIcon","ArrowUpIcon","makePrefixer","forwardRef","MetricContent","useWindow","useComponentCssInjection","metricContentCss","useMetricContext","Display3","Display2","Display1","jsxs","clsx","jsx","Text"],"mappings":";;;;;;;;;;;;AAwCA,MAAM,gBAAmB,GAAA;AAAA,EACvB,IAAM,EAAAA,mBAAA;AAAA,EACN,EAAI,EAAAC;AACN,CAAA;AAEA,MAAM,YAAA,GAAeC,kBAAa,mBAAmB,CAAA;AAE9C,MAAM,aAAgB,GAAAC,gBAAA;AAAA,EAC3B,SAASC,cACP,CAAA;AAAA,IACE,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,eAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,IAAO,GAAA,QAAA;AAAA,MACP,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACEC,8BAAiB,EAAA;AAErB,IAAM,MAAA,QAAA,GAAW,IAAS,KAAA,OAAA,GAAU,CAAI,GAAA,CAAA;AAExC,IAAA,MAAM,iBAAoB,GAAA;AAAA,MACxB,KAAO,EAAAC,aAAA;AAAA,MACP,MAAQ,EAAAC,aAAA;AAAA,MACR,KAAO,EAAAC;AAAA,KACT;AACA,IAAM,MAAA,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAE7C,IAAA,MAAM,SAAY,GAAA;AAAA,MAChB,YAAc,EAAA,SAAA;AAAA,MACd,SAAA,EAAW,aAAa,WAAW,CAAA;AAAA,MACnC,IAAM,EAAA,SAAA,GAAY,CAAY,SAAA,EAAA,SAAS,CAAK,CAAA,GAAA,EAAA;AAAA,MAC5C,IAAM,EAAA,QAAA;AAAA,MACN,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,aACJ,GAAA,sBAAA,KACC,SAAY,GAAA,gBAAA,CAAiB,SAAS,CAAI,GAAA,MAAA,CAAA;AAE7C,IAAA,MAAM,OACJ,aAAiB,IAAA,aAAA,kCAAiB,aAAe,EAAA,EAAA,GAAG,WAAW,CAAK,GAAA,IAAA;AAEtE,IACE,uBAAAC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,SAAA;AAAA,QACJ,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,mBAAiB,CAAG,EAAA,OAAA,IAAW,EAAE,CAAA,CAAA,EAAI,cAAc,EAAE,CAAA,CAAA;AAAA,QACrD,GAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,eAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,YAAa,CAAA,iBAAiB,CAC3C,EAAA,QAAA,EAAA;AAAA,YAAA,iBAAA,KAAsB,OAAW,IAAA,IAAA;AAAA,4BAClCE,cAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,aAAY,EAAA,cAAA;AAAA,gBACZ,EAAI,EAAA,OAAA;AAAA,gBACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,gBAE9B,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YACC,sBAAsB,KAAS,IAAA;AAAA,WAClC,EAAA,CAAA;AAAA,UACC,QACC,oBAAAA,cAAA;AAAA,YAACC,SAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,aAAa,UAAU,CAAA;AAAA,cAClC,aAAY,EAAA,iBAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA;AAGN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.js","sources":["../src/number-input/NumberInput.tsx"],"sourcesContent":["import {\n Button,\n StatusAdornment,\n type ValidationStatus,\n capitalize,\n makePrefixer,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useIcon,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\nimport {\n isAllowedNonNumeric,\n isOutOfRange,\n sanitizedInput,\n toFixedDecimalPlaces,\n toFloat,\n} from \"./internal/utils\";\n\nimport numberInputCss from \"./NumberInput.css\";\nimport { useNumberInput } from \"./useNumberInput\";\n\nconst withBaseName = makePrefixer(\"saltNumberInput\");\n\nexport interface NumberInputProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * A boolean. When `true`, the input will receive a full border.\n */\n bordered?: boolean;\n /**\n * The number of decimal places to display.\n */\n decimalPlaces?: number;\n /**\n * Sets the initial default value of the component.\n */\n defaultValue?: number | string;\n /**\n * If `true`, the number input will be disabled.\n */\n disabled?: boolean;\n /**\n * The marker to use in an empty read only Input.\n * Use `''` to disable this feature. Defaults to '—'.\n * @default '—'\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component\n */\n endAdornment?: ReactNode;\n /**\n * Whether to hide the number buttons. Defaults to `false`.\n * @default false\n */\n hideButtons?: boolean;\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * Optional ref for the input component\n */\n inputRef?: Ref<HTMLInputElement>;\n /**\n * The maximum value that can be selected. Defaults to Number.MAX_SAFE_INTEGER.\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * The minimum value that can be selected. Defaults to Number.MIN_SAFE_INTEGER.\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n /**\n * Callback when number input value is changed.\n * @param event - the event triggers value change, could be undefined during increment / decrement button long press\n */\n onChange?: (\n event: SyntheticEvent | undefined,\n value: number | string,\n ) => void;\n /**\n * A string. Displayed in a dimmed color when the input value is empty.\n */\n placeholder?: string | undefined;\n /**\n * A boolean. If `true`, the component is not editable by the user.\n */\n readOnly?: boolean;\n /**\n * Start adornment component\n */\n startAdornment?: ReactNode;\n /**\n * The amount to increment or decrement the value by when using the number buttons or Up Arrow and Down Arrow keys. Default to 1.\n * @default 1\n */\n step?: number;\n /**\n * The amount to change the value when the value is incremented or decremented by holding Shift and pressing Up arrow or Down arrow keys.\n * Defaults to 10.\n * @default 10\n */\n stepBlock?: number;\n /**\n * Alignment of text within container. Defaults to \"left\".\n * @default \"left\"\n */\n textAlign?: \"left\" | \"center\" | \"right\";\n /**\n * Validation status.\n */\n validationStatus?: Extract<ValidationStatus, \"error\" | \"warning\" | \"success\">;\n /**\n * Styling variant. Defaults to \"primary\".\n * @default \"primary\"\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * The value of the number input. The component will be controlled if this prop is provided.\n */\n value?: number | string | undefined;\n}\n\nexport const NumberInput = forwardRef<HTMLDivElement, NumberInputProps>(\n function NumberInput(\n {\n bordered,\n className: classNameProp,\n decimalPlaces = 0,\n defaultValue: defaultValueProp,\n disabled,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n hideButtons,\n inputProps: inputPropsProp = {},\n inputRef: inputRefProp,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n onChange: onChangeProp,\n placeholder,\n readOnly: readOnlyProp,\n startAdornment,\n step = 1,\n stepBlock = 10,\n textAlign = \"left\",\n validationStatus: validationStatusProp,\n value: valueProp,\n variant = \"primary\",\n ...restProps\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-number-input\",\n css: numberInputCss,\n window: targetWindow,\n });\n\n const { IncreaseIcon, DecreaseIcon } = useIcon();\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isDisabled = disabled || formFieldDisabled;\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": inputDescribedBy,\n \"aria-labelledby\": inputLabelledBy,\n className: inputClassName,\n onBlur: inputOnBlur,\n onChange: inputOnChange,\n onFocus: inputOnFocus,\n required: inputRequired,\n onKeyDown: inputOnKeyDown,\n ...restInputProps\n } = inputPropsProp;\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : inputRequired;\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default:\n typeof defaultValueProp === \"number\"\n ? toFixedDecimalPlaces(defaultValueProp, decimalPlaces)\n : defaultValueProp,\n name: \"NumberInput\",\n state: \"value\",\n });\n\n // Won't be needed when `:has` css can be used\n const [focused, setFocused] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const forkedInputRef = useForkRef(inputRef, inputRefProp);\n\n const {\n decrementButtonProps,\n decrementValue,\n incrementButtonProps,\n incrementValue,\n } = useNumberInput({\n inputRef,\n setValue,\n decimalPlaces,\n disabled,\n max,\n min,\n onChange: onChangeProp,\n readOnly: isReadOnly,\n step,\n stepBlock,\n value,\n });\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n\n inputOnFocus?.(event);\n };\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n\n if (value === undefined) return;\n\n const floatValue = toFloat(value);\n if (Number.isNaN(floatValue)) {\n // Keep original value if NaN\n setValue(value);\n onChangeProp?.(event, value);\n } else {\n const roundedValue = toFixedDecimalPlaces(floatValue, decimalPlaces);\n\n if (value !== \"\" && !isAllowedNonNumeric(value)) {\n setValue(roundedValue);\n }\n\n onChangeProp?.(event, roundedValue);\n }\n\n inputOnBlur?.(event);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const changedValue = event.target.value;\n\n setValue(sanitizedInput(changedValue));\n\n onChangeProp?.(event, sanitizedInput(changedValue));\n inputOnChange?.(event);\n };\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n case \"ArrowUp\": {\n event.preventDefault();\n const block = event.shiftKey;\n incrementValue(event, block);\n break;\n }\n case \"ArrowDown\": {\n event.preventDefault();\n const block = event.shiftKey;\n decrementValue(event, block);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n setValue(min);\n onChangeProp?.(event, min);\n break;\n }\n case \"End\": {\n event.preventDefault();\n setValue(max);\n onChangeProp?.(event, max);\n break;\n }\n case \"PageUp\": {\n event.preventDefault();\n incrementValue(event, true);\n break;\n }\n case \"PageDown\": {\n event.preventDefault();\n decrementValue(event, true);\n break;\n }\n }\n\n inputOnKeyDown?.(event);\n };\n\n return (\n <div\n className={clsx(withBaseName(), classNameProp)}\n {...restProps}\n ref={ref}\n >\n <div\n className={clsx(\n withBaseName(\"inputContainer\"),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus || \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n )}\n >\n {startAdornment && (\n <div className={withBaseName(\"startAdornmentContainer\")}>\n {startAdornment}\n </div>\n )}\n <input\n aria-describedby={clsx(formFieldDescribedBy, inputDescribedBy)}\n aria-labelledby={clsx(formFieldLabelledBy, inputLabelledBy)}\n aria-invalid={\n !isReadOnly ? isOutOfRange(value, min, max) : undefined\n }\n aria-valuemax={\n !isReadOnly\n ? toFloat(toFixedDecimalPlaces(max, decimalPlaces))\n : undefined\n }\n aria-valuemin={\n !isReadOnly\n ? toFloat(toFixedDecimalPlaces(min, decimalPlaces))\n : undefined\n }\n aria-valuenow={\n value && !Number.isNaN(toFloat(value)) && !isReadOnly\n ? toFloat(toFixedDecimalPlaces(toFloat(value), decimalPlaces))\n : undefined\n }\n className={clsx(\n withBaseName(\"input\"),\n withBaseName(`inputTextAlign${capitalize(textAlign)}`),\n inputClassName,\n )}\n disabled={isDisabled}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onFocus={!isDisabled ? handleInputFocus : undefined}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n readOnly={isReadOnly}\n aria-readonly={isReadOnly ? \"true\" : undefined}\n ref={forkedInputRef}\n required={isRequired}\n // Workaround to have readonly conveyed by screen readers (https://github.com/jpmorganchase/salt-ds/issues/4586)\n role={isReadOnly ? \"textbox\" : \"spinbutton\"}\n tabIndex={isDisabled ? -1 : 0}\n value={value}\n {...restInputProps}\n />\n {!isDisabled && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment && (\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {endAdornment}\n </div>\n )}\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n\n {!hideButtons && !isReadOnly && (\n <div className={withBaseName(\"buttonContainer\")}>\n <Button\n className={clsx(\n withBaseName(\"numberButton\"),\n withBaseName(\"numberButtonIncrement\"),\n )}\n {...incrementButtonProps}\n >\n <IncreaseIcon aria-hidden />\n </Button>\n <Button\n className={clsx(\n withBaseName(\"numberButton\"),\n withBaseName(\"numberButtonDecrement\"),\n )}\n {...decrementButtonProps}\n >\n <DecreaseIcon aria-hidden />\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","NumberInput","useWindow","useComponentCssInjection","numberInputCss","useIcon","useFormFieldProps","useControlled","toFixedDecimalPlaces","useState","useRef","useForkRef","useNumberInput","toFloat","isAllowedNonNumeric","sanitizedInput","jsxs","clsx","jsx","isOutOfRange","capitalize","StatusAdornment","Button"],"mappings":"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"}
1
+ {"version":3,"file":"NumberInput.js","sources":["../src/number-input/NumberInput.tsx"],"sourcesContent":["import {\n Button,\n StatusAdornment,\n type ValidationStatus,\n capitalize,\n makePrefixer,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useIcon,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\nimport {\n isAllowedNonNumeric,\n isOutOfRange,\n sanitizedInput,\n toFixedDecimalPlaces,\n toFloat,\n} from \"./internal/utils\";\n\nimport numberInputCss from \"./NumberInput.css\";\nimport { useNumberInput } from \"./useNumberInput\";\n\nconst withBaseName = makePrefixer(\"saltNumberInput\");\n\nexport interface NumberInputProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * A boolean. When `true`, the input will receive a full border.\n */\n bordered?: boolean;\n /**\n * The number of decimal places to display.\n */\n decimalPlaces?: number;\n /**\n * Sets the initial default value of the component.\n */\n defaultValue?: number | string;\n /**\n * If `true`, the number input will be disabled.\n */\n disabled?: boolean;\n /**\n * The marker to use in an empty read only Input.\n * Use `''` to disable this feature. Defaults to '—'.\n * @default '—'\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component\n */\n endAdornment?: ReactNode;\n /**\n * Whether to hide the number buttons. Defaults to `false`.\n * @default false\n */\n hideButtons?: boolean;\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * Optional ref for the input component\n */\n inputRef?: Ref<HTMLInputElement>;\n /**\n * The maximum value that can be selected. Defaults to Number.MAX_SAFE_INTEGER.\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * The minimum value that can be selected. Defaults to Number.MIN_SAFE_INTEGER.\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n /**\n * Callback when number input value is changed.\n * @param event - the event triggers value change, could be undefined during increment / decrement button long press\n */\n onChange?: (\n event: SyntheticEvent | undefined,\n value: number | string,\n ) => void;\n /**\n * A string. Displayed in a dimmed color when the input value is empty.\n */\n placeholder?: string | undefined;\n /**\n * A boolean. If `true`, the component is not editable by the user.\n */\n readOnly?: boolean;\n /**\n * Start adornment component\n */\n startAdornment?: ReactNode;\n /**\n * The amount to increment or decrement the value by when using the number buttons or Up Arrow and Down Arrow keys. Default to 1.\n * @default 1\n */\n step?: number;\n /**\n * The amount to change the value when the value is incremented or decremented by holding Shift and pressing Up arrow or Down arrow keys.\n * Defaults to 10.\n * @default 10\n */\n stepBlock?: number;\n /**\n * Alignment of text within container. Defaults to \"left\".\n * @default \"left\"\n */\n textAlign?: \"left\" | \"center\" | \"right\";\n /**\n * Validation status.\n */\n validationStatus?: Extract<ValidationStatus, \"error\" | \"warning\" | \"success\">;\n /**\n * Styling variant. Defaults to \"primary\".\n * @default \"primary\"\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * The value of the number input. The component will be controlled if this prop is provided.\n */\n value?: number | string | undefined;\n}\n\nexport const NumberInput = forwardRef<HTMLDivElement, NumberInputProps>(\n function NumberInput(\n {\n bordered,\n className: classNameProp,\n decimalPlaces = 0,\n defaultValue: defaultValueProp,\n disabled,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n hideButtons,\n inputProps: inputPropsProp = {},\n inputRef: inputRefProp,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n onChange: onChangeProp,\n placeholder,\n readOnly: readOnlyProp,\n startAdornment,\n step = 1,\n stepBlock = 10,\n textAlign = \"left\",\n validationStatus: validationStatusProp,\n value: valueProp,\n variant = \"primary\",\n ...restProps\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-number-input\",\n css: numberInputCss,\n window: targetWindow,\n });\n\n const { IncreaseIcon, DecreaseIcon } = useIcon();\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isDisabled = disabled || formFieldDisabled;\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": inputDescribedBy,\n \"aria-labelledby\": inputLabelledBy,\n className: inputClassName,\n onBlur: inputOnBlur,\n onChange: inputOnChange,\n onFocus: inputOnFocus,\n required: inputRequired,\n onKeyDown: inputOnKeyDown,\n ...restInputProps\n } = inputPropsProp;\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : inputRequired;\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default:\n typeof defaultValueProp === \"number\"\n ? toFixedDecimalPlaces(defaultValueProp, decimalPlaces)\n : defaultValueProp,\n name: \"NumberInput\",\n state: \"value\",\n });\n\n // Won't be needed when `:has` css can be used\n const [focused, setFocused] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const forkedInputRef = useForkRef(inputRef, inputRefProp);\n\n const {\n decrementButtonProps,\n decrementValue,\n incrementButtonProps,\n incrementValue,\n } = useNumberInput({\n inputRef,\n setValue,\n decimalPlaces,\n disabled,\n max,\n min,\n onChange: onChangeProp,\n readOnly: isReadOnly,\n step,\n stepBlock,\n value,\n });\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n\n inputOnFocus?.(event);\n };\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n\n if (value === undefined) return;\n\n const floatValue = toFloat(value);\n if (Number.isNaN(floatValue)) {\n // Keep original value if NaN\n setValue(value);\n onChangeProp?.(event, value);\n } else {\n const roundedValue = toFixedDecimalPlaces(floatValue, decimalPlaces);\n\n if (value !== \"\" && !isAllowedNonNumeric(value)) {\n setValue(roundedValue);\n }\n\n onChangeProp?.(event, roundedValue);\n }\n\n inputOnBlur?.(event);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const changedValue = event.target.value;\n\n setValue(sanitizedInput(changedValue));\n\n onChangeProp?.(event, sanitizedInput(changedValue));\n inputOnChange?.(event);\n };\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n case \"ArrowUp\": {\n event.preventDefault();\n const block = event.shiftKey;\n incrementValue(event, block);\n break;\n }\n case \"ArrowDown\": {\n event.preventDefault();\n const block = event.shiftKey;\n decrementValue(event, block);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n setValue(min);\n onChangeProp?.(event, min);\n break;\n }\n case \"End\": {\n event.preventDefault();\n setValue(max);\n onChangeProp?.(event, max);\n break;\n }\n case \"PageUp\": {\n event.preventDefault();\n incrementValue(event, true);\n break;\n }\n case \"PageDown\": {\n event.preventDefault();\n decrementValue(event, true);\n break;\n }\n }\n\n inputOnKeyDown?.(event);\n };\n\n return (\n <div\n className={clsx(withBaseName(), classNameProp)}\n {...restProps}\n ref={ref}\n >\n <div\n className={clsx(\n withBaseName(\"inputContainer\"),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus || \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n )}\n >\n {startAdornment && (\n <div className={withBaseName(\"startAdornmentContainer\")}>\n {startAdornment}\n </div>\n )}\n <input\n aria-describedby={clsx(formFieldDescribedBy, inputDescribedBy)}\n aria-labelledby={clsx(formFieldLabelledBy, inputLabelledBy)}\n aria-invalid={\n !isReadOnly ? isOutOfRange(value, min, max) : undefined\n }\n aria-valuemax={\n !isReadOnly\n ? toFloat(toFixedDecimalPlaces(max, decimalPlaces))\n : undefined\n }\n aria-valuemin={\n !isReadOnly\n ? toFloat(toFixedDecimalPlaces(min, decimalPlaces))\n : undefined\n }\n aria-valuenow={\n value && !Number.isNaN(toFloat(value)) && !isReadOnly\n ? toFloat(toFixedDecimalPlaces(toFloat(value), decimalPlaces))\n : undefined\n }\n className={clsx(\n withBaseName(\"input\"),\n withBaseName(`inputTextAlign${capitalize(textAlign)}`),\n inputClassName,\n )}\n disabled={isDisabled}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onFocus={!isDisabled ? handleInputFocus : undefined}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n readOnly={isReadOnly}\n aria-readonly={isReadOnly ? \"true\" : undefined}\n ref={forkedInputRef}\n required={isRequired}\n // Workaround to have readonly conveyed by screen readers (https://github.com/jpmorganchase/salt-ds/issues/4586)\n role={isReadOnly ? \"textbox\" : \"spinbutton\"}\n tabIndex={isDisabled ? -1 : 0}\n value={value}\n {...restInputProps}\n />\n {!isDisabled && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment && (\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {endAdornment}\n </div>\n )}\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n\n {!hideButtons && !isReadOnly && (\n <div className={withBaseName(\"buttonContainer\")}>\n <Button\n className={clsx(\n withBaseName(\"numberButton\"),\n withBaseName(\"numberButtonIncrement\"),\n )}\n {...incrementButtonProps}\n >\n <IncreaseIcon aria-hidden />\n </Button>\n <Button\n className={clsx(\n withBaseName(\"numberButton\"),\n withBaseName(\"numberButtonDecrement\"),\n )}\n {...decrementButtonProps}\n >\n <DecreaseIcon aria-hidden />\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","NumberInput","useWindow","useComponentCssInjection","numberInputCss","useIcon","useFormFieldProps","useControlled","toFixedDecimalPlaces","useState","useRef","useForkRef","useNumberInput","toFloat","isAllowedNonNumeric","sanitizedInput","jsxs","clsx","jsx","isOutOfRange","capitalize","StatusAdornment","Button"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useNumberInput.js","sources":["../src/number-input/useNumberInput.ts"],"sourcesContent":["import {\n type Dispatch,\n type MouseEvent,\n type MutableRefObject,\n type SetStateAction,\n type SyntheticEvent,\n useCallback,\n} from \"react\";\nimport type { NumberInputProps } from \"./NumberInput\";\nimport { useActivateWhileMouseDown } from \"./internal/useActivateWhileMouseDown\";\nimport {\n isAtMax,\n isAtMin,\n toFixedDecimalPlaces,\n toFloat,\n} from \"./internal/utils\";\n\n/**\n * Manages increment / decrement logic\n */\nexport const useNumberInput = ({\n decimalPlaces = 0,\n disabled,\n inputRef,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n onChange,\n readOnly,\n setValue,\n step = 1,\n stepBlock = 10,\n value,\n}: Pick<\n NumberInputProps,\n | \"decimalPlaces\"\n | \"disabled\"\n | \"inputRef\"\n | \"max\"\n | \"min\"\n | \"onChange\"\n | \"readOnly\"\n | \"step\"\n | \"stepBlock\"\n | \"value\"\n> & {\n setValue: Dispatch<SetStateAction<string | number | undefined>>;\n inputRef: MutableRefObject<HTMLInputElement | null>;\n}) => {\n const setValueInRange = useCallback(\n (event: SyntheticEvent | undefined, modifiedValue: number) => {\n if (readOnly) return;\n let nextValue = modifiedValue;\n if (nextValue < min) nextValue = min;\n if (nextValue > max) nextValue = max;\n\n const roundedValue = toFixedDecimalPlaces(nextValue, decimalPlaces);\n if (Number.isNaN(toFloat(roundedValue))) return;\n\n setValue(roundedValue);\n\n onChange?.(event, roundedValue);\n },\n [decimalPlaces, min, max, onChange, readOnly, setValue],\n );\n\n const decrementValue = useCallback(\n (event?: SyntheticEvent, block?: boolean) => {\n if (value === undefined || isAtMin(value, min)) return;\n const decrementStep = block ? stepBlock : step;\n const nextValue =\n value === \"\" ? -decrementStep : toFloat(value) - decrementStep;\n setValueInRange(event, nextValue);\n },\n [value, min, step, stepBlock, setValueInRange],\n );\n\n const incrementValue = useCallback(\n (event?: SyntheticEvent, block?: boolean) => {\n if (value === undefined || isAtMax(value, max)) return;\n const incrementStep = block ? stepBlock : step;\n const nextValue =\n value === \"\" ? incrementStep : toFloat(value) + incrementStep;\n setValueInRange(event, nextValue);\n },\n [value, max, step, stepBlock, setValueInRange],\n );\n\n const { activate: decrementSpinner } = useActivateWhileMouseDown(\n (event?: SyntheticEvent) => decrementValue(event),\n isAtMin(value, min),\n );\n\n const { activate: incrementSpinner } = useActivateWhileMouseDown(\n (event?: SyntheticEvent) => incrementValue(event),\n isAtMax(value, max),\n );\n\n const handleButtonMouseUp = () => inputRef.current?.focus();\n\n const commonButtonProps = {\n \"aria-hidden\": true,\n tabIndex: -1,\n onMouseUp: handleButtonMouseUp,\n };\n\n const incrementButtonProps = {\n ...commonButtonProps,\n \"aria-label\": \"increment value\",\n disabled: disabled || isAtMax(value, max),\n onMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n if (event.nativeEvent.button !== 0) {\n // To match closely with <input type='input'>\n return;\n }\n incrementSpinner(event);\n },\n };\n\n const decrementButtonProps = {\n ...commonButtonProps,\n \"aria-label\": \"decrement value\",\n disabled: disabled || isAtMin(value, min),\n onMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n if (event.nativeEvent.button !== 0) {\n // To match closely with <input type='input'>\n return;\n }\n decrementSpinner(event);\n },\n };\n\n return {\n incrementButtonProps,\n decrementButtonProps,\n incrementValue,\n decrementValue,\n };\n};\n"],"names":["useCallback","toFixedDecimalPlaces","toFloat","isAtMin","isAtMax","useActivateWhileMouseDown"],"mappings":";;;;;;AAoBO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,aAAgB,GAAA,CAAA;AAAA,EAChB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAM,MAAO,CAAA,gBAAA;AAAA,EACb,MAAM,MAAO,CAAA,gBAAA;AAAA,EACb,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAO,GAAA,CAAA;AAAA,EACP,SAAY,GAAA,EAAA;AAAA,EACZ;AACF,CAeM,KAAA;AACJ,EAAA,MAAM,eAAkB,GAAAA,iBAAA;AAAA,IACtB,CAAC,OAAmC,aAA0B,KAAA;AAC5D,MAAA,IAAI,QAAU,EAAA;AACd,MAAA,IAAI,SAAY,GAAA,aAAA;AAChB,MAAI,IAAA,SAAA,GAAY,KAAiB,SAAA,GAAA,GAAA;AACjC,MAAI,IAAA,SAAA,GAAY,KAAiB,SAAA,GAAA,GAAA;AAEjC,MAAM,MAAA,YAAA,GAAeC,0BAAqB,CAAA,SAAA,EAAW,aAAa,CAAA;AAClE,MAAA,IAAI,MAAO,CAAA,KAAA,CAAMC,aAAQ,CAAA,YAAY,CAAC,CAAG,EAAA;AAEzC,MAAA,QAAA,CAAS,YAAY,CAAA;AAErB,MAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAW,KAAO,EAAA,YAAA,CAAA;AAAA,KACpB;AAAA,IACA,CAAC,aAAe,EAAA,GAAA,EAAK,GAAK,EAAA,QAAA,EAAU,UAAU,QAAQ;AAAA,GACxD;AAEA,EAAA,MAAM,cAAiB,GAAAF,iBAAA;AAAA,IACrB,CAAC,OAAwB,KAAoB,KAAA;AAC3C,MAAA,IAAI,KAAU,KAAA,KAAA,CAAA,IAAaG,aAAQ,CAAA,KAAA,EAAO,GAAG,CAAG,EAAA;AAChD,MAAM,MAAA,aAAA,GAAgB,QAAQ,SAAY,GAAA,IAAA;AAC1C,MAAA,MAAM,YACJ,KAAU,KAAA,EAAA,GAAK,CAAC,aAAgB,GAAAD,aAAA,CAAQ,KAAK,CAAI,GAAA,aAAA;AACnD,MAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,KAClC;AAAA,IACA,CAAC,KAAA,EAAO,GAAK,EAAA,IAAA,EAAM,WAAW,eAAe;AAAA,GAC/C;AAEA,EAAA,MAAM,cAAiB,GAAAF,iBAAA;AAAA,IACrB,CAAC,OAAwB,KAAoB,KAAA;AAC3C,MAAA,IAAI,KAAU,KAAA,KAAA,CAAA,IAAaI,aAAQ,CAAA,KAAA,EAAO,GAAG,CAAG,EAAA;AAChD,MAAM,MAAA,aAAA,GAAgB,QAAQ,SAAY,GAAA,IAAA;AAC1C,MAAA,MAAM,YACJ,KAAU,KAAA,EAAA,GAAK,aAAgB,GAAAF,aAAA,CAAQ,KAAK,CAAI,GAAA,aAAA;AAClD,MAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,KAClC;AAAA,IACA,CAAC,KAAA,EAAO,GAAK,EAAA,IAAA,EAAM,WAAW,eAAe;AAAA,GAC/C;AAEA,EAAM,MAAA,EAAE,QAAU,EAAA,gBAAA,EAAqB,GAAAG,mDAAA;AAAA,IACrC,CAAC,KAA2B,KAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IAChDF,aAAA,CAAQ,OAAO,GAAG;AAAA,GACpB;AAEA,EAAM,MAAA,EAAE,QAAU,EAAA,gBAAA,EAAqB,GAAAE,mDAAA;AAAA,IACrC,CAAC,KAA2B,KAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IAChDD,aAAA,CAAQ,OAAO,GAAG;AAAA,GACpB;AAEA,EAAA,MAAM,sBAAsB,MAAG;AAjGjC,IAAA,IAAA,EAAA;AAiGoC,IAAA,OAAA,CAAA,EAAA,GAAA,QAAA,CAAS,YAAT,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA;AAAA,GAAA;AAEpD,EAAA,MAAM,iBAAoB,GAAA;AAAA,IACxB,aAAe,EAAA,IAAA;AAAA,IACf,QAAU,EAAA,CAAA,CAAA;AAAA,IACV,SAAW,EAAA;AAAA,GACb;AAEA,EAAA,MAAM,oBAAuB,GAAA;AAAA,IAC3B,GAAG,iBAAA;AAAA,IACH,YAAc,EAAA,iBAAA;AAAA,IACd,QAAU,EAAA,QAAA,IAAYA,aAAQ,CAAA,KAAA,EAAO,GAAG,CAAA;AAAA,IACxC,WAAA,EAAa,CAAC,KAAyC,KAAA;AACrD,MAAI,IAAA,KAAA,CAAM,WAAY,CAAA,MAAA,KAAW,CAAG,EAAA;AAElC,QAAA;AAAA;AAEF,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA;AACxB,GACF;AAEA,EAAA,MAAM,oBAAuB,GAAA;AAAA,IAC3B,GAAG,iBAAA;AAAA,IACH,YAAc,EAAA,iBAAA;AAAA,IACd,QAAU,EAAA,QAAA,IAAYD,aAAQ,CAAA,KAAA,EAAO,GAAG,CAAA;AAAA,IACxC,WAAA,EAAa,CAAC,KAAyC,KAAA;AACrD,MAAI,IAAA,KAAA,CAAM,WAAY,CAAA,MAAA,KAAW,CAAG,EAAA;AAElC,QAAA;AAAA;AAEF,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA;AACxB,GACF;AAEA,EAAO,OAAA;AAAA,IACL,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useNumberInput.js","sources":["../src/number-input/useNumberInput.ts"],"sourcesContent":["import {\n type Dispatch,\n type MouseEvent,\n type MutableRefObject,\n type SetStateAction,\n type SyntheticEvent,\n useCallback,\n} from \"react\";\nimport type { NumberInputProps } from \"./NumberInput\";\nimport { useActivateWhileMouseDown } from \"./internal/useActivateWhileMouseDown\";\nimport {\n isAtMax,\n isAtMin,\n toFixedDecimalPlaces,\n toFloat,\n} from \"./internal/utils\";\n\n/**\n * Manages increment / decrement logic\n */\nexport const useNumberInput = ({\n decimalPlaces = 0,\n disabled,\n inputRef,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n onChange,\n readOnly,\n setValue,\n step = 1,\n stepBlock = 10,\n value,\n}: Pick<\n NumberInputProps,\n | \"decimalPlaces\"\n | \"disabled\"\n | \"inputRef\"\n | \"max\"\n | \"min\"\n | \"onChange\"\n | \"readOnly\"\n | \"step\"\n | \"stepBlock\"\n | \"value\"\n> & {\n setValue: Dispatch<SetStateAction<string | number | undefined>>;\n inputRef: MutableRefObject<HTMLInputElement | null>;\n}) => {\n const setValueInRange = useCallback(\n (event: SyntheticEvent | undefined, modifiedValue: number) => {\n if (readOnly) return;\n let nextValue = modifiedValue;\n if (nextValue < min) nextValue = min;\n if (nextValue > max) nextValue = max;\n\n const roundedValue = toFixedDecimalPlaces(nextValue, decimalPlaces);\n if (Number.isNaN(toFloat(roundedValue))) return;\n\n setValue(roundedValue);\n\n onChange?.(event, roundedValue);\n },\n [decimalPlaces, min, max, onChange, readOnly, setValue],\n );\n\n const decrementValue = useCallback(\n (event?: SyntheticEvent, block?: boolean) => {\n if (value === undefined || isAtMin(value, min)) return;\n const decrementStep = block ? stepBlock : step;\n const nextValue =\n value === \"\" ? -decrementStep : toFloat(value) - decrementStep;\n setValueInRange(event, nextValue);\n },\n [value, min, step, stepBlock, setValueInRange],\n );\n\n const incrementValue = useCallback(\n (event?: SyntheticEvent, block?: boolean) => {\n if (value === undefined || isAtMax(value, max)) return;\n const incrementStep = block ? stepBlock : step;\n const nextValue =\n value === \"\" ? incrementStep : toFloat(value) + incrementStep;\n setValueInRange(event, nextValue);\n },\n [value, max, step, stepBlock, setValueInRange],\n );\n\n const { activate: decrementSpinner } = useActivateWhileMouseDown(\n (event?: SyntheticEvent) => decrementValue(event),\n isAtMin(value, min),\n );\n\n const { activate: incrementSpinner } = useActivateWhileMouseDown(\n (event?: SyntheticEvent) => incrementValue(event),\n isAtMax(value, max),\n );\n\n const handleButtonMouseUp = () => inputRef.current?.focus();\n\n const commonButtonProps = {\n \"aria-hidden\": true,\n tabIndex: -1,\n onMouseUp: handleButtonMouseUp,\n };\n\n const incrementButtonProps = {\n ...commonButtonProps,\n \"aria-label\": \"increment value\",\n disabled: disabled || isAtMax(value, max),\n onMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n if (event.nativeEvent.button !== 0) {\n // To match closely with <input type='input'>\n return;\n }\n incrementSpinner(event);\n },\n };\n\n const decrementButtonProps = {\n ...commonButtonProps,\n \"aria-label\": \"decrement value\",\n disabled: disabled || isAtMin(value, min),\n onMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n if (event.nativeEvent.button !== 0) {\n // To match closely with <input type='input'>\n return;\n }\n decrementSpinner(event);\n },\n };\n\n return {\n incrementButtonProps,\n decrementButtonProps,\n incrementValue,\n decrementValue,\n };\n};\n"],"names":["useCallback","toFixedDecimalPlaces","toFloat","isAtMin","isAtMax","useActivateWhileMouseDown"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CategoryListContext.js","sources":["../src/query-input/internal/CategoryListContext.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\nexport interface CategoryListContext {\n width: number;\n}\n\nexport const CategoryListContext = createContext<\n CategoryListContext | undefined\n>(undefined);\n\nexport function useCategoryListContext(): CategoryListContext {\n const context = useContext(CategoryListContext);\n if (!context) {\n throw new Error(\n \"useCategoryListContext should be used inside CategoryList\",\n );\n }\n return context;\n}\n"],"names":["createContext","useContext"],"mappings":";;;;AAMa,MAAA,mBAAA,GAAsBA,oBAEjC,KAAS,CAAA;AAEJ,SAAS,sBAA8C,GAAA;AAC5D,EAAM,MAAA,OAAA,GAAUC,iBAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,OAAA;AACT;;;;;"}
1
+ {"version":3,"file":"CategoryListContext.js","sources":["../src/query-input/internal/CategoryListContext.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\nexport interface CategoryListContext {\n width: number;\n}\n\nexport const CategoryListContext = createContext<\n CategoryListContext | undefined\n>(undefined);\n\nexport function useCategoryListContext(): CategoryListContext {\n const context = useContext(CategoryListContext);\n if (!context) {\n throw new Error(\n \"useCategoryListContext should be used inside CategoryList\",\n );\n }\n return context;\n}\n"],"names":["createContext","useContext"],"mappings":";;;;AAMa,MAAA,mBAAA,GAAsBA,oBAEjC,MAAS;AAEJ,SAAS,sBAA8C,GAAA;AAC5D,EAAM,MAAA,OAAA,GAAUC,iBAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,OAAA;AACT;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CategoryListItem.js","sources":["../src/query-input/internal/CategoryListItem.tsx"],"sourcesContent":["import { makePrefixer, useIcon } from \"@salt-ds/core\";\nimport { type CSSProperties, useMemo, useRef } from \"react\";\nimport { ListItem, type ListItemProps, type ListItemType } from \"../../list\";\nimport type { QueryInputCategory } from \"../queryInputTypes\";\nimport { useCategoryListContext } from \"./CategoryListContext\";\n\nconst withBaseName = makePrefixer(\"saltCategoryListItem\");\n\nexport interface CategoryListItemProps\n extends ListItemProps<QueryInputCategory> {\n category: QueryInputCategory;\n}\n\nexport const CategoryListItem: ListItemType<QueryInputCategory> =\n function CategoryListItem({ item: category, ...props }) {\n const textRef = useRef<HTMLDivElement>(null);\n const context = useCategoryListContext();\n const { ExpandGroupIcon } = useIcon();\n const textStyle: CSSProperties = useMemo(\n () => ({\n minWidth: context.width,\n }),\n [context.width],\n );\n\n return (\n <ListItem {...props} label={category?.name}>\n <div ref={textRef} className={withBaseName(\"text\")} style={textStyle}>\n {category?.name}\n </div>\n <div className={withBaseName(\"valuesContainer\")}>\n <span>(</span>\n <span className={withBaseName(\"values\")}>\n {category?.values.join(\", \")}\n </span>\n <span>)</span>\n </div>\n <ExpandGroupIcon className={withBaseName(\"chevron\")} />\n </ListItem>\n );\n };\n"],"names":["makePrefixer","CategoryListItem","useRef","useCategoryListContext","useIcon","useMemo","ListItem","jsx","jsxs"],"mappings":";;;;;;;;;;;;;;AAMA,MAAM,YAAA,GAAeA,kBAAa,sBAAsB,CAAA;AAO3C,MAAA,gBAAA,GACX,SAASC,iBAAiB,CAAA,EAAE,MAAM,QAAU,EAAA,GAAG,OAAS,EAAA;AACtD,EAAM,MAAA,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAUC,0CAAuB,EAAA;AACvC,EAAM,MAAA,EAAE,eAAgB,EAAA,GAAIC,YAAQ,EAAA;AACpC,EAAA,MAAM,SAA2B,GAAAC,aAAA;AAAA,IAC/B,OAAO;AAAA,MACL,UAAU,OAAQ,CAAA;AAAA,KACpB,CAAA;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,GAChB;AAEA,EAAA,uCACGC,iBAAU,EAAA,EAAA,GAAG,KAAO,EAAA,KAAA,EAAO,qCAAU,IACpC,EAAA,QAAA,EAAA;AAAA,oBAACC,cAAA,CAAA,KAAA,EAAA,EAAI,GAAK,EAAA,OAAA,EAAS,SAAW,EAAA,YAAA,CAAa,MAAM,CAAG,EAAA,KAAA,EAAO,SACxD,EAAA,QAAA,EAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAU,IACb,EAAA,CAAA;AAAA,oBACCC,eAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,YAAA,CAAa,iBAAiB,CAC5C,EAAA,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAAC,UAAK,QAAC,EAAA,GAAA,EAAA,CAAA;AAAA,sBACPA,cAAA,CAAC,UAAK,SAAW,EAAA,YAAA,CAAa,QAAQ,CACnC,EAAA,QAAA,EAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAU,MAAO,CAAA,IAAA,CAAK,IACzB,CAAA,EAAA,CAAA;AAAA,sBACAA,cAAA,CAAC,UAAK,QAAC,EAAA,GAAA,EAAA;AAAA,KACT,EAAA,CAAA;AAAA,oBACCA,cAAA,CAAA,eAAA,EAAA,EAAgB,SAAW,EAAA,YAAA,CAAa,SAAS,CAAG,EAAA;AAAA,GACvD,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"CategoryListItem.js","sources":["../src/query-input/internal/CategoryListItem.tsx"],"sourcesContent":["import { makePrefixer, useIcon } from \"@salt-ds/core\";\nimport { type CSSProperties, useMemo, useRef } from \"react\";\nimport { ListItem, type ListItemProps, type ListItemType } from \"../../list\";\nimport type { QueryInputCategory } from \"../queryInputTypes\";\nimport { useCategoryListContext } from \"./CategoryListContext\";\n\nconst withBaseName = makePrefixer(\"saltCategoryListItem\");\n\nexport interface CategoryListItemProps\n extends ListItemProps<QueryInputCategory> {\n category: QueryInputCategory;\n}\n\nexport const CategoryListItem: ListItemType<QueryInputCategory> =\n function CategoryListItem({ item: category, ...props }) {\n const textRef = useRef<HTMLDivElement>(null);\n const context = useCategoryListContext();\n const { ExpandGroupIcon } = useIcon();\n const textStyle: CSSProperties = useMemo(\n () => ({\n minWidth: context.width,\n }),\n [context.width],\n );\n\n return (\n <ListItem {...props} label={category?.name}>\n <div ref={textRef} className={withBaseName(\"text\")} style={textStyle}>\n {category?.name}\n </div>\n <div className={withBaseName(\"valuesContainer\")}>\n <span>(</span>\n <span className={withBaseName(\"values\")}>\n {category?.values.join(\", \")}\n </span>\n <span>)</span>\n </div>\n <ExpandGroupIcon className={withBaseName(\"chevron\")} />\n </ListItem>\n );\n };\n"],"names":["makePrefixer","CategoryListItem","useRef","useCategoryListContext","useIcon","useMemo","ListItem","jsx","jsxs"],"mappings":";;;;;;;;;;;;;;AAMA,MAAM,YAAA,GAAeA,kBAAa,sBAAsB,CAAA;AAO3C,MAAA,gBAAA,GACX,SAASC,iBAAiB,CAAA,EAAE,MAAM,QAAU,EAAA,GAAG,OAAS,EAAA;AACtD,EAAM,MAAA,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAUC,0CAAuB,EAAA;AACvC,EAAM,MAAA,EAAE,eAAgB,EAAA,GAAIC,YAAQ,EAAA;AACpC,EAAA,MAAM,SAA2B,GAAAC,aAAA;AAAA,IAC/B,OAAO;AAAA,MACL,UAAU,OAAQ,CAAA;AAAA,KACpB,CAAA;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,GAChB;AAEA,EAAA,uCACGC,iBAAU,EAAA,EAAA,GAAG,KAAO,EAAA,KAAA,EAAO,qCAAU,IACpC,EAAA,QAAA,EAAA;AAAA,oBAACC,cAAA,CAAA,KAAA,EAAA,EAAI,GAAK,EAAA,OAAA,EAAS,SAAW,EAAA,YAAA,CAAa,MAAM,CAAG,EAAA,KAAA,EAAO,SACxD,EAAA,QAAA,EAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,IACb,EAAA,CAAA;AAAA,oBACCC,eAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,YAAA,CAAa,iBAAiB,CAC5C,EAAA,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAAC,UAAK,QAAC,EAAA,GAAA,EAAA,CAAA;AAAA,sBACPA,cAAA,CAAC,UAAK,SAAW,EAAA,YAAA,CAAa,QAAQ,CACnC,EAAA,QAAA,EAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,MAAO,CAAA,IAAA,CAAK,IACzB,CAAA,EAAA,CAAA;AAAA,sBACAA,cAAA,CAAC,UAAK,QAAC,EAAA,GAAA,EAAA;AAAA,KACT,EAAA,CAAA;AAAA,oBACCA,cAAA,CAAA,eAAA,EAAA,EAAgB,SAAW,EAAA,YAAA,CAAa,SAAS,CAAG,EAAA;AAAA,GACvD,EAAA,CAAA;AAEJ;;;;"}
@@ -3,8 +3,8 @@
3
3
  var react = require('react');
4
4
 
5
5
  function usePopperStatus(props) {
6
- const { initialOpen, autoClose } = props;
7
- const [isOpen, setIsOpen] = react.useState(!!initialOpen);
6
+ const { autoClose } = props;
7
+ const [isOpen, setIsOpen] = react.useState(false);
8
8
  const onKeyDown = (event) => {
9
9
  if (event.altKey && ["ArrowUp", "ArrowDown"].includes(event.key)) {
10
10
  setIsOpen((x) => !x);
@@ -1 +1 @@
1
- {"version":3,"file":"usePopperStatus.js","sources":["../src/query-input/internal/usePopperStatus.ts"],"sourcesContent":["import { type FocusEvent, type KeyboardEvent, useState } from \"react\";\n\nexport interface UsePopperStatusProps {\n initialOpen?: boolean;\n autoClose?: boolean;\n}\n\nexport function usePopperStatus(props: UsePopperStatusProps) {\n const { initialOpen, autoClose } = props;\n const [isOpen, setIsOpen] = useState<boolean>(!!initialOpen);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.altKey && [\"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n setIsOpen((x) => !x);\n } else if (\n !isOpen &&\n [\"Alt\", \"Tab\", \"Escape\", \"Control\", \"Shift\", \"Meta\"].includes(event.key)\n ) {\n setIsOpen(true);\n } else if (isOpen && event.key === \"Escape\") {\n setIsOpen(false);\n } else if (isOpen && autoClose && event.key === \"Enter\") {\n setIsOpen(false);\n }\n };\n\n const onFocus = (event: FocusEvent) => {\n setIsOpen(true);\n };\n\n const onBlur = (event: FocusEvent) => {\n setIsOpen(false);\n };\n\n const onChange = () => {\n if (autoClose) {\n setIsOpen(false);\n }\n };\n\n const onClick = () => {\n if (!isOpen) {\n setIsOpen(true);\n }\n };\n\n return {\n isOpen,\n onKeyDown,\n onFocus,\n onBlur,\n onChange,\n onClick,\n };\n}\n"],"names":["useState"],"mappings":";;;;AAOO,SAAS,gBAAgB,KAA6B,EAAA;AAC3D,EAAM,MAAA,EAAE,WAAa,EAAA,SAAA,EAAc,GAAA,KAAA;AACnC,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,IAAIA,cAAkB,CAAA,CAAC,CAAC,WAAW,CAAA;AAE3D,EAAM,MAAA,SAAA,GAAY,CAAC,KAAyB,KAAA;AAC1C,IAAI,IAAA,KAAA,CAAM,UAAU,CAAC,SAAA,EAAW,WAAW,CAAE,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,CAAG,EAAA;AAChE,MAAU,SAAA,CAAA,CAAC,CAAM,KAAA,CAAC,CAAC,CAAA;AAAA,KAEnB,MAAA,IAAA,CAAC,MACD,IAAA,CAAC,OAAO,KAAO,EAAA,QAAA,EAAU,SAAW,EAAA,OAAA,EAAS,MAAM,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CACvE,EAAA;AACA,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,KACL,MAAA,IAAA,MAAA,IAAU,KAAM,CAAA,GAAA,KAAQ,QAAU,EAAA;AAC3C,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,KACN,MAAA,IAAA,MAAA,IAAU,SAAa,IAAA,KAAA,CAAM,QAAQ,OAAS,EAAA;AACvD,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,CAAC,KAAsB,KAAA;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,GAChB;AAEA,EAAM,MAAA,MAAA,GAAS,CAAC,KAAsB,KAAA;AACpC,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,GACjB;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA;AAChB,GACF;AAEA,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"usePopperStatus.js","sources":["../src/query-input/internal/usePopperStatus.ts"],"sourcesContent":["import { type FocusEvent, type KeyboardEvent, useState } from \"react\";\n\nexport interface UsePopperStatusProps {\n initialOpen?: boolean;\n autoClose?: boolean;\n}\n\nexport function usePopperStatus(props: UsePopperStatusProps) {\n const { initialOpen, autoClose } = props;\n const [isOpen, setIsOpen] = useState<boolean>(!!initialOpen);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.altKey && [\"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n setIsOpen((x) => !x);\n } else if (\n !isOpen &&\n [\"Alt\", \"Tab\", \"Escape\", \"Control\", \"Shift\", \"Meta\"].includes(event.key)\n ) {\n setIsOpen(true);\n } else if (isOpen && event.key === \"Escape\") {\n setIsOpen(false);\n } else if (isOpen && autoClose && event.key === \"Enter\") {\n setIsOpen(false);\n }\n };\n\n const onFocus = (event: FocusEvent) => {\n setIsOpen(true);\n };\n\n const onBlur = (event: FocusEvent) => {\n setIsOpen(false);\n };\n\n const onChange = () => {\n if (autoClose) {\n setIsOpen(false);\n }\n };\n\n const onClick = () => {\n if (!isOpen) {\n setIsOpen(true);\n }\n };\n\n return {\n isOpen,\n onKeyDown,\n onFocus,\n onBlur,\n onChange,\n onClick,\n };\n}\n"],"names":["useState"],"mappings":";;;;AAOO,SAAS,gBAAgB,KAA6B,EAAA;AAC3D,EAAM,MAAA,EAAe,SAAA,EAAc,GAAA,KAAA;AACnC,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,IAAIA,cAAkB,CAAA,KAAa,CAAA;AAE3D,EAAM,MAAA,SAAA,GAAY,CAAC,KAAyB,KAAA;AAC1C,IAAI,IAAA,KAAA,CAAM,UAAU,CAAC,SAAA,EAAW,WAAW,CAAE,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,CAAG,EAAA;AAChE,MAAU,SAAA,CAAA,CAAC,CAAM,KAAA,CAAC,CAAC,CAAA;AAAA,KAEnB,MAAA,IAAA,CAAC,MACD,IAAA,CAAC,OAAO,KAAO,EAAA,QAAA,EAAU,SAAW,EAAA,OAAA,EAAS,MAAM,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CACvE,EAAA;AACA,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,KACL,MAAA,IAAA,MAAA,IAAU,KAAM,CAAA,GAAA,KAAQ,QAAU,EAAA;AAC3C,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,KACN,MAAA,IAAA,MAAA,IAAU,SAAa,IAAA,KAAA,CAAM,QAAQ,OAAS,EAAA;AACvD,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,CAAC,KAAsB,KAAA;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,GAChB;AAEA,EAAM,MAAA,MAAA,GAAS,CAAC,KAAsB,KAAA;AACpC,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,GACjB;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA;AAChB,GACF;AAEA,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -33,7 +33,6 @@ function useQueryInput(props, forwardedRef) {
33
33
  state: "booleanOperator"
34
34
  });
35
35
  const popperStatus = usePopperStatus.usePopperStatus({
36
- initialOpen: false,
37
36
  autoClose: props.autoClose
38
37
  });
39
38
  const [isFocused, setIsFocused] = react.useState(false);