@vuu-ui/vuu-ui-controls 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/cjs/calendar/Calendar.js.map +1 -1
  2. package/cjs/calendar/internal/CalendarCarousel.js.map +1 -1
  3. package/cjs/calendar/internal/CalendarContext.js.map +1 -1
  4. package/cjs/calendar/internal/CalendarDay.js.map +1 -1
  5. package/cjs/calendar/internal/CalendarMonth.js.map +1 -1
  6. package/cjs/calendar/internal/CalendarNavigation.js.map +1 -1
  7. package/cjs/calendar/internal/CalendarWeekHeader.js.map +1 -1
  8. package/cjs/calendar/internal/useFocusManagement.js.map +1 -1
  9. package/cjs/calendar/internal/utils.js.map +1 -1
  10. package/cjs/calendar/useCalendar.js.map +1 -1
  11. package/cjs/calendar/useCalendarDay.js.map +1 -1
  12. package/cjs/calendar/useSelection.js.map +1 -1
  13. package/cjs/column-picker/ColumnPicker.js.map +1 -1
  14. package/cjs/column-picker/ColumnSearch.js.map +1 -1
  15. package/cjs/common-hooks/collectionProvider.js.map +1 -1
  16. package/cjs/common-hooks/itemToString.js.map +1 -1
  17. package/cjs/common-hooks/selectionTypes.js.map +1 -1
  18. package/cjs/common-hooks/use-resize-observer.js.map +1 -1
  19. package/cjs/common-hooks/useCollectionItems.js.map +1 -1
  20. package/cjs/common-hooks/useControlled.js.map +1 -1
  21. package/cjs/common-hooks/useSelection.js.map +1 -1
  22. package/cjs/cycle-state-button/CycleStateButton.js.map +1 -1
  23. package/cjs/date-input/DateInput.js.map +1 -1
  24. package/cjs/date-picker/DatePicker.js.map +1 -1
  25. package/cjs/date-picker/DatePickerContext.js.map +1 -1
  26. package/cjs/date-picker/DatePickerPanel.js.map +1 -1
  27. package/cjs/drag-drop/DragDropProvider.js.map +1 -1
  28. package/cjs/drag-drop/DragDropState.js.map +1 -1
  29. package/cjs/drag-drop/Draggable.js +0 -5
  30. package/cjs/drag-drop/Draggable.js.map +1 -1
  31. package/cjs/drag-drop/dragDropTypes.js.map +1 -1
  32. package/cjs/drag-drop/drop-target-utils.js.map +1 -1
  33. package/cjs/drag-drop/useAutoScroll.js.map +1 -1
  34. package/cjs/drag-drop/useDragDisplacers.js.map +1 -1
  35. package/cjs/drag-drop/useDragDrop.js.map +1 -1
  36. package/cjs/drag-drop/useDragDropCopy.js.map +1 -1
  37. package/cjs/drag-drop/useDragDropIndicator.js.map +1 -1
  38. package/cjs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  39. package/cjs/drag-drop/useDropIndicator.js.map +1 -1
  40. package/cjs/drag-drop/useGlobalDragDrop.js.map +1 -1
  41. package/cjs/editable/useEditableText.js.map +1 -1
  42. package/cjs/editable-label/EditableLabel.css.js +1 -1
  43. package/cjs/editable-label/EditableLabel.js.map +1 -1
  44. package/cjs/expando-input/ExpandoInput.js +1 -1
  45. package/cjs/expando-input/ExpandoInput.js.map +1 -1
  46. package/cjs/icon-button/Icon.js.map +1 -1
  47. package/cjs/icon-button/IconButton.js.map +1 -1
  48. package/cjs/icon-button/ToggleIconButton.css.js +1 -1
  49. package/cjs/icon-button/ToggleIconButton.js.map +1 -1
  50. package/cjs/index.js +14 -5
  51. package/cjs/index.js.map +1 -1
  52. package/cjs/instrument-picker/TablePicker.js.map +1 -1
  53. package/cjs/instrument-picker/useTablePicker.js.map +1 -1
  54. package/cjs/list/Highlighter.js.map +1 -1
  55. package/cjs/list/List.js.map +1 -1
  56. package/cjs/list/ListItem.js.map +1 -1
  57. package/cjs/list/RadioIcon.js.map +1 -1
  58. package/cjs/list/common-hooks/keyUtils.js.map +1 -1
  59. package/cjs/list/common-hooks/list-dom-utils.js.map +1 -1
  60. package/cjs/list/common-hooks/useCollapsibleGroups.js.map +1 -1
  61. package/cjs/list/common-hooks/useImperativeScrollingAPI.js.map +1 -1
  62. package/cjs/list/common-hooks/useKeyboardNavigation.js.map +1 -1
  63. package/cjs/list/common-hooks/useTypeahead.js.map +1 -1
  64. package/cjs/list/common-hooks/useViewportTracking.js.map +1 -1
  65. package/cjs/list/common-hooks/utils/collection-item-utils.js.map +1 -1
  66. package/cjs/list/common-hooks/utils/filter-utils.js.map +1 -1
  67. package/cjs/list/common-hooks/utils/isSelected.js.map +1 -1
  68. package/cjs/list/useList.js.map +1 -1
  69. package/cjs/list/useListDrop.js.map +1 -1
  70. package/cjs/list/useListHeight.js.map +1 -1
  71. package/cjs/list/useScrollPosition.js.map +1 -1
  72. package/cjs/measured-container/MeasuredContainer.js +1 -0
  73. package/cjs/measured-container/MeasuredContainer.js.map +1 -1
  74. package/cjs/measured-container/useMeasuredContainer.js +4 -1
  75. package/cjs/measured-container/useMeasuredContainer.js.map +1 -1
  76. package/cjs/measured-container/useResizeObserver.js.map +1 -1
  77. package/cjs/overflow-container/OverflowContainer.js.map +1 -1
  78. package/cjs/overflow-container/overflow-utils.js.map +1 -1
  79. package/cjs/overflow-container/useOverflowContainer.js.map +1 -1
  80. package/cjs/price-ticker/PriceTicker.js.map +1 -1
  81. package/cjs/split-button/SplitButton.css.js +1 -1
  82. package/cjs/split-button/SplitButton.js.map +1 -1
  83. package/cjs/split-button/SplitStateButton.css.js +1 -1
  84. package/cjs/split-button/SplitStateButton.js.map +1 -1
  85. package/cjs/split-button/useSplitButton.js.map +1 -1
  86. package/cjs/table-search/SearchCell.css.js +1 -1
  87. package/cjs/table-search/SearchCell.js +8 -3
  88. package/cjs/table-search/SearchCell.js.map +1 -1
  89. package/cjs/table-search/TableSearch.js +11 -18
  90. package/cjs/table-search/TableSearch.js.map +1 -1
  91. package/cjs/table-search/useTableSearch.js +1 -1
  92. package/cjs/table-search/useTableSearch.js.map +1 -1
  93. package/cjs/tabs-next/TabBar.css.js +6 -0
  94. package/cjs/tabs-next/TabBar.css.js.map +1 -0
  95. package/cjs/tabs-next/TabBar.js +41 -0
  96. package/cjs/tabs-next/TabBar.js.map +1 -0
  97. package/cjs/tabs-next/TabListNext.css.js +6 -0
  98. package/cjs/tabs-next/TabListNext.css.js.map +1 -0
  99. package/cjs/tabs-next/TabListNext.js +124 -0
  100. package/cjs/tabs-next/TabListNext.js.map +1 -0
  101. package/cjs/tabs-next/TabNext.css.js +6 -0
  102. package/cjs/tabs-next/TabNext.css.js.map +1 -0
  103. package/cjs/tabs-next/TabNext.js +110 -0
  104. package/cjs/tabs-next/TabNext.js.map +1 -0
  105. package/cjs/tabs-next/TabNextAction.js +35 -0
  106. package/cjs/tabs-next/TabNextAction.js.map +1 -0
  107. package/cjs/tabs-next/TabNextContext.js +23 -0
  108. package/cjs/tabs-next/TabNextContext.js.map +1 -0
  109. package/cjs/tabs-next/TabNextPanel.css.js +6 -0
  110. package/cjs/tabs-next/TabNextPanel.css.js.map +1 -0
  111. package/cjs/tabs-next/TabNextPanel.js +77 -0
  112. package/cjs/tabs-next/TabNextPanel.js.map +1 -0
  113. package/cjs/tabs-next/TabNextTrigger.css.js +6 -0
  114. package/cjs/tabs-next/TabNextTrigger.css.js.map +1 -0
  115. package/cjs/tabs-next/TabNextTrigger.js +74 -0
  116. package/cjs/tabs-next/TabNextTrigger.js.map +1 -0
  117. package/cjs/tabs-next/TabOverflowList.css.js +6 -0
  118. package/cjs/tabs-next/TabOverflowList.css.js.map +1 -0
  119. package/cjs/tabs-next/TabOverflowList.js +130 -0
  120. package/cjs/tabs-next/TabOverflowList.js.map +1 -0
  121. package/cjs/tabs-next/TabsNext.js +174 -0
  122. package/cjs/tabs-next/TabsNext.js.map +1 -0
  123. package/cjs/tabs-next/TabsNextContext.js +33 -0
  124. package/cjs/tabs-next/TabsNextContext.js.map +1 -0
  125. package/cjs/tabs-next/hooks/useCollection.js +91 -0
  126. package/cjs/tabs-next/hooks/useCollection.js.map +1 -0
  127. package/cjs/tabs-next/hooks/useFocusOutside.js +24 -0
  128. package/cjs/tabs-next/hooks/useFocusOutside.js.map +1 -0
  129. package/cjs/tabs-next/hooks/useOverflow.js +138 -0
  130. package/cjs/tabs-next/hooks/useOverflow.js.map +1 -0
  131. package/cjs/tabstrip/Tab.js.map +1 -1
  132. package/cjs/tabstrip/TabMenu.js.map +1 -1
  133. package/cjs/tabstrip/TabMenuOptions.js.map +1 -1
  134. package/cjs/tabstrip/Tabstrip.css.js +1 -1
  135. package/cjs/tabstrip/Tabstrip.js.map +1 -1
  136. package/cjs/tabstrip/tabstrip-dom-utils.js.map +1 -1
  137. package/cjs/tabstrip/useAnimatedSelectionThumb.js.map +1 -1
  138. package/cjs/tabstrip/useKeyboardNavigation.js.map +1 -1
  139. package/cjs/tabstrip/useSelection.js.map +1 -1
  140. package/cjs/tabstrip/useTabstrip.js.map +1 -1
  141. package/cjs/toolbar/Toolbar.js.map +1 -1
  142. package/cjs/toolbar/toolbar-dom-utils.js.map +1 -1
  143. package/cjs/toolbar/useKeyboardNavigation.js.map +1 -1
  144. package/cjs/toolbar/useSelection.js.map +1 -1
  145. package/cjs/toolbar/useToolbar.js.map +1 -1
  146. package/cjs/utils/escapeRegExp.js.map +1 -1
  147. package/cjs/utils/forwardCallbackProps.js.map +1 -1
  148. package/cjs/utils/isOverflowElement.js.map +1 -1
  149. package/cjs/vuu-date-picker/VuuDatePicker.js.map +1 -1
  150. package/cjs/vuu-input/VuuInput.js.map +1 -1
  151. package/cjs/vuu-typeahead-input/VuuTypeaheadInput.js.map +1 -1
  152. package/cjs/vuu-typeahead-input/useVuuTypeaheadInput.js.map +1 -1
  153. package/esm/calendar/Calendar.js.map +1 -1
  154. package/esm/calendar/internal/CalendarCarousel.js.map +1 -1
  155. package/esm/calendar/internal/CalendarContext.js.map +1 -1
  156. package/esm/calendar/internal/CalendarDay.js.map +1 -1
  157. package/esm/calendar/internal/CalendarMonth.js.map +1 -1
  158. package/esm/calendar/internal/CalendarNavigation.js.map +1 -1
  159. package/esm/calendar/internal/CalendarWeekHeader.js.map +1 -1
  160. package/esm/calendar/internal/useFocusManagement.js.map +1 -1
  161. package/esm/calendar/internal/utils.js.map +1 -1
  162. package/esm/calendar/useCalendar.js.map +1 -1
  163. package/esm/calendar/useCalendarDay.js.map +1 -1
  164. package/esm/calendar/useSelection.js.map +1 -1
  165. package/esm/column-picker/ColumnPicker.js.map +1 -1
  166. package/esm/column-picker/ColumnSearch.js.map +1 -1
  167. package/esm/common-hooks/collectionProvider.js.map +1 -1
  168. package/esm/common-hooks/itemToString.js.map +1 -1
  169. package/esm/common-hooks/selectionTypes.js.map +1 -1
  170. package/esm/common-hooks/use-resize-observer.js.map +1 -1
  171. package/esm/common-hooks/useCollectionItems.js.map +1 -1
  172. package/esm/common-hooks/useControlled.js.map +1 -1
  173. package/esm/common-hooks/useSelection.js.map +1 -1
  174. package/esm/cycle-state-button/CycleStateButton.js.map +1 -1
  175. package/esm/date-input/DateInput.js.map +1 -1
  176. package/esm/date-picker/DatePicker.js.map +1 -1
  177. package/esm/date-picker/DatePickerContext.js.map +1 -1
  178. package/esm/date-picker/DatePickerPanel.js.map +1 -1
  179. package/esm/drag-drop/DragDropProvider.js.map +1 -1
  180. package/esm/drag-drop/DragDropState.js.map +1 -1
  181. package/esm/drag-drop/Draggable.js +0 -5
  182. package/esm/drag-drop/Draggable.js.map +1 -1
  183. package/esm/drag-drop/dragDropTypes.js.map +1 -1
  184. package/esm/drag-drop/drop-target-utils.js.map +1 -1
  185. package/esm/drag-drop/useAutoScroll.js.map +1 -1
  186. package/esm/drag-drop/useDragDisplacers.js.map +1 -1
  187. package/esm/drag-drop/useDragDrop.js +1 -1
  188. package/esm/drag-drop/useDragDrop.js.map +1 -1
  189. package/esm/drag-drop/useDragDropCopy.js.map +1 -1
  190. package/esm/drag-drop/useDragDropIndicator.js +1 -1
  191. package/esm/drag-drop/useDragDropIndicator.js.map +1 -1
  192. package/esm/drag-drop/useDragDropNaturalMovement.js +1 -1
  193. package/esm/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  194. package/esm/drag-drop/useDropIndicator.js.map +1 -1
  195. package/esm/drag-drop/useGlobalDragDrop.js.map +1 -1
  196. package/esm/editable/useEditableText.js.map +1 -1
  197. package/esm/editable-label/EditableLabel.css.js +1 -1
  198. package/esm/editable-label/EditableLabel.js.map +1 -1
  199. package/esm/expando-input/ExpandoInput.js +1 -1
  200. package/esm/expando-input/ExpandoInput.js.map +1 -1
  201. package/esm/icon-button/Icon.js.map +1 -1
  202. package/esm/icon-button/IconButton.js.map +1 -1
  203. package/esm/icon-button/ToggleIconButton.css.js +1 -1
  204. package/esm/icon-button/ToggleIconButton.js.map +1 -1
  205. package/esm/index.js +7 -2
  206. package/esm/index.js.map +1 -1
  207. package/esm/instrument-picker/TablePicker.js.map +1 -1
  208. package/esm/instrument-picker/useTablePicker.js.map +1 -1
  209. package/esm/list/Highlighter.js.map +1 -1
  210. package/esm/list/List.js.map +1 -1
  211. package/esm/list/ListItem.js.map +1 -1
  212. package/esm/list/RadioIcon.js.map +1 -1
  213. package/esm/list/common-hooks/keyUtils.js.map +1 -1
  214. package/esm/list/common-hooks/list-dom-utils.js.map +1 -1
  215. package/esm/list/common-hooks/useCollapsibleGroups.js.map +1 -1
  216. package/esm/list/common-hooks/useImperativeScrollingAPI.js.map +1 -1
  217. package/esm/list/common-hooks/useKeyboardNavigation.js.map +1 -1
  218. package/esm/list/common-hooks/useTypeahead.js.map +1 -1
  219. package/esm/list/common-hooks/useViewportTracking.js.map +1 -1
  220. package/esm/list/common-hooks/utils/collection-item-utils.js.map +1 -1
  221. package/esm/list/common-hooks/utils/filter-utils.js.map +1 -1
  222. package/esm/list/common-hooks/utils/isSelected.js.map +1 -1
  223. package/esm/list/useList.js.map +1 -1
  224. package/esm/list/useListDrop.js.map +1 -1
  225. package/esm/list/useListHeight.js.map +1 -1
  226. package/esm/list/useScrollPosition.js.map +1 -1
  227. package/esm/measured-container/MeasuredContainer.js +1 -0
  228. package/esm/measured-container/MeasuredContainer.js.map +1 -1
  229. package/esm/measured-container/useMeasuredContainer.js +4 -1
  230. package/esm/measured-container/useMeasuredContainer.js.map +1 -1
  231. package/esm/measured-container/useResizeObserver.js.map +1 -1
  232. package/esm/overflow-container/OverflowContainer.js.map +1 -1
  233. package/esm/overflow-container/overflow-utils.js.map +1 -1
  234. package/esm/overflow-container/useOverflowContainer.js.map +1 -1
  235. package/esm/price-ticker/PriceTicker.js.map +1 -1
  236. package/esm/split-button/SplitButton.css.js +1 -1
  237. package/esm/split-button/SplitButton.js.map +1 -1
  238. package/esm/split-button/SplitStateButton.css.js +1 -1
  239. package/esm/split-button/SplitStateButton.js.map +1 -1
  240. package/esm/split-button/useSplitButton.js.map +1 -1
  241. package/esm/table-search/SearchCell.css.js +1 -1
  242. package/esm/table-search/SearchCell.js +8 -3
  243. package/esm/table-search/SearchCell.js.map +1 -1
  244. package/esm/table-search/TableSearch.js +12 -19
  245. package/esm/table-search/TableSearch.js.map +1 -1
  246. package/esm/table-search/useTableSearch.js +1 -1
  247. package/esm/table-search/useTableSearch.js.map +1 -1
  248. package/esm/tabs-next/TabBar.css.js +4 -0
  249. package/esm/tabs-next/TabBar.css.js.map +1 -0
  250. package/esm/tabs-next/TabBar.js +39 -0
  251. package/esm/tabs-next/TabBar.js.map +1 -0
  252. package/esm/tabs-next/TabListNext.css.js +4 -0
  253. package/esm/tabs-next/TabListNext.css.js.map +1 -0
  254. package/esm/tabs-next/TabListNext.js +122 -0
  255. package/esm/tabs-next/TabListNext.js.map +1 -0
  256. package/esm/tabs-next/TabNext.css.js +4 -0
  257. package/esm/tabs-next/TabNext.css.js.map +1 -0
  258. package/esm/tabs-next/TabNext.js +108 -0
  259. package/esm/tabs-next/TabNext.js.map +1 -0
  260. package/esm/tabs-next/TabNextAction.js +33 -0
  261. package/esm/tabs-next/TabNextAction.js.map +1 -0
  262. package/esm/tabs-next/TabNextContext.js +20 -0
  263. package/esm/tabs-next/TabNextContext.js.map +1 -0
  264. package/esm/tabs-next/TabNextPanel.css.js +4 -0
  265. package/esm/tabs-next/TabNextPanel.css.js.map +1 -0
  266. package/esm/tabs-next/TabNextPanel.js +75 -0
  267. package/esm/tabs-next/TabNextPanel.js.map +1 -0
  268. package/esm/tabs-next/TabNextTrigger.css.js +4 -0
  269. package/esm/tabs-next/TabNextTrigger.css.js.map +1 -0
  270. package/esm/tabs-next/TabNextTrigger.js +72 -0
  271. package/esm/tabs-next/TabNextTrigger.js.map +1 -0
  272. package/esm/tabs-next/TabOverflowList.css.js +4 -0
  273. package/esm/tabs-next/TabOverflowList.css.js.map +1 -0
  274. package/esm/tabs-next/TabOverflowList.js +128 -0
  275. package/esm/tabs-next/TabOverflowList.js.map +1 -0
  276. package/esm/tabs-next/TabsNext.js +172 -0
  277. package/esm/tabs-next/TabsNext.js.map +1 -0
  278. package/esm/tabs-next/TabsNextContext.js +30 -0
  279. package/esm/tabs-next/TabsNextContext.js.map +1 -0
  280. package/esm/tabs-next/hooks/useCollection.js +89 -0
  281. package/esm/tabs-next/hooks/useCollection.js.map +1 -0
  282. package/esm/tabs-next/hooks/useFocusOutside.js +22 -0
  283. package/esm/tabs-next/hooks/useFocusOutside.js.map +1 -0
  284. package/esm/tabs-next/hooks/useOverflow.js +136 -0
  285. package/esm/tabs-next/hooks/useOverflow.js.map +1 -0
  286. package/esm/tabstrip/Tab.js.map +1 -1
  287. package/esm/tabstrip/TabMenu.js.map +1 -1
  288. package/esm/tabstrip/TabMenuOptions.js.map +1 -1
  289. package/esm/tabstrip/Tabstrip.css.js +1 -1
  290. package/esm/tabstrip/Tabstrip.js.map +1 -1
  291. package/esm/tabstrip/tabstrip-dom-utils.js.map +1 -1
  292. package/esm/tabstrip/useAnimatedSelectionThumb.js.map +1 -1
  293. package/esm/tabstrip/useKeyboardNavigation.js.map +1 -1
  294. package/esm/tabstrip/useSelection.js.map +1 -1
  295. package/esm/tabstrip/useTabstrip.js.map +1 -1
  296. package/esm/toolbar/Toolbar.js.map +1 -1
  297. package/esm/toolbar/toolbar-dom-utils.js.map +1 -1
  298. package/esm/toolbar/useKeyboardNavigation.js.map +1 -1
  299. package/esm/toolbar/useSelection.js.map +1 -1
  300. package/esm/toolbar/useToolbar.js.map +1 -1
  301. package/esm/utils/escapeRegExp.js.map +1 -1
  302. package/esm/utils/forwardCallbackProps.js.map +1 -1
  303. package/esm/utils/isOverflowElement.js.map +1 -1
  304. package/esm/vuu-date-picker/VuuDatePicker.js.map +1 -1
  305. package/esm/vuu-input/VuuInput.js.map +1 -1
  306. package/esm/vuu-typeahead-input/VuuTypeaheadInput.js.map +1 -1
  307. package/esm/vuu-typeahead-input/useVuuTypeaheadInput.js.map +1 -1
  308. package/package.json +15 -14
  309. package/types/calendar/Calendar.d.ts +0 -1
  310. package/types/calendar/internal/CalendarCarousel.d.ts +0 -1
  311. package/types/calendar/internal/CalendarContext.d.ts +0 -1
  312. package/types/calendar/internal/CalendarWeekHeader.d.ts +1 -1
  313. package/types/calendar/useCalendar.d.ts +4 -4
  314. package/types/calendar/useCalendarDay.d.ts +2 -2
  315. package/types/column-picker/ColumnPicker.d.ts +0 -1
  316. package/types/common-hooks/collectionProvider.d.ts +1 -1
  317. package/types/common-hooks/selectionTypes.d.ts +1 -1
  318. package/types/cycle-state-button/CycleStateButton.d.ts +2 -2
  319. package/types/date-picker/DatePickerContext.d.ts +0 -1
  320. package/types/drag-drop/DragDropProvider.d.ts +1 -1
  321. package/types/drag-drop/DropIndicator.d.ts +1 -2
  322. package/types/drag-drop/drop-target-utils.d.ts +24 -20
  323. package/types/drag-drop/useAutoScroll.d.ts +4 -4
  324. package/types/drag-drop/useGlobalDragDrop.d.ts +0 -1
  325. package/types/expando-input/ExpandoInput.d.ts +2 -2
  326. package/types/icon-button/Icon.d.ts +1 -1
  327. package/types/icon-button/IconButton.d.ts +0 -1
  328. package/types/icon-button/ToggleIconButton.d.ts +1 -2
  329. package/types/index.d.ts +1 -1
  330. package/types/instrument-picker/SearchCell.d.ts +1 -2
  331. package/types/instrument-picker/TablePicker.d.ts +1 -1
  332. package/types/instrument-picker/useTablePicker.d.ts +3 -10
  333. package/types/list/ChevronIcon.d.ts +1 -1
  334. package/types/list/ListItem.d.ts +1 -1
  335. package/types/list/RadioIcon.d.ts +1 -2
  336. package/types/list/common-hooks/useTypeahead.d.ts +0 -1
  337. package/types/measured-container/MeasuredContainer.d.ts +1 -1
  338. package/types/overflow-container/useOverflowContainer.d.ts +4 -5
  339. package/types/price-ticker/PriceTicker.d.ts +1 -1
  340. package/types/split-button/SplitStateButton.d.ts +0 -1
  341. package/types/split-button/useSplitButton.d.ts +71 -60
  342. package/types/table-search/SearchCell.d.ts +1 -2
  343. package/types/table-search/TableSearch.d.ts +2 -4
  344. package/types/table-search/useTableSearch.d.ts +4 -2
  345. package/types/tabs-next/TabBar.d.ts +12 -0
  346. package/types/tabs-next/TabListNext.d.ts +12 -0
  347. package/types/tabs-next/TabNext.d.ts +12 -0
  348. package/types/tabs-next/TabNextAction.d.ts +5 -0
  349. package/types/tabs-next/TabNextContext.d.ts +12 -0
  350. package/types/tabs-next/TabNextPanel.d.ts +8 -0
  351. package/types/tabs-next/TabNextTrigger.d.ts +5 -0
  352. package/types/tabs-next/TabOverflowList.d.ts +11 -0
  353. package/types/tabs-next/TabsNext.d.ts +17 -0
  354. package/types/tabs-next/TabsNextContext.d.ts +21 -0
  355. package/types/tabs-next/hooks/useCollection.d.ts +18 -0
  356. package/types/tabs-next/hooks/useFocusOutside.d.ts +2 -0
  357. package/types/tabs-next/hooks/useOverflow.d.ts +11 -0
  358. package/types/tabs-next/index.d.ts +7 -0
  359. package/types/tabstrip/Tab.d.ts +23 -22
  360. package/types/tabstrip/TabMenu.d.ts +1 -2
  361. package/types/tabstrip/Tabstrip.d.ts +1 -2
  362. package/types/tabstrip/useSelection.d.ts +3 -3
  363. package/types/tabstrip/useTabstrip.d.ts +5 -5
  364. package/types/toolbar/Toolbar.d.ts +1 -2
  365. package/types/toolbar/useToolbar.d.ts +1 -1
  366. package/types/vuu-date-picker/VuuDatePicker.d.ts +4 -6
  367. package/types/vuu-input/VuuInput.d.ts +1 -1
  368. package/types/vuu-typeahead-input/VuuTypeaheadInput.d.ts +1 -2
  369. package/cjs/tree/Tree.css.js +0 -6
  370. package/cjs/tree/Tree.css.js.map +0 -1
  371. package/cjs/tree/Tree.js +0 -179
  372. package/cjs/tree/Tree.js.map +0 -1
  373. package/cjs/tree/hierarchical-data-utils.js +0 -72
  374. package/cjs/tree/hierarchical-data-utils.js.map +0 -1
  375. package/cjs/tree/key-code.js +0 -62
  376. package/cjs/tree/key-code.js.map +0 -1
  377. package/cjs/tree/list-dom-utils.js +0 -19
  378. package/cjs/tree/list-dom-utils.js.map +0 -1
  379. package/cjs/tree/treeTypeUtils.js +0 -6
  380. package/cjs/tree/treeTypeUtils.js.map +0 -1
  381. package/cjs/tree/use-collapsible-groups.js +0 -85
  382. package/cjs/tree/use-collapsible-groups.js.map +0 -1
  383. package/cjs/tree/use-hierarchical-data.js +0 -51
  384. package/cjs/tree/use-hierarchical-data.js.map +0 -1
  385. package/cjs/tree/use-items-with-ids.js +0 -100
  386. package/cjs/tree/use-items-with-ids.js.map +0 -1
  387. package/cjs/tree/use-keyboard-navigation.js +0 -144
  388. package/cjs/tree/use-keyboard-navigation.js.map +0 -1
  389. package/cjs/tree/use-selection.js +0 -154
  390. package/cjs/tree/use-selection.js.map +0 -1
  391. package/cjs/tree/use-tree-keyboard-navigation.js +0 -41
  392. package/cjs/tree/use-tree-keyboard-navigation.js.map +0 -1
  393. package/cjs/tree/use-viewport-tracking.js +0 -76
  394. package/cjs/tree/use-viewport-tracking.js.map +0 -1
  395. package/cjs/tree/useTree.js +0 -106
  396. package/cjs/tree/useTree.js.map +0 -1
  397. package/esm/tree/Tree.css.js +0 -4
  398. package/esm/tree/Tree.css.js.map +0 -1
  399. package/esm/tree/Tree.js +0 -176
  400. package/esm/tree/Tree.js.map +0 -1
  401. package/esm/tree/hierarchical-data-utils.js +0 -65
  402. package/esm/tree/hierarchical-data-utils.js.map +0 -1
  403. package/esm/tree/key-code.js +0 -54
  404. package/esm/tree/key-code.js.map +0 -1
  405. package/esm/tree/list-dom-utils.js +0 -15
  406. package/esm/tree/list-dom-utils.js.map +0 -1
  407. package/esm/tree/treeTypeUtils.js +0 -4
  408. package/esm/tree/treeTypeUtils.js.map +0 -1
  409. package/esm/tree/use-collapsible-groups.js +0 -83
  410. package/esm/tree/use-collapsible-groups.js.map +0 -1
  411. package/esm/tree/use-hierarchical-data.js +0 -49
  412. package/esm/tree/use-hierarchical-data.js.map +0 -1
  413. package/esm/tree/use-items-with-ids.js +0 -98
  414. package/esm/tree/use-items-with-ids.js.map +0 -1
  415. package/esm/tree/use-keyboard-navigation.js +0 -142
  416. package/esm/tree/use-keyboard-navigation.js.map +0 -1
  417. package/esm/tree/use-selection.js +0 -147
  418. package/esm/tree/use-selection.js.map +0 -1
  419. package/esm/tree/use-tree-keyboard-navigation.js +0 -39
  420. package/esm/tree/use-tree-keyboard-navigation.js.map +0 -1
  421. package/esm/tree/use-viewport-tracking.js +0 -74
  422. package/esm/tree/use-viewport-tracking.js.map +0 -1
  423. package/esm/tree/useTree.js +0 -104
  424. package/esm/tree/useTree.js.map +0 -1
  425. package/types/tree/Tree.d.ts +0 -19
  426. package/types/tree/hierarchical-data-utils.d.ts +0 -8
  427. package/types/tree/index.d.ts +0 -3
  428. package/types/tree/key-code.d.ts +0 -11
  429. package/types/tree/list-dom-utils.d.ts +0 -6
  430. package/types/tree/treeTypeUtils.d.ts +0 -2
  431. package/types/tree/use-collapsible-groups.d.ts +0 -18
  432. package/types/tree/use-hierarchical-data.d.ts +0 -6
  433. package/types/tree/use-items-with-ids.d.ts +0 -8
  434. package/types/tree/use-keyboard-navigation.d.ts +0 -26
  435. package/types/tree/use-selection.d.ts +0 -31
  436. package/types/tree/use-tree-keyboard-navigation.d.ts +0 -12
  437. package/types/tree/use-viewport-tracking.d.ts +0 -2
  438. package/types/tree/useTree.d.ts +0 -30
@@ -1 +1 @@
1
- {"version":3,"file":"selectionTypes.js","sources":["../../src/common-hooks/selectionTypes.ts"],"sourcesContent":["import { MouseEventHandler, RefObject, SyntheticEvent } from \"react\";\n\nexport type SelectionDisallowed = \"none\";\nexport type SingleSelectionStrategy = \"default\" | \"deselectable\";\nexport type MultiSelectionStrategy =\n | \"multiple\"\n | \"extended\"\n | \"extended-multi-range\";\n\n/**\n * SpecialKeyMultiple works as deselectable unless a special key\n * (default SHIFT) is also pressed, then it allows multiple selection.\n * Useful for column sorting, filters etc\n */\nexport type SpecialKeyMultipleSelection = \"multiple-special-key\";\n\nexport type SelectionStrategy =\n | SelectionDisallowed\n | SingleSelectionStrategy\n | MultiSelectionStrategy;\n\nexport const isSingleSelection = (\n s?: SelectionStrategy\n): s is SingleSelectionStrategy =>\n s === undefined || s === \"default\" || s === \"deselectable\";\n\nexport const isMultiSelection = (\n s?: SelectionStrategy\n): s is MultiSelectionStrategy =>\n s === \"multiple\" || s?.startsWith(\"extended\") === true;\n\nexport type SelectHandler<Item = string> = (\n event: SyntheticEvent,\n selectedItem: Item\n) => void;\n\nexport const selectionIsDisallowed = (\n selection?: SelectionStrategy | SpecialKeyMultipleSelection\n): selection is SelectionDisallowed => selection === \"none\";\n\nexport const allowMultipleSelection = (\n selectionStrategy: SelectionStrategy | SpecialKeyMultipleSelection,\n specialKey = false\n) =>\n selectionStrategy === \"multiple\" ||\n (selectionStrategy === \"multiple-special-key\" && specialKey);\n\nexport const deselectionIsAllowed = (\n selection?: SelectionStrategy | SpecialKeyMultipleSelection\n): selection is \"deselectable\" | MultiSelectionStrategy =>\n selection !== \"none\" && selection !== \"default\";\n\nexport const hasSelection = <Item = unknown>(selected?: Item[]) =>\n selected !== undefined && selected.length > 0;\n\nexport const getFirstSelectedItem = <Item = unknown>(selected: Item[]) =>\n selected[0];\n\ninterface SelectionProps {\n defaultSelected?: string[];\n onSelect?: SelectHandler;\n onSelectionChange?: MultiSelectionHandler;\n selected?: string[];\n selectionStrategy?: SelectionStrategy;\n}\n\nexport interface ListHandlers {\n onClick?: (event: React.MouseEvent) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n onKeyboardNavigation?: (\n event: React.KeyboardEvent,\n currentIndex: number\n ) => void;\n onMouseMove?: (event: React.MouseEvent) => void;\n}\nexport interface SelectionHookProps extends SelectionProps {\n containerRef: RefObject<HTMLElement>;\n disableSelection?: boolean;\n highlightedIndex: number;\n itemQuery: string;\n label?: string;\n onClick?: MouseEventHandler;\n selectionKeys?: string[];\n tabToSelect?: boolean;\n}\n\nexport interface SelectionHookResult {\n listHandlers: ListHandlers;\n selected: string[];\n setSelected: (selected: string[]) => void;\n}\n\n/**\n * evt is only null in the special case of a selection fired from a multi-select\n * host on tab or selection based on freeform text in combobox\n */\nexport type MultiSelectionHandler<Item = string> = (\n event: SyntheticEvent | null,\n selected: Item[]\n) => void;\n/**\n * evt is only null in the special case of freeform text in combobox\n */\nexport type SingleSelectionHandler<Item = string> = (\n event: SyntheticEvent | null,\n selected: Item\n) => void;\n\nexport type SelectionType<\n I,\n S extends SelectionStrategy\n> = S extends MultiSelectionStrategy ? I[] : I | null;\n\nexport interface ComponentSelectionProps<\n Item = string,\n S extends SelectionStrategy = \"default\"\n> {\n defaultSelected?: S extends MultiSelectionStrategy ? Item[] : Item;\n onSelect?: SelectHandler<Item>;\n onSelectionChange?: S extends MultiSelectionStrategy\n ? MultiSelectionHandler<Item>\n : SingleSelectionHandler<Item>;\n selected?: SelectionType<Item, S>;\n selectionStrategy?: S;\n /**\n * The keyboard keys used to effect selection, defaults to SPACE and ENTER\n * TODO maybe this belongs on the SelectionProps interface ?\n */\n selectionKeys?: string[];\n}\n"],"names":[],"mappings":";;AAqBO,MAAM,oBAAoB,CAC/B,CAAA,KAEA,MAAM,KAAa,CAAA,IAAA,CAAA,KAAM,aAAa,CAAM,KAAA,eAAA;AAEjC,MAAA,gBAAA,GAAmB,CAC9B,CAEA,KAAA,CAAA,KAAM,cAAc,CAAG,EAAA,UAAA,CAAW,UAAU,CAAM,KAAA,KAAA;AAOvC,MAAA,qBAAA,GAAwB,CACnC,SAAA,KACqC,SAAc,KAAA,OAAA;AAExC,MAAA,sBAAA,GAAyB,CACpC,iBACA,EAAA,UAAA,GAAa,UAEb,iBAAsB,KAAA,UAAA,IACrB,sBAAsB,sBAA0B,IAAA,WAAA;AAE5C,MAAM,oBAAuB,GAAA,CAClC,SAEA,KAAA,SAAA,KAAc,UAAU,SAAc,KAAA,UAAA;AAEjC,MAAM,eAAe,CAAiB,QAAA,KAC3C,QAAa,KAAA,KAAA,CAAA,IAAa,SAAS,MAAS,GAAA,EAAA;AAEvC,MAAM,oBAAuB,GAAA,CAAiB,QACnD,KAAA,QAAA,CAAS,CAAC;;;;;;;;;;"}
1
+ {"version":3,"file":"selectionTypes.js","sources":["../../src/common-hooks/selectionTypes.ts"],"sourcesContent":["import { MouseEventHandler, RefObject, SyntheticEvent } from \"react\";\n\nexport type SelectionDisallowed = \"none\";\nexport type SingleSelectionStrategy = \"default\" | \"deselectable\";\nexport type MultiSelectionStrategy =\n | \"multiple\"\n | \"extended\"\n | \"extended-multi-range\";\n\n/**\n * SpecialKeyMultiple works as deselectable unless a special key\n * (default SHIFT) is also pressed, then it allows multiple selection.\n * Useful for column sorting, filters etc\n */\nexport type SpecialKeyMultipleSelection = \"multiple-special-key\";\n\nexport type SelectionStrategy =\n | SelectionDisallowed\n | SingleSelectionStrategy\n | MultiSelectionStrategy;\n\nexport const isSingleSelection = (\n s?: SelectionStrategy\n): s is SingleSelectionStrategy =>\n s === undefined || s === \"default\" || s === \"deselectable\";\n\nexport const isMultiSelection = (\n s?: SelectionStrategy\n): s is MultiSelectionStrategy =>\n s === \"multiple\" || s?.startsWith(\"extended\") === true;\n\nexport type SelectHandler<Item = string> = (\n event: SyntheticEvent,\n selectedItem: Item\n) => void;\n\nexport const selectionIsDisallowed = (\n selection?: SelectionStrategy | SpecialKeyMultipleSelection\n): selection is SelectionDisallowed => selection === \"none\";\n\nexport const allowMultipleSelection = (\n selectionStrategy: SelectionStrategy | SpecialKeyMultipleSelection,\n specialKey = false\n) =>\n selectionStrategy === \"multiple\" ||\n (selectionStrategy === \"multiple-special-key\" && specialKey);\n\nexport const deselectionIsAllowed = (\n selection?: SelectionStrategy | SpecialKeyMultipleSelection\n): selection is \"deselectable\" | MultiSelectionStrategy =>\n selection !== \"none\" && selection !== \"default\";\n\nexport const hasSelection = <Item = unknown>(selected?: Item[]) =>\n selected !== undefined && selected.length > 0;\n\nexport const getFirstSelectedItem = <Item = unknown>(selected: Item[]) =>\n selected[0];\n\ninterface SelectionProps {\n defaultSelected?: string[];\n onSelect?: SelectHandler;\n onSelectionChange?: MultiSelectionHandler;\n selected?: string[];\n selectionStrategy?: SelectionStrategy;\n}\n\nexport interface ListHandlers {\n onClick?: (event: React.MouseEvent) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n onKeyboardNavigation?: (\n event: React.KeyboardEvent,\n currentIndex: number\n ) => void;\n onMouseMove?: (event: React.MouseEvent) => void;\n}\nexport interface SelectionHookProps extends SelectionProps {\n containerRef: RefObject<HTMLElement>;\n disableSelection?: boolean;\n highlightedIndex: number;\n itemQuery: string;\n label?: string;\n onClick?: MouseEventHandler;\n selectionKeys?: string[];\n tabToSelect?: boolean;\n}\n\nexport interface SelectionHookResult {\n listHandlers: ListHandlers;\n selected: string[];\n setSelected: (selected: string[]) => void;\n}\n\n/**\n * evt is only null in the special case of a selection fired from a multi-select\n * host on tab or selection based on freeform text in combobox\n */\nexport type MultiSelectionHandler<Item = string> = (\n event: SyntheticEvent | null,\n selected: Item[]\n) => void;\n/**\n * evt is only null in the special case of freeform text in combobox\n */\nexport type SingleSelectionHandler<Item = string> = (\n event: SyntheticEvent | null,\n selected: Item\n) => void;\n\nexport type SelectionType<\n I,\n S extends SelectionStrategy\n> = S extends MultiSelectionStrategy ? I[] : I | null;\n\nexport interface ComponentSelectionProps<\n Item = string,\n S extends SelectionStrategy = \"default\"\n> {\n defaultSelected?: S extends MultiSelectionStrategy ? Item[] : Item;\n onSelect?: SelectHandler<Item>;\n onSelectionChange?: S extends MultiSelectionStrategy\n ? MultiSelectionHandler<Item>\n : SingleSelectionHandler<Item>;\n selected?: SelectionType<Item, S>;\n selectionStrategy?: S;\n /**\n * The keyboard keys used to effect selection, defaults to SPACE and ENTER\n * TODO maybe this belongs on the SelectionProps interface ?\n */\n selectionKeys?: string[];\n}\n"],"names":[],"mappings":";;AAqBO,MAAM,oBAAoB,CAC/B,CAAA,KAEA,MAAM,KAAa,CAAA,IAAA,CAAA,KAAM,aAAa,CAAM,KAAA;AAEjC,MAAA,gBAAA,GAAmB,CAC9B,CAEA,KAAA,CAAA,KAAM,cAAc,CAAG,EAAA,UAAA,CAAW,UAAU,CAAM,KAAA;AAOvC,MAAA,qBAAA,GAAwB,CACnC,SAAA,KACqC,SAAc,KAAA;AAExC,MAAA,sBAAA,GAAyB,CACpC,iBACA,EAAA,UAAA,GAAa,UAEb,iBAAsB,KAAA,UAAA,IACrB,sBAAsB,sBAA0B,IAAA;AAE5C,MAAM,oBAAuB,GAAA,CAClC,SAEA,KAAA,SAAA,KAAc,UAAU,SAAc,KAAA;AAEjC,MAAM,eAAe,CAAiB,QAAA,KAC3C,QAAa,KAAA,KAAA,CAAA,IAAa,SAAS,MAAS,GAAA;AAEvC,MAAM,oBAAuB,GAAA,CAAiB,QACnD,KAAA,QAAA,CAAS,CAAC;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-resize-observer.js","sources":["../../src/common-hooks/use-resize-observer.ts"],"sourcesContent":["import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\nexport const HeightOnly = [\"height\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n clientHeight?: number;\n clientWidth?: number;\n contentHeight?: number;\n contentWidth?: number;\n scrollHeight?: number;\n scrollWidth?: number;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new Map<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n size: {\n height: number;\n width: number;\n contentHeight: number;\n contentWidth: number;\n },\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return size.height;\n case \"clientHeight\":\n return element.clientHeight;\n case \"clientWidth\":\n return element.clientWidth;\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(element.scrollHeight);\n case \"scrollWidth\":\n return Math.ceil(element.scrollWidth);\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\n// TODO should we make this create-on-demand\nconst resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const [{ blockSize: height, inlineSize: width }] = borderBoxSize;\n const [{ blockSize: contentHeight, inlineSize: contentWidth }] =\n contentBoxSize;\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n { height, width, contentHeight, contentWidth },\n dimension as measuredDimension\n );\n\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n // TODO only return measured sizes\n onResize && onResize(measurements);\n }\n }\n }\n});\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n) {\n const dimensionsRef = useRef(dimensions);\n const target = ref.current as HTMLElement;\n\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const { width, height } = target.getBoundingClientRect();\n const { clientWidth: contentWidth, clientHeight: contentHeight } = target;\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n { width, height, contentHeight, contentWidth },\n dim as measuredDimension\n );\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useLayoutEffect(() => {\n // const target = ref.current as HTMLElement;\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n await document.fonts.ready;\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n } else {\n console.log(\n `%cuseResizeObserver an target expected to be under observation wa snot found. This warrants investigation`,\n \"font-weight:bold; color:red;\"\n );\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n // console.log(\n // \"useResizeObserver attemping to observe same element twice\",\n // { target }\n // );\n // throw Error(\n // \"useResizeObserver attemping to observe same element twice\"\n // );\n }\n // TODO set a pending entry on map\n registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, target]);\n\n useEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n}\n"],"names":["useRef","useCallback","target","useLayoutEffect","useEffect"],"mappings":";;;;AAQa,MAAA,WAAA,GAAc,CAAC,QAAA,EAAU,OAAO,EAAA;AAChC,MAAA,SAAA,GAAY,CAAC,OAAO,EAAA;AACpB,MAAA,UAAA,GAAa,CAAC,QAAQ,EAAA;AAoBnC,MAAM,WAAA,uBAAkB,GAAkC,EAAA,CAAA;AAE1D,MAAM,aAAgB,GAAA,CACpB,OACA,EAAA,IAAA,EAMA,SACW,KAAA;AACX,EAAA,QAAQ,SAAW;AAAA,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,IACd,KAAK,cAAA;AACH,MAAA,OAAO,OAAQ,CAAA,YAAA,CAAA;AAAA,IACjB,KAAK,aAAA;AACH,MAAA,OAAO,OAAQ,CAAA,WAAA,CAAA;AAAA,IACjB,KAAK,eAAA;AACH,MAAA,OAAO,IAAK,CAAA,aAAA,CAAA;AAAA,IACd,KAAK,cAAA;AACH,MAAA,OAAO,IAAK,CAAA,YAAA,CAAA;AAAA,IACd,KAAK,cAAA;AACH,MAAO,OAAA,IAAA,CAAK,IAAK,CAAA,OAAA,CAAQ,YAAY,CAAA,CAAA;AAAA,IACvC,KAAK,aAAA;AACH,MAAO,OAAA,IAAA,CAAK,IAAK,CAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AAAA,IACd;AACE,MAAO,OAAA,CAAA,CAAA;AAAA,GACX;AACF,CAAA,CAAA;AAGA,MAAM,cAAiB,GAAA,IAAI,cAAe,CAAA,CAAC,OAAmC,KAAA;AAC5E,EAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,IAAA,MAAM,EAAE,MAAA,EAAQ,aAAe,EAAA,cAAA,EAAmB,GAAA,KAAA,CAAA;AAClD,IAAM,MAAA,cAAA,GAAiB,WAAY,CAAA,GAAA,CAAI,MAAqB,CAAA,CAAA;AAC5D,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,MAAM,CAAC,EAAE,SAAA,EAAW,QAAQ,UAAY,EAAA,KAAA,EAAO,CAAI,GAAA,aAAA,CAAA;AACnD,MAAA,MAAM,CAAC,EAAE,SAAA,EAAW,eAAe,UAAY,EAAA,YAAA,EAAc,CAC3D,GAAA,cAAA,CAAA;AACF,MAAM,MAAA,EAAE,QAAU,EAAA,YAAA,EAAiB,GAAA,cAAA,CAAA;AACnC,MAAA,IAAI,WAAc,GAAA,KAAA,CAAA;AAClB,MAAA,KAAA,MAAW,CAAC,SAAW,EAAA,IAAI,KAAK,MAAO,CAAA,OAAA,CAAQ,YAAY,CAAG,EAAA;AAC5D,QAAA,MAAM,OAAU,GAAA,aAAA;AAAA,UACd,MAAA;AAAA,UACA,EAAE,MAAA,EAAQ,KAAO,EAAA,aAAA,EAAe,YAAa,EAAA;AAAA,UAC7C,SAAA;AAAA,SACF,CAAA;AAEA,QAAA,IAAI,YAAY,IAAM,EAAA;AACpB,UAAc,WAAA,GAAA,IAAA,CAAA;AACd,UAAA,YAAA,CAAa,SAA8B,CAAI,GAAA,OAAA,CAAA;AAAA,SACjD;AAAA,OACF;AACA,MAAA,IAAI,WAAa,EAAA;AAEf,QAAA,QAAA,IAAY,SAAS,YAAY,CAAA,CAAA;AAAA,OACnC;AAAA,KACF;AAAA,GACF;AACF,CAAC,CAAA,CAAA;AAIM,SAAS,iBACd,CAAA,GAAA,EACA,UACA,EAAA,QAAA,EACA,oBAAoB,KACpB,EAAA;AACA,EAAM,MAAA,aAAA,GAAgBA,aAAO,UAAU,CAAA,CAAA;AACvC,EAAA,MAAM,SAAS,GAAI,CAAA,OAAA,CAAA;AAEnB,EAAM,MAAA,OAAA,GAAUC,iBAAY,CAAA,CAACC,OAA8C,KAAA;AACzE,IAAA,MAAM,EAAE,KAAA,EAAO,MAAO,EAAA,GAAIA,QAAO,qBAAsB,EAAA,CAAA;AACvD,IAAA,MAAM,EAAE,WAAA,EAAa,YAAc,EAAA,YAAA,EAAc,eAAkBA,GAAAA,OAAAA,CAAAA;AACnE,IAAA,OAAO,cAAc,OAAQ,CAAA,MAAA;AAAA,MAC3B,CAAC,KAAgC,GAAQ,KAAA;AACvC,QAAA,GAAA,CAAI,GAAG,CAAI,GAAA,aAAA;AAAA,UACTA,OAAAA;AAAA,UACA,EAAE,KAAA,EAAO,MAAQ,EAAA,aAAA,EAAe,YAAa,EAAA;AAAA,UAC7C,GAAA;AAAA,SACF,CAAA;AACA,QAAO,OAAA,GAAA,CAAA;AAAA,OACT;AAAA,MACA,EAAC;AAAA,KACH,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAUL,EAAAC,qBAAA,CAAgB,MAAM;AAEpB,IAAA,eAAe,gBAAmB,GAAA;AAGhC,MAAA,WAAA,CAAY,IAAI,MAAQ,EAAA,EAAE,YAAc,EAAA,IAA4B,CAAA,CAAA;AACpE,MAAA,MAAM,SAAS,KAAM,CAAA,KAAA,CAAA;AACrB,MAAM,MAAA,cAAA,GAAiB,WAAY,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAC7C,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAM,MAAA,YAAA,GAAe,QAAQ,MAAM,CAAA,CAAA;AACnC,QAAA,cAAA,CAAe,YAAe,GAAA,YAAA,CAAA;AAC9B,QAAA,cAAA,CAAe,QAAQ,MAAM,CAAA,CAAA;AAC7B,QAAA,IAAI,iBAAmB,EAAA;AACrB,UAAA,QAAA,CAAS,YAAY,CAAA,CAAA;AAAA,SACvB;AAAA,OACK,MAAA;AACL,QAAQ,OAAA,CAAA,GAAA;AAAA,UACN,CAAA,yGAAA,CAAA;AAAA,UACA,8BAAA;AAAA,SACF,CAAA;AAAA,OACF;AAAA,KACF;AAEA,IAAA,IAAI,MAAQ,EAAA;AAEV,MAAI,IAAA,WAAA,CAAY,GAAI,CAAA,MAAM,CAAG,EAAA,CAQ7B;AAEA,MAAiB,gBAAA,EAAA,CAAA;AAAA,KACnB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,MAAU,IAAA,WAAA,CAAY,GAAI,CAAA,MAAM,CAAG,EAAA;AACrC,QAAA,cAAA,CAAe,UAAU,MAAM,CAAA,CAAA;AAC/B,QAAA,WAAA,CAAY,OAAO,MAAM,CAAA,CAAA;AAAA,OAC3B;AAAA,KACF,CAAA;AAAA,GAEC,EAAA,CAAC,OAAS,EAAA,MAAM,CAAC,CAAA,CAAA;AAEpB,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAMF,UAAS,GAAI,CAAA,OAAA,CAAA;AACnB,IAAM,MAAA,MAAA,GAAS,WAAY,CAAA,GAAA,CAAIA,OAAM,CAAA,CAAA;AACrC,IAAA,IAAI,MAAQ,EAAA;AACV,MAAI,IAAA,aAAA,CAAc,YAAY,UAAY,EAAA;AACxC,QAAA,aAAA,CAAc,OAAU,GAAA,UAAA,CAAA;AACxB,QAAM,MAAA,YAAA,GAAe,QAAQA,OAAM,CAAA,CAAA;AACnC,QAAA,MAAA,CAAO,YAAe,GAAA,YAAA,CAAA;AAAA,OACxB;AAEA,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAAA,KACpB;AAAA,KACC,CAAC,UAAA,EAAY,OAAS,EAAA,GAAA,EAAK,QAAQ,CAAC,CAAA,CAAA;AACzC;;;;;;;"}
1
+ {"version":3,"file":"use-resize-observer.js","sources":["../../src/common-hooks/use-resize-observer.ts"],"sourcesContent":["import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\";\n\nexport const WidthHeight = [\"height\", \"width\"];\nexport const WidthOnly = [\"width\"];\nexport const HeightOnly = [\"height\"];\n\nexport type measurements<T = string | number> = {\n height?: T;\n clientHeight?: number;\n clientWidth?: number;\n contentHeight?: number;\n contentWidth?: number;\n scrollHeight?: number;\n scrollWidth?: number;\n width?: T;\n};\ntype measuredDimension = keyof measurements<number>;\n\nexport type ResizeHandler = (measurements: measurements<number>) => void;\n\ntype observedDetails = {\n onResize?: ResizeHandler;\n measurements: measurements<number>;\n};\nconst observedMap = new Map<HTMLElement, observedDetails>();\n\nconst getTargetSize = (\n element: HTMLElement,\n size: {\n height: number;\n width: number;\n contentHeight: number;\n contentWidth: number;\n },\n dimension: measuredDimension\n): number => {\n switch (dimension) {\n case \"height\":\n return size.height;\n case \"clientHeight\":\n return element.clientHeight;\n case \"clientWidth\":\n return element.clientWidth;\n case \"contentHeight\":\n return size.contentHeight;\n case \"contentWidth\":\n return size.contentWidth;\n case \"scrollHeight\":\n return Math.ceil(element.scrollHeight);\n case \"scrollWidth\":\n return Math.ceil(element.scrollWidth);\n case \"width\":\n return size.width;\n default:\n return 0;\n }\n};\n\n// TODO should we make this create-on-demand\nconst resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n const observedTarget = observedMap.get(target as HTMLElement);\n if (observedTarget) {\n const [{ blockSize: height, inlineSize: width }] = borderBoxSize;\n const [{ blockSize: contentHeight, inlineSize: contentWidth }] =\n contentBoxSize;\n const { onResize, measurements } = observedTarget;\n let sizeChanged = false;\n for (const [dimension, size] of Object.entries(measurements)) {\n const newSize = getTargetSize(\n target as HTMLElement,\n { height, width, contentHeight, contentWidth },\n dimension as measuredDimension\n );\n\n if (newSize !== size) {\n sizeChanged = true;\n measurements[dimension as measuredDimension] = newSize;\n }\n }\n if (sizeChanged) {\n // TODO only return measured sizes\n onResize && onResize(measurements);\n }\n }\n }\n});\n\n// TODO use an optional lag (default to false) to ask to fire onResize\n// with initial size\nexport function useResizeObserver(\n ref: RefObject<Element | HTMLElement | null>,\n dimensions: string[],\n onResize: ResizeHandler,\n reportInitialSize = false\n) {\n const dimensionsRef = useRef(dimensions);\n const target = ref.current as HTMLElement;\n\n const measure = useCallback((target: HTMLElement): measurements<number> => {\n const { width, height } = target.getBoundingClientRect();\n const { clientWidth: contentWidth, clientHeight: contentHeight } = target;\n return dimensionsRef.current.reduce(\n (map: { [key: string]: number }, dim) => {\n map[dim] = getTargetSize(\n target,\n { width, height, contentHeight, contentWidth },\n dim as measuredDimension\n );\n return map;\n },\n {}\n );\n }, []);\n\n // TODO use ref to store resizeHandler here\n // resize handler registered with REsizeObserver will never change\n // use ref to store user onResize callback here\n // resizeHandler will call user callback.current\n\n // Keep this effect separate in case user inadvertently passes different\n // dimensions or callback instance each time - we only ever want to\n // initiate new observation when ref changes.\n useLayoutEffect(() => {\n // const target = ref.current as HTMLElement;\n async function registerObserver() {\n // Create the map entry immediately. useEffect may fire below\n // before fonts are ready and attempt to update entry\n observedMap.set(target, { measurements: {} as measurements<number> });\n await document.fonts.ready;\n const observedTarget = observedMap.get(target);\n if (observedTarget) {\n const measurements = measure(target);\n observedTarget.measurements = measurements;\n resizeObserver.observe(target);\n if (reportInitialSize) {\n onResize(measurements);\n }\n } else {\n console.log(\n `%cuseResizeObserver an target expected to be under observation wa snot found. This warrants investigation`,\n \"font-weight:bold; color:red;\"\n );\n }\n }\n\n if (target) {\n // TODO might we want multiple callers to attach a listener to the same element ?\n if (observedMap.has(target)) {\n // console.log(\n // \"useResizeObserver attemping to observe same element twice\",\n // { target }\n // );\n // throw Error(\n // \"useResizeObserver attemping to observe same element twice\"\n // );\n }\n // TODO set a pending entry on map\n registerObserver();\n }\n return () => {\n if (target && observedMap.has(target)) {\n resizeObserver.unobserve(target);\n observedMap.delete(target);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, target]);\n\n useEffect(() => {\n const target = ref.current as HTMLElement;\n const record = observedMap.get(target);\n if (record) {\n if (dimensionsRef.current !== dimensions) {\n dimensionsRef.current = dimensions;\n const measurements = measure(target);\n record.measurements = measurements;\n }\n // Might not have changed, but no harm ...\n record.onResize = onResize;\n }\n }, [dimensions, measure, ref, onResize]);\n}\n"],"names":["useRef","useCallback","target","useLayoutEffect","useEffect"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCollectionItems.js","sources":["../../src/common-hooks/useCollectionItems.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState, isValidElement } from \"react\";\nimport {\n CollectionItem,\n CollectionIndexer,\n CollectionHookProps,\n CollectionHookResult,\n} from \"./collectionTypes\";\nimport {\n isHeader,\n isGroupNode,\n childItems,\n countChildItems,\n FilterPredicate,\n getDefaultFilter,\n getDefaultFilterRegex,\n isDisabled,\n isFocusable,\n isParentPath,\n replaceCollectionItem,\n sourceItems,\n} from \"../list/common-hooks/utils\";\nimport { itemToString as defaultItemToString } from \"./itemToString\";\n\nimport { useCollection } from \"./collectionProvider\";\n\nconst defaultCollectionOptions = {};\n\nexport const useCollectionItems = <Item>({\n children,\n id: idRoot,\n options = defaultCollectionOptions,\n // revealSelected = false,\n source,\n}: CollectionHookProps<Item>): CollectionHookResult<Item> => {\n const { getItemId } = options;\n const [, forceUpdate] = useState<unknown>(null);\n const inheritedCollectionHook = useCollection<Item>();\n const dataRef = useRef<CollectionItem<Item>[]>([]);\n const flattenedDataRef = useRef<CollectionItem<Item>[]>([]);\n const EMPTY_COLLECTION: CollectionItem<Item>[] = useMemo(() => [], []);\n const filterPattern = useRef<string>(options.filterPattern ?? \"\");\n const disableFilter = options.disableFilter ?? false;\n\n // destructure individual option values so we can safely reference them in dependency arrays\n const {\n getFilterRegex = getDefaultFilterRegex,\n noChildrenLabel,\n itemToString = defaultItemToString,\n } = options;\n\n const isExpanded = useCallback(() => {\n // We can't do this here because itemToId won't work until we complete this phase\n // if (Array.isArray(revealSelected)) {\n // const selectedIds = revealSelected.map(itemToId);\n // return selectedIds.some((id) => isParentPath(path, id));\n // }\n return options.defaultExpanded || false;\n }, [options.defaultExpanded]);\n\n const addMetadataToItems = useCallback(\n <Item>(\n items: CollectionItem<Item>[],\n indexer: CollectionIndexer,\n level = 1,\n path = \"\",\n results: CollectionItem<Item>[] = [],\n flattenedCollection: CollectionItem<Item>[] = [],\n flattenedSource: (Item | null)[] = []\n ): [CollectionItem<Item>[], (Item | null)[], CollectionItem<Item>[]] => {\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && options.collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && options.collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `item-${i}`;\n // getItemId is backward compatible with earlier List implementation.\n // It is not appropriate for a nested source structure, where index\n // will not always be an absolute offset.\n const id =\n item.id ?? (getItemId ? getItemId(i) : `${idRoot}-${childPath}`);\n\n const expanded = nonCollapsible\n ? undefined\n : item.expanded ?? isExpanded();\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: CollectionItem<Item> = {\n ...item,\n childNodes: undefined,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n description: item.description,\n disabled: isDisabled(item.value),\n focusable: isFocusable(item.value) ? undefined : false,\n id,\n index: indexer.value,\n expanded,\n level,\n };\n results.push(normalisedItem);\n flattenedCollection.push(normalisedItem);\n flattenedSource.push(items[i].value);\n\n indexer.value += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [children] = addMetadataToItems<Item>(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedCollection,\n flattenedSource\n );\n normalisedItem.childNodes = children;\n }\n });\n return [results, flattenedSource, flattenedCollection];\n },\n [options.collapsibleHeaders, getItemId, idRoot, isExpanded]\n );\n\n const getFilter = useCallback(() => {\n if (filterPattern.current && !disableFilter) {\n return getDefaultFilter(filterPattern.current, getFilterRegex);\n } else {\n return null;\n }\n }, [disableFilter, getFilterRegex]);\n\n const collectVisibleItems = useCallback(\n (\n items: CollectionItem<Item>[],\n filter: null | FilterPredicate = getFilter(),\n results: CollectionItem<Item>[] = [],\n idx: { value: number } = { value: 0 }\n ): CollectionItem<Item>[] => {\n let skipToNextHeader = false;\n for (const item of items) {\n if (!(skipToNextHeader && !isHeader(item))) {\n if (\n item.value !== null &&\n (filter === null || filter(itemToString(item.value)))\n ) {\n results[idx.value] = item;\n idx.value += 1;\n }\n skipToNextHeader = false;\n if (isHeader(item) && item.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(item)) {\n if (item.expanded !== false && item.childNodes) {\n collectVisibleItems(item.childNodes, filter, results, idx);\n }\n }\n }\n }\n return results;\n },\n [getFilter, itemToString]\n );\n\n // Stage 1 - convert source or children to CollectionItems.\n const partialCollectionItems = useMemo(() => {\n return inheritedCollectionHook\n ? EMPTY_COLLECTION\n : sourceItems<Item>(source, { itemToString, noChildrenLabel }) ||\n childItems(children) ||\n [];\n }, [\n inheritedCollectionHook,\n EMPTY_COLLECTION,\n source,\n itemToString,\n noChildrenLabel,\n children,\n ]);\n\n // Stage 2 - extend the collectionItems with additional metadata\n const [collectionItems, flattenedSource, flattenedCollection] = useMemo(\n () =>\n inheritedCollectionHook\n ? [EMPTY_COLLECTION, EMPTY_COLLECTION, EMPTY_COLLECTION]\n : // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n addMetadataToItems<Item>(partialCollectionItems, { value: 0 }),\n [\n EMPTY_COLLECTION,\n addMetadataToItems,\n inheritedCollectionHook,\n partialCollectionItems,\n ]\n );\n flattenedDataRef.current = flattenedCollection;\n\n // Stage 3 prepare the list of visible items, this is what will be rendered\n useMemo(\n () =>\n inheritedCollectionHook\n ? EMPTY_COLLECTION\n : (dataRef.current = collectVisibleItems(collectionItems)),\n [\n EMPTY_COLLECTION,\n collectVisibleItems,\n collectionItems,\n inheritedCollectionHook,\n ]\n );\n\n const collectionItemsRef = useRef(collectionItems);\n\n const setFilterPattern = useCallback(\n (pattern = \"\") => {\n if (typeof pattern === \"string\") {\n filterPattern.current = pattern;\n dataRef.current = collectVisibleItems(collectionItems);\n forceUpdate({});\n }\n },\n [collectionItems, collectVisibleItems]\n );\n\n const itemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems\n ): Item | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id))\n );\n if (sourceWithId?.id === id) {\n //TODO do we need the flattered source at all ?\n return flattenedSource?.[sourceWithId.index!] as Item;\n } else if (sourceWithId) {\n return itemById(id, sourceWithId.childNodes);\n }\n throw Error(`useCollectionData itemById, id ${id} not found `);\n },\n [flattenedSource, collectionItems]\n );\n\n const indexOfItemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems\n ): number | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id))\n );\n const idx = sourceWithId ? dataRef.current.indexOf(sourceWithId) : -1;\n if (idx !== -1) {\n return idx;\n }\n throw Error(`useCollectionData indexOfItemById, id ${id} not found `);\n },\n [collectionItems]\n );\n\n const toCollectionItem = useCallback(\n (item: Item): CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n isValidElement(i.value) ? i.label === item : i.value === item\n );\n if (collectionItem) {\n return collectionItem;\n }\n throw Error(`useCollectionData toCollectionItem, item not found `);\n },\n []\n );\n\n // TODO types need more work, these are correct but we\n // don't really want references to Selection in here\n const itemToCollectionItem = useCallback(\n (sel: Item) => {\n if (sel === null) {\n return null;\n } else if (Array.isArray(sel)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of sel) {\n const collectionItem = toCollectionItem(item);\n result.push(collectionItem);\n }\n return result;\n } else if (sel !== undefined) {\n return toCollectionItem(sel as Item);\n }\n\n return undefined;\n },\n [toCollectionItem]\n );\n\n const itemToCollectionItemId = useCallback(\n (sel) => {\n if (sel === undefined) {\n return undefined;\n }\n\n const selectedCollectionItem = itemToCollectionItem(sel);\n if (Array.isArray(selectedCollectionItem)) {\n return selectedCollectionItem.map((i) => i.id);\n } else if (selectedCollectionItem) {\n return [selectedCollectionItem.id];\n } else {\n return [];\n }\n },\n [itemToCollectionItem]\n );\n\n const stringToCollectionItem = useCallback(\n (value: string | null | undefined) => {\n const toCollectionItem = (\n item: string\n ): undefined | CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n isValidElement(i.value)\n ? i.label === item\n : i.value !== null && itemToString(i.value) === item\n );\n if (collectionItem) {\n return collectionItem;\n }\n };\n\n if (value === null) {\n return null;\n } else if (Array.isArray(value)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of value) {\n const collectionItem = toCollectionItem(item);\n if (collectionItem) {\n result.push(collectionItem);\n }\n }\n return result;\n } else if (value !== undefined) {\n return toCollectionItem(value);\n }\n\n return undefined;\n },\n [itemToString]\n );\n\n const itemToId = useCallback((item: Item): string => {\n for (const collectionItem of collectionItemsRef.current) {\n if (item === collectionItem.value) {\n return collectionItem.id;\n }\n }\n throw Error(\"useCollectionData itemToId, item not found\");\n }, []);\n\n const collapseGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem(\n collectionItemsRef.current,\n item.id,\n {\n expanded: false,\n }\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems]\n );\n\n const expandGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem<Item>(\n collectionItemsRef.current,\n item.id,\n {\n expanded: true,\n }\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems]\n );\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return (\n inheritedCollectionHook || {\n collapseGroupItem,\n data: dataRef.current,\n expandGroupItem, // why not toggle, or just rely on setdata ?\n setFilterPattern,\n indexOfItemById,\n itemById,\n itemToId,\n toCollectionItem,\n itemToCollectionItem,\n itemToCollectionItemId,\n stringToCollectionItem,\n }\n );\n};\n"],"names":["useState","useCollection","useRef","useMemo","getDefaultFilterRegex","itemToString","defaultItemToString","useCallback","flattenedCollection","flattenedSource","countChildItems","isDisabled","isFocusable","children","getDefaultFilter","isHeader","isGroupNode","sourceItems","childItems","isParentPath","isValidElement","toCollectionItem","replaceCollectionItem"],"mappings":"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"}
1
+ {"version":3,"file":"useCollectionItems.js","sources":["../../src/common-hooks/useCollectionItems.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState, isValidElement } from \"react\";\nimport {\n CollectionItem,\n CollectionIndexer,\n CollectionHookProps,\n CollectionHookResult,\n} from \"./collectionTypes\";\nimport {\n isHeader,\n isGroupNode,\n childItems,\n countChildItems,\n FilterPredicate,\n getDefaultFilter,\n getDefaultFilterRegex,\n isDisabled,\n isFocusable,\n isParentPath,\n replaceCollectionItem,\n sourceItems,\n} from \"../list/common-hooks/utils\";\nimport { itemToString as defaultItemToString } from \"./itemToString\";\n\nimport { useCollection } from \"./collectionProvider\";\n\nconst defaultCollectionOptions = {};\n\nexport const useCollectionItems = <Item>({\n children,\n id: idRoot,\n options = defaultCollectionOptions,\n // revealSelected = false,\n source,\n}: CollectionHookProps<Item>): CollectionHookResult<Item> => {\n const { getItemId } = options;\n const [, forceUpdate] = useState<unknown>(null);\n const inheritedCollectionHook = useCollection<Item>();\n const dataRef = useRef<CollectionItem<Item>[]>([]);\n const flattenedDataRef = useRef<CollectionItem<Item>[]>([]);\n const EMPTY_COLLECTION: CollectionItem<Item>[] = useMemo(() => [], []);\n const filterPattern = useRef<string>(options.filterPattern ?? \"\");\n const disableFilter = options.disableFilter ?? false;\n\n // destructure individual option values so we can safely reference them in dependency arrays\n const {\n getFilterRegex = getDefaultFilterRegex,\n noChildrenLabel,\n itemToString = defaultItemToString,\n } = options;\n\n const isExpanded = useCallback(() => {\n // We can't do this here because itemToId won't work until we complete this phase\n // if (Array.isArray(revealSelected)) {\n // const selectedIds = revealSelected.map(itemToId);\n // return selectedIds.some((id) => isParentPath(path, id));\n // }\n return options.defaultExpanded || false;\n }, [options.defaultExpanded]);\n\n const addMetadataToItems = useCallback(\n <Item>(\n items: CollectionItem<Item>[],\n indexer: CollectionIndexer,\n level = 1,\n path = \"\",\n results: CollectionItem<Item>[] = [],\n flattenedCollection: CollectionItem<Item>[] = [],\n flattenedSource: (Item | null)[] = [],\n ): [CollectionItem<Item>[], (Item | null)[], CollectionItem<Item>[]] => {\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && options.collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && options.collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `item-${i}`;\n // getItemId is backward compatible with earlier List implementation.\n // It is not appropriate for a nested source structure, where index\n // will not always be an absolute offset.\n const id =\n item.id ?? (getItemId ? getItemId(i) : `${idRoot}-${childPath}`);\n\n const expanded = nonCollapsible\n ? undefined\n : (item.expanded ?? isExpanded());\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: CollectionItem<Item> = {\n ...item,\n childNodes: undefined,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n description: item.description,\n disabled: isDisabled(item.value),\n focusable: isFocusable(item.value) ? undefined : false,\n id,\n index: indexer.value,\n expanded,\n level,\n };\n results.push(normalisedItem);\n flattenedCollection.push(normalisedItem);\n flattenedSource.push(items[i].value);\n\n indexer.value += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [children] = addMetadataToItems<Item>(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedCollection,\n flattenedSource,\n );\n normalisedItem.childNodes = children;\n }\n });\n return [results, flattenedSource, flattenedCollection];\n },\n [options.collapsibleHeaders, getItemId, idRoot, isExpanded],\n );\n\n const getFilter = useCallback(() => {\n if (filterPattern.current && !disableFilter) {\n return getDefaultFilter(filterPattern.current, getFilterRegex);\n } else {\n return null;\n }\n }, [disableFilter, getFilterRegex]);\n\n const collectVisibleItems = useCallback(\n (\n items: CollectionItem<Item>[],\n filter: null | FilterPredicate = getFilter(),\n results: CollectionItem<Item>[] = [],\n idx: { value: number } = { value: 0 },\n ): CollectionItem<Item>[] => {\n let skipToNextHeader = false;\n for (const item of items) {\n if (!(skipToNextHeader && !isHeader(item))) {\n if (\n item.value !== null &&\n (filter === null || filter(itemToString(item.value)))\n ) {\n results[idx.value] = item;\n idx.value += 1;\n }\n skipToNextHeader = false;\n if (isHeader(item) && item.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(item)) {\n if (item.expanded !== false && item.childNodes) {\n collectVisibleItems(item.childNodes, filter, results, idx);\n }\n }\n }\n }\n return results;\n },\n [getFilter, itemToString],\n );\n\n // Stage 1 - convert source or children to CollectionItems.\n const partialCollectionItems = useMemo(() => {\n return inheritedCollectionHook\n ? EMPTY_COLLECTION\n : sourceItems<Item>(source, { itemToString, noChildrenLabel }) ||\n childItems(children) ||\n [];\n }, [\n inheritedCollectionHook,\n EMPTY_COLLECTION,\n source,\n itemToString,\n noChildrenLabel,\n children,\n ]);\n\n // Stage 2 - extend the collectionItems with additional metadata\n const [collectionItems, flattenedSource, flattenedCollection] = useMemo(\n () =>\n inheritedCollectionHook\n ? [EMPTY_COLLECTION, EMPTY_COLLECTION, EMPTY_COLLECTION]\n : // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n addMetadataToItems<Item>(partialCollectionItems, { value: 0 }),\n [\n EMPTY_COLLECTION,\n addMetadataToItems,\n inheritedCollectionHook,\n partialCollectionItems,\n ],\n );\n flattenedDataRef.current = flattenedCollection;\n\n // Stage 3 prepare the list of visible items, this is what will be rendered\n useMemo(\n () =>\n inheritedCollectionHook\n ? EMPTY_COLLECTION\n : (dataRef.current = collectVisibleItems(collectionItems)),\n [\n EMPTY_COLLECTION,\n collectVisibleItems,\n collectionItems,\n inheritedCollectionHook,\n ],\n );\n\n const collectionItemsRef = useRef(collectionItems);\n\n const setFilterPattern = useCallback(\n (pattern = \"\") => {\n if (typeof pattern === \"string\") {\n filterPattern.current = pattern;\n dataRef.current = collectVisibleItems(collectionItems);\n forceUpdate({});\n }\n },\n [collectionItems, collectVisibleItems],\n );\n\n const itemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems,\n ): Item | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id)),\n );\n if (sourceWithId?.id === id) {\n //TODO do we need the flattered source at all ?\n return flattenedSource?.[sourceWithId.index!] as Item;\n } else if (sourceWithId) {\n return itemById(id, sourceWithId.childNodes);\n }\n throw Error(`useCollectionData itemById, id ${id} not found `);\n },\n [flattenedSource, collectionItems],\n );\n\n const indexOfItemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems,\n ): number | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id)),\n );\n const idx = sourceWithId ? dataRef.current.indexOf(sourceWithId) : -1;\n if (idx !== -1) {\n return idx;\n }\n throw Error(`useCollectionData indexOfItemById, id ${id} not found `);\n },\n [collectionItems],\n );\n\n const toCollectionItem = useCallback(\n (item: Item): CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n isValidElement(i.value) ? i.label === item : i.value === item,\n );\n if (collectionItem) {\n return collectionItem;\n }\n throw Error(`useCollectionData toCollectionItem, item not found `);\n },\n [],\n );\n\n // TODO types need more work, these are correct but we\n // don't really want references to Selection in here\n const itemToCollectionItem = useCallback(\n (sel: Item) => {\n if (sel === null) {\n return null;\n } else if (Array.isArray(sel)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of sel) {\n const collectionItem = toCollectionItem(item);\n result.push(collectionItem);\n }\n return result;\n } else if (sel !== undefined) {\n return toCollectionItem(sel as Item);\n }\n\n return undefined;\n },\n [toCollectionItem],\n );\n\n const itemToCollectionItemId = useCallback(\n (sel: Item) => {\n if (sel === undefined) {\n return undefined;\n }\n\n const selectedCollectionItem = itemToCollectionItem(sel);\n if (Array.isArray(selectedCollectionItem)) {\n return selectedCollectionItem.map((i) => i.id);\n } else if (selectedCollectionItem) {\n return [selectedCollectionItem.id];\n } else {\n return [];\n }\n },\n [itemToCollectionItem],\n );\n\n const stringToCollectionItem = useCallback(\n (value: string | null | undefined) => {\n const toCollectionItem = (\n item: string,\n ): undefined | CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n isValidElement(i.value)\n ? i.label === item\n : i.value !== null && itemToString(i.value) === item,\n );\n if (collectionItem) {\n return collectionItem;\n }\n };\n\n if (value === null) {\n return null;\n } else if (Array.isArray(value)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of value) {\n const collectionItem = toCollectionItem(item);\n if (collectionItem) {\n result.push(collectionItem);\n }\n }\n return result;\n } else if (value !== undefined) {\n return toCollectionItem(value);\n }\n\n return undefined;\n },\n [itemToString],\n );\n\n const itemToId = useCallback((item: Item): string => {\n for (const collectionItem of collectionItemsRef.current) {\n if (item === collectionItem.value) {\n return collectionItem.id;\n }\n }\n throw Error(\"useCollectionData itemToId, item not found\");\n }, []);\n\n const collapseGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem(\n collectionItemsRef.current,\n item.id,\n {\n expanded: false,\n },\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems],\n );\n\n const expandGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem<Item>(\n collectionItemsRef.current,\n item.id,\n {\n expanded: true,\n },\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems],\n );\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return (\n inheritedCollectionHook || {\n collapseGroupItem,\n data: dataRef.current,\n expandGroupItem, // why not toggle, or just rely on setdata ?\n setFilterPattern,\n indexOfItemById,\n itemById,\n itemToId,\n toCollectionItem,\n itemToCollectionItem,\n itemToCollectionItemId,\n stringToCollectionItem,\n }\n );\n};\n"],"names":["useState","useCollection","useRef","useMemo","getDefaultFilterRegex","itemToString","defaultItemToString","useCallback","flattenedCollection","flattenedSource","countChildItems","isDisabled","isFocusable","children","getDefaultFilter","isHeader","isGroupNode","sourceItems","childItems","isParentPath","isValidElement","toCollectionItem","replaceCollectionItem"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useControlled.js","sources":["../../src/common-hooks/useControlled.ts"],"sourcesContent":["import {\n Dispatch,\n isValidElement,\n SetStateAction,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nexport interface UseControlledProps<T> {\n /**\n * Holds the component value when it's controlled.\n */\n controlled?: T;\n /**\n * The default value when uncontrolled.\n */\n default: T;\n /**\n * The component name displayed in warnings.\n */\n name: string;\n /**\n * The name of the state variable displayed in warnings.\n */\n state?: string;\n}\n\n/**\n * Copied from MUI (v5) useControlled hook with one additional returned value\n * @see https://github.com/mui-org/material-ui/blob/0979e6a54ba47c278d1f535953c0520a86349811/packages/material-ui-utils/src/useControlled.js\n */\nexport function useControlled<S>({\n controlled,\n default: defaultProp,\n name,\n state = \"value\",\n}: UseControlledProps<S>): [S, Dispatch<SetStateAction<S>>, boolean] {\n const { current: isControlled } = useRef(controlled !== undefined);\n const [valueState, setValue] = useState<S>(defaultProp);\n const value = controlled !== undefined ? controlled : valueState;\n const { current: defaultValue } = useRef(defaultProp);\n\n // console.log(\n // `%cuseControlled ${name} ${state}`,\n // `color: ${isControlled ? \"blue\" : \"black\"};font-weight: bold;`,\n // {\n // controlled,\n // defaultProp,\n // }\n // );\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (isControlled !== (controlled !== undefined)) {\n console.error(\n [\n `Salt: A component is changing the ${\n isControlled ? \"\" : \"un\"\n }controlled ${state} state of ${name} to be ${\n isControlled ? \"un\" : \"\"\n }controlled.`,\n \"Elements should not switch from uncontrolled to controlled (or vice versa).\",\n `Decide between using a controlled or uncontrolled ${name} ` +\n \"element for the lifetime of the component.\",\n \"The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.\",\n \"More info: https://fb.me/react-controlled-components\",\n ].join(\"\\n\")\n );\n }\n }\n return undefined;\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [state, name, controlled]);\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (!isControlled && defaultValue !== defaultProp) {\n console.error(\n [\n `Salt: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. ` +\n `To suppress this warning opt to use a controlled ${name}.`,\n ].join(\"\\n\")\n );\n }\n }\n return undefined;\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [JSON.stringify(defaultProp, ignoreReactElements)]);\n\n const setValueIfUncontrolled: Dispatch<SetStateAction<S>> = useCallback(\n (newValue) => {\n if (!isControlled) {\n setValue(newValue);\n }\n },\n [isControlled]\n );\n\n return [value, setValueIfUncontrolled, isControlled];\n}\n\n// Ignore ReactElements in JSON, they contain circular refs\nfunction ignoreReactElements<T>(key: string, value: T): T | null {\n return isValidElement(value) ? null : value;\n}\n"],"names":["useRef","useState","useEffect","useCallback","isValidElement"],"mappings":";;;;AAiCO,SAAS,aAAiB,CAAA;AAAA,EAC/B,UAAA;AAAA,EACA,OAAS,EAAA,WAAA;AAAA,EACT,IAAA;AAAA,EACA,KAAQ,GAAA,OAAA;AACV,CAAqE,EAAA;AACnE,EAAA,MAAM,EAAE,OAAS,EAAA,YAAA,EAAiB,GAAAA,YAAA,CAAO,eAAe,KAAS,CAAA,CAAA,CAAA;AACjE,EAAA,MAAM,CAAC,UAAA,EAAY,QAAQ,CAAA,GAAIC,eAAY,WAAW,CAAA,CAAA;AACtD,EAAM,MAAA,KAAA,GAAQ,UAAe,KAAA,KAAA,CAAA,GAAY,UAAa,GAAA,UAAA,CAAA;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,YAAa,EAAA,GAAID,aAAO,WAAW,CAAA,CAAA;AAWpD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,MAAI,IAAA,YAAA,MAAkB,eAAe,KAAY,CAAA,CAAA,EAAA;AAC/C,QAAQ,OAAA,CAAA,KAAA;AAAA,UACN;AAAA,YACE,CAAA,kCAAA,EACE,YAAe,GAAA,EAAA,GAAK,IACtB,CAAA,WAAA,EAAc,KAAK,CAAA,UAAA,EAAa,IAAI,CAAA,OAAA,EAClC,YAAe,GAAA,IAAA,GAAO,EACxB,CAAA,WAAA,CAAA;AAAA,YACA,6EAAA;AAAA,YACA,qDAAqD,IAAI,CAAA,2CAAA,CAAA;AAAA,YAEzD,4HAAA;AAAA,YACA,sDAAA;AAAA,WACF,CAAE,KAAK,IAAI,CAAA;AAAA,SACb,CAAA;AAAA,OACF;AAAA,KACF;AACA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GAEN,EAAA,CAAC,KAAO,EAAA,IAAA,EAAM,UAAU,CAAC,CAAA,CAAA;AAE5B,EAAAA,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,MAAI,IAAA,CAAC,YAAgB,IAAA,YAAA,KAAiB,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,KAAA;AAAA,UACN;AAAA,YACE,CAA6C,0CAAA,EAAA,KAAK,CAA6B,0BAAA,EAAA,IAAI,8EAC7B,IAAI,CAAA,CAAA,CAAA;AAAA,WAC5D,CAAE,KAAK,IAAI,CAAA;AAAA,SACb,CAAA;AAAA,OACF;AAAA,KACF;AACA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KAEN,CAAC,IAAA,CAAK,UAAU,WAAa,EAAA,mBAAmB,CAAC,CAAC,CAAA,CAAA;AAErD,EAAA,MAAM,sBAAsD,GAAAC,iBAAA;AAAA,IAC1D,CAAC,QAAa,KAAA;AACZ,MAAA,IAAI,CAAC,YAAc,EAAA;AACjB,QAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,OACnB;AAAA,KACF;AAAA,IACA,CAAC,YAAY,CAAA;AAAA,GACf,CAAA;AAEA,EAAO,OAAA,CAAC,KAAO,EAAA,sBAAA,EAAwB,YAAY,CAAA,CAAA;AACrD,CAAA;AAGA,SAAS,mBAAA,CAAuB,KAAa,KAAoB,EAAA;AAC/D,EAAO,OAAAC,oBAAA,CAAe,KAAK,CAAA,GAAI,IAAO,GAAA,KAAA,CAAA;AACxC;;;;"}
1
+ {"version":3,"file":"useControlled.js","sources":["../../src/common-hooks/useControlled.ts"],"sourcesContent":["import {\n Dispatch,\n isValidElement,\n SetStateAction,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nexport interface UseControlledProps<T> {\n /**\n * Holds the component value when it's controlled.\n */\n controlled?: T;\n /**\n * The default value when uncontrolled.\n */\n default: T;\n /**\n * The component name displayed in warnings.\n */\n name: string;\n /**\n * The name of the state variable displayed in warnings.\n */\n state?: string;\n}\n\n/**\n * Copied from MUI (v5) useControlled hook with one additional returned value\n * @see https://github.com/mui-org/material-ui/blob/0979e6a54ba47c278d1f535953c0520a86349811/packages/material-ui-utils/src/useControlled.js\n */\nexport function useControlled<S>({\n controlled,\n default: defaultProp,\n name,\n state = \"value\",\n}: UseControlledProps<S>): [S, Dispatch<SetStateAction<S>>, boolean] {\n const { current: isControlled } = useRef(controlled !== undefined);\n const [valueState, setValue] = useState<S>(defaultProp);\n const value = controlled !== undefined ? controlled : valueState;\n const { current: defaultValue } = useRef(defaultProp);\n\n // console.log(\n // `%cuseControlled ${name} ${state}`,\n // `color: ${isControlled ? \"blue\" : \"black\"};font-weight: bold;`,\n // {\n // controlled,\n // defaultProp,\n // }\n // );\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (isControlled !== (controlled !== undefined)) {\n console.error(\n [\n `Salt: A component is changing the ${\n isControlled ? \"\" : \"un\"\n }controlled ${state} state of ${name} to be ${\n isControlled ? \"un\" : \"\"\n }controlled.`,\n \"Elements should not switch from uncontrolled to controlled (or vice versa).\",\n `Decide between using a controlled or uncontrolled ${name} ` +\n \"element for the lifetime of the component.\",\n \"The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.\",\n \"More info: https://fb.me/react-controlled-components\",\n ].join(\"\\n\")\n );\n }\n }\n return undefined;\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [state, name, controlled]);\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (!isControlled && defaultValue !== defaultProp) {\n console.error(\n [\n `Salt: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. ` +\n `To suppress this warning opt to use a controlled ${name}.`,\n ].join(\"\\n\")\n );\n }\n }\n return undefined;\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [JSON.stringify(defaultProp, ignoreReactElements)]);\n\n const setValueIfUncontrolled: Dispatch<SetStateAction<S>> = useCallback(\n (newValue) => {\n if (!isControlled) {\n setValue(newValue);\n }\n },\n [isControlled]\n );\n\n return [value, setValueIfUncontrolled, isControlled];\n}\n\n// Ignore ReactElements in JSON, they contain circular refs\nfunction ignoreReactElements<T>(key: string, value: T): T | null {\n return isValidElement(value) ? null : value;\n}\n"],"names":["useRef","useState","useEffect","useCallback","isValidElement"],"mappings":";;;;AAiCO,SAAS,aAAiB,CAAA;AAAA,EAC/B,UAAA;AAAA,EACA,OAAS,EAAA,WAAA;AAAA,EACT,IAAA;AAAA,EACA,KAAQ,GAAA;AACV,CAAqE,EAAA;AACnE,EAAA,MAAM,EAAE,OAAS,EAAA,YAAA,EAAiB,GAAAA,YAAA,CAAO,eAAe,KAAS,CAAA,CAAA;AACjE,EAAA,MAAM,CAAC,UAAA,EAAY,QAAQ,CAAA,GAAIC,eAAY,WAAW,CAAA;AACtD,EAAM,MAAA,KAAA,GAAQ,UAAe,KAAA,KAAA,CAAA,GAAY,UAAa,GAAA,UAAA;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,YAAa,EAAA,GAAID,aAAO,WAAW,CAAA;AAWpD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,MAAI,IAAA,YAAA,MAAkB,eAAe,KAAY,CAAA,CAAA,EAAA;AAC/C,QAAQ,OAAA,CAAA,KAAA;AAAA,UACN;AAAA,YACE,CAAA,kCAAA,EACE,YAAe,GAAA,EAAA,GAAK,IACtB,CAAA,WAAA,EAAc,KAAK,CAAA,UAAA,EAAa,IAAI,CAAA,OAAA,EAClC,YAAe,GAAA,IAAA,GAAO,EACxB,CAAA,WAAA,CAAA;AAAA,YACA,6EAAA;AAAA,YACA,qDAAqD,IAAI,CAAA,2CAAA,CAAA;AAAA,YAEzD,4HAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA,SACb;AAAA;AACF;AAEF,IAAO,OAAA,KAAA,CAAA;AAAA,GAEN,EAAA,CAAC,KAAO,EAAA,IAAA,EAAM,UAAU,CAAC,CAAA;AAE5B,EAAAA,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,MAAI,IAAA,CAAC,YAAgB,IAAA,YAAA,KAAiB,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,KAAA;AAAA,UACN;AAAA,YACE,CAA6C,0CAAA,EAAA,KAAK,CAA6B,0BAAA,EAAA,IAAI,8EAC7B,IAAI,CAAA,CAAA;AAAA,WAC5D,CAAE,KAAK,IAAI;AAAA,SACb;AAAA;AACF;AAEF,IAAO,OAAA,KAAA,CAAA;AAAA,KAEN,CAAC,IAAA,CAAK,UAAU,WAAa,EAAA,mBAAmB,CAAC,CAAC,CAAA;AAErD,EAAA,MAAM,sBAAsD,GAAAC,iBAAA;AAAA,IAC1D,CAAC,QAAa,KAAA;AACZ,MAAA,IAAI,CAAC,YAAc,EAAA;AACjB,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAA;AACnB,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAO,OAAA,CAAC,KAAO,EAAA,sBAAA,EAAwB,YAAY,CAAA;AACrD;AAGA,SAAS,mBAAA,CAAuB,KAAa,KAAoB,EAAA;AAC/D,EAAO,OAAAC,oBAAA,CAAe,KAAK,CAAA,GAAI,IAAO,GAAA,KAAA;AACxC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSelection.js","sources":["../../src/common-hooks/useSelection.ts"],"sourcesContent":["import {\n getElementByDataIndex,\n getElementDataIndex,\n isSelectableElement,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport {\n SelectionHookProps,\n SelectionHookResult,\n selectionIsDisallowed,\n} from \"./selectionTypes\";\nimport { useControlled } from \"./useControlled\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode,\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = ({\n containerRef,\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIndex,\n itemQuery,\n onClick,\n // label,\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect,\n}: SelectionHookProps): SelectionHookResult => {\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const [selected, setSelected] = useControlled<string[]>({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"UseSelection\",\n state: \"selected\",\n });\n\n const isItemSelected = useCallback(\n (itemId: string) => selected.includes(itemId),\n [selected],\n );\n\n const selectDeselectable = useCallback(\n (itemId: string) => (isItemSelected(itemId) ? [] : [itemId]),\n [isItemSelected],\n );\n const selectMultiple = useCallback(\n (itemId: string) => {\n const nextItems = isItemSelected(itemId)\n ? (selected as string[]).filter((i) => i !== itemId)\n : (selected as string[]).concat(itemId);\n nextItems.sort();\n return nextItems;\n },\n [isItemSelected, selected],\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as string[])\n : ([] as string[]);\n\n const [lastSelectedItemId] = (selected as string[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItemId\n ? getElementDataIndex(document.getElementById(lastSelectedItemId))\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n\n const container = containerRef.current as HTMLElement;\n const allItems = Array.from(\n container.querySelectorAll(itemQuery),\n ) as HTMLElement[];\n const rangeSelection = allItems\n .slice(startRegion, endRegion + 1)\n .map((el) => el.id);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort();\n return nextItems;\n },\n [containerRef, itemQuery, selected],\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean,\n ) => {\n const { current: container } = containerRef;\n const { id } = getElementByDataIndex(container, idx, true);\n\n let newSelected;\n if (isMultipleSelect) {\n newSelected = selectMultiple(id);\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(id);\n } else if (rangeSelect) {\n newSelected = selectRange(idx, preserveExistingSelection);\n } else {\n newSelected = [id];\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(id);\n } else {\n newSelected = [id];\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, id);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n containerRef,\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n setSelected,\n onSelectionChange,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (isSelectableElement(element)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIndex,\n false,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n }\n },\n [\n highlightedIndex,\n containerRef,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, currentIndex);\n if (isSelectableElement(element)) {\n selectItemAtIndex(evt, currentIndex, true);\n }\n }\n },\n [isExtendedSelect, containerRef, selectItemAtIndex],\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (!disableSelection && isSelectableElement(element)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIndex,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n onClick?.(evt);\n },\n [\n containerRef,\n highlightedIndex,\n disableSelection,\n onClick,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const listHandlers = selectionIsDisallowed(selectionStrategy)\n ? {\n onClick,\n }\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n return {\n listHandlers,\n selected,\n setSelected,\n };\n};\n"],"names":["useRef","useCallback","useControlled","getElementDataIndex","getElementByDataIndex","isSelectableElement","selectionIsDisallowed"],"mappings":"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"}
1
+ {"version":3,"file":"useSelection.js","sources":["../../src/common-hooks/useSelection.ts"],"sourcesContent":["import {\n getElementByDataIndex,\n getElementDataIndex,\n isSelectableElement,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport {\n SelectionHookProps,\n SelectionHookResult,\n selectionIsDisallowed,\n} from \"./selectionTypes\";\nimport { useControlled } from \"./useControlled\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode,\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = ({\n containerRef,\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIndex,\n itemQuery,\n onClick,\n // label,\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect,\n}: SelectionHookProps): SelectionHookResult => {\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const [selected, setSelected] = useControlled<string[]>({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"UseSelection\",\n state: \"selected\",\n });\n\n const isItemSelected = useCallback(\n (itemId: string) => selected.includes(itemId),\n [selected],\n );\n\n const selectDeselectable = useCallback(\n (itemId: string) => (isItemSelected(itemId) ? [] : [itemId]),\n [isItemSelected],\n );\n const selectMultiple = useCallback(\n (itemId: string) => {\n const nextItems = isItemSelected(itemId)\n ? (selected as string[]).filter((i) => i !== itemId)\n : (selected as string[]).concat(itemId);\n nextItems.sort();\n return nextItems;\n },\n [isItemSelected, selected],\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as string[])\n : ([] as string[]);\n\n const [lastSelectedItemId] = (selected as string[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItemId\n ? getElementDataIndex(document.getElementById(lastSelectedItemId))\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n\n const container = containerRef.current as HTMLElement;\n const allItems = Array.from(\n container.querySelectorAll(itemQuery),\n ) as HTMLElement[];\n const rangeSelection = allItems\n .slice(startRegion, endRegion + 1)\n .map((el) => el.id);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort();\n return nextItems;\n },\n [containerRef, itemQuery, selected],\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean,\n ) => {\n const { current: container } = containerRef;\n const { id } = getElementByDataIndex(container, idx, true);\n\n let newSelected;\n if (isMultipleSelect) {\n newSelected = selectMultiple(id);\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(id);\n } else if (rangeSelect) {\n newSelected = selectRange(idx, preserveExistingSelection);\n } else {\n newSelected = [id];\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(id);\n } else {\n newSelected = [id];\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, id);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n containerRef,\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n setSelected,\n onSelectionChange,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (isSelectableElement(element)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIndex,\n false,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n }\n },\n [\n highlightedIndex,\n containerRef,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, currentIndex);\n if (isSelectableElement(element)) {\n selectItemAtIndex(evt, currentIndex, true);\n }\n }\n },\n [isExtendedSelect, containerRef, selectItemAtIndex],\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (!disableSelection && isSelectableElement(element)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIndex,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n onClick?.(evt);\n },\n [\n containerRef,\n highlightedIndex,\n disableSelection,\n onClick,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const listHandlers = selectionIsDisallowed(selectionStrategy)\n ? {\n onClick,\n }\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n return {\n listHandlers,\n selected,\n setSelected,\n };\n};\n"],"names":["useRef","useCallback","useControlled","getElementDataIndex","getElementByDataIndex","isSelectableElement","selectionIsDisallowed"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CycleStateButton.js","sources":["../../src/cycle-state-button/CycleStateButton.tsx"],"sourcesContent":["import { Button, ButtonProps } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport type {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ForwardedRef, forwardRef, SyntheticEvent, useCallback } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\n\nconst classBase = \"vuuCycleStateButton\";\n\nexport interface CycleStateButtonProps extends Omit<ButtonProps, \"onChange\"> {\n onChange?: (value: VuuRowDataItemType) => void;\n onCommit?: CommitHandler<HTMLButtonElement>;\n values: string[];\n value: string;\n}\n\nconst getNextValue = (value: string, valueList: string[]) => {\n const index = valueList\n .map((v) => v.toUpperCase())\n .indexOf(value.toUpperCase());\n if (index === valueList.length - 1) {\n return valueList[0];\n } else {\n return valueList[index + 1];\n }\n};\n\nexport const CycleStateButton = forwardRef(function CycleStateButton(\n {\n className,\n onChange,\n onCommit,\n value = \"\",\n values,\n ...buttonProps\n }: CycleStateButtonProps,\n forwardedRef: ForwardedRef<HTMLButtonElement>,\n) {\n const handleClick = useCallback(\n async (evt: SyntheticEvent<HTMLButtonElement>) => {\n const nextValue = getNextValue(value, values);\n onChange?.(nextValue);\n onCommit?.(evt, nextValue as VuuColumnDataType);\n },\n [onChange, onCommit, value, values],\n );\n\n return (\n <Button\n {...buttonProps}\n className={cx(\n classBase,\n className,\n `${classBase}-${value.toLowerCase()}`,\n )}\n onClick={handleClick}\n ref={forwardedRef}\n >\n {value}\n </Button>\n );\n});\n"],"names":["forwardRef","CycleStateButton","useCallback","jsx","Button"],"mappings":";;;;;;;AASA,MAAM,SAAY,GAAA,qBAAA,CAAA;AASlB,MAAM,YAAA,GAAe,CAAC,KAAA,EAAe,SAAwB,KAAA;AAC3D,EAAA,MAAM,KAAQ,GAAA,SAAA,CACX,GAAI,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,WAAY,EAAC,CAC1B,CAAA,OAAA,CAAQ,KAAM,CAAA,WAAA,EAAa,CAAA,CAAA;AAC9B,EAAI,IAAA,KAAA,KAAU,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA;AAClC,IAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,GACb,MAAA;AACL,IAAO,OAAA,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA,CAAA;AAEa,MAAA,gBAAA,GAAmBA,gBAAW,CAAA,SAASC,iBAClD,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAQ,GAAA,EAAA;AAAA,EACR,MAAA;AAAA,EACA,GAAG,WAAA;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,WAAc,GAAAC,iBAAA;AAAA,IAClB,OAAO,GAA2C,KAAA;AAChD,MAAM,MAAA,SAAA,GAAY,YAAa,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AAC5C,MAAA,QAAA,GAAW,SAAS,CAAA,CAAA;AACpB,MAAA,QAAA,GAAW,KAAK,SAA8B,CAAA,CAAA;AAAA,KAChD;AAAA,IACA,CAAC,QAAA,EAAU,QAAU,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA,GACpC,CAAA;AAEA,EACE,uBAAAC,cAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,SAAW,EAAA,EAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAG,EAAA,SAAS,CAAI,CAAA,EAAA,KAAA,CAAM,aAAa,CAAA,CAAA;AAAA,OACrC;AAAA,MACA,OAAS,EAAA,WAAA;AAAA,MACT,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA,KAAA;AAAA,KAAA;AAAA,GACH,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"CycleStateButton.js","sources":["../../src/cycle-state-button/CycleStateButton.tsx"],"sourcesContent":["import { Button, ButtonProps } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport type {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ForwardedRef, forwardRef, SyntheticEvent, useCallback } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\n\nconst classBase = \"vuuCycleStateButton\";\n\nexport type CycleStateButtonChangeHandler = (value: VuuRowDataItemType) => void;\n\nexport interface CycleStateButtonProps extends Omit<ButtonProps, \"onChange\"> {\n onChange?: CycleStateButtonChangeHandler;\n onCommit?: CommitHandler<HTMLButtonElement>;\n values: string[];\n value: string;\n}\n\nconst getNextValue = (value: string, valueList: string[]) => {\n const index = valueList\n .map((v) => v.toUpperCase())\n .indexOf(value.toUpperCase());\n if (index === valueList.length - 1) {\n return valueList[0];\n } else {\n return valueList[index + 1];\n }\n};\n\nexport const CycleStateButton = forwardRef(function CycleStateButton(\n {\n className,\n onChange,\n onCommit,\n value = \"\",\n values,\n ...buttonProps\n }: CycleStateButtonProps,\n forwardedRef: ForwardedRef<HTMLButtonElement>,\n) {\n const handleClick = useCallback(\n async (evt: SyntheticEvent<HTMLButtonElement>) => {\n const nextValue = getNextValue(value, values);\n onChange?.(nextValue);\n onCommit?.(evt, nextValue as VuuColumnDataType);\n },\n [onChange, onCommit, value, values],\n );\n\n return (\n <Button\n {...buttonProps}\n className={cx(\n classBase,\n className,\n `${classBase}-${value.toLowerCase()}`,\n )}\n onClick={handleClick}\n ref={forwardedRef}\n >\n {value}\n </Button>\n );\n});\n"],"names":["forwardRef","CycleStateButton","useCallback","jsx","Button"],"mappings":";;;;;;;AASA,MAAM,SAAY,GAAA,qBAAA;AAWlB,MAAM,YAAA,GAAe,CAAC,KAAA,EAAe,SAAwB,KAAA;AAC3D,EAAA,MAAM,KAAQ,GAAA,SAAA,CACX,GAAI,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,WAAY,EAAC,CAC1B,CAAA,OAAA,CAAQ,KAAM,CAAA,WAAA,EAAa,CAAA;AAC9B,EAAI,IAAA,KAAA,KAAU,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA;AAClC,IAAA,OAAO,UAAU,CAAC,CAAA;AAAA,GACb,MAAA;AACL,IAAO,OAAA,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA;AAE9B,CAAA;AAEa,MAAA,gBAAA,GAAmBA,gBAAW,CAAA,SAASC,iBAClD,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAQ,GAAA,EAAA;AAAA,EACR,MAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,WAAc,GAAAC,iBAAA;AAAA,IAClB,OAAO,GAA2C,KAAA;AAChD,MAAM,MAAA,SAAA,GAAY,YAAa,CAAA,KAAA,EAAO,MAAM,CAAA;AAC5C,MAAA,QAAA,GAAW,SAAS,CAAA;AACpB,MAAA,QAAA,GAAW,KAAK,SAA8B,CAAA;AAAA,KAChD;AAAA,IACA,CAAC,QAAA,EAAU,QAAU,EAAA,KAAA,EAAO,MAAM;AAAA,GACpC;AAEA,EACE,uBAAAC,cAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,SAAW,EAAA,EAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAG,EAAA,SAAS,CAAI,CAAA,EAAA,KAAA,CAAM,aAAa,CAAA;AAAA,OACrC;AAAA,MACA,OAAS,EAAA,WAAA;AAAA,MACT,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DateInput.js","sources":["../../src/date-input/DateInput.tsx"],"sourcesContent":["import { 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 RefObject,\n type SyntheticEvent,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n CalendarDate,\n DateFormatter,\n type DateValue,\n getLocalTimeZone,\n parseAbsoluteToLocal,\n} from \"@internationalized/date\";\nimport {\n StatusAdornment,\n makePrefixer,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport {\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { useDatePickerContext } from \"../date-picker/DatePickerContext\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\nconst isInvalidDate = (value: string) =>\n value && Number.isNaN(new Date(value).getDay());\nconst createDate = (date: string): Date | null => {\n if (!date || isInvalidDate(date)) {\n return null;\n }\n return new Date(date);\n};\n\nconst getIsoDate = (date: Date) => {\n try {\n return parseAbsoluteToLocal(date?.toISOString());\n } catch (err) {\n return undefined;\n }\n};\n\nfunction getCalendarDate(inputDate: string) {\n const date = createDate(inputDate);\n if (!date) return undefined;\n const isoDate = getIsoDate(date);\n return isoDate && new CalendarDate(isoDate.year, isoDate.month, isoDate.day);\n}\n\nconst defaultDateFormatter = (date: DateValue | undefined): string => {\n return date\n ? new DateFormatter(\"EN-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n }).format(date.toDate(getLocalTimeZone()))\n : \"\";\n};\n\nexport interface DateInputProps<SelectionVariantType>\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\" | \"onChange\">,\n Pick<ComponentPropsWithoutRef<\"input\">, \"disabled\" | \"placeholder\"> {\n ariaLabel?: string;\n /**\n * The marker to use in an empty read only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component\n */\n endAdornment?: ReactNode;\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes) applied to the `input` elements.\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read only.\n */\n readOnly?: boolean;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Styling variant with full border. Defaults to false\n */\n bordered?: boolean;\n /**\n * Function to format the input value.\n */\n dateFormatter?: (input: DateValue | undefined) => string;\n /**\n * Reference for the startInput;\n */\n startInputRef?: RefObject<HTMLInputElement>;\n /**\n * Reference for the endInput;\n */\n endInputRef?: RefObject<HTMLInputElement>;\n /**\n * Selection variant. Defaults to single select.\n */\n selectionVariant?: \"default\" | \"range\";\n /**\n * Callback fired when the selected date change.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n /**\n * Callback fired when the input value change.\n */\n onChange?: SelectionVariantType extends SingleSelectionValueType\n ? (\n event: ChangeEvent<HTMLInputElement>,\n selectedDateInputValue?: string,\n ) => void\n : (\n event: ChangeEvent<HTMLInputElement>,\n startDateInputValue?: string,\n endDateInputValue?: string,\n ) => void;\n}\n\nexport const DateInput = forwardRef<\n HTMLDivElement,\n DateInputProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DateInput(\n {\n className,\n disabled,\n \"aria-label\": ariaLabel,\n selectionVariant: selectionVariantProp,\n emptyReadOnlyMarker = \"—\",\n inputProps = {},\n endAdornment,\n readOnly: readOnlyProp,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n bordered = false,\n dateFormatter = defaultDateFormatter,\n placeholder = \"dd mmm yyyy\",\n startInputRef,\n endInputRef,\n onSelectionChange,\n onChange,\n ...rest\n },\n ref,\n) {\n const wrapperRef = useRef(null);\n const inputRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n const inputStringFormatter = (input: string): string => {\n const date = getCalendarDate(input);\n return !input || !date ? input : dateFormatter(date);\n };\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dateInput\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const {\n selectedDate,\n setSelectedDate,\n selectionVariant: pickerSelectionVariant,\n openState,\n setOpen,\n } = useDatePickerContext();\n\n const selectionVariant = selectionVariantProp ?? pickerSelectionVariant;\n const isRangePicker =\n isRangeOrOffsetSelectionWithStartDate(selectedDate) ||\n selectionVariant === \"range\";\n\n const endDateInputID = useId();\n const startDateInputID = useId();\n\n const [focused, setFocused] = useState(false);\n const [startDateStringValue, setStartDateStringValue] = useState<string>(\n dateFormatter(\n isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.startDate\n : selectedDate,\n ),\n );\n const [endDateStringValue, setEndDateStringValue] = useState<string>(\n dateFormatter(\n isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.endDate\n : undefined,\n ),\n );\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 isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": dateInputDescribedBy,\n \"aria-labelledby\": dateInputLabelledBy,\n onBlur,\n onKeyDown,\n onFocus,\n required: dateInputPropsRequired,\n ...restDateInputProps\n } = inputProps;\n\n // Update date strings when dates change\n useEffect(() => {\n if (isRangeOrOffsetSelectionWithStartDate(selectedDate)) {\n selectedDate?.startDate &&\n setStartDateStringValue(dateFormatter(selectedDate?.startDate));\n selectedDate?.endDate &&\n setEndDateStringValue(dateFormatter(selectedDate?.endDate));\n } else {\n setStartDateStringValue(dateFormatter(selectedDate));\n }\n }, [selectedDate, dateFormatter]);\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : dateInputPropsRequired;\n const updateStartDate = (event: SyntheticEvent, dateString: string) => {\n const inputDate = inputStringFormatter(dateString);\n const calendarDate = getCalendarDate(inputDate);\n const newSelectedDate = isRangePicker\n ? { ...selectedDate, startDate: calendarDate }\n : calendarDate;\n setSelectedDate(newSelectedDate);\n onSelectionChange?.(event, newSelectedDate);\n };\n\n const updateEndDate = (event: SyntheticEvent, dateString: string) => {\n const inputDate = inputStringFormatter(dateString);\n const calendarDate = getCalendarDate(inputDate);\n const newSelectedDate = { ...selectedDate, endDate: calendarDate };\n setSelectedDate(newSelectedDate);\n onSelectionChange?.(event, newSelectedDate);\n };\n\n // Handlers\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n onFocus?.(event);\n setFocused(true);\n };\n const handleStartDateBlur = (event: FocusEvent<HTMLInputElement>) => {\n updateStartDate(event, event.target.value);\n setFocused(false);\n };\n\n const handleStartDateChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newStartValue = event.target.value;\n setStartDateStringValue(newStartValue);\n onChange?.(event, newStartValue, endDateStringValue);\n };\n\n const handleStartDateKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n updateStartDate(event, startDateStringValue);\n setOpen(false);\n }\n if (event.key === \"Tab\" && event.shiftKey && openState) {\n setOpen(false);\n }\n };\n\n const handleEndDateBlur = (event: FocusEvent<HTMLInputElement>) => {\n updateEndDate(event, event.target.value);\n setFocused(false);\n };\n const handleEndDateChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newEndValue = event.target.value;\n setEndDateStringValue(newEndValue);\n onChange?.(event, startDateStringValue, newEndValue);\n };\n const handleEndDateKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n updateEndDate(event, endDateStringValue);\n setOpen(false);\n }\n };\n\n const handleInputClick = (event: SyntheticEvent<HTMLDivElement>) => {\n if (event.target === wrapperRef.current) {\n startInputRef?.current?.focus();\n }\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\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 className,\n )}\n onClick={(event) => handleInputClick(event)}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n ref={inputRef}\n {...rest}\n >\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(formFieldDescribedBy, dateInputDescribedBy)}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n dateInputLabelledBy,\n startDateInputID,\n )}\n aria-label={clsx(\"Start date\", ariaLabel)}\n id={startDateInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={startInputRef}\n tabIndex={isDisabled ? -1 : 0}\n onBlur={handleStartDateBlur}\n onChange={handleStartDateChange}\n onKeyDown={handleStartDateKeyDown}\n onFocus={!isDisabled ? handleFocus : undefined}\n placeholder={placeholder}\n size={placeholder.length}\n value={\n isReadOnly && !startDateStringValue\n ? emptyReadOnlyMarker\n : startDateStringValue\n }\n {...restDateInputProps}\n required={isRequired}\n />\n {selectionVariant === \"range\" && (\n <>\n <span>-</span>\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(formFieldDescribedBy, dateInputDescribedBy)}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n dateInputLabelledBy,\n endDateInputID,\n )}\n aria-label={clsx(\"End date\", ariaLabel)}\n id={endDateInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={endInputRef}\n tabIndex={isDisabled ? -1 : 0}\n onBlur={handleEndDateBlur}\n onChange={handleEndDateChange}\n onKeyDown={handleEndDateKeyDown}\n onFocus={!isDisabled ? handleFocus : undefined}\n placeholder={placeholder}\n size={placeholder.length}\n value={\n isReadOnly && !endDateStringValue\n ? emptyReadOnlyMarker\n : endDateStringValue\n }\n required={isRequired}\n {...restDateInputProps}\n />\n </>\n )}\n {\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && !isReadOnly && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n }\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n});\n"],"names":["makePrefixer","date","parseAbsoluteToLocal","CalendarDate","DateFormatter","getLocalTimeZone","forwardRef","DateInput","useRef","useForkRef","useWindow","useComponentCssInjection","dateInputCss","useDatePickerContext","isRangeOrOffsetSelectionWithStartDate","useId","useState","useFormFieldProps","useEffect","jsxs","clsx","jsx","Fragment","StatusAdornment"],"mappings":";;;;;;;;;;;;;;;;AAwCA,MAAM,YAAA,GAAeA,kBAAa,eAAe,CAAA,CAAA;AACjD,MAAM,aAAA,GAAgB,CAAC,KAAA,KACrB,KAAS,IAAA,MAAA,CAAO,KAAM,CAAA,IAAI,IAAK,CAAA,KAAK,CAAE,CAAA,MAAA,EAAQ,CAAA,CAAA;AAChD,MAAM,UAAA,GAAa,CAAC,IAA8B,KAAA;AAChD,EAAA,IAAI,CAAC,IAAA,IAAQ,aAAc,CAAA,IAAI,CAAG,EAAA;AAChC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,IAAI,KAAK,IAAI,CAAA,CAAA;AACtB,CAAA,CAAA;AAEA,MAAM,UAAA,GAAa,CAACC,MAAe,KAAA;AACjC,EAAI,IAAA;AACF,IAAO,OAAAC,yBAAA,CAAqBD,MAAM,EAAA,WAAA,EAAa,CAAA,CAAA;AAAA,WACxC,GAAK,EAAA;AACZ,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,SAAS,gBAAgB,SAAmB,EAAA;AAC1C,EAAM,MAAAA,MAAA,GAAO,WAAW,SAAS,CAAA,CAAA;AACjC,EAAI,IAAA,CAACA,QAAa,OAAA,KAAA,CAAA,CAAA;AAClB,EAAM,MAAA,OAAA,GAAU,WAAWA,MAAI,CAAA,CAAA;AAC/B,EAAO,OAAA,OAAA,IAAW,IAAIE,iBAAa,CAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,KAAA,EAAO,QAAQ,GAAG,CAAA,CAAA;AAC7E,CAAA;AAEA,MAAM,oBAAA,GAAuB,CAACF,MAAwC,KAAA;AACpE,EAAO,OAAAA,MAAA,GACH,IAAIG,kBAAA,CAAc,OAAS,EAAA;AAAA,IACzB,GAAK,EAAA,SAAA;AAAA,IACL,KAAO,EAAA,OAAA;AAAA,IACP,IAAM,EAAA,SAAA;AAAA,GACP,EAAE,MAAO,CAAAH,MAAA,CAAK,OAAOI,qBAAiB,EAAC,CAAC,CACzC,GAAA,EAAA,CAAA;AACN,CAAA,CAAA;AAyEa,MAAA,SAAA,GAAYC,gBAGvB,CAAA,SAASC,UACT,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAc,EAAA,SAAA;AAAA,EACd,gBAAkB,EAAA,oBAAA;AAAA,EAClB,mBAAsB,GAAA,QAAA;AAAA,EACtB,aAAa,EAAC;AAAA,EACd,YAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,gBAAkB,EAAA,oBAAA;AAAA,EAClB,OAAU,GAAA,SAAA;AAAA,EACV,QAAW,GAAA,KAAA;AAAA,EACX,aAAgB,GAAA,oBAAA;AAAA,EAChB,WAAc,GAAA,aAAA;AAAA,EACd,aAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG,IAAA;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAM,MAAA,UAAA,GAAaC,aAAO,IAAI,CAAA,CAAA;AAC9B,EAAM,MAAA,QAAA,GAAWC,eAA2B,CAAA,GAAA,EAAK,UAAU,CAAA,CAAA;AAC3D,EAAM,MAAA,oBAAA,GAAuB,CAAC,KAA0B,KAAA;AACtD,IAAM,MAAA,IAAA,GAAO,gBAAgB,KAAK,CAAA,CAAA;AAClC,IAAA,OAAO,CAAC,KAAS,IAAA,CAAC,IAAO,GAAA,KAAA,GAAQ,cAAc,IAAI,CAAA,CAAA;AAAA,GACrD,CAAA;AACA,EAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,WAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAkB,EAAA,sBAAA;AAAA,IAClB,SAAA;AAAA,IACA,OAAA;AAAA,MACEC,sCAAqB,EAAA,CAAA;AAEzB,EAAA,MAAM,mBAAmB,oBAAwB,IAAA,sBAAA,CAAA;AACjD,EAAA,MAAM,aACJ,GAAAC,kDAAA,CAAsC,YAAY,CAAA,IAClD,gBAAqB,KAAA,OAAA,CAAA;AAEvB,EAAA,MAAM,iBAAiBC,UAAM,EAAA,CAAA;AAC7B,EAAA,MAAM,mBAAmBA,UAAM,EAAA,CAAA;AAE/B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA,CAAA;AAC5C,EAAM,MAAA,CAAC,oBAAsB,EAAA,uBAAuB,CAAI,GAAAA,cAAA;AAAA,IACtD,aAAA;AAAA,MACEF,kDAAsC,CAAA,YAAY,CAC9C,GAAA,YAAA,EAAc,SACd,GAAA,YAAA;AAAA,KACN;AAAA,GACF,CAAA;AACA,EAAM,MAAA,CAAC,kBAAoB,EAAA,qBAAqB,CAAI,GAAAE,cAAA;AAAA,IAClD,aAAA;AAAA,MACEF,kDAAsC,CAAA,YAAY,CAC9C,GAAA,YAAA,EAAc,OACd,GAAA,KAAA,CAAA;AAAA,KACN;AAAA,GACF,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,SAAW,EAAA;AAAA,MACT,kBAAoB,EAAA,oBAAA;AAAA,MACpB,iBAAmB,EAAA,mBAAA;AAAA,QACjB,EAAC;AAAA,IACL,QAAU,EAAA,iBAAA;AAAA,IACV,QAAU,EAAA,iBAAA;AAAA,IACV,SAAW,EAAA,iBAAA;AAAA,IACX,gBAAkB,EAAA,yBAAA;AAAA,MAChBG,sBAAkB,EAAA,CAAA;AAEtB,EAAA,MAAM,aAAa,YAAgB,IAAA,iBAAA,CAAA;AACnC,EAAA,MAAM,aAAa,QAAY,IAAA,iBAAA,CAAA;AAE/B,EAAA,MAAM,mBAAmB,yBAA6B,IAAA,oBAAA,CAAA;AAEtD,EAAM,MAAA;AAAA,IACJ,kBAAoB,EAAA,oBAAA;AAAA,IACpB,iBAAmB,EAAA,mBAAA;AAAA,IACnB,MAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAU,EAAA,sBAAA;AAAA,IACV,GAAG,kBAAA;AAAA,GACD,GAAA,UAAA,CAAA;AAGJ,EAAAC,eAAA,CAAU,MAAM;AACd,IAAI,IAAAJ,kDAAA,CAAsC,YAAY,CAAG,EAAA;AACvD,MAAA,YAAA,EAAc,SACZ,IAAA,uBAAA,CAAwB,aAAc,CAAA,YAAA,EAAc,SAAS,CAAC,CAAA,CAAA;AAChE,MAAA,YAAA,EAAc,OACZ,IAAA,qBAAA,CAAsB,aAAc,CAAA,YAAA,EAAc,OAAO,CAAC,CAAA,CAAA;AAAA,KACvD,MAAA;AACL,MAAwB,uBAAA,CAAA,aAAA,CAAc,YAAY,CAAC,CAAA,CAAA;AAAA,KACrD;AAAA,GACC,EAAA,CAAC,YAAc,EAAA,aAAa,CAAC,CAAA,CAAA;AAEhC,EAAM,MAAA,UAAA,GAAa,oBACf,CAAC,UAAA,EAAY,UAAU,CAAE,CAAA,QAAA,CAAS,iBAAiB,CACnD,GAAA,sBAAA,CAAA;AACJ,EAAM,MAAA,eAAA,GAAkB,CAAC,KAAA,EAAuB,UAAuB,KAAA;AACrE,IAAM,MAAA,SAAA,GAAY,qBAAqB,UAAU,CAAA,CAAA;AACjD,IAAM,MAAA,YAAA,GAAe,gBAAgB,SAAS,CAAA,CAAA;AAC9C,IAAA,MAAM,kBAAkB,aACpB,GAAA,EAAE,GAAG,YAAc,EAAA,SAAA,EAAW,cAC9B,GAAA,YAAA,CAAA;AACJ,IAAA,eAAA,CAAgB,eAAe,CAAA,CAAA;AAC/B,IAAA,iBAAA,GAAoB,OAAO,eAAe,CAAA,CAAA;AAAA,GAC5C,CAAA;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,KAAA,EAAuB,UAAuB,KAAA;AACnE,IAAM,MAAA,SAAA,GAAY,qBAAqB,UAAU,CAAA,CAAA;AACjD,IAAM,MAAA,YAAA,GAAe,gBAAgB,SAAS,CAAA,CAAA;AAC9C,IAAA,MAAM,eAAkB,GAAA,EAAE,GAAG,YAAA,EAAc,SAAS,YAAa,EAAA,CAAA;AACjE,IAAA,eAAA,CAAgB,eAAe,CAAA,CAAA;AAC/B,IAAA,iBAAA,GAAoB,OAAO,eAAe,CAAA,CAAA;AAAA,GAC5C,CAAA;AAGA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAwC,KAAA;AAC3D,IAAA,OAAA,GAAU,KAAK,CAAA,CAAA;AACf,IAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,GACjB,CAAA;AACA,EAAM,MAAA,mBAAA,GAAsB,CAAC,KAAwC,KAAA;AACnE,IAAgB,eAAA,CAAA,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACzC,IAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,GAClB,CAAA;AAEA,EAAM,MAAA,qBAAA,GAAwB,CAAC,KAAyC,KAAA;AACtE,IAAM,MAAA,aAAA,GAAgB,MAAM,MAAO,CAAA,KAAA,CAAA;AACnC,IAAA,uBAAA,CAAwB,aAAa,CAAA,CAAA;AACrC,IAAW,QAAA,GAAA,KAAA,EAAO,eAAe,kBAAkB,CAAA,CAAA;AAAA,GACrD,CAAA;AAEA,EAAM,MAAA,sBAAA,GAAyB,CAAC,KAA2C,KAAA;AACzE,IAAI,IAAA,KAAA,CAAM,QAAQ,OAAS,EAAA;AACzB,MAAA,eAAA,CAAgB,OAAO,oBAAoB,CAAA,CAAA;AAC3C,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,KACf;AACA,IAAA,IAAI,KAAM,CAAA,GAAA,KAAQ,KAAS,IAAA,KAAA,CAAM,YAAY,SAAW,EAAA;AACtD,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,KACf;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,KAAwC,KAAA;AACjE,IAAc,aAAA,CAAA,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACvC,IAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,GAClB,CAAA;AACA,EAAM,MAAA,mBAAA,GAAsB,CAAC,KAAyC,KAAA;AACpE,IAAM,MAAA,WAAA,GAAc,MAAM,MAAO,CAAA,KAAA,CAAA;AACjC,IAAA,qBAAA,CAAsB,WAAW,CAAA,CAAA;AACjC,IAAW,QAAA,GAAA,KAAA,EAAO,sBAAsB,WAAW,CAAA,CAAA;AAAA,GACrD,CAAA;AACA,EAAM,MAAA,oBAAA,GAAuB,CAAC,KAA2C,KAAA;AACvE,IAAI,IAAA,KAAA,CAAM,QAAQ,OAAS,EAAA;AACzB,MAAA,aAAA,CAAc,OAAO,kBAAkB,CAAA,CAAA;AACvC,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,KACf;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAA0C,KAAA;AAClE,IAAI,IAAA,KAAA,CAAM,MAAW,KAAA,UAAA,CAAW,OAAS,EAAA;AACvC,MAAA,aAAA,EAAe,SAAS,KAAM,EAAA,CAAA;AAAA,KAChC;AAAA,GACF,CAAA;AAEA,EACE,uBAAAK,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAC,OAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb,aAAa,OAAO,CAAA;AAAA,QACpB;AAAA,UACE,CAAC,YAAa,CAAA,SAAS,CAAC,GAAG,CAAC,UAAc,IAAA,OAAA;AAAA,UAC1C,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,UAAA;AAAA,UAC5B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,UAAA;AAAA,UAC5B,CAAC,YAAA,CAAa,gBAAoB,IAAA,EAAE,CAAC,GAAG,gBAAA;AAAA,UACxC,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,SAC9B;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,OAAS,EAAA,CAAC,KAAU,KAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,MAC1C,SAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAK,EAAA,QAAA;AAAA,MACJ,GAAG,IAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,YAAa,EAAA,KAAA;AAAA,YACb,kBAAA,EAAkBD,OAAK,CAAA,oBAAA,EAAsB,oBAAoB,CAAA;AAAA,YACjE,iBAAiB,EAAAA,OAAA;AAAA,cACf,mBAAA;AAAA,cACA,mBAAA;AAAA,cACA,gBAAA;AAAA,aACF;AAAA,YACA,YAAA,EAAYA,OAAK,CAAA,YAAA,EAAc,SAAS,CAAA;AAAA,YACxC,EAAI,EAAA,gBAAA;AAAA,YACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,YAC/B,QAAU,EAAA,UAAA;AAAA,YACV,QAAU,EAAA,UAAA;AAAA,YACV,GAAK,EAAA,aAAA;AAAA,YACL,QAAA,EAAU,aAAa,CAAK,CAAA,GAAA,CAAA;AAAA,YAC5B,MAAQ,EAAA,mBAAA;AAAA,YACR,QAAU,EAAA,qBAAA;AAAA,YACV,SAAW,EAAA,sBAAA;AAAA,YACX,OAAA,EAAS,CAAC,UAAA,GAAa,WAAc,GAAA,KAAA,CAAA;AAAA,YACrC,WAAA;AAAA,YACA,MAAM,WAAY,CAAA,MAAA;AAAA,YAClB,KACE,EAAA,UAAA,IAAc,CAAC,oBAAA,GACX,mBACA,GAAA,oBAAA;AAAA,YAEL,GAAG,kBAAA;AAAA,YACJ,QAAU,EAAA,UAAA;AAAA,WAAA;AAAA,SACZ;AAAA,QACC,gBAAA,KAAqB,2BAElBD,eAAA,CAAAG,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAAD,cAAA,CAAC,UAAK,QAAC,EAAA,GAAA,EAAA,CAAA;AAAA,0BACPA,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,YAAa,EAAA,KAAA;AAAA,cACb,kBAAA,EAAkBD,OAAK,CAAA,oBAAA,EAAsB,oBAAoB,CAAA;AAAA,cACjE,iBAAiB,EAAAA,OAAA;AAAA,gBACf,mBAAA;AAAA,gBACA,mBAAA;AAAA,gBACA,cAAA;AAAA,eACF;AAAA,cACA,YAAA,EAAYA,OAAK,CAAA,UAAA,EAAY,SAAS,CAAA;AAAA,cACtC,EAAI,EAAA,cAAA;AAAA,cACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAC/B,QAAU,EAAA,UAAA;AAAA,cACV,QAAU,EAAA,UAAA;AAAA,cACV,GAAK,EAAA,WAAA;AAAA,cACL,QAAA,EAAU,aAAa,CAAK,CAAA,GAAA,CAAA;AAAA,cAC5B,MAAQ,EAAA,iBAAA;AAAA,cACR,QAAU,EAAA,mBAAA;AAAA,cACV,SAAW,EAAA,oBAAA;AAAA,cACX,OAAA,EAAS,CAAC,UAAA,GAAa,WAAc,GAAA,KAAA,CAAA;AAAA,cACrC,WAAA;AAAA,cACA,MAAM,WAAY,CAAA,MAAA;AAAA,cAClB,KACE,EAAA,UAAA,IAAc,CAAC,kBAAA,GACX,mBACA,GAAA,kBAAA;AAAA,cAEN,QAAU,EAAA,UAAA;AAAA,cACT,GAAG,kBAAA;AAAA,aAAA;AAAA,WACN;AAAA,SACF,EAAA,CAAA;AAAA,wBAGCD,eAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,YAAA,CAAa,uBAAuB,CACjD,EAAA,QAAA,EAAA;AAAA,UAAA,CAAC,cAAc,CAAC,UAAA,IAAc,oCAC5BE,cAAA,CAAAE,oBAAA,EAAA,EAAgB,QAAQ,gBAAkB,EAAA,CAAA;AAAA,UAE5C,YAAA;AAAA,SACH,EAAA,CAAA;AAAA,wBAEDF,cAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,YAAA,CAAa,qBAAqB,CAAG,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GACvD,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"DateInput.js","sources":["../../src/date-input/DateInput.tsx"],"sourcesContent":["import { 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 RefObject,\n type SyntheticEvent,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n CalendarDate,\n DateFormatter,\n type DateValue,\n getLocalTimeZone,\n parseAbsoluteToLocal,\n} from \"@internationalized/date\";\nimport {\n StatusAdornment,\n makePrefixer,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport {\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { useDatePickerContext } from \"../date-picker/DatePickerContext\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\nconst isInvalidDate = (value: string) =>\n value && Number.isNaN(new Date(value).getDay());\nconst createDate = (date: string): Date | null => {\n if (!date || isInvalidDate(date)) {\n return null;\n }\n return new Date(date);\n};\n\nconst getIsoDate = (date: Date) => {\n try {\n return parseAbsoluteToLocal(date?.toISOString());\n } catch (err) {\n return undefined;\n }\n};\n\nfunction getCalendarDate(inputDate: string) {\n const date = createDate(inputDate);\n if (!date) return undefined;\n const isoDate = getIsoDate(date);\n return isoDate && new CalendarDate(isoDate.year, isoDate.month, isoDate.day);\n}\n\nconst defaultDateFormatter = (date: DateValue | undefined): string => {\n return date\n ? new DateFormatter(\"EN-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n }).format(date.toDate(getLocalTimeZone()))\n : \"\";\n};\n\nexport interface DateInputProps<SelectionVariantType>\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\" | \"onChange\">,\n Pick<ComponentPropsWithoutRef<\"input\">, \"disabled\" | \"placeholder\"> {\n ariaLabel?: string;\n /**\n * The marker to use in an empty read only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component\n */\n endAdornment?: ReactNode;\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes) applied to the `input` elements.\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read only.\n */\n readOnly?: boolean;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Styling variant with full border. Defaults to false\n */\n bordered?: boolean;\n /**\n * Function to format the input value.\n */\n dateFormatter?: (input: DateValue | undefined) => string;\n /**\n * Reference for the startInput;\n */\n startInputRef?: RefObject<HTMLInputElement>;\n /**\n * Reference for the endInput;\n */\n endInputRef?: RefObject<HTMLInputElement>;\n /**\n * Selection variant. Defaults to single select.\n */\n selectionVariant?: \"default\" | \"range\";\n /**\n * Callback fired when the selected date change.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n /**\n * Callback fired when the input value change.\n */\n onChange?: SelectionVariantType extends SingleSelectionValueType\n ? (\n event: ChangeEvent<HTMLInputElement>,\n selectedDateInputValue?: string,\n ) => void\n : (\n event: ChangeEvent<HTMLInputElement>,\n startDateInputValue?: string,\n endDateInputValue?: string,\n ) => void;\n}\n\nexport const DateInput = forwardRef<\n HTMLDivElement,\n DateInputProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DateInput(\n {\n className,\n disabled,\n \"aria-label\": ariaLabel,\n selectionVariant: selectionVariantProp,\n emptyReadOnlyMarker = \"—\",\n inputProps = {},\n endAdornment,\n readOnly: readOnlyProp,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n bordered = false,\n dateFormatter = defaultDateFormatter,\n placeholder = \"dd mmm yyyy\",\n startInputRef,\n endInputRef,\n onSelectionChange,\n onChange,\n ...rest\n },\n ref,\n) {\n const wrapperRef = useRef(null);\n const inputRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n const inputStringFormatter = (input: string): string => {\n const date = getCalendarDate(input);\n return !input || !date ? input : dateFormatter(date);\n };\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dateInput\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const {\n selectedDate,\n setSelectedDate,\n selectionVariant: pickerSelectionVariant,\n openState,\n setOpen,\n } = useDatePickerContext();\n\n const selectionVariant = selectionVariantProp ?? pickerSelectionVariant;\n const isRangePicker =\n isRangeOrOffsetSelectionWithStartDate(selectedDate) ||\n selectionVariant === \"range\";\n\n const endDateInputID = useId();\n const startDateInputID = useId();\n\n const [focused, setFocused] = useState(false);\n const [startDateStringValue, setStartDateStringValue] = useState<string>(\n dateFormatter(\n isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.startDate\n : selectedDate,\n ),\n );\n const [endDateStringValue, setEndDateStringValue] = useState<string>(\n dateFormatter(\n isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.endDate\n : undefined,\n ),\n );\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 isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": dateInputDescribedBy,\n \"aria-labelledby\": dateInputLabelledBy,\n onBlur,\n onKeyDown,\n onFocus,\n required: dateInputPropsRequired,\n ...restDateInputProps\n } = inputProps;\n\n // Update date strings when dates change\n useEffect(() => {\n if (isRangeOrOffsetSelectionWithStartDate(selectedDate)) {\n selectedDate?.startDate &&\n setStartDateStringValue(dateFormatter(selectedDate?.startDate));\n selectedDate?.endDate &&\n setEndDateStringValue(dateFormatter(selectedDate?.endDate));\n } else {\n setStartDateStringValue(dateFormatter(selectedDate));\n }\n }, [selectedDate, dateFormatter]);\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : dateInputPropsRequired;\n const updateStartDate = (event: SyntheticEvent, dateString: string) => {\n const inputDate = inputStringFormatter(dateString);\n const calendarDate = getCalendarDate(inputDate);\n const newSelectedDate = isRangePicker\n ? { ...selectedDate, startDate: calendarDate }\n : calendarDate;\n setSelectedDate(newSelectedDate);\n onSelectionChange?.(event, newSelectedDate);\n };\n\n const updateEndDate = (event: SyntheticEvent, dateString: string) => {\n const inputDate = inputStringFormatter(dateString);\n const calendarDate = getCalendarDate(inputDate);\n const newSelectedDate = { ...selectedDate, endDate: calendarDate };\n setSelectedDate(newSelectedDate);\n onSelectionChange?.(event, newSelectedDate);\n };\n\n // Handlers\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n onFocus?.(event);\n setFocused(true);\n };\n const handleStartDateBlur = (event: FocusEvent<HTMLInputElement>) => {\n updateStartDate(event, event.target.value);\n setFocused(false);\n };\n\n const handleStartDateChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newStartValue = event.target.value;\n setStartDateStringValue(newStartValue);\n onChange?.(event, newStartValue, endDateStringValue);\n };\n\n const handleStartDateKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n updateStartDate(event, startDateStringValue);\n setOpen(false);\n }\n if (event.key === \"Tab\" && event.shiftKey && openState) {\n setOpen(false);\n }\n };\n\n const handleEndDateBlur = (event: FocusEvent<HTMLInputElement>) => {\n updateEndDate(event, event.target.value);\n setFocused(false);\n };\n const handleEndDateChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newEndValue = event.target.value;\n setEndDateStringValue(newEndValue);\n onChange?.(event, startDateStringValue, newEndValue);\n };\n const handleEndDateKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n updateEndDate(event, endDateStringValue);\n setOpen(false);\n }\n };\n\n const handleInputClick = (event: SyntheticEvent<HTMLDivElement>) => {\n if (event.target === wrapperRef.current) {\n startInputRef?.current?.focus();\n }\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\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 className,\n )}\n onClick={(event) => handleInputClick(event)}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n ref={inputRef}\n {...rest}\n >\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(formFieldDescribedBy, dateInputDescribedBy)}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n dateInputLabelledBy,\n startDateInputID,\n )}\n aria-label={clsx(\"Start date\", ariaLabel)}\n id={startDateInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={startInputRef}\n tabIndex={isDisabled ? -1 : 0}\n onBlur={handleStartDateBlur}\n onChange={handleStartDateChange}\n onKeyDown={handleStartDateKeyDown}\n onFocus={!isDisabled ? handleFocus : undefined}\n placeholder={placeholder}\n size={placeholder.length}\n value={\n isReadOnly && !startDateStringValue\n ? emptyReadOnlyMarker\n : startDateStringValue\n }\n {...restDateInputProps}\n required={isRequired}\n />\n {selectionVariant === \"range\" && (\n <>\n <span>-</span>\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(formFieldDescribedBy, dateInputDescribedBy)}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n dateInputLabelledBy,\n endDateInputID,\n )}\n aria-label={clsx(\"End date\", ariaLabel)}\n id={endDateInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={endInputRef}\n tabIndex={isDisabled ? -1 : 0}\n onBlur={handleEndDateBlur}\n onChange={handleEndDateChange}\n onKeyDown={handleEndDateKeyDown}\n onFocus={!isDisabled ? handleFocus : undefined}\n placeholder={placeholder}\n size={placeholder.length}\n value={\n isReadOnly && !endDateStringValue\n ? emptyReadOnlyMarker\n : endDateStringValue\n }\n required={isRequired}\n {...restDateInputProps}\n />\n </>\n )}\n {\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && !isReadOnly && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n }\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n});\n"],"names":["makePrefixer","date","parseAbsoluteToLocal","CalendarDate","DateFormatter","getLocalTimeZone","forwardRef","DateInput","useRef","useForkRef","useWindow","useComponentCssInjection","dateInputCss","useDatePickerContext","isRangeOrOffsetSelectionWithStartDate","useId","useState","useFormFieldProps","useEffect","jsxs","clsx","jsx","Fragment","StatusAdornment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sources":["../../src/date-picker/DatePicker.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\n\nimport { flip, offset, useDismiss, useInteractions } from \"@floating-ui/react\";\nimport {\n type DateValue,\n getLocalTimeZone,\n today,\n} from \"@internationalized/date\";\nimport {\n Button,\n makePrefixer,\n useControlled,\n useFloatingUI,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport {\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { DateInput, type DateInputProps } from \"../date-input\";\nimport { DatePickerContext } from \"./DatePickerContext\";\nimport { DatePickerPanel } from \"./DatePickerPanel\";\n\nconst withBaseName = makePrefixer(\"saltDatePicker\");\n\nexport interface DatePickerProps<SelectionVariantType>\n extends DateInputProps<SelectionVariantType> {\n /**\n * Selection variant. Defaults to single select.\n */\n selectionVariant?: \"default\" | \"range\";\n /**\n * If `true`, the component will be disabled.\n */\n disabled?: boolean;\n /**\n * The selected date value. Use when the component is controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n selectedDate?: SelectionVariantType;\n /**\n * The default date value. Use when the component is not controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n defaultSelectedDate?: SelectionVariantType;\n /**\n * Props to be passed to the Calendar component.\n */\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n /**\n * Function to format the input value.\n */\n dateFormatter?: (input: DateValue | undefined) => string;\n /**\n * Callback function triggered when open state changes.\n */\n onOpenChange?: (newOpen: boolean) => void;\n /**\n * Display or hide the component.\n */\n open?: boolean;\n /**\n * The default open value. Use when the component is not controlled.\n */\n defaultOpen?: boolean;\n /**\n * Helper text to display in the panel\n */\n helperText?: string;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Callback fired when the selected date change.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n /**\n * Callback fired when the input value change.\n */\n onChange?: SelectionVariantType extends SingleSelectionValueType\n ? (\n event: ChangeEvent<HTMLInputElement>,\n selectedDateInputValue?: string,\n ) => void\n : (\n event: ChangeEvent<HTMLInputElement>,\n startDateInputValue?: string,\n endDateInputValue?: string,\n ) => void;\n /**\n * Number of Calendars to be shown if selectionVariant is range.\n * 2 is the default value.\n */\n visibleMonths?: 1 | 2;\n}\n\nexport const DatePicker = forwardRef<\n HTMLDivElement,\n DatePickerProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePicker(\n {\n selectionVariant = \"default\",\n disabled = false,\n placeholder = \"dd mmm yyyy\",\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n dateFormatter,\n CalendarProps,\n className,\n id: idProp,\n open: openProp,\n defaultOpen,\n onOpenChange: onOpenChangeProp,\n helperText,\n readOnly: readOnlyProp,\n validationStatus,\n onSelectionChange,\n onChange,\n visibleMonths = 2,\n bordered,\n ...rest\n },\n ref,\n) {\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"openPanel\",\n state: \"openPanel\",\n });\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const id = useId(idProp);\n\n const [startVisibleMonth, setStartVisibleMonth] = useState<\n DateValue | undefined\n >(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.startDate\n : selectedDate) ?? today(getLocalTimeZone()),\n );\n\n const [endVisibleMonth, setEndVisibleMonth] = useState<DateValue | undefined>(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate.startDate?.add({ months: 1 })\n : selectedDate) ?? today(getLocalTimeZone()).add({ months: 1 }),\n );\n\n const onOpenChange = (newState: boolean) => {\n setOpen(newState);\n startInputRef?.current?.focus();\n onOpenChangeProp?.(newState);\n };\n\n const { x, y, strategy, elements, floating, reference, context } =\n useFloatingUI({\n open: open,\n onOpenChange: onOpenChange,\n placement: \"bottom-start\",\n middleware: [offset(1), flip({ fallbackStrategy: \"initialPlacement\" })],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useDismiss(context),\n ]);\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n\n const getPanelPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n });\n\n const panelRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const inputRef = useForkRef<HTMLDivElement>(ref, reference);\n const floatingRef = useForkRef<HTMLDivElement>(panelRef, floating);\n\n // Handlers\n const handleSelect = (\n event: SyntheticEvent,\n selectedDate?: DateValue | { startDate?: DateValue; endDate?: DateValue },\n ) => {\n if (selectionVariant === \"default\" && selectedDate) {\n startInputRef?.current?.focus();\n }\n\n if (\n isRangeOrOffsetSelectionWithStartDate(selectedDate) &&\n selectedDate.endDate\n ) {\n endInputRef?.current?.focus();\n }\n onSelectionChange?.(event, selectedDate);\n };\n const handleCalendarButton = () => {\n startInputRef?.current?.focus();\n const newState = !open;\n setOpen(newState);\n onOpenChangeProp?.(newState);\n };\n\n // Context\n const datePickerContextValue = {\n openState: open,\n setOpen,\n disabled,\n selectedDate,\n setSelectedDate,\n defaultSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n selectionVariant,\n context,\n getPanelPosition,\n };\n\n const calendarId = `${id}-calendar`;\n\n return (\n <DatePickerContext.Provider value={datePickerContextValue}>\n <DateInput\n aria-owns={calendarId}\n validationStatus={validationStatus}\n bordered={bordered}\n className={clsx(withBaseName(), className)}\n id={id}\n ref={inputRef}\n {...getReferenceProps()}\n startInputRef={startInputRef}\n endInputRef={endInputRef}\n placeholder={placeholder}\n dateFormatter={dateFormatter}\n readOnly={isReadOnly}\n onSelectionChange={onSelectionChange}\n onChange={onChange}\n endAdornment={\n <Button\n variant=\"secondary\"\n onClick={handleCalendarButton}\n disabled={disabled || isReadOnly || formFieldDisabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon aria-hidden />\n </Button>\n }\n {...rest}\n />\n <DatePickerPanel\n ref={floatingRef}\n {...getFloatingProps()}\n onSelect={handleSelect}\n CalendarProps={{\n ...CalendarProps,\n borderedDropdown: bordered,\n id: calendarId,\n }}\n helperText={helperText}\n visibleMonths={visibleMonths}\n />\n </DatePickerContext.Provider>\n );\n});\n"],"names":["makePrefixer","forwardRef","DatePicker","useControlled","useId","useState","isRangeOrOffsetSelectionWithStartDate","today","getLocalTimeZone","useFloatingUI","offset","flip","useInteractions","useDismiss","useFormFieldProps","useRef","useForkRef","selectedDate","jsxs","DatePickerContext","jsx","DateInput","clsx","Button","CalendarIcon","DatePickerPanel"],"mappings":"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"}
1
+ {"version":3,"file":"DatePicker.js","sources":["../../src/date-picker/DatePicker.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\n\nimport { flip, offset, useDismiss, useInteractions } from \"@floating-ui/react\";\nimport {\n type DateValue,\n getLocalTimeZone,\n today,\n} from \"@internationalized/date\";\nimport {\n Button,\n makePrefixer,\n useControlled,\n useFloatingUI,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport {\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { DateInput, type DateInputProps } from \"../date-input\";\nimport { DatePickerContext } from \"./DatePickerContext\";\nimport { DatePickerPanel } from \"./DatePickerPanel\";\n\nconst withBaseName = makePrefixer(\"saltDatePicker\");\n\nexport interface DatePickerProps<SelectionVariantType>\n extends DateInputProps<SelectionVariantType> {\n /**\n * Selection variant. Defaults to single select.\n */\n selectionVariant?: \"default\" | \"range\";\n /**\n * If `true`, the component will be disabled.\n */\n disabled?: boolean;\n /**\n * The selected date value. Use when the component is controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n selectedDate?: SelectionVariantType;\n /**\n * The default date value. Use when the component is not controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n defaultSelectedDate?: SelectionVariantType;\n /**\n * Props to be passed to the Calendar component.\n */\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n /**\n * Function to format the input value.\n */\n dateFormatter?: (input: DateValue | undefined) => string;\n /**\n * Callback function triggered when open state changes.\n */\n onOpenChange?: (newOpen: boolean) => void;\n /**\n * Display or hide the component.\n */\n open?: boolean;\n /**\n * The default open value. Use when the component is not controlled.\n */\n defaultOpen?: boolean;\n /**\n * Helper text to display in the panel\n */\n helperText?: string;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Callback fired when the selected date change.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n /**\n * Callback fired when the input value change.\n */\n onChange?: SelectionVariantType extends SingleSelectionValueType\n ? (\n event: ChangeEvent<HTMLInputElement>,\n selectedDateInputValue?: string,\n ) => void\n : (\n event: ChangeEvent<HTMLInputElement>,\n startDateInputValue?: string,\n endDateInputValue?: string,\n ) => void;\n /**\n * Number of Calendars to be shown if selectionVariant is range.\n * 2 is the default value.\n */\n visibleMonths?: 1 | 2;\n}\n\nexport const DatePicker = forwardRef<\n HTMLDivElement,\n DatePickerProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePicker(\n {\n selectionVariant = \"default\",\n disabled = false,\n placeholder = \"dd mmm yyyy\",\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n dateFormatter,\n CalendarProps,\n className,\n id: idProp,\n open: openProp,\n defaultOpen,\n onOpenChange: onOpenChangeProp,\n helperText,\n readOnly: readOnlyProp,\n validationStatus,\n onSelectionChange,\n onChange,\n visibleMonths = 2,\n bordered,\n ...rest\n },\n ref,\n) {\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"openPanel\",\n state: \"openPanel\",\n });\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const id = useId(idProp);\n\n const [startVisibleMonth, setStartVisibleMonth] = useState<\n DateValue | undefined\n >(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.startDate\n : selectedDate) ?? today(getLocalTimeZone()),\n );\n\n const [endVisibleMonth, setEndVisibleMonth] = useState<DateValue | undefined>(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate.startDate?.add({ months: 1 })\n : selectedDate) ?? today(getLocalTimeZone()).add({ months: 1 }),\n );\n\n const onOpenChange = (newState: boolean) => {\n setOpen(newState);\n startInputRef?.current?.focus();\n onOpenChangeProp?.(newState);\n };\n\n const { x, y, strategy, elements, floating, reference, context } =\n useFloatingUI({\n open: open,\n onOpenChange: onOpenChange,\n placement: \"bottom-start\",\n middleware: [offset(1), flip({ fallbackStrategy: \"initialPlacement\" })],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useDismiss(context),\n ]);\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n\n const getPanelPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n });\n\n const panelRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const inputRef = useForkRef<HTMLDivElement>(ref, reference);\n const floatingRef = useForkRef<HTMLDivElement>(panelRef, floating);\n\n // Handlers\n const handleSelect = (\n event: SyntheticEvent,\n selectedDate?: DateValue | { startDate?: DateValue; endDate?: DateValue },\n ) => {\n if (selectionVariant === \"default\" && selectedDate) {\n startInputRef?.current?.focus();\n }\n\n if (\n isRangeOrOffsetSelectionWithStartDate(selectedDate) &&\n selectedDate.endDate\n ) {\n endInputRef?.current?.focus();\n }\n onSelectionChange?.(event, selectedDate);\n };\n const handleCalendarButton = () => {\n startInputRef?.current?.focus();\n const newState = !open;\n setOpen(newState);\n onOpenChangeProp?.(newState);\n };\n\n // Context\n const datePickerContextValue = {\n openState: open,\n setOpen,\n disabled,\n selectedDate,\n setSelectedDate,\n defaultSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n selectionVariant,\n context,\n getPanelPosition,\n };\n\n const calendarId = `${id}-calendar`;\n\n return (\n <DatePickerContext.Provider value={datePickerContextValue}>\n <DateInput\n aria-owns={calendarId}\n validationStatus={validationStatus}\n bordered={bordered}\n className={clsx(withBaseName(), className)}\n id={id}\n ref={inputRef}\n {...getReferenceProps()}\n startInputRef={startInputRef}\n endInputRef={endInputRef}\n placeholder={placeholder}\n dateFormatter={dateFormatter}\n readOnly={isReadOnly}\n onSelectionChange={onSelectionChange}\n onChange={onChange}\n endAdornment={\n <Button\n variant=\"secondary\"\n onClick={handleCalendarButton}\n disabled={disabled || isReadOnly || formFieldDisabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon aria-hidden />\n </Button>\n }\n {...rest}\n />\n <DatePickerPanel\n ref={floatingRef}\n {...getFloatingProps()}\n onSelect={handleSelect}\n CalendarProps={{\n ...CalendarProps,\n borderedDropdown: bordered,\n id: calendarId,\n }}\n helperText={helperText}\n visibleMonths={visibleMonths}\n />\n </DatePickerContext.Provider>\n );\n});\n"],"names":["makePrefixer","forwardRef","DatePicker","useControlled","useId","useState","isRangeOrOffsetSelectionWithStartDate","today","getLocalTimeZone","useFloatingUI","offset","flip","useInteractions","useDismiss","useFormFieldProps","useRef","useForkRef","selectedDate","jsxs","DatePickerContext","jsx","DateInput","clsx","Button","CalendarIcon","DatePickerPanel"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DatePickerContext.js","sources":["../../src/date-picker/DatePickerContext.ts"],"sourcesContent":["import type { DateValue } from \"@internationalized/date\";\nimport { type UseFloatingUIReturn, createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\nimport type {\n RangeSelectionValueType,\n SingleSelectionValueType,\n} from \"../calendar\";\n\nexport interface DatePickerContextValue<SelectionVariantType>\n extends Partial<Pick<UseFloatingUIReturn, \"context\">> {\n openState: boolean;\n setOpen: (newOpen: boolean) => void;\n disabled: boolean;\n //\n selectedDate: SelectionVariantType | undefined;\n defaultSelectedDate: SelectionVariantType | undefined;\n setSelectedDate: (newStartDate: SelectionVariantType | undefined) => void;\n startVisibleMonth: DateValue | undefined;\n setStartVisibleMonth: (newStartDate: DateValue | undefined) => void;\n endVisibleMonth: DateValue | undefined;\n setEndVisibleMonth: (newStartDate: DateValue | undefined) => void;\n selectionVariant: \"default\" | \"range\";\n getPanelPosition: () => Record<string, unknown>;\n}\n\nexport const DatePickerContext = createContext<\n DatePickerContextValue<SingleSelectionValueType | RangeSelectionValueType>\n>(\"DatePickerContext\", {\n openState: false,\n setOpen: () => undefined,\n disabled: false,\n selectedDate: undefined,\n defaultSelectedDate: undefined,\n setSelectedDate: () => undefined,\n startVisibleMonth: undefined,\n setStartVisibleMonth: () => undefined,\n endVisibleMonth: undefined,\n setEndVisibleMonth: () => undefined,\n selectionVariant: \"default\",\n getPanelPosition: () => ({}),\n});\n\nexport function useDatePickerContext() {\n return useContext(DatePickerContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAyBa,MAAA,iBAAA,GAAoBA,mBAE/B,mBAAqB,EAAA;AAAA,EACrB,SAAW,EAAA,KAAA;AAAA,EACX,SAAS,MAAM,KAAA,CAAA;AAAA,EACf,QAAU,EAAA,KAAA;AAAA,EACV,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,mBAAqB,EAAA,KAAA,CAAA;AAAA,EACrB,iBAAiB,MAAM,KAAA,CAAA;AAAA,EACvB,iBAAmB,EAAA,KAAA,CAAA;AAAA,EACnB,sBAAsB,MAAM,KAAA,CAAA;AAAA,EAC5B,eAAiB,EAAA,KAAA,CAAA;AAAA,EACjB,oBAAoB,MAAM,KAAA,CAAA;AAAA,EAC1B,gBAAkB,EAAA,SAAA;AAAA,EAClB,gBAAA,EAAkB,OAAO,EAAC,CAAA;AAC5B,CAAC,EAAA;AAEM,SAAS,oBAAuB,GAAA;AACrC,EAAA,OAAOC,iBAAW,iBAAiB,CAAA,CAAA;AACrC;;;;;"}
1
+ {"version":3,"file":"DatePickerContext.js","sources":["../../src/date-picker/DatePickerContext.ts"],"sourcesContent":["import type { DateValue } from \"@internationalized/date\";\nimport { type UseFloatingUIReturn, createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\nimport type {\n RangeSelectionValueType,\n SingleSelectionValueType,\n} from \"../calendar\";\n\nexport interface DatePickerContextValue<SelectionVariantType>\n extends Partial<Pick<UseFloatingUIReturn, \"context\">> {\n openState: boolean;\n setOpen: (newOpen: boolean) => void;\n disabled: boolean;\n //\n selectedDate: SelectionVariantType | undefined;\n defaultSelectedDate: SelectionVariantType | undefined;\n setSelectedDate: (newStartDate: SelectionVariantType | undefined) => void;\n startVisibleMonth: DateValue | undefined;\n setStartVisibleMonth: (newStartDate: DateValue | undefined) => void;\n endVisibleMonth: DateValue | undefined;\n setEndVisibleMonth: (newStartDate: DateValue | undefined) => void;\n selectionVariant: \"default\" | \"range\";\n getPanelPosition: () => Record<string, unknown>;\n}\n\nexport const DatePickerContext = createContext<\n DatePickerContextValue<SingleSelectionValueType | RangeSelectionValueType>\n>(\"DatePickerContext\", {\n openState: false,\n setOpen: () => undefined,\n disabled: false,\n selectedDate: undefined,\n defaultSelectedDate: undefined,\n setSelectedDate: () => undefined,\n startVisibleMonth: undefined,\n setStartVisibleMonth: () => undefined,\n endVisibleMonth: undefined,\n setEndVisibleMonth: () => undefined,\n selectionVariant: \"default\",\n getPanelPosition: () => ({}),\n});\n\nexport function useDatePickerContext() {\n return useContext(DatePickerContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAyBa,MAAA,iBAAA,GAAoBA,mBAE/B,mBAAqB,EAAA;AAAA,EACrB,SAAW,EAAA,KAAA;AAAA,EACX,SAAS,MAAM,KAAA,CAAA;AAAA,EACf,QAAU,EAAA,KAAA;AAAA,EACV,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,mBAAqB,EAAA,KAAA,CAAA;AAAA,EACrB,iBAAiB,MAAM,KAAA,CAAA;AAAA,EACvB,iBAAmB,EAAA,KAAA,CAAA;AAAA,EACnB,sBAAsB,MAAM,KAAA,CAAA;AAAA,EAC5B,eAAiB,EAAA,KAAA,CAAA;AAAA,EACjB,oBAAoB,MAAM,KAAA,CAAA;AAAA,EAC1B,gBAAkB,EAAA,SAAA;AAAA,EAClB,gBAAA,EAAkB,OAAO,EAAC;AAC5B,CAAC;AAEM,SAAS,oBAAuB,GAAA;AACrC,EAAA,OAAOC,iBAAW,iBAAiB,CAAA;AACrC;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DatePickerPanel.js","sources":["../../src/date-picker/DatePickerPanel.tsx"],"sourcesContent":["import {\n type DateValue,\n endOfMonth,\n startOfMonth,\n} from \"@internationalized/date\";\nimport {\n FlexItem,\n FlexLayout,\n FormFieldContext,\n type FormFieldContextValue,\n FormFieldHelperText,\n StackLayout,\n makePrefixer,\n useFloatingComponent,\n useFormFieldProps,\n} 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 SyntheticEvent,\n forwardRef,\n useEffect,\n useState,\n} from \"react\";\nimport {\n Calendar,\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n type UseRangeSelectionCalendarProps,\n type UseSingleSelectionCalendarProps,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport dateInputPanelCss from \"./DatePickerPanel.css\";\n\nexport interface DatePickerPanelProps<SelectionVariantType>\n extends ComponentPropsWithoutRef<\"div\"> {\n onSelect?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n helperText?: string;\n visibleMonths?: 1 | 2;\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n}\n\nconst withBaseName = makePrefixer(\"saltDatePickerPanel\");\n\nfunction getHoveredDate(\n date?: DateValue | null,\n compact?: boolean,\n hoveredDate?: DateValue | null,\n) {\n return date &&\n !compact &&\n hoveredDate &&\n hoveredDate.compare(endOfMonth(date)) > 0\n ? endOfMonth(date)\n : hoveredDate;\n}\n\nexport const DatePickerPanel = forwardRef<\n HTMLDivElement,\n DatePickerPanelProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePickerPanel(props, ref) {\n const {\n className,\n onSelect,\n helperText,\n CalendarProps,\n visibleMonths,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-picker-panel\",\n css: dateInputPanelCss,\n window: targetWindow,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n const [hoveredDate, setHoveredDate] = useState<DateValue | null>(null);\n\n const {\n openState,\n selectedDate,\n setSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n setOpen,\n context,\n getPanelPosition,\n selectionVariant,\n } = useDatePickerContext();\n\n const { a11yProps } = useFormFieldProps();\n const isRangePicker =\n isRangeOrOffsetSelectionWithStartDate(selectedDate) ||\n (selectionVariant === \"range\" && selectedDate === undefined);\n const compact = visibleMonths === 1;\n\n const setRangeDate: UseRangeSelectionCalendarProps[\"onSelectedDateChange\"] = (\n event,\n newDate,\n ) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n if (newDate.startDate && newDate.endDate) {\n setOpen(false);\n }\n };\n const setSingleDate: UseSingleSelectionCalendarProps[\"onSelectedDateChange\"] =\n (event, newDate) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n setOpen(false);\n };\n const handleHoveredDateChange: CalendarProps[\"onHoveredDateChange\"] = (\n _,\n newHoveredDate,\n ) => {\n setHoveredDate(newHoveredDate);\n };\n useEffect(() => {\n if (isRangePicker) {\n if (selectedDate?.startDate) {\n setStartVisibleMonth(selectedDate.startDate);\n setEndVisibleMonth(selectedDate.startDate.add({ months: 1 }));\n }\n } else {\n setStartVisibleMonth(selectedDate);\n }\n }, [selectedDate, setEndVisibleMonth, setStartVisibleMonth]);\n\n const firstCalendarProps: CalendarProps = isRangePicker\n ? {\n selectionVariant: \"range\",\n hoveredDate: getHoveredDate(\n selectedDate?.startDate,\n compact,\n hoveredDate,\n ),\n onHoveredDateChange: handleHoveredDateChange,\n selectedDate: selectedDate,\n onSelectedDateChange: setRangeDate,\n maxDate:\n !compact && selectedDate?.startDate\n ? endOfMonth(selectedDate?.startDate)\n : undefined,\n hideOutOfRangeDates: true,\n }\n : {\n selectionVariant: \"default\",\n selectedDate: selectedDate,\n onSelectedDateChange: setSingleDate,\n };\n return (\n <FloatingComponent\n open={openState}\n className={clsx(withBaseName(), className)}\n aria-modal=\"true\"\n ref={ref}\n focusManagerProps={\n context\n ? {\n context: context,\n initialFocus: 4,\n }\n : undefined\n }\n {...getPanelPosition()}\n {...a11yProps}\n {...rest}\n >\n <StackLayout separators gap={0} className={withBaseName(\"container\")}>\n {helperText && (\n <FlexItem className={withBaseName(\"header\")}>\n <FormFieldHelperText>{helperText}</FormFieldHelperText>\n </FlexItem>\n )}\n <FlexLayout>\n {/* Avoid Dropdowns in Calendar inheriting the FormField's state */}\n <FormFieldContext.Provider value={{} as FormFieldContextValue}>\n <Calendar\n visibleMonth={startVisibleMonth}\n onVisibleMonthChange={(_, month) => setStartVisibleMonth(month)}\n {...firstCalendarProps}\n {...CalendarProps}\n />\n {isRangePicker && !compact && (\n <Calendar\n selectionVariant=\"range\"\n hoveredDate={hoveredDate}\n onHoveredDateChange={handleHoveredDateChange}\n selectedDate={selectedDate}\n onSelectedDateChange={setRangeDate}\n visibleMonth={endVisibleMonth}\n onVisibleMonthChange={(_, month) => setEndVisibleMonth(month)}\n hideOutOfRangeDates\n minDate={\n selectedDate?.startDate\n ? startOfMonth(selectedDate?.startDate)?.add({\n months: 1,\n })\n : undefined\n }\n {...CalendarProps}\n />\n )}\n </FormFieldContext.Provider>\n </FlexLayout>\n </StackLayout>\n </FloatingComponent>\n );\n});\n"],"names":["makePrefixer","date","endOfMonth","forwardRef","DatePickerPanel","useWindow","useComponentCssInjection","dateInputPanelCss","useFloatingComponent","useState","useDatePickerContext","useFormFieldProps","isRangeOrOffsetSelectionWithStartDate","useEffect","jsx","clsx","jsxs","StackLayout","FlexItem","FormFieldHelperText","FlexLayout","FormFieldContext","Calendar","startOfMonth"],"mappings":"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"}
1
+ {"version":3,"file":"DatePickerPanel.js","sources":["../../src/date-picker/DatePickerPanel.tsx"],"sourcesContent":["import {\n type DateValue,\n endOfMonth,\n startOfMonth,\n} from \"@internationalized/date\";\nimport {\n FlexItem,\n FlexLayout,\n FormFieldContext,\n type FormFieldContextValue,\n FormFieldHelperText,\n StackLayout,\n makePrefixer,\n useFloatingComponent,\n useFormFieldProps,\n} 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 SyntheticEvent,\n forwardRef,\n useEffect,\n useState,\n} from \"react\";\nimport {\n Calendar,\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n type UseRangeSelectionCalendarProps,\n type UseSingleSelectionCalendarProps,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport dateInputPanelCss from \"./DatePickerPanel.css\";\n\nexport interface DatePickerPanelProps<SelectionVariantType>\n extends ComponentPropsWithoutRef<\"div\"> {\n onSelect?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n helperText?: string;\n visibleMonths?: 1 | 2;\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n}\n\nconst withBaseName = makePrefixer(\"saltDatePickerPanel\");\n\nfunction getHoveredDate(\n date?: DateValue | null,\n compact?: boolean,\n hoveredDate?: DateValue | null,\n) {\n return date &&\n !compact &&\n hoveredDate &&\n hoveredDate.compare(endOfMonth(date)) > 0\n ? endOfMonth(date)\n : hoveredDate;\n}\n\nexport const DatePickerPanel = forwardRef<\n HTMLDivElement,\n DatePickerPanelProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePickerPanel(props, ref) {\n const {\n className,\n onSelect,\n helperText,\n CalendarProps,\n visibleMonths,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-picker-panel\",\n css: dateInputPanelCss,\n window: targetWindow,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n const [hoveredDate, setHoveredDate] = useState<DateValue | null>(null);\n\n const {\n openState,\n selectedDate,\n setSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n setOpen,\n context,\n getPanelPosition,\n selectionVariant,\n } = useDatePickerContext();\n\n const { a11yProps } = useFormFieldProps();\n const isRangePicker =\n isRangeOrOffsetSelectionWithStartDate(selectedDate) ||\n (selectionVariant === \"range\" && selectedDate === undefined);\n const compact = visibleMonths === 1;\n\n const setRangeDate: UseRangeSelectionCalendarProps[\"onSelectedDateChange\"] = (\n event,\n newDate,\n ) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n if (newDate.startDate && newDate.endDate) {\n setOpen(false);\n }\n };\n const setSingleDate: UseSingleSelectionCalendarProps[\"onSelectedDateChange\"] =\n (event, newDate) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n setOpen(false);\n };\n const handleHoveredDateChange: CalendarProps[\"onHoveredDateChange\"] = (\n _,\n newHoveredDate,\n ) => {\n setHoveredDate(newHoveredDate);\n };\n useEffect(() => {\n if (isRangePicker) {\n if (selectedDate?.startDate) {\n setStartVisibleMonth(selectedDate.startDate);\n setEndVisibleMonth(selectedDate.startDate.add({ months: 1 }));\n }\n } else {\n setStartVisibleMonth(selectedDate);\n }\n }, [selectedDate, setEndVisibleMonth, setStartVisibleMonth]);\n\n const firstCalendarProps: CalendarProps = isRangePicker\n ? {\n selectionVariant: \"range\",\n hoveredDate: getHoveredDate(\n selectedDate?.startDate,\n compact,\n hoveredDate,\n ),\n onHoveredDateChange: handleHoveredDateChange,\n selectedDate: selectedDate,\n onSelectedDateChange: setRangeDate,\n maxDate:\n !compact && selectedDate?.startDate\n ? endOfMonth(selectedDate?.startDate)\n : undefined,\n hideOutOfRangeDates: true,\n }\n : {\n selectionVariant: \"default\",\n selectedDate: selectedDate,\n onSelectedDateChange: setSingleDate,\n };\n return (\n <FloatingComponent\n open={openState}\n className={clsx(withBaseName(), className)}\n aria-modal=\"true\"\n ref={ref}\n focusManagerProps={\n context\n ? {\n context: context,\n initialFocus: 4,\n }\n : undefined\n }\n {...getPanelPosition()}\n {...a11yProps}\n {...rest}\n >\n <StackLayout separators gap={0} className={withBaseName(\"container\")}>\n {helperText && (\n <FlexItem className={withBaseName(\"header\")}>\n <FormFieldHelperText>{helperText}</FormFieldHelperText>\n </FlexItem>\n )}\n <FlexLayout>\n {/* Avoid Dropdowns in Calendar inheriting the FormField's state */}\n <FormFieldContext.Provider value={{} as FormFieldContextValue}>\n <Calendar\n visibleMonth={startVisibleMonth}\n onVisibleMonthChange={(_, month) => setStartVisibleMonth(month)}\n {...firstCalendarProps}\n {...CalendarProps}\n />\n {isRangePicker && !compact && (\n <Calendar\n selectionVariant=\"range\"\n hoveredDate={hoveredDate}\n onHoveredDateChange={handleHoveredDateChange}\n selectedDate={selectedDate}\n onSelectedDateChange={setRangeDate}\n visibleMonth={endVisibleMonth}\n onVisibleMonthChange={(_, month) => setEndVisibleMonth(month)}\n hideOutOfRangeDates\n minDate={\n selectedDate?.startDate\n ? startOfMonth(selectedDate?.startDate)?.add({\n months: 1,\n })\n : undefined\n }\n {...CalendarProps}\n />\n )}\n </FormFieldContext.Provider>\n </FlexLayout>\n </StackLayout>\n </FloatingComponent>\n );\n});\n"],"names":["makePrefixer","date","endOfMonth","forwardRef","DatePickerPanel","useWindow","useComponentCssInjection","dateInputPanelCss","useFloatingComponent","useState","useDatePickerContext","useFormFieldProps","isRangeOrOffsetSelectionWithStartDate","useEffect","jsx","clsx","jsxs","StackLayout","FlexItem","FormFieldHelperText","FlexLayout","FormFieldContext","Calendar","startOfMonth"],"mappings":"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"}