@salt-ds/lab 1.0.0-alpha.51 → 1.0.0-alpha.52

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 (276) hide show
  1. package/css/salt-lab.css +256 -268
  2. package/dist-cjs/calendar/Calendar.css.js +1 -1
  3. package/dist-cjs/calendar/Calendar.js +6 -17
  4. package/dist-cjs/calendar/Calendar.js.map +1 -1
  5. package/dist-cjs/calendar/CalendarNavigation.css.js +6 -0
  6. package/dist-cjs/calendar/{internal/CalendarNavigation.js → CalendarNavigation.js} +160 -66
  7. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -0
  8. package/dist-cjs/calendar/formatDate.js +56 -0
  9. package/dist-cjs/calendar/formatDate.js.map +1 -0
  10. package/dist-cjs/calendar/internal/CalendarCarousel.js +3 -3
  11. package/dist-cjs/calendar/internal/CalendarCarousel.js.map +1 -1
  12. package/dist-cjs/calendar/internal/CalendarDay.js +45 -33
  13. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
  14. package/dist-cjs/calendar/internal/CalendarMonth.js +3 -2
  15. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
  16. package/dist-cjs/calendar/internal/CalendarWeekHeader.js +3 -3
  17. package/dist-cjs/calendar/internal/CalendarWeekHeader.js.map +1 -1
  18. package/dist-cjs/calendar/internal/useFocusManagement.js +7 -4
  19. package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
  20. package/dist-cjs/calendar/internal/utils.js +28 -23
  21. package/dist-cjs/calendar/internal/utils.js.map +1 -1
  22. package/dist-cjs/calendar/useCalendar.js +94 -45
  23. package/dist-cjs/calendar/useCalendar.js.map +1 -1
  24. package/dist-cjs/calendar/useCalendarDay.js +19 -10
  25. package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
  26. package/dist-cjs/calendar/useCalendarSelection.js +360 -0
  27. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -0
  28. package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  29. package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
  30. package/dist-cjs/combo-box-deprecated/ComboBox.css.js +1 -1
  31. package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
  32. package/dist-cjs/content-status/ContentStatus.css.js +1 -1
  33. package/dist-cjs/date-input/DateInput.css.js +1 -1
  34. package/dist-cjs/date-input/DateInputRange.js +355 -0
  35. package/dist-cjs/date-input/DateInputRange.js.map +1 -0
  36. package/dist-cjs/date-input/DateInputSingle.js +229 -0
  37. package/dist-cjs/date-input/DateInputSingle.js.map +1 -0
  38. package/dist-cjs/date-input/utils.js +65 -0
  39. package/dist-cjs/date-input/utils.js.map +1 -0
  40. package/dist-cjs/date-picker/DatePicker.js +40 -150
  41. package/dist-cjs/date-picker/DatePicker.js.map +1 -1
  42. package/dist-cjs/date-picker/DatePickerActions.css.js +6 -0
  43. package/dist-cjs/date-picker/DatePickerActions.css.js.map +1 -0
  44. package/dist-cjs/date-picker/DatePickerActions.js +102 -0
  45. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -0
  46. package/dist-cjs/date-picker/DatePickerContext.js +23 -17
  47. package/dist-cjs/date-picker/DatePickerContext.js.map +1 -1
  48. package/dist-cjs/date-picker/DatePickerOverlay.css.js +6 -0
  49. package/dist-cjs/date-picker/DatePickerOverlay.css.js.map +1 -0
  50. package/dist-cjs/date-picker/DatePickerOverlay.js +50 -0
  51. package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -0
  52. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +105 -0
  53. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -0
  54. package/dist-cjs/date-picker/DatePickerPanel.css.js +1 -1
  55. package/dist-cjs/date-picker/DatePickerRangeInput.js +118 -0
  56. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -0
  57. package/dist-cjs/date-picker/DatePickerRangePanel.js +206 -0
  58. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -0
  59. package/dist-cjs/date-picker/DatePickerSingleInput.js +97 -0
  60. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -0
  61. package/dist-cjs/date-picker/DatePickerSinglePanel.js +138 -0
  62. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -0
  63. package/dist-cjs/date-picker/useDatePicker.js +179 -0
  64. package/dist-cjs/date-picker/useDatePicker.js.map +1 -0
  65. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  66. package/dist-cjs/form-field-legacy/FormLabel.js.map +1 -1
  67. package/dist-cjs/index.js +43 -10
  68. package/dist-cjs/index.js.map +1 -1
  69. package/dist-cjs/list/List.js.map +1 -1
  70. package/dist-cjs/menu-button/MenuButtonTrigger.css.js +1 -1
  71. package/dist-cjs/query-input/QueryInput.css.js +1 -1
  72. package/dist-cjs/slider/Slider.css.js +1 -1
  73. package/dist-cjs/slider/Slider.js +53 -105
  74. package/dist-cjs/slider/Slider.js.map +1 -1
  75. package/dist-cjs/slider/internal/SliderContext.js +21 -0
  76. package/dist-cjs/slider/internal/SliderContext.js.map +1 -0
  77. package/dist-cjs/slider/internal/SliderMarks.js +31 -0
  78. package/dist-cjs/slider/internal/SliderMarks.js.map +1 -0
  79. package/dist-cjs/slider/internal/SliderSelection.js +17 -10
  80. package/dist-cjs/slider/internal/SliderSelection.js.map +1 -1
  81. package/dist-cjs/slider/internal/SliderThumb.js +77 -0
  82. package/dist-cjs/slider/internal/SliderThumb.js.map +1 -0
  83. package/dist-cjs/slider/internal/SliderTrack.js +91 -0
  84. package/dist-cjs/slider/internal/SliderTrack.js.map +1 -0
  85. package/dist-cjs/slider/internal/useKeyDownThumb.js +53 -0
  86. package/dist-cjs/slider/internal/useKeyDownThumb.js.map +1 -0
  87. package/dist-cjs/slider/internal/utils.js +78 -116
  88. package/dist-cjs/slider/internal/utils.js.map +1 -1
  89. package/dist-cjs/tabs/TabActivationIndicator.css.js +1 -1
  90. package/dist-cjs/tabs/useTabs.js.map +1 -1
  91. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  92. package/dist-es/calendar/Calendar.css.js +1 -1
  93. package/dist-es/calendar/Calendar.js +7 -18
  94. package/dist-es/calendar/Calendar.js.map +1 -1
  95. package/dist-es/calendar/CalendarNavigation.css.js +4 -0
  96. package/dist-es/calendar/CalendarNavigation.js +308 -0
  97. package/dist-es/calendar/CalendarNavigation.js.map +1 -0
  98. package/dist-es/calendar/formatDate.js +51 -0
  99. package/dist-es/calendar/formatDate.js.map +1 -0
  100. package/dist-es/calendar/internal/CalendarCarousel.js +3 -3
  101. package/dist-es/calendar/internal/CalendarCarousel.js.map +1 -1
  102. package/dist-es/calendar/internal/CalendarDay.js +45 -33
  103. package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
  104. package/dist-es/calendar/internal/CalendarMonth.js +3 -2
  105. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
  106. package/dist-es/calendar/internal/CalendarWeekHeader.js +3 -3
  107. package/dist-es/calendar/internal/CalendarWeekHeader.js.map +1 -1
  108. package/dist-es/calendar/internal/useFocusManagement.js +7 -4
  109. package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
  110. package/dist-es/calendar/internal/utils.js +29 -23
  111. package/dist-es/calendar/internal/utils.js.map +1 -1
  112. package/dist-es/calendar/useCalendar.js +96 -47
  113. package/dist-es/calendar/useCalendar.js.map +1 -1
  114. package/dist-es/calendar/useCalendarDay.js +20 -11
  115. package/dist-es/calendar/useCalendarDay.js.map +1 -1
  116. package/dist-es/calendar/useCalendarSelection.js +350 -0
  117. package/dist-es/calendar/useCalendarSelection.js.map +1 -0
  118. package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  119. package/dist-es/color-chooser/ColorChooser.js.map +1 -1
  120. package/dist-es/combo-box-deprecated/ComboBox.css.js +1 -1
  121. package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
  122. package/dist-es/content-status/ContentStatus.css.js +1 -1
  123. package/dist-es/date-input/DateInput.css.js +1 -1
  124. package/dist-es/date-input/DateInputRange.js +351 -0
  125. package/dist-es/date-input/DateInputRange.js.map +1 -0
  126. package/dist-es/date-input/DateInputSingle.js +225 -0
  127. package/dist-es/date-input/DateInputSingle.js.map +1 -0
  128. package/dist-es/date-input/utils.js +57 -0
  129. package/dist-es/date-input/utils.js.map +1 -0
  130. package/dist-es/date-picker/DatePicker.js +43 -154
  131. package/dist-es/date-picker/DatePicker.js.map +1 -1
  132. package/dist-es/date-picker/DatePickerActions.css.js +4 -0
  133. package/dist-es/date-picker/DatePickerActions.css.js.map +1 -0
  134. package/dist-es/date-picker/DatePickerActions.js +98 -0
  135. package/dist-es/date-picker/DatePickerActions.js.map +1 -0
  136. package/dist-es/date-picker/DatePickerContext.js +22 -17
  137. package/dist-es/date-picker/DatePickerContext.js.map +1 -1
  138. package/dist-es/date-picker/DatePickerOverlay.css.js +4 -0
  139. package/dist-es/date-picker/DatePickerOverlay.css.js.map +1 -0
  140. package/dist-es/date-picker/DatePickerOverlay.js +46 -0
  141. package/dist-es/date-picker/DatePickerOverlay.js.map +1 -0
  142. package/dist-es/date-picker/DatePickerOverlayProvider.js +100 -0
  143. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -0
  144. package/dist-es/date-picker/DatePickerPanel.css.js +1 -1
  145. package/dist-es/date-picker/DatePickerRangeInput.js +114 -0
  146. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -0
  147. package/dist-es/date-picker/DatePickerRangePanel.js +198 -0
  148. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -0
  149. package/dist-es/date-picker/DatePickerSingleInput.js +93 -0
  150. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -0
  151. package/dist-es/date-picker/DatePickerSinglePanel.js +130 -0
  152. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -0
  153. package/dist-es/date-picker/useDatePicker.js +175 -0
  154. package/dist-es/date-picker/useDatePicker.js.map +1 -0
  155. package/dist-es/dropdown/useDropdown.js.map +1 -1
  156. package/dist-es/form-field-legacy/FormLabel.js.map +1 -1
  157. package/dist-es/index.js +14 -3
  158. package/dist-es/index.js.map +1 -1
  159. package/dist-es/list/List.js.map +1 -1
  160. package/dist-es/menu-button/MenuButtonTrigger.css.js +1 -1
  161. package/dist-es/query-input/QueryInput.css.js +1 -1
  162. package/dist-es/slider/Slider.css.js +1 -1
  163. package/dist-es/slider/Slider.js +55 -107
  164. package/dist-es/slider/Slider.js.map +1 -1
  165. package/dist-es/slider/internal/SliderContext.js +16 -0
  166. package/dist-es/slider/internal/SliderContext.js.map +1 -0
  167. package/dist-es/slider/internal/SliderMarks.js +27 -0
  168. package/dist-es/slider/internal/SliderMarks.js.map +1 -0
  169. package/dist-es/slider/internal/SliderSelection.js +17 -10
  170. package/dist-es/slider/internal/SliderSelection.js.map +1 -1
  171. package/dist-es/slider/internal/SliderThumb.js +73 -0
  172. package/dist-es/slider/internal/SliderThumb.js.map +1 -0
  173. package/dist-es/slider/internal/SliderTrack.js +87 -0
  174. package/dist-es/slider/internal/SliderTrack.js.map +1 -0
  175. package/dist-es/slider/internal/useKeyDownThumb.js +49 -0
  176. package/dist-es/slider/internal/useKeyDownThumb.js.map +1 -0
  177. package/dist-es/slider/internal/utils.js +70 -111
  178. package/dist-es/slider/internal/utils.js.map +1 -1
  179. package/dist-es/tabs/TabActivationIndicator.css.js +1 -1
  180. package/dist-es/tabs/useTabs.js.map +1 -1
  181. package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  182. package/dist-types/calendar/Calendar.d.ts +63 -6
  183. package/dist-types/calendar/CalendarNavigation.d.ts +57 -0
  184. package/dist-types/calendar/formatDate.d.ts +14 -0
  185. package/dist-types/calendar/index.d.ts +3 -1
  186. package/dist-types/calendar/internal/CalendarDay.d.ts +2 -1
  187. package/dist-types/calendar/internal/CalendarWeekHeader.d.ts +4 -4
  188. package/dist-types/calendar/internal/useFocusManagement.d.ts +2 -1
  189. package/dist-types/calendar/internal/utils.d.ts +7 -8
  190. package/dist-types/calendar/useCalendar.d.ts +100 -16
  191. package/dist-types/calendar/useCalendarDay.d.ts +38 -0
  192. package/dist-types/calendar/useCalendarSelection.d.ts +189 -0
  193. package/dist-types/date-input/DateInputRange.d.ts +150 -0
  194. package/dist-types/date-input/DateInputSingle.d.ts +117 -0
  195. package/dist-types/date-input/index.d.ts +3 -1
  196. package/dist-types/date-input/utils.d.ts +43 -0
  197. package/dist-types/date-picker/DatePicker.d.ts +20 -62
  198. package/dist-types/date-picker/DatePickerActions.d.ts +80 -0
  199. package/dist-types/date-picker/DatePickerContext.d.ts +180 -17
  200. package/dist-types/date-picker/DatePickerOverlay.d.ts +11 -0
  201. package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +67 -0
  202. package/dist-types/date-picker/DatePickerRangeInput.d.ts +7 -0
  203. package/dist-types/date-picker/DatePickerRangePanel.d.ts +64 -0
  204. package/dist-types/date-picker/DatePickerSingleInput.d.ts +7 -0
  205. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +42 -0
  206. package/dist-types/date-picker/index.d.ts +7 -0
  207. package/dist-types/date-picker/useDatePicker.d.ts +112 -0
  208. package/dist-types/slider/Slider.d.ts +23 -10
  209. package/dist-types/slider/internal/SliderContext.d.ts +11 -0
  210. package/dist-types/slider/internal/SliderMarks.d.ts +7 -0
  211. package/dist-types/slider/internal/SliderSelection.d.ts +3 -3
  212. package/dist-types/slider/internal/SliderThumb.d.ts +8 -0
  213. package/dist-types/slider/internal/SliderTrack.d.ts +4 -0
  214. package/dist-types/slider/internal/index.d.ts +3 -0
  215. package/dist-types/slider/internal/useKeyDownThumb.d.ts +2 -0
  216. package/dist-types/slider/internal/utils.d.ts +18 -10
  217. package/dist-types/slider/types.d.ts +3 -1
  218. package/package.json +3 -3
  219. package/dist-cjs/calendar/internal/CalendarNavigation.css.js +0 -6
  220. package/dist-cjs/calendar/internal/CalendarNavigation.js.map +0 -1
  221. package/dist-cjs/calendar/useSelection.js +0 -249
  222. package/dist-cjs/calendar/useSelection.js.map +0 -1
  223. package/dist-cjs/date-input/DateInput.js +0 -283
  224. package/dist-cjs/date-input/DateInput.js.map +0 -1
  225. package/dist-cjs/date-picker/DatePickerPanel.js +0 -155
  226. package/dist-cjs/date-picker/DatePickerPanel.js.map +0 -1
  227. package/dist-cjs/slider/internal/SliderHandle.js +0 -44
  228. package/dist-cjs/slider/internal/SliderHandle.js.map +0 -1
  229. package/dist-cjs/slider/internal/SliderMarkLabels.js +0 -45
  230. package/dist-cjs/slider/internal/SliderMarkLabels.js.map +0 -1
  231. package/dist-cjs/slider/internal/SliderRail.js +0 -25
  232. package/dist-cjs/slider/internal/SliderRail.js.map +0 -1
  233. package/dist-cjs/slider/internal/SliderRailMarks.js +0 -48
  234. package/dist-cjs/slider/internal/SliderRailMarks.js.map +0 -1
  235. package/dist-cjs/slider/internal/styles.js +0 -99
  236. package/dist-cjs/slider/internal/styles.js.map +0 -1
  237. package/dist-cjs/slider/internal/useSliderKeyDown.js +0 -50
  238. package/dist-cjs/slider/internal/useSliderKeyDown.js.map +0 -1
  239. package/dist-cjs/slider/internal/useSliderMouseDown.js +0 -96
  240. package/dist-cjs/slider/internal/useSliderMouseDown.js.map +0 -1
  241. package/dist-es/calendar/internal/CalendarNavigation.css.js +0 -4
  242. package/dist-es/calendar/internal/CalendarNavigation.js +0 -214
  243. package/dist-es/calendar/internal/CalendarNavigation.js.map +0 -1
  244. package/dist-es/calendar/useSelection.js +0 -242
  245. package/dist-es/calendar/useSelection.js.map +0 -1
  246. package/dist-es/date-input/DateInput.js +0 -279
  247. package/dist-es/date-input/DateInput.js.map +0 -1
  248. package/dist-es/date-picker/DatePickerPanel.js +0 -151
  249. package/dist-es/date-picker/DatePickerPanel.js.map +0 -1
  250. package/dist-es/slider/internal/SliderHandle.js +0 -40
  251. package/dist-es/slider/internal/SliderHandle.js.map +0 -1
  252. package/dist-es/slider/internal/SliderMarkLabels.js +0 -41
  253. package/dist-es/slider/internal/SliderMarkLabels.js.map +0 -1
  254. package/dist-es/slider/internal/SliderRail.js +0 -21
  255. package/dist-es/slider/internal/SliderRail.js.map +0 -1
  256. package/dist-es/slider/internal/SliderRailMarks.js +0 -44
  257. package/dist-es/slider/internal/SliderRailMarks.js.map +0 -1
  258. package/dist-es/slider/internal/styles.js +0 -91
  259. package/dist-es/slider/internal/styles.js.map +0 -1
  260. package/dist-es/slider/internal/useSliderKeyDown.js +0 -46
  261. package/dist-es/slider/internal/useSliderKeyDown.js.map +0 -1
  262. package/dist-es/slider/internal/useSliderMouseDown.js +0 -92
  263. package/dist-es/slider/internal/useSliderMouseDown.js.map +0 -1
  264. package/dist-types/calendar/internal/CalendarNavigation.d.ts +0 -16
  265. package/dist-types/calendar/useSelection.d.ts +0 -78
  266. package/dist-types/date-input/DateInput.d.ts +0 -60
  267. package/dist-types/date-picker/DatePickerPanel.d.ts +0 -10
  268. package/dist-types/slider/internal/SliderHandle.d.ts +0 -11
  269. package/dist-types/slider/internal/SliderMarkLabels.d.ts +0 -7
  270. package/dist-types/slider/internal/SliderRail.d.ts +0 -1
  271. package/dist-types/slider/internal/SliderRailMarks.d.ts +0 -12
  272. package/dist-types/slider/internal/styles.d.ts +0 -10
  273. package/dist-types/slider/internal/useSliderKeyDown.d.ts +0 -4
  274. package/dist-types/slider/internal/useSliderMouseDown.d.ts +0 -4
  275. /package/dist-cjs/calendar/{internal/CalendarNavigation.css.js.map → CalendarNavigation.css.js.map} +0 -0
  276. /package/dist-es/calendar/{internal/CalendarNavigation.css.js.map → CalendarNavigation.css.js.map} +0 -0
@@ -1,19 +1,26 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { makePrefixer } from '@salt-ds/core';
3
- import { useComponentCssInjection } from '@salt-ds/styles';
4
- import { useWindow } from '@salt-ds/window';
5
- import css_248z from '../Slider.css.js';
3
+ import { clsx } from 'clsx';
4
+ import { useSliderContext } from './SliderContext.js';
5
+ import { getPercentage } from './utils.js';
6
6
 
7
7
  const withBaseName = makePrefixer("saltSliderSelection");
8
- function SliderSelection({ valueLength }) {
9
- const targetWindow = useWindow();
10
- useComponentCssInjection({
11
- testId: "salt-slider",
12
- css: css_248z,
13
- window: targetWindow
8
+ function SliderSelection({
9
+ ...props
10
+ }) {
11
+ const { min, max, value } = useSliderContext();
12
+ const thumbPosition = value.map((value2) => {
13
+ return getPercentage(min, max, value2);
14
14
  });
15
15
  return /* @__PURE__ */ jsx("div", {
16
- className: valueLength < 2 ? withBaseName() : withBaseName("range")
16
+ className: clsx(withBaseName(), {
17
+ [withBaseName("range")]: Array.isArray(value)
18
+ }),
19
+ style: {
20
+ left: value.length > 1 ? `${thumbPosition[0]}%` : 0,
21
+ width: value.length > 1 ? `${thumbPosition[1] - thumbPosition[0]}%` : `${thumbPosition[0]}%`
22
+ },
23
+ ...props
17
24
  });
18
25
  }
19
26
 
@@ -1 +1 @@
1
- {"version":3,"file":"SliderSelection.js","sources":["../src/slider/internal/SliderSelection.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport sliderCss from \"../Slider.css\";\n\nconst withBaseName = makePrefixer(\"saltSliderSelection\");\n\nexport interface SliderSelectionProps {\n valueLength: number;\n}\n\nexport function SliderSelection({ valueLength }: SliderSelectionProps) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-slider\",\n css: sliderCss,\n window: targetWindow,\n });\n\n return (\n <div className={valueLength < 2 ? withBaseName() : withBaseName(\"range\")} />\n );\n}\n"],"names":["sliderCss"],"mappings":";;;;;;AAMA,MAAM,YAAA,GAAe,aAAa,qBAAqB,CAAA,CAAA;AAMvC,SAAA,eAAA,CAAgB,EAAE,WAAA,EAAqC,EAAA;AACrE,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,aAAA;AAAA,IACR,GAAK,EAAAA,QAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IAAI,WAAW,WAAc,GAAA,CAAA,GAAI,YAAa,EAAA,GAAI,aAAa,OAAO,CAAA;AAAA,GAAG,CAAA,CAAA;AAE9E;;;;"}
1
+ {"version":3,"file":"SliderSelection.js","sources":["../src/slider/internal/SliderSelection.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { useSliderContext } from \"./SliderContext\";\nimport { getPercentage } from \"./utils\";\n\nconst withBaseName = makePrefixer(\"saltSliderSelection\");\n\nexport interface SliderSelectionProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nexport function SliderSelection({\n ...props\n}: SliderSelectionProps): JSX.Element {\n const { min, max, value } = useSliderContext();\n\n const thumbPosition = value.map((value) => {\n return getPercentage(min, max, value);\n });\n\n return (\n <div\n className={clsx(withBaseName(), {\n [withBaseName(\"range\")]: Array.isArray(value),\n })}\n style={{\n left: value.length > 1 ? `${thumbPosition[0]}%` : 0,\n width:\n value.length > 1\n ? `${thumbPosition[1] - thumbPosition[0]}%`\n : `${thumbPosition[0]}%`,\n }}\n {...props}\n />\n );\n}\n"],"names":["value"],"mappings":";;;;;;AAMA,MAAM,YAAA,GAAe,aAAa,qBAAqB,CAAA,CAAA;AAIhD,SAAS,eAAgB,CAAA;AAAA,EAC3B,GAAA,KAAA;AACL,CAAsC,EAAA;AACpC,EAAA,MAAM,EAAE,GAAA,EAAK,GAAK,EAAA,KAAA,KAAU,gBAAiB,EAAA,CAAA;AAE7C,EAAA,MAAM,aAAgB,GAAA,KAAA,CAAM,GAAI,CAAA,CAACA,MAAU,KAAA;AACzC,IAAO,OAAA,aAAA,CAAc,GAAK,EAAA,GAAA,EAAKA,MAAK,CAAA,CAAA;AAAA,GACrC,CAAA,CAAA;AAED,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IACC,SAAA,EAAW,IAAK,CAAA,YAAA,EAAgB,EAAA;AAAA,MAC9B,CAAC,YAAa,CAAA,OAAO,CAAI,GAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,KAC7C,CAAA;AAAA,IACD,KAAO,EAAA;AAAA,MACL,MAAM,KAAM,CAAA,MAAA,GAAS,CAAI,GAAA,CAAA,EAAG,cAAc,CAAQ,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;AAAA,MAClD,KAAA,EACE,KAAM,CAAA,MAAA,GAAS,CACX,GAAA,CAAA,EAAG,cAAc,CAAK,CAAA,GAAA,aAAA,CAAc,CACpC,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,EAAG,aAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KACzB;AAAA,IACC,GAAG,KAAA;AAAA,GACN,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,73 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, Label } from '@salt-ds/core';
3
+ import { clsx } from 'clsx';
4
+ import { useState } from 'react';
5
+ import { useSliderContext } from './SliderContext.js';
6
+ import { useKeyDownThumb } from './useKeyDownThumb.js';
7
+ import { getPercentage } from './utils.js';
8
+
9
+ const withBaseName = makePrefixer("saltSliderThumb");
10
+ function SliderThumb(props) {
11
+ const { index, activeThumb, setActiveThumb } = props;
12
+ const [focussed, setFocussed] = useState(false);
13
+ const { min, max, step, value, onChange, ariaLabel } = useSliderContext();
14
+ const onKeyDown = useKeyDownThumb(min, max, step, value, onChange, index);
15
+ const thumbValue = value[index];
16
+ const thumbPosition = getPercentage(min, max, thumbValue);
17
+ const handlePointerOver = () => {
18
+ if (activeThumb === void 0 && index !== null)
19
+ setActiveThumb(index);
20
+ };
21
+ const handleFocus = () => {
22
+ setFocussed(true);
23
+ if (index !== null)
24
+ setActiveThumb(index);
25
+ };
26
+ const handleBlur = () => {
27
+ setFocussed(false);
28
+ setActiveThumb(void 0);
29
+ };
30
+ const showTooltip = focussed || activeThumb === index;
31
+ return /* @__PURE__ */ jsxs("div", {
32
+ style: { left: `${thumbPosition}%` },
33
+ className: withBaseName("container"),
34
+ onPointerOver: handlePointerOver,
35
+ onFocus: handleFocus,
36
+ onBlur: handleBlur,
37
+ children: [
38
+ /* @__PURE__ */ jsxs("div", {
39
+ className: clsx(withBaseName("tooltip"), {
40
+ [withBaseName("tooltip-visible")]: showTooltip
41
+ }),
42
+ "aria-expanded": showTooltip,
43
+ children: [
44
+ /* @__PURE__ */ jsx("svg", {
45
+ className: withBaseName("tooltip-arrow"),
46
+ "aria-hidden": "true",
47
+ viewBox: "0 1 14 14",
48
+ children: /* @__PURE__ */ jsx("path", {
49
+ d: "M0,0 H14 L7,7 Q7,7 7,7 Z"
50
+ })
51
+ }),
52
+ /* @__PURE__ */ jsx(Label, {
53
+ children: value[index]
54
+ })
55
+ ]
56
+ }),
57
+ /* @__PURE__ */ jsx("div", {
58
+ className: withBaseName(),
59
+ onKeyDown,
60
+ role: "slider",
61
+ "aria-valuemin": min,
62
+ "aria-valuemax": max,
63
+ "aria-valuenow": index === 1 ? value[1] : value[0],
64
+ "aria-label": ariaLabel,
65
+ "aria-orientation": "horizontal",
66
+ tabIndex: 0
67
+ })
68
+ ]
69
+ });
70
+ }
71
+
72
+ export { SliderThumb };
73
+ //# sourceMappingURL=SliderThumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliderThumb.js","sources":["../src/slider/internal/SliderThumb.tsx"],"sourcesContent":["import { Label, makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, useState } from \"react\";\nimport type { ActiveThumbIndex, ThumbIndex } from \"../types\";\nimport { useSliderContext } from \"./SliderContext\";\nimport { useKeyDownThumb } from \"./useKeyDownThumb\";\nimport { getPercentage } from \"./utils\";\n\nconst withBaseName = makePrefixer(\"saltSliderThumb\");\n\nexport interface SliderThumbProps extends ComponentPropsWithoutRef<\"div\"> {\n index: ThumbIndex;\n activeThumb: ActiveThumbIndex;\n setActiveThumb: (index: ActiveThumbIndex) => void;\n}\n\nexport function SliderThumb(props: SliderThumbProps): JSX.Element {\n const { index, activeThumb, setActiveThumb } = props;\n\n const [focussed, setFocussed] = useState(false);\n\n const { min, max, step, value, onChange, ariaLabel } = useSliderContext();\n\n const onKeyDown = useKeyDownThumb(min, max, step, value, onChange, index);\n\n const thumbValue = value[index];\n\n const thumbPosition = getPercentage(min, max, thumbValue as number);\n\n const handlePointerOver = () => {\n if (activeThumb === undefined && index !== null) setActiveThumb(index);\n };\n\n const handleFocus = () => {\n setFocussed(true);\n if (index !== null) setActiveThumb(index);\n };\n\n const handleBlur = () => {\n setFocussed(false);\n setActiveThumb(undefined);\n };\n\n const showTooltip = focussed || activeThumb === index;\n\n return (\n <div\n style={{ left: `${thumbPosition}%` }}\n className={withBaseName(\"container\")}\n onPointerOver={handlePointerOver}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n className={clsx(withBaseName(\"tooltip\"), {\n [withBaseName(\"tooltip-visible\")]: showTooltip,\n })}\n aria-expanded={showTooltip}\n >\n <svg\n className={withBaseName(\"tooltip-arrow\")}\n aria-hidden=\"true\"\n viewBox=\"0 1 14 14\"\n >\n <path d=\"M0,0 H14 L7,7 Q7,7 7,7 Z\" />\n </svg>\n <Label>{value[index]}</Label>\n </div>\n <div\n className={withBaseName()}\n onKeyDown={onKeyDown}\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={index === 1 ? value[1] : value[0]}\n aria-label={ariaLabel}\n aria-orientation=\"horizontal\"\n tabIndex={0}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer } from '@salt-ds/core';
3
+ import { useRef, useState, useEffect } from 'react';
4
+ import { useSliderContext } from './SliderContext.js';
5
+ import { SliderSelection } from './SliderSelection.js';
6
+ import { SliderThumb } from './SliderThumb.js';
7
+ import { getValue, getNearestIndex, setValue, preventOverlappingValues } from './utils.js';
8
+
9
+ const withBaseName = makePrefixer("saltSliderTrack");
10
+ const SliderTrack = ({ ...props }) => {
11
+ const { min, max, step, value, onChange } = useSliderContext();
12
+ const trackRef = useRef(null);
13
+ const valueRef = useRef(value);
14
+ const [activeThumb, setActiveThumbState] = useState(void 0);
15
+ const activeThumbRef = useRef(void 0);
16
+ const pointerDown = useRef(false);
17
+ const setActiveThumb = (index) => {
18
+ setActiveThumbState(index);
19
+ activeThumbRef.current = index;
20
+ };
21
+ const handlePointerUp = () => {
22
+ setActiveThumb(void 0);
23
+ pointerDown.current = false;
24
+ };
25
+ const handlePointerDown = (event) => {
26
+ if (event.button !== 0)
27
+ return;
28
+ const { clientX } = event;
29
+ const newValue = getValue(trackRef, min, max, step, clientX);
30
+ const nearestIndex = getNearestIndex(value, newValue);
31
+ setValue(value, newValue, value.length > 1 ? nearestIndex : 0, onChange);
32
+ setActiveThumb(nearestIndex);
33
+ pointerDown.current = true;
34
+ };
35
+ const handlePointerMove = (event) => {
36
+ if (!pointerDown.current || typeof activeThumbRef.current === "undefined")
37
+ return;
38
+ const thumb = activeThumbRef.current;
39
+ const { clientX } = event;
40
+ const rawValue = getValue(trackRef, min, max, step, clientX);
41
+ const newValue = preventOverlappingValues(
42
+ valueRef.current,
43
+ rawValue,
44
+ thumb
45
+ );
46
+ setValue(valueRef.current, newValue, thumb, onChange);
47
+ };
48
+ const handlePointerOut = () => {
49
+ if (!pointerDown.current) {
50
+ setActiveThumb(void 0);
51
+ }
52
+ };
53
+ useEffect(() => {
54
+ window.addEventListener("pointerup", handlePointerUp);
55
+ window.addEventListener("pointermove", handlePointerMove);
56
+ return () => {
57
+ window.removeEventListener("pointerup", handlePointerUp);
58
+ window.removeEventListener("pointermove", handlePointerMove);
59
+ };
60
+ }, []);
61
+ useEffect(() => {
62
+ valueRef.current = value;
63
+ }, [value]);
64
+ return /* @__PURE__ */ jsxs("div", {
65
+ className: withBaseName(),
66
+ ref: trackRef,
67
+ onPointerDown: handlePointerDown,
68
+ onPointerOut: handlePointerOut,
69
+ ...props,
70
+ children: [
71
+ /* @__PURE__ */ jsx("div", {
72
+ className: withBaseName("rail")
73
+ }),
74
+ /* @__PURE__ */ jsx(SliderSelection, {}),
75
+ value.map((_, i) => {
76
+ return /* @__PURE__ */ jsx(SliderThumb, {
77
+ index: i,
78
+ activeThumb,
79
+ setActiveThumb
80
+ }, i);
81
+ })
82
+ ]
83
+ });
84
+ };
85
+
86
+ export { SliderTrack };
87
+ //# sourceMappingURL=SliderTrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliderTrack.js","sources":["../src/slider/internal/SliderTrack.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport {\n type ComponentPropsWithoutRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport type { ActiveThumbIndex, SliderValue, ThumbIndex } from \"../types\";\nimport { useSliderContext } from \"./SliderContext\";\nimport { SliderSelection } from \"./SliderSelection\";\nimport { SliderThumb } from \"./SliderThumb\";\nimport {\n getNearestIndex,\n getValue,\n preventOverlappingValues,\n setValue,\n} from \"./utils\";\n\nexport interface SliderTrackProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nconst withBaseName = makePrefixer(\"saltSliderTrack\");\n\nexport const SliderTrack = ({ ...props }: SliderTrackProps) => {\n const { min, max, step, value, onChange } = useSliderContext();\n\n const trackRef = useRef<HTMLDivElement>(null);\n\n const valueRef = useRef<SliderValue>(value);\n\n const [activeThumb, setActiveThumbState] =\n useState<ActiveThumbIndex>(undefined);\n const activeThumbRef = useRef<ActiveThumbIndex>(undefined);\n const pointerDown = useRef(false);\n\n const setActiveThumb = (index: ActiveThumbIndex) => {\n setActiveThumbState(index);\n activeThumbRef.current = index;\n };\n\n const handlePointerUp = () => {\n setActiveThumb(undefined);\n pointerDown.current = false;\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n const { clientX } = event;\n const newValue: number = getValue(trackRef, min, max, step, clientX);\n const nearestIndex = getNearestIndex(value, newValue);\n setValue(value, newValue, value.length > 1 ? nearestIndex : 0, onChange);\n setActiveThumb(nearestIndex);\n pointerDown.current = true;\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!pointerDown.current || typeof activeThumbRef.current === \"undefined\")\n return;\n const thumb = activeThumbRef.current;\n const { clientX } = event;\n const rawValue: number = getValue(trackRef, min, max, step, clientX);\n const newValue = preventOverlappingValues(\n valueRef.current,\n rawValue,\n thumb,\n );\n setValue(valueRef.current, newValue, thumb, onChange);\n };\n\n const handlePointerOut = () => {\n if (!pointerDown.current) {\n setActiveThumb(undefined);\n }\n };\n\n useEffect(() => {\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointermove\", handlePointerMove);\n return () => {\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointermove\", handlePointerMove);\n };\n }, []);\n\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n return (\n <div\n className={withBaseName()}\n ref={trackRef}\n onPointerDown={handlePointerDown}\n onPointerOut={handlePointerOut}\n {...props}\n >\n <div className={withBaseName(\"rail\")} />\n <SliderSelection />\n {value.map((_, i) => {\n return (\n <SliderThumb\n key={i}\n index={i as ThumbIndex}\n activeThumb={activeThumb}\n setActiveThumb={setActiveThumb}\n />\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { setValue, roundToStep, preventOverlappingValues, clampValue } from './utils.js';
2
+
3
+ const supportedKeys = [
4
+ "Home",
5
+ "End",
6
+ "ArrowUp",
7
+ "ArrowRight",
8
+ "ArrowDown",
9
+ "ArrowLeft"
10
+ ];
11
+ const getValueFromKeyName = (keyName, value, min, max, step) => {
12
+ switch (keyName) {
13
+ case "Home":
14
+ return min;
15
+ case "End":
16
+ return max;
17
+ case "ArrowUp":
18
+ case "ArrowRight":
19
+ return value + step;
20
+ case "ArrowDown":
21
+ case "ArrowLeft":
22
+ return value - step;
23
+ default:
24
+ return value;
25
+ }
26
+ };
27
+ const useKeyDownThumb = (min, max, step, value, onChange, index) => {
28
+ return (event) => {
29
+ if (!supportedKeys.includes(event.key))
30
+ return;
31
+ event.preventDefault();
32
+ const targetValue = value[index];
33
+ const rawValue = getValueFromKeyName(
34
+ event.key,
35
+ targetValue,
36
+ min,
37
+ max,
38
+ step
39
+ );
40
+ const roundedToStep = roundToStep(rawValue, step);
41
+ const rounded = Number(roundedToStep.toFixed(1));
42
+ const clamped = clampValue(rounded, [min, max]);
43
+ const newValue = preventOverlappingValues(value, clamped, index);
44
+ setValue(value, newValue, index, onChange);
45
+ };
46
+ };
47
+
48
+ export { useKeyDownThumb };
49
+ //# sourceMappingURL=useKeyDownThumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyDownThumb.js","sources":["../src/slider/internal/useKeyDownThumb.ts"],"sourcesContent":["import type { SliderChangeHandler, SliderValue, ThumbIndex } from \"../types\";\nimport {\n clampValue,\n preventOverlappingValues,\n roundToStep,\n setValue,\n} from \"./utils\";\n\nconst supportedKeys = [\n \"Home\",\n \"End\",\n \"ArrowUp\",\n \"ArrowRight\",\n \"ArrowDown\",\n \"ArrowLeft\",\n];\n\nconst getValueFromKeyName = (\n keyName: string,\n value: number,\n min: number,\n max: number,\n step: number,\n) => {\n switch (keyName) {\n case \"Home\":\n return min;\n case \"End\":\n return max;\n case \"ArrowUp\":\n case \"ArrowRight\":\n return value + step;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n return value - step;\n default:\n return value;\n }\n};\n\nexport const useKeyDownThumb = (\n min: number,\n max: number,\n step: number,\n value: SliderValue,\n onChange: SliderChangeHandler,\n index: ThumbIndex,\n) => {\n return (event: React.KeyboardEvent) => {\n if (!supportedKeys.includes(event.key)) return;\n event.preventDefault();\n const targetValue = value[index];\n const rawValue = getValueFromKeyName(\n event.key,\n targetValue as number,\n min,\n max,\n step,\n );\n\n const roundedToStep = roundToStep(rawValue, step);\n const rounded = Number(roundedToStep.toFixed(1));\n const clamped = clampValue(rounded, [min, max]);\n const newValue = preventOverlappingValues(value, clamped, index);\n\n setValue(value, newValue, index, onChange);\n };\n};\n"],"names":[],"mappings":";;AAQA,MAAM,aAAgB,GAAA;AAAA,EACpB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AACF,CAAA,CAAA;AAEA,MAAM,sBAAsB,CAC1B,OAAA,EACA,KACA,EAAA,GAAA,EACA,KACA,IACG,KAAA;AACH,EAAQ,QAAA,OAAA;AAAA,IACD,KAAA,MAAA;AACH,MAAO,OAAA,GAAA,CAAA;AAAA,IACJ,KAAA,KAAA;AACH,MAAO,OAAA,GAAA,CAAA;AAAA,IACJ,KAAA,SAAA,CAAA;AAAA,IACA,KAAA,YAAA;AACH,MAAA,OAAO,KAAQ,GAAA,IAAA,CAAA;AAAA,IACZ,KAAA,WAAA,CAAA;AAAA,IACA,KAAA,WAAA;AACH,MAAA,OAAO,KAAQ,GAAA,IAAA,CAAA;AAAA,IAAA;AAEf,MAAO,OAAA,KAAA,CAAA;AAAA,GAAA;AAEb,CAAA,CAAA;AAEO,MAAM,kBAAkB,CAC7B,GAAA,EACA,KACA,IACA,EAAA,KAAA,EACA,UACA,KACG,KAAA;AACH,EAAA,OAAO,CAAC,KAA+B,KAAA;AACrC,IAAA,IAAI,CAAC,aAAA,CAAc,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA;AAAG,MAAA,OAAA;AACxC,IAAA,KAAA,CAAM,cAAe,EAAA,CAAA;AACrB,IAAA,MAAM,cAAc,KAAM,CAAA,KAAA,CAAA,CAAA;AAC1B,IAAA,MAAM,QAAW,GAAA,mBAAA;AAAA,MACf,KAAM,CAAA,GAAA;AAAA,MACN,WAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,aAAA,GAAgB,WAAY,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAChD,IAAA,MAAM,OAAU,GAAA,MAAA,CAAO,aAAc,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAC/C,IAAA,MAAM,UAAU,UAAW,CAAA,OAAA,EAAS,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AAC9C,IAAA,MAAM,QAAW,GAAA,wBAAA,CAAyB,KAAO,EAAA,OAAA,EAAS,KAAK,CAAA,CAAA;AAE/D,IAAS,QAAA,CAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAAA,GAC3C,CAAA;AACF;;;;"}
@@ -1,121 +1,80 @@
1
- import { useMemo } from 'react';
2
-
3
- const updateValueItemNotPushable = (oldValue, index, valueItem, min, max) => {
4
- const newValue = [...oldValue];
5
- if (valueItem < oldValue[index]) {
6
- const constraint = index === 0 ? min : newValue[index - 1];
7
- newValue[index] = Math.max(constraint, valueItem);
8
- } else {
9
- const constraint = index === newValue.length - 1 ? max : newValue[index + 1];
10
- newValue[index] = Math.min(constraint, valueItem);
11
- }
12
- return newValue;
1
+ const getValue = (trackRef, min, max, step, clientX) => {
2
+ const { width, x } = trackRef.current.getBoundingClientRect();
3
+ const localX = clientX - x;
4
+ const normaliseBetweenValues = localX / width * (max - min) + min;
5
+ const roundedToStep = roundToStep(normaliseBetweenValues, step);
6
+ const decimals = countDecimalPlaces(step);
7
+ const rounded = Number(roundedToStep.toFixed(decimals));
8
+ const value = clampValue(rounded, [min, max]);
9
+ return value;
13
10
  };
14
- const updateValueItemPushable = (oldValue, index, valueItem, min, max, pushDistance) => {
15
- const newValue = [...oldValue];
16
- newValue[index] = valueItem;
17
- if (valueItem < oldValue[index]) {
18
- for (let i = index - 1; i >= 0; --i) {
19
- if (newValue[i + 1] - newValue[i] < pushDistance) {
20
- newValue[i] = newValue[i + 1] - pushDistance;
21
- } else {
22
- break;
23
- }
24
- }
25
- const distToMin = newValue[0] - min;
26
- if (distToMin < 0) {
27
- for (let i = index; i >= 0; --i) {
28
- newValue[i] -= distToMin;
29
- }
30
- }
31
- } else {
32
- for (let i = index + 1; i < newValue.length; ++i) {
33
- if (newValue[i] - newValue[i - 1] < pushDistance) {
34
- newValue[i] = newValue[i - 1] + pushDistance;
35
- } else {
36
- break;
37
- }
38
- }
39
- const distToMax = max - newValue[newValue.length - 1];
40
- if (distToMax < 0) {
41
- for (let i = index; i < newValue.length; ++i) {
42
- newValue[i] += distToMax;
43
- }
44
- }
11
+ const setValue = (value, newValue, index, onChange) => {
12
+ if (value.length === 2) {
13
+ const newValueArray = [...value];
14
+ newValueArray.splice(index, 1, newValue);
15
+ onChange(newValueArray);
16
+ return;
45
17
  }
46
- return newValue;
18
+ onChange([newValue]);
47
19
  };
48
- function useValueUpdater(pushable, pushDistance, min, max) {
49
- return useMemo(() => {
50
- const updater = pushable ? (oldValue, index, valueItem) => updateValueItemPushable(
51
- oldValue,
52
- index,
53
- valueItem,
54
- min,
55
- max,
56
- pushDistance
57
- ) : (oldValue, index, valueItem) => updateValueItemNotPushable(oldValue, index, valueItem, min, max);
58
- return (oldValue, index, valueItem) => {
59
- if (!Array.isArray(oldValue)) {
60
- return valueItem;
61
- }
62
- if (oldValue[index] === valueItem) {
63
- return oldValue;
64
- }
65
- const newValue = updater(oldValue, index, valueItem);
66
- if (-1 === newValue.findIndex((v, i) => oldValue[i] !== v)) {
67
- return oldValue;
68
- }
69
- return newValue;
70
- };
71
- }, [pushable, pushDistance, min, max]);
72
- }
73
- const roundValue = (v, step) => Math.round(v / step) * step;
74
- const clampValue = (v, min, max) => {
75
- if (v < min) {
76
- return min;
77
- }
78
- if (v > max) {
20
+ const roundToStep = (value, step) => Math.round(value / step) * step;
21
+ const clampValue = (value, [min, max]) => {
22
+ if (value > max) {
79
23
  return max;
80
24
  }
81
- return v;
82
- };
83
- function getSliderAriaLabel(count, index) {
84
- if (count < 2) {
85
- return;
86
- }
87
- if (count === 2) {
88
- return index === 0 ? "Min" : "Max";
25
+ if (value < min) {
26
+ return min;
89
27
  }
90
- if (index >= 0 && index < 10) {
91
- return [
92
- "First",
93
- "Second",
94
- "Third",
95
- "Fourth",
96
- "Fifth",
97
- "Sixth",
98
- "Seventh",
99
- "Eighth",
100
- "Ninth",
101
- "Tenth"
102
- ][index];
28
+ return value;
29
+ };
30
+ const getPercentage = (min, max, value) => {
31
+ const percentage = (value - min) / (max - min) * 100;
32
+ return Math.min(Math.max(percentage, 0), 100);
33
+ };
34
+ const countDecimalPlaces = (num) => {
35
+ const parts = num.toString().split(".");
36
+ return parts.length > 1 ? parts[1].length : 0;
37
+ };
38
+ const getMarkStyles = (min, max, step) => {
39
+ const marks = [];
40
+ for (let i = min; i <= max; i = Number((i + step).toPrecision(4))) {
41
+ const value = Number(i.toPrecision(4));
42
+ const position = `${getPercentage(min, max, value)}%`;
43
+ marks.push({ value, position });
103
44
  }
104
- return;
105
- }
106
- function getHandleIndex(element) {
107
- const handleIndexAttribute = element.getAttribute("data-handle-index");
108
- if (handleIndexAttribute) {
109
- return Number.parseInt(handleIndexAttribute, 10);
45
+ const decimals = Math.max(
46
+ ...marks.map((mark) => countDecimalPlaces(mark.value))
47
+ );
48
+ return marks.map((mark) => ({
49
+ ...mark,
50
+ label: mark.value.toFixed(decimals)
51
+ }));
52
+ };
53
+ const getNearestIndex = (value, newValue) => {
54
+ if (value.length === 1)
55
+ return 0;
56
+ if (value[0] === value[1]) {
57
+ if (newValue < value[0])
58
+ return 0;
59
+ return 1;
110
60
  }
111
- return getHandleIndex(element.parentElement);
112
- }
113
- function isLabeledMark(mark) {
114
- return typeof mark !== "number";
115
- }
116
- function isMarkAtMax(max, mark) {
117
- return max === (isLabeledMark(mark) ? mark.value : mark);
118
- }
61
+ const distances = value.map((value2) => Math.abs(newValue - value2));
62
+ const minDistance = Math.min(...distances);
63
+ const nearestIndex = distances.indexOf(minDistance);
64
+ return nearestIndex;
65
+ };
66
+ const preventOverlappingValues = (value, newValue, index) => value.length === 2 ? index === 0 ? Math.min(newValue, value[1]) : Math.max(newValue, value[0]) : newValue;
67
+ const parseValueProp = (value, min, max) => {
68
+ if (typeof value === "undefined" || value.length < 1)
69
+ return;
70
+ const a = clampValue(value[0], [min, max]);
71
+ if (value.length === 1)
72
+ return [a];
73
+ const b = clampValue(value[1], [min, max]);
74
+ if (a > b)
75
+ return [a, a];
76
+ return [a, b];
77
+ };
119
78
 
120
- export { clampValue, getHandleIndex, getSliderAriaLabel, isLabeledMark, isMarkAtMax, roundValue, useValueUpdater };
79
+ export { clampValue, countDecimalPlaces, getMarkStyles, getNearestIndex, getPercentage, getValue, parseValueProp, preventOverlappingValues, roundToStep, setValue };
121
80
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../src/slider/internal/utils.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport type { SliderValue } from \"../types\";\nimport type { LabeledMark, SliderMark } from \"./SliderRailMarks\";\n\nconst updateValueItemNotPushable = (\n oldValue: number[],\n index: number,\n valueItem: number,\n min: number,\n max: number,\n) => {\n const newValue = [...oldValue];\n if (valueItem < oldValue[index]) {\n const constraint = index === 0 ? min : newValue[index - 1];\n newValue[index] = Math.max(constraint, valueItem);\n } else {\n const constraint =\n index === newValue.length - 1 ? max : newValue[index + 1];\n newValue[index] = Math.min(constraint, valueItem);\n }\n return newValue;\n};\n\nconst updateValueItemPushable = (\n oldValue: number[],\n index: number,\n valueItem: number,\n min: number,\n max: number,\n pushDistance: number,\n) => {\n const newValue = [...oldValue];\n newValue[index] = valueItem;\n if (valueItem < oldValue[index]) {\n for (let i = index - 1; i >= 0; --i) {\n if (newValue[i + 1] - newValue[i] < pushDistance) {\n newValue[i] = newValue[i + 1] - pushDistance;\n } else {\n break;\n }\n }\n const distToMin = newValue[0] - min;\n if (distToMin < 0) {\n for (let i = index; i >= 0; --i) {\n newValue[i] -= distToMin;\n }\n }\n } else {\n for (let i = index + 1; i < newValue.length; ++i) {\n if (newValue[i] - newValue[i - 1] < pushDistance) {\n newValue[i] = newValue[i - 1] + pushDistance;\n } else {\n break;\n }\n }\n const distToMax = max - newValue[newValue.length - 1];\n if (distToMax < 0) {\n for (let i = index; i < newValue.length; ++i) {\n newValue[i] += distToMax;\n }\n }\n }\n return newValue;\n};\n\nexport type UpdateValueItem = (\n oldValue: SliderValue,\n index: number,\n valueItem: number,\n) => SliderValue;\n\nexport function useValueUpdater(\n pushable: boolean | undefined,\n pushDistance: number,\n min: number,\n max: number,\n): UpdateValueItem {\n return useMemo(() => {\n const updater = pushable\n ? (oldValue: number[], index: number, valueItem: number) =>\n updateValueItemPushable(\n oldValue,\n index,\n valueItem,\n min,\n max,\n pushDistance,\n )\n : (oldValue: number[], index: number, valueItem: number) =>\n updateValueItemNotPushable(oldValue, index, valueItem, min, max);\n return (oldValue: SliderValue, index: number, valueItem: number) => {\n if (!Array.isArray(oldValue)) {\n return valueItem;\n }\n if (oldValue[index] === valueItem) {\n return oldValue;\n }\n const newValue = updater(oldValue, index, valueItem);\n if (-1 === newValue.findIndex((v, i) => oldValue[i] !== v)) {\n return oldValue;\n }\n return newValue;\n };\n }, [pushable, pushDistance, min, max]);\n}\n\nexport const roundValue = (v: number, step: number) =>\n Math.round(v / step) * step;\n\nexport const clampValue = (v: number, min: number, max: number) => {\n if (v < min) {\n return min;\n }\n if (v > max) {\n return max;\n }\n return v;\n};\n\nexport function getSliderAriaLabel(count: number, index: number) {\n if (count < 2) {\n return;\n }\n if (count === 2) {\n return index === 0 ? \"Min\" : \"Max\";\n }\n if (index >= 0 && index < 10) {\n return [\n \"First\",\n \"Second\",\n \"Third\",\n \"Fourth\",\n \"Fifth\",\n \"Sixth\",\n \"Seventh\",\n \"Eighth\",\n \"Ninth\",\n \"Tenth\",\n ][index];\n }\n return;\n}\n\nexport function getHandleIndex(element: HTMLElement): number {\n const handleIndexAttribute = element.getAttribute(\"data-handle-index\");\n if (handleIndexAttribute) {\n return Number.parseInt(handleIndexAttribute, 10);\n }\n return getHandleIndex(element.parentElement as HTMLElement);\n}\n\nexport function isLabeledMark(mark: SliderMark): mark is LabeledMark {\n return typeof mark !== \"number\";\n}\n\nexport function isMarkAtMax(max: number, mark: SliderMark) {\n return max === (isLabeledMark(mark) ? mark.value : mark);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../src/slider/internal/utils.ts"],"sourcesContent":["import type { RefObject } from \"react\";\nimport type { SliderChangeHandler, SliderValue, ThumbIndex } from \"../types\";\n\nexport const getValue = (\n trackRef: RefObject<Element>,\n min: number,\n max: number,\n step: number,\n clientX: number,\n) => {\n const { width, x } = trackRef.current!.getBoundingClientRect();\n const localX = clientX - x;\n const normaliseBetweenValues = (localX / width) * (max - min) + min;\n const roundedToStep = roundToStep(normaliseBetweenValues, step);\n const decimals = countDecimalPlaces(step);\n const rounded = Number(roundedToStep.toFixed(decimals));\n const value = clampValue(rounded, [min, max]);\n return value;\n};\n\nexport const setValue = (\n value: SliderValue,\n newValue: number,\n index: ThumbIndex,\n onChange: SliderChangeHandler,\n) => {\n if (value.length === 2) {\n const newValueArray = [...value];\n newValueArray.splice(index, 1, newValue);\n onChange(newValueArray as SliderValue);\n return;\n }\n onChange([newValue]);\n};\n\nexport const roundToStep = (value: number, step: number) =>\n Math.round(value / step) * step;\n\nexport const clampValue = (value: number, [min, max]: number[]) => {\n if (value > max) {\n return max;\n }\n if (value < min) {\n return min;\n }\n return value;\n};\n\nexport const getPercentage = (min: number, max: number, value: number) => {\n const percentage = ((value - min) / (max - min)) * 100;\n return Math.min(Math.max(percentage, 0), 100);\n};\n\nexport const getPercentageDifference = (\n min: number,\n max: number,\n value: number[],\n) => {\n const valueDiff = value[1] - value[0];\n const percentage = ((valueDiff - min) / (max - min)) * 100;\n return `${Math.min(Math.max(percentage, 0), 100)}%`;\n};\n\nexport const getPercentageOffset = (\n min: number,\n max: number,\n value: number[],\n) => {\n const offsetLeft = ((value[0] - min) / (max - min)) * 100;\n return `${Math.min(Math.max(offsetLeft, 0), 100)}%`;\n};\n\nexport const countDecimalPlaces = (num: number) => {\n const parts = num.toString().split(\".\");\n return parts.length > 1 ? parts[1].length : 0;\n};\n\nexport const getMarkStyles = (min: number, max: number, step: number) => {\n const marks = [];\n for (let i = min; i <= max; i = Number((i + step).toPrecision(4))) {\n const value = Number(i.toPrecision(4));\n const position = `${getPercentage(min, max, value)}%`;\n marks.push({ value, position });\n }\n const decimals = Math.max(\n ...marks.map((mark) => countDecimalPlaces(mark.value)),\n );\n return marks.map((mark) => ({\n ...mark,\n label: mark.value.toFixed(decimals),\n }));\n};\n\nexport const getNearestIndex = (value: SliderValue, newValue: number) => {\n if (value.length === 1) return 0;\n\n if (value[0] === value[1]) {\n if (newValue < value[0]) return 0;\n return 1;\n }\n\n const distances = value.map((value) => Math.abs(newValue - value));\n const minDistance = Math.min(...distances);\n const nearestIndex = distances.indexOf(minDistance);\n\n return nearestIndex as ThumbIndex;\n};\n\nexport const preventOverlappingValues = (\n value: SliderValue,\n newValue: number,\n index: ThumbIndex,\n) =>\n value.length === 2\n ? index === 0\n ? Math.min(newValue, value[1])\n : Math.max(newValue, value[0])\n : newValue;\n\nexport const parseValueProp = (\n value: number[] | undefined,\n min: number,\n max: number,\n) => {\n if (typeof value === \"undefined\" || value.length < 1) return;\n const a = clampValue(value[0], [min, max]);\n if (value.length === 1) return [a] as SliderValue;\n const b = clampValue(value[1], [min, max]);\n if (a > b) return [a, a] as SliderValue;\n return [a, b] as SliderValue;\n};\n"],"names":["value"],"mappings":"AAGO,MAAM,WAAW,CACtB,QAAA,EACA,GACA,EAAA,GAAA,EACA,MACA,OACG,KAAA;AACH,EAAA,MAAM,EAAE,KAAO,EAAA,CAAA,EAAM,GAAA,QAAA,CAAS,QAAS,qBAAsB,EAAA,CAAA;AAC7D,EAAA,MAAM,SAAS,OAAU,GAAA,CAAA,CAAA;AACzB,EAAA,MAAM,sBAA0B,GAAA,MAAA,GAAS,KAAU,IAAA,GAAA,GAAM,GAAO,CAAA,GAAA,GAAA,CAAA;AAChE,EAAM,MAAA,aAAA,GAAgB,WAAY,CAAA,sBAAA,EAAwB,IAAI,CAAA,CAAA;AAC9D,EAAM,MAAA,QAAA,GAAW,mBAAmB,IAAI,CAAA,CAAA;AACxC,EAAA,MAAM,OAAU,GAAA,MAAA,CAAO,aAAc,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA;AACtD,EAAA,MAAM,QAAQ,UAAW,CAAA,OAAA,EAAS,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AAC5C,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAEO,MAAM,QAAW,GAAA,CACtB,KACA,EAAA,QAAA,EACA,OACA,QACG,KAAA;AACH,EAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,IAAM,MAAA,aAAA,GAAgB,CAAC,GAAG,KAAK,CAAA,CAAA;AAC/B,IAAc,aAAA,CAAA,MAAA,CAAO,KAAO,EAAA,CAAA,EAAG,QAAQ,CAAA,CAAA;AACvC,IAAA,QAAA,CAAS,aAA4B,CAAA,CAAA;AACrC,IAAA,OAAA;AAAA,GACF;AACA,EAAS,QAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA;AACrB,EAAA;AAEa,MAAA,WAAA,GAAc,CAAC,KAAe,EAAA,IAAA,KACzC,KAAK,KAAM,CAAA,KAAA,GAAQ,IAAI,CAAI,GAAA,KAAA;AAEtB,MAAM,aAAa,CAAC,KAAA,EAAe,CAAC,GAAA,EAAK,GAAG,CAAgB,KAAA;AACjE,EAAA,IAAI,QAAQ,GAAK,EAAA;AACf,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,QAAQ,GAAK,EAAA;AACf,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAEO,MAAM,aAAgB,GAAA,CAAC,GAAa,EAAA,GAAA,EAAa,KAAkB,KAAA;AACxE,EAAA,MAAM,UAAe,GAAA,CAAA,KAAA,GAAQ,GAAQ,KAAA,GAAA,GAAM,GAAQ,CAAA,GAAA,GAAA,CAAA;AACnD,EAAA,OAAO,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,UAAY,EAAA,CAAC,GAAG,GAAG,CAAA,CAAA;AAC9C,EAAA;AAqBa,MAAA,kBAAA,GAAqB,CAAC,GAAgB,KAAA;AACjD,EAAA,MAAM,KAAQ,GAAA,GAAA,CAAI,QAAS,EAAA,CAAE,MAAM,GAAG,CAAA,CAAA;AACtC,EAAA,OAAO,KAAM,CAAA,MAAA,GAAS,CAAI,GAAA,KAAA,CAAM,GAAG,MAAS,GAAA,CAAA,CAAA;AAC9C,EAAA;AAEO,MAAM,aAAgB,GAAA,CAAC,GAAa,EAAA,GAAA,EAAa,IAAiB,KAAA;AACvE,EAAA,MAAM,QAAQ,EAAC,CAAA;AACf,EAAS,KAAA,IAAA,CAAA,GAAI,GAAK,EAAA,CAAA,IAAK,GAAK,EAAA,CAAA,GAAI,MAAQ,CAAA,CAAA,CAAA,GAAI,IAAM,EAAA,WAAA,CAAY,CAAC,CAAC,CAAG,EAAA;AACjE,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,CAAE,CAAA,WAAA,CAAY,CAAC,CAAC,CAAA,CAAA;AACrC,IAAA,MAAM,QAAW,GAAA,CAAA,EAAG,aAAc,CAAA,GAAA,EAAK,KAAK,KAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AACjD,IAAA,KAAA,CAAM,IAAK,CAAA,EAAE,KAAO,EAAA,QAAA,EAAU,CAAA,CAAA;AAAA,GAChC;AACA,EAAA,MAAM,WAAW,IAAK,CAAA,GAAA;AAAA,IACpB,GAAG,MAAM,GAAI,CAAA,CAAC,SAAS,kBAAmB,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,GACvD,CAAA;AACA,EAAO,OAAA,KAAA,CAAM,GAAI,CAAA,CAAC,IAAU,MAAA;AAAA,IAC1B,GAAG,IAAA;AAAA,IACH,KAAO,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,GAClC,CAAA,CAAA,CAAA;AACJ,EAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,KAAA,EAAoB,QAAqB,KAAA;AACvE,EAAA,IAAI,MAAM,MAAW,KAAA,CAAA;AAAG,IAAO,OAAA,CAAA,CAAA;AAE/B,EAAI,IAAA,KAAA,CAAM,CAAO,CAAA,KAAA,KAAA,CAAM,CAAI,CAAA,EAAA;AACzB,IAAA,IAAI,WAAW,KAAM,CAAA,CAAA,CAAA;AAAI,MAAO,OAAA,CAAA,CAAA;AAChC,IAAO,OAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,SAAA,GAAY,MAAM,GAAI,CAAA,CAACA,WAAU,IAAK,CAAA,GAAA,CAAI,QAAWA,GAAAA,MAAK,CAAC,CAAA,CAAA;AACjE,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,GAAG,SAAS,CAAA,CAAA;AACzC,EAAM,MAAA,YAAA,GAAe,SAAU,CAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAElD,EAAO,OAAA,YAAA,CAAA;AACT,EAAA;AAEa,MAAA,wBAAA,GAA2B,CACtC,KACA,EAAA,QAAA,EACA,UAEA,KAAM,CAAA,MAAA,KAAW,IACb,KAAU,KAAA,CAAA,GACR,KAAK,GAAI,CAAA,QAAA,EAAU,MAAM,CAAE,CAAA,CAAA,GAC3B,KAAK,GAAI,CAAA,QAAA,EAAU,KAAM,CAAA,CAAA,CAAE,CAC7B,GAAA,SAAA;AAEC,MAAM,cAAiB,GAAA,CAC5B,KACA,EAAA,GAAA,EACA,GACG,KAAA;AACH,EAAA,IAAI,OAAO,KAAA,KAAU,WAAe,IAAA,KAAA,CAAM,MAAS,GAAA,CAAA;AAAG,IAAA,OAAA;AACtD,EAAA,MAAM,IAAI,UAAW,CAAA,KAAA,CAAM,IAAI,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AACzC,EAAA,IAAI,MAAM,MAAW,KAAA,CAAA;AAAG,IAAA,OAAO,CAAC,CAAC,CAAA,CAAA;AACjC,EAAA,MAAM,IAAI,UAAW,CAAA,KAAA,CAAM,IAAI,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AACzC,EAAA,IAAI,CAAI,GAAA,CAAA;AAAG,IAAO,OAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AACvB,EAAO,OAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AACd;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltTabActivationIndicator-no-background {\n --tabs-activationIndicator-background: transparent !important;\n}\n\n.saltTabActivationIndicator {\n --tabs-activationIndicator-background: var(--salt-container-primary-borderColor);\n\n background: var(--saltTabs-activationIndicator-background, var(--tabs-activationIndicator-background));\n bottom: 0;\n height: var(--saltTabs-activationIndicator-height, auto);\n inset: var(--tabs-activationIndicator-inset);\n position: absolute;\n width: var(--tabs-activationIndicator-width, auto);\n}\n\n/* the Active Tab indicator, uses navigable styles */\n.saltTabActivationIndicator-thumb {\n inset: var(--saltTabs-activationIndicator-thumb-inset);\n position: absolute;\n height: var(--tabs-activationIndicator-thumb-height, auto);\n background: var(--salt-navigable-indicator-active);\n transition: var(--saltTabs-activationIndicator-transition, var(--tabs-activationIndicator-transition, left 0.3s ease));\n width: var(--tabs-activationIndicator-thumb-width, auto);\n z-index: 1;\n}\n";
1
+ var css_248z = ".saltTabActivationIndicator-no-background {\n --tabs-activationIndicator-background: transparent !important;\n}\n\n.saltTabActivationIndicator {\n --tabs-activationIndicator-background: var(--salt-container-primary-borderColor);\n\n background: var(--saltTabs-activationIndicator-background, var(--tabs-activationIndicator-background));\n height: var(--saltTabs-activationIndicator-height, auto);\n inset: var(--tabs-activationIndicator-inset);\n position: absolute;\n width: var(--tabs-activationIndicator-width, auto);\n}\n\n/* the Active Tab indicator, uses navigable styles */\n.saltTabActivationIndicator-thumb {\n inset: var(--saltTabs-activationIndicator-thumb-inset);\n position: absolute;\n height: var(--tabs-activationIndicator-thumb-height, auto);\n background: var(--salt-navigable-indicator-active);\n transition: var(--saltTabs-activationIndicator-transition, var(--tabs-activationIndicator-transition, left 0.3s ease));\n width: var(--tabs-activationIndicator-thumb-width, auto);\n z-index: 1;\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=TabActivationIndicator.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTabs.js","sources":["../src/tabs/useTabs.ts"],"sourcesContent":["import { useControlled, useIdMemo } from \"@salt-ds/core\";\nimport { type ReactNode, useCallback } from \"react\";\nimport type { TabDescriptor } from \"./TabsTypes\";\nimport { useItemsWithIds } from \"./useItemsWithIds\";\n\nexport interface TabsHookProps {\n activeTabIndex?: number | null;\n children: ReactNode;\n defaultActiveTabIndex?: number;\n id?: string;\n onActiveChange?: (tabIndex: number) => void;\n}\n\nexport interface TabsHookResult {\n activeTabIndex?: number | null;\n id: string;\n onActiveChange?: (tabIndex: number) => void;\n tabPanel?: ReactNode;\n tabs: TabDescriptor[];\n}\n\nexport const useTabs = ({\n activeTabIndex: activeTabIndexProp,\n children,\n defaultActiveTabIndex,\n id: idProp,\n onActiveChange,\n}: TabsHookProps): TabsHookResult => {\n const id = useIdMemo(idProp);\n const [itemsWithIds] = useItemsWithIds(children, id);\n\n const [activeTabIndex, setActiveTabIndex] = useControlled({\n controlled: activeTabIndexProp,\n default: defaultActiveTabIndex ?? 0,\n name: \"useTabs\",\n state: \"activeTabIndex\",\n });\n\n const handleTabActivated = useCallback(\n (tabIndex: number) => {\n setActiveTabIndex(tabIndex);\n onActiveChange?.(tabIndex);\n },\n [onActiveChange],\n );\n\n return {\n id,\n onActiveChange: handleTabActivated,\n activeTabIndex,\n tabs: itemsWithIds,\n tabPanel:\n activeTabIndex === null\n ? null\n : itemsWithIds[activeTabIndex]?.element ?? null,\n };\n};\n"],"names":[],"mappings":";;;;AAqBO,MAAM,UAAU,CAAC;AAAA,EACtB,cAAgB,EAAA,kBAAA;AAAA,EAChB,QAAA;AAAA,EACA,qBAAA;AAAA,EACA,EAAI,EAAA,MAAA;AAAA,EACJ,cAAA;AACF,CAAqC,KAAA;AA3BrC,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4BE,EAAM,MAAA,EAAA,GAAK,UAAU,MAAM,CAAA,CAAA;AAC3B,EAAA,MAAM,CAAC,YAAY,CAAI,GAAA,eAAA,CAAgB,UAAU,EAAE,CAAA,CAAA;AAEnD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,aAAc,CAAA;AAAA,IACxD,UAAY,EAAA,kBAAA;AAAA,IACZ,SAAS,qBAAyB,IAAA,IAAA,GAAA,qBAAA,GAAA,CAAA;AAAA,IAClC,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,gBAAA;AAAA,GACR,CAAA,CAAA;AAED,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAAC,QAAqB,KAAA;AACpB,MAAA,iBAAA,CAAkB,QAAQ,CAAA,CAAA;AAC1B,MAAiB,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,QAAA,CAAA,CAAA;AAAA,KACnB;AAAA,IACA,CAAC,cAAc,CAAA;AAAA,GACjB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,cAAgB,EAAA,kBAAA;AAAA,IAChB,cAAA;AAAA,IACA,IAAM,EAAA,YAAA;AAAA,IACN,QAAA,EACE,mBAAmB,IACf,GAAA,IAAA,GAAA,CACA,wBAAa,cAAb,CAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,YAA9B,IAAyC,GAAA,EAAA,GAAA,IAAA;AAAA,GACjD,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useTabs.js","sources":["../src/tabs/useTabs.ts"],"sourcesContent":["import { useControlled, useIdMemo } from \"@salt-ds/core\";\nimport { type ReactNode, useCallback } from \"react\";\nimport type { TabDescriptor } from \"./TabsTypes\";\nimport { useItemsWithIds } from \"./useItemsWithIds\";\n\nexport interface TabsHookProps {\n activeTabIndex?: number | null;\n children: ReactNode;\n defaultActiveTabIndex?: number;\n id?: string;\n onActiveChange?: (tabIndex: number) => void;\n}\n\nexport interface TabsHookResult {\n activeTabIndex?: number | null;\n id: string;\n onActiveChange?: (tabIndex: number) => void;\n tabPanel?: ReactNode;\n tabs: TabDescriptor[];\n}\n\nexport const useTabs = ({\n activeTabIndex: activeTabIndexProp,\n children,\n defaultActiveTabIndex,\n id: idProp,\n onActiveChange,\n}: TabsHookProps): TabsHookResult => {\n const id = useIdMemo(idProp);\n const [itemsWithIds] = useItemsWithIds(children, id);\n\n const [activeTabIndex, setActiveTabIndex] = useControlled({\n controlled: activeTabIndexProp,\n default: defaultActiveTabIndex ?? 0,\n name: \"useTabs\",\n state: \"activeTabIndex\",\n });\n\n const handleTabActivated = useCallback(\n (tabIndex: number) => {\n setActiveTabIndex(tabIndex);\n onActiveChange?.(tabIndex);\n },\n [onActiveChange],\n );\n\n return {\n id,\n onActiveChange: handleTabActivated,\n activeTabIndex,\n tabs: itemsWithIds,\n tabPanel:\n activeTabIndex === null\n ? null\n : (itemsWithIds[activeTabIndex]?.element ?? null),\n };\n};\n"],"names":[],"mappings":";;;;AAqBO,MAAM,UAAU,CAAC;AAAA,EACtB,cAAgB,EAAA,kBAAA;AAAA,EAChB,QAAA;AAAA,EACA,qBAAA;AAAA,EACA,EAAI,EAAA,MAAA;AAAA,EACJ,cAAA;AACF,CAAqC,KAAA;AA3BrC,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4BE,EAAM,MAAA,EAAA,GAAK,UAAU,MAAM,CAAA,CAAA;AAC3B,EAAA,MAAM,CAAC,YAAY,CAAI,GAAA,eAAA,CAAgB,UAAU,EAAE,CAAA,CAAA;AAEnD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,aAAc,CAAA;AAAA,IACxD,UAAY,EAAA,kBAAA;AAAA,IACZ,SAAS,qBAAyB,IAAA,IAAA,GAAA,qBAAA,GAAA,CAAA;AAAA,IAClC,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,gBAAA;AAAA,GACR,CAAA,CAAA;AAED,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAAC,QAAqB,KAAA;AACpB,MAAA,iBAAA,CAAkB,QAAQ,CAAA,CAAA;AAC1B,MAAiB,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,QAAA,CAAA,CAAA;AAAA,KACnB;AAAA,IACA,CAAC,cAAc,CAAA;AAAA,GACjB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,cAAgB,EAAA,kBAAA;AAAA,IAChB,cAAA;AAAA,IACA,IAAM,EAAA,YAAA;AAAA,IACN,QAAA,EACE,mBAAmB,IACf,GAAA,IAAA,GAAA,CACC,wBAAa,cAAb,CAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,YAA9B,IAAyC,GAAA,EAAA,GAAA,IAAA;AAAA,GAClD,CAAA;AACF;;;;"}