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

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 (223) hide show
  1. package/css/salt-lab.css +280 -38
  2. package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -2
  3. package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
  4. package/dist-cjs/calendar/Calendar.js +55 -26
  5. package/dist-cjs/calendar/Calendar.js.map +1 -1
  6. package/dist-cjs/calendar/CalendarDateGrid.css.js +6 -0
  7. package/dist-cjs/calendar/CalendarDateGrid.css.js.map +1 -0
  8. package/dist-cjs/calendar/{internal/CalendarCarousel.js → CalendarDateGrid.js} +37 -14
  9. package/dist-cjs/calendar/CalendarDateGrid.js.map +1 -0
  10. package/dist-cjs/calendar/CalendarNavigation.js +7 -5
  11. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
  12. package/dist-cjs/calendar/{internal/CalendarWeekHeader.js → CalendarWeekHeader.js} +4 -3
  13. package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -0
  14. package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
  15. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
  16. package/dist-cjs/calendar/useCalendar.js +2 -4
  17. package/dist-cjs/calendar/useCalendar.js.map +1 -1
  18. package/dist-cjs/calendar/useCalendarSelection.js +16 -43
  19. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
  20. package/dist-cjs/carousel/Carousel.js +5 -5
  21. package/dist-cjs/carousel/Carousel.js.map +1 -1
  22. package/dist-cjs/cascading-menu/CascadingMenuItem.js +2 -2
  23. package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
  24. package/dist-cjs/contact-details/ContactMetadata.js +2 -2
  25. package/dist-cjs/contact-details/ContactMetadata.js.map +1 -1
  26. package/dist-cjs/date-input/DateInputRange.js +2 -0
  27. package/dist-cjs/date-input/DateInputRange.js.map +1 -1
  28. package/dist-cjs/date-input/DateInputSingle.js +2 -0
  29. package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
  30. package/dist-cjs/date-picker/DatePicker.js +40 -5
  31. package/dist-cjs/date-picker/DatePicker.js.map +1 -1
  32. package/dist-cjs/date-picker/DatePickerActions.js +7 -3
  33. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -1
  34. package/dist-cjs/date-picker/DatePickerRangeInput.js +5 -4
  35. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
  36. package/dist-cjs/date-picker/DatePickerRangePanel.js +33 -9
  37. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
  38. package/dist-cjs/date-picker/DatePickerSingleInput.js +5 -4
  39. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
  40. package/dist-cjs/date-picker/DatePickerSinglePanel.js +19 -5
  41. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -1
  42. package/dist-cjs/date-picker/useDatePicker.js +91 -63
  43. package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
  44. package/dist-cjs/dropdown/DropdownButton.js +4 -2
  45. package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
  46. package/dist-cjs/index.js +10 -0
  47. package/dist-cjs/index.js.map +1 -1
  48. package/dist-cjs/menu-button/MenuButtonTrigger.js +2 -2
  49. package/dist-cjs/menu-button/MenuButtonTrigger.js.map +1 -1
  50. package/dist-cjs/query-input/internal/CategoryListItem.js +2 -2
  51. package/dist-cjs/query-input/internal/CategoryListItem.js.map +1 -1
  52. package/dist-cjs/query-input/internal/ValueList.js +2 -2
  53. package/dist-cjs/query-input/internal/ValueList.js.map +1 -1
  54. package/dist-cjs/search-input/SearchInput.js +2 -1
  55. package/dist-cjs/search-input/SearchInput.js.map +1 -1
  56. package/dist-cjs/static-list/StaticList.css.js +6 -0
  57. package/dist-cjs/static-list/StaticList.css.js.map +1 -0
  58. package/dist-cjs/static-list/StaticList.js +32 -0
  59. package/dist-cjs/static-list/StaticList.js.map +1 -0
  60. package/dist-cjs/static-list/StaticListItem.css.js +6 -0
  61. package/dist-cjs/static-list/StaticListItem.css.js.map +1 -0
  62. package/dist-cjs/static-list/StaticListItem.js +33 -0
  63. package/dist-cjs/static-list/StaticListItem.js.map +1 -0
  64. package/dist-cjs/static-list/StaticListItemContent.css.js +6 -0
  65. package/dist-cjs/static-list/StaticListItemContent.css.js.map +1 -0
  66. package/dist-cjs/static-list/StaticListItemContent.js +30 -0
  67. package/dist-cjs/static-list/StaticListItemContent.js.map +1 -0
  68. package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js +8 -8
  69. package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js.map +1 -1
  70. package/dist-cjs/stepper-input/StepperInput.css.js +1 -1
  71. package/dist-cjs/stepper-input/StepperInput.js +214 -29
  72. package/dist-cjs/stepper-input/StepperInput.js.map +1 -1
  73. package/dist-cjs/stepper-input/internal/useActivateWhileMouseDown.js +54 -0
  74. package/dist-cjs/stepper-input/internal/useActivateWhileMouseDown.js.map +1 -0
  75. package/dist-cjs/stepper-input/internal/utils.js +43 -0
  76. package/dist-cjs/stepper-input/internal/utils.js.map +1 -0
  77. package/dist-cjs/stepper-input/useStepperInput.js +88 -172
  78. package/dist-cjs/stepper-input/useStepperInput.js.map +1 -1
  79. package/dist-cjs/tabs/Tab.js +14 -12
  80. package/dist-cjs/tabs/Tab.js.map +1 -1
  81. package/dist-cjs/tabs/Tabstrip.js +2 -1
  82. package/dist-cjs/tabs/Tabstrip.js.map +1 -1
  83. package/dist-cjs/tabs-next/OverflowMenu.js +2 -2
  84. package/dist-cjs/tabs-next/OverflowMenu.js.map +1 -1
  85. package/dist-cjs/tokenized-input/TokenizedInputBase.js +3 -3
  86. package/dist-cjs/tokenized-input/TokenizedInputBase.js.map +1 -1
  87. package/dist-cjs/tokenized-input/internal/InputPill.js +2 -2
  88. package/dist-cjs/tokenized-input/internal/InputPill.js.map +1 -1
  89. package/dist-cjs/tokenized-input-next/TokenizedInputNext.js +3 -3
  90. package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -1
  91. package/dist-cjs/tokenized-input-next/internal/InputPill.js +2 -2
  92. package/dist-cjs/tokenized-input-next/internal/InputPill.js.map +1 -1
  93. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js +2 -2
  94. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  95. package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -2
  96. package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
  97. package/dist-es/calendar/Calendar.js +57 -28
  98. package/dist-es/calendar/Calendar.js.map +1 -1
  99. package/dist-es/calendar/CalendarDateGrid.css.js +4 -0
  100. package/dist-es/calendar/CalendarDateGrid.css.js.map +1 -0
  101. package/dist-es/calendar/{internal/CalendarCarousel.js → CalendarDateGrid.js} +37 -14
  102. package/dist-es/calendar/CalendarDateGrid.js.map +1 -0
  103. package/dist-es/calendar/CalendarNavigation.js +8 -6
  104. package/dist-es/calendar/CalendarNavigation.js.map +1 -1
  105. package/dist-es/calendar/{internal/CalendarWeekHeader.js → CalendarWeekHeader.js} +4 -3
  106. package/dist-es/calendar/CalendarWeekHeader.js.map +1 -0
  107. package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
  108. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
  109. package/dist-es/calendar/useCalendar.js +2 -4
  110. package/dist-es/calendar/useCalendar.js.map +1 -1
  111. package/dist-es/calendar/useCalendarSelection.js +16 -43
  112. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  113. package/dist-es/carousel/Carousel.js +6 -6
  114. package/dist-es/carousel/Carousel.js.map +1 -1
  115. package/dist-es/cascading-menu/CascadingMenuItem.js +3 -3
  116. package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
  117. package/dist-es/contact-details/ContactMetadata.js +3 -3
  118. package/dist-es/contact-details/ContactMetadata.js.map +1 -1
  119. package/dist-es/date-input/DateInputRange.js +2 -0
  120. package/dist-es/date-input/DateInputRange.js.map +1 -1
  121. package/dist-es/date-input/DateInputSingle.js +2 -0
  122. package/dist-es/date-input/DateInputSingle.js.map +1 -1
  123. package/dist-es/date-picker/DatePicker.js +40 -5
  124. package/dist-es/date-picker/DatePicker.js.map +1 -1
  125. package/dist-es/date-picker/DatePickerActions.js +7 -3
  126. package/dist-es/date-picker/DatePickerActions.js.map +1 -1
  127. package/dist-es/date-picker/DatePickerRangeInput.js +5 -4
  128. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
  129. package/dist-es/date-picker/DatePickerRangePanel.js +33 -9
  130. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
  131. package/dist-es/date-picker/DatePickerSingleInput.js +5 -4
  132. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
  133. package/dist-es/date-picker/DatePickerSinglePanel.js +19 -5
  134. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -1
  135. package/dist-es/date-picker/useDatePicker.js +92 -64
  136. package/dist-es/date-picker/useDatePicker.js.map +1 -1
  137. package/dist-es/dropdown/DropdownButton.js +6 -4
  138. package/dist-es/dropdown/DropdownButton.js.map +1 -1
  139. package/dist-es/index.js +5 -0
  140. package/dist-es/index.js.map +1 -1
  141. package/dist-es/menu-button/MenuButtonTrigger.js +3 -3
  142. package/dist-es/menu-button/MenuButtonTrigger.js.map +1 -1
  143. package/dist-es/query-input/internal/CategoryListItem.js +3 -3
  144. package/dist-es/query-input/internal/CategoryListItem.js.map +1 -1
  145. package/dist-es/query-input/internal/ValueList.js +3 -3
  146. package/dist-es/query-input/internal/ValueList.js.map +1 -1
  147. package/dist-es/search-input/SearchInput.js +3 -2
  148. package/dist-es/search-input/SearchInput.js.map +1 -1
  149. package/dist-es/static-list/StaticList.css.js +4 -0
  150. package/dist-es/static-list/StaticList.css.js.map +1 -0
  151. package/dist-es/static-list/StaticList.js +28 -0
  152. package/dist-es/static-list/StaticList.js.map +1 -0
  153. package/dist-es/static-list/StaticListItem.css.js +4 -0
  154. package/dist-es/static-list/StaticListItem.css.js.map +1 -0
  155. package/dist-es/static-list/StaticListItem.js +29 -0
  156. package/dist-es/static-list/StaticListItem.js.map +1 -0
  157. package/dist-es/static-list/StaticListItemContent.css.js +4 -0
  158. package/dist-es/static-list/StaticListItemContent.css.js.map +1 -0
  159. package/dist-es/static-list/StaticListItemContent.js +26 -0
  160. package/dist-es/static-list/StaticListItemContent.js.map +1 -0
  161. package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js +9 -9
  162. package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js.map +1 -1
  163. package/dist-es/stepper-input/StepperInput.css.js +1 -1
  164. package/dist-es/stepper-input/StepperInput.js +216 -31
  165. package/dist-es/stepper-input/StepperInput.js.map +1 -1
  166. package/dist-es/stepper-input/internal/useActivateWhileMouseDown.js +50 -0
  167. package/dist-es/stepper-input/internal/useActivateWhileMouseDown.js.map +1 -0
  168. package/dist-es/stepper-input/internal/utils.js +32 -0
  169. package/dist-es/stepper-input/internal/utils.js.map +1 -0
  170. package/dist-es/stepper-input/useStepperInput.js +88 -172
  171. package/dist-es/stepper-input/useStepperInput.js.map +1 -1
  172. package/dist-es/tabs/Tab.js +15 -13
  173. package/dist-es/tabs/Tab.js.map +1 -1
  174. package/dist-es/tabs/Tabstrip.js +4 -3
  175. package/dist-es/tabs/Tabstrip.js.map +1 -1
  176. package/dist-es/tabs-next/OverflowMenu.js +3 -3
  177. package/dist-es/tabs-next/OverflowMenu.js.map +1 -1
  178. package/dist-es/tokenized-input/TokenizedInputBase.js +3 -3
  179. package/dist-es/tokenized-input/TokenizedInputBase.js.map +1 -1
  180. package/dist-es/tokenized-input/internal/InputPill.js +2 -2
  181. package/dist-es/tokenized-input/internal/InputPill.js.map +1 -1
  182. package/dist-es/tokenized-input-next/TokenizedInputNext.js +3 -3
  183. package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -1
  184. package/dist-es/tokenized-input-next/internal/InputPill.js +2 -2
  185. package/dist-es/tokenized-input-next/internal/InputPill.js.map +1 -1
  186. package/dist-es/toolbar/overflow-panel/OverflowPanel.js +3 -3
  187. package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  188. package/dist-types/calendar/Calendar.d.ts +2 -15
  189. package/dist-types/calendar/CalendarDateGrid.d.ts +10 -0
  190. package/dist-types/calendar/{internal/CalendarWeekHeader.d.ts → CalendarWeekHeader.d.ts} +1 -1
  191. package/dist-types/calendar/index.d.ts +2 -0
  192. package/dist-types/calendar/internal/CalendarMonth.d.ts +9 -1
  193. package/dist-types/calendar/useCalendarSelection.d.ts +0 -7
  194. package/dist-types/date-picker/DatePickerRangePanel.d.ts +17 -1
  195. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +9 -1
  196. package/dist-types/index.d.ts +1 -0
  197. package/dist-types/static-list/StaticList.d.ts +8 -0
  198. package/dist-types/static-list/StaticListItem.d.ts +4 -0
  199. package/dist-types/static-list/StaticListItemContent.d.ts +8 -0
  200. package/dist-types/static-list/index.d.ts +3 -0
  201. package/dist-types/stepper-input/StepperInput.d.ts +66 -19
  202. package/dist-types/stepper-input/internal/useActivateWhileMouseDown.d.ts +5 -0
  203. package/dist-types/stepper-input/internal/utils.d.ts +8 -0
  204. package/dist-types/stepper-input/useStepperInput.d.ts +21 -8
  205. package/package.json +2 -2
  206. package/dist-cjs/calendar/internal/CalendarCarousel.css.js +0 -6
  207. package/dist-cjs/calendar/internal/CalendarCarousel.css.js.map +0 -1
  208. package/dist-cjs/calendar/internal/CalendarCarousel.js.map +0 -1
  209. package/dist-cjs/calendar/internal/CalendarWeekHeader.js.map +0 -1
  210. package/dist-cjs/stepper-input/internal/useSpinner.js +0 -33
  211. package/dist-cjs/stepper-input/internal/useSpinner.js.map +0 -1
  212. package/dist-es/calendar/internal/CalendarCarousel.css.js +0 -4
  213. package/dist-es/calendar/internal/CalendarCarousel.css.js.map +0 -1
  214. package/dist-es/calendar/internal/CalendarCarousel.js.map +0 -1
  215. package/dist-es/calendar/internal/CalendarWeekHeader.js.map +0 -1
  216. package/dist-es/stepper-input/internal/useSpinner.js +0 -29
  217. package/dist-es/stepper-input/internal/useSpinner.js.map +0 -1
  218. package/dist-types/calendar/internal/CalendarCarousel.d.ts +0 -3
  219. package/dist-types/stepper-input/internal/useSpinner.d.ts +0 -5
  220. /package/dist-cjs/calendar/{internal/CalendarWeekHeader.css.js → CalendarWeekHeader.css.js} +0 -0
  221. /package/dist-cjs/calendar/{internal/CalendarWeekHeader.css.js.map → CalendarWeekHeader.css.js.map} +0 -0
  222. /package/dist-es/calendar/{internal/CalendarWeekHeader.css.js → CalendarWeekHeader.css.js} +0 -0
  223. /package/dist-es/calendar/{internal/CalendarWeekHeader.css.js.map → CalendarWeekHeader.css.js.map} +0 -0
@@ -1,60 +1,245 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { makePrefixer, Input, Button } from '@salt-ds/core';
3
- import { TriangleUpIcon, TriangleDownIcon } from '@salt-ds/icons';
2
+ import { makePrefixer, useIcon, useFormFieldProps, useControlled, useForkRef, capitalize, StatusAdornment, Button } from '@salt-ds/core';
4
3
  import { useComponentCssInjection } from '@salt-ds/styles';
5
4
  import { useWindow } from '@salt-ds/window';
6
5
  import { clsx } from 'clsx';
7
- import { forwardRef, useRef } from 'react';
8
- import { useStepperInput } from './useStepperInput.js';
6
+ import { forwardRef, useState, useRef } from 'react';
7
+ import { toFixedDecimalPlaces, isOutOfRange, toFloat, isAllowedNonNumeric, sanitizedInput } from './internal/utils.js';
9
8
  import css_248z from './StepperInput.css.js';
9
+ import { useStepperInput } from './useStepperInput.js';
10
10
 
11
11
  const withBaseName = makePrefixer("saltStepperInput");
12
12
  const StepperInput = forwardRef(
13
- function StepperInput2(props, ref) {
14
- const {
15
- className,
16
- hideButtons,
17
- onBlur,
18
- onChange,
19
- onFocus,
20
- readOnly,
21
- ...rest
22
- } = props;
13
+ function StepperInput2({
14
+ bordered,
15
+ className: classNameProp,
16
+ decimalPlaces = 0,
17
+ defaultValue: defaultValueProp,
18
+ disabled,
19
+ emptyReadOnlyMarker = "\u2014",
20
+ endAdornment,
21
+ hideButtons,
22
+ inputProps: inputPropsProp = {},
23
+ inputRef: inputRefProp,
24
+ max = Number.MAX_SAFE_INTEGER,
25
+ min = Number.MIN_SAFE_INTEGER,
26
+ onChange: onChangeProp,
27
+ placeholder,
28
+ readOnly: readOnlyProp,
29
+ startAdornment,
30
+ step = 1,
31
+ stepBlock = 10,
32
+ textAlign = "left",
33
+ validationStatus: validationStatusProp,
34
+ value: valueProp,
35
+ variant = "primary",
36
+ ...restProps
37
+ }, ref) {
23
38
  const targetWindow = useWindow();
24
39
  useComponentCssInjection({
25
40
  testId: "salt-stepper-input",
26
41
  css: css_248z,
27
42
  window: targetWindow
28
43
  });
44
+ const { IncreaseIcon, DecreaseIcon } = useIcon();
45
+ const {
46
+ a11yProps: {
47
+ "aria-describedby": formFieldDescribedBy,
48
+ "aria-labelledby": formFieldLabelledBy
49
+ } = {},
50
+ disabled: formFieldDisabled,
51
+ readOnly: formFieldReadOnly,
52
+ necessity: formFieldRequired,
53
+ validationStatus: formFieldValidationStatus
54
+ } = useFormFieldProps();
55
+ const isDisabled = disabled || formFieldDisabled;
56
+ const isReadOnly = readOnlyProp || formFieldReadOnly;
57
+ const validationStatus = formFieldValidationStatus != null ? formFieldValidationStatus : validationStatusProp;
58
+ const {
59
+ "aria-describedby": inputDescribedBy,
60
+ "aria-labelledby": inputLabelledBy,
61
+ className: inputClassName,
62
+ onBlur: inputOnBlur,
63
+ onChange: inputOnChange,
64
+ onFocus: inputOnFocus,
65
+ required: inputRequired,
66
+ onKeyDown: inputOnKeyDown,
67
+ ...restInputProps
68
+ } = inputPropsProp;
69
+ const isRequired = formFieldRequired ? ["required", "asterisk"].includes(formFieldRequired) : inputRequired;
70
+ const [value, setValue] = useControlled({
71
+ controlled: valueProp,
72
+ default: typeof defaultValueProp === "number" ? toFixedDecimalPlaces(defaultValueProp, decimalPlaces) : defaultValueProp,
73
+ name: "StepperInput",
74
+ state: "value"
75
+ });
76
+ const [focused, setFocused] = useState(false);
29
77
  const inputRef = useRef(null);
30
- const { getButtonProps, getInputProps } = useStepperInput(props, inputRef);
78
+ const forkedInputRef = useForkRef(inputRef, inputRefProp);
79
+ const {
80
+ decrementButtonProps,
81
+ decrementValue,
82
+ incrementButtonProps,
83
+ incrementValue
84
+ } = useStepperInput({
85
+ inputRef,
86
+ setValue,
87
+ decimalPlaces,
88
+ disabled,
89
+ max,
90
+ min,
91
+ onChange: onChangeProp,
92
+ readOnly: isReadOnly,
93
+ step,
94
+ stepBlock,
95
+ value
96
+ });
97
+ const handleInputFocus = (event) => {
98
+ setFocused(true);
99
+ inputOnFocus == null ? void 0 : inputOnFocus(event);
100
+ };
101
+ const handleInputBlur = (event) => {
102
+ setFocused(false);
103
+ if (value === void 0)
104
+ return;
105
+ const floatValue = toFloat(value);
106
+ if (Number.isNaN(floatValue)) {
107
+ setValue(value);
108
+ onChangeProp == null ? void 0 : onChangeProp(event, value);
109
+ } else {
110
+ const roundedValue = toFixedDecimalPlaces(floatValue, decimalPlaces);
111
+ if (value !== "" && !isAllowedNonNumeric(value)) {
112
+ setValue(roundedValue);
113
+ }
114
+ onChangeProp == null ? void 0 : onChangeProp(event, roundedValue);
115
+ }
116
+ inputOnBlur == null ? void 0 : inputOnBlur(event);
117
+ };
118
+ const handleInputChange = (event) => {
119
+ const changedValue = event.target.value;
120
+ setValue(sanitizedInput(changedValue));
121
+ onChangeProp == null ? void 0 : onChangeProp(event, sanitizedInput(changedValue));
122
+ inputOnChange == null ? void 0 : inputOnChange(event);
123
+ };
124
+ const handleInputKeyDown = (event) => {
125
+ switch (event.key) {
126
+ case "ArrowUp": {
127
+ event.preventDefault();
128
+ const block = event.shiftKey;
129
+ incrementValue(event, block);
130
+ break;
131
+ }
132
+ case "ArrowDown": {
133
+ event.preventDefault();
134
+ const block = event.shiftKey;
135
+ decrementValue(event, block);
136
+ break;
137
+ }
138
+ case "Home": {
139
+ event.preventDefault();
140
+ setValue(min);
141
+ onChangeProp == null ? void 0 : onChangeProp(event, min);
142
+ break;
143
+ }
144
+ case "End": {
145
+ event.preventDefault();
146
+ setValue(max);
147
+ onChangeProp == null ? void 0 : onChangeProp(event, max);
148
+ break;
149
+ }
150
+ case "PageUp": {
151
+ event.preventDefault();
152
+ incrementValue(event, true);
153
+ break;
154
+ }
155
+ case "PageDown": {
156
+ event.preventDefault();
157
+ decrementValue(event, true);
158
+ break;
159
+ }
160
+ }
161
+ inputOnKeyDown == null ? void 0 : inputOnKeyDown(event);
162
+ };
31
163
  return /* @__PURE__ */ jsxs("div", {
32
- className: clsx(withBaseName(), className),
164
+ className: clsx(withBaseName(), classNameProp),
165
+ ...restProps,
33
166
  ref,
34
167
  children: [
35
- /* @__PURE__ */ jsx(Input, {
36
- onBlur,
37
- onFocus,
38
- ref: inputRef,
39
- readOnly,
40
- ...getInputProps(rest)
168
+ /* @__PURE__ */ jsxs("div", {
169
+ className: clsx(
170
+ withBaseName("inputContainer"),
171
+ withBaseName(variant),
172
+ {
173
+ [withBaseName("focused")]: !isDisabled && focused,
174
+ [withBaseName("disabled")]: isDisabled,
175
+ [withBaseName("readOnly")]: isReadOnly,
176
+ [withBaseName(validationStatus || "")]: validationStatus,
177
+ [withBaseName("bordered")]: bordered
178
+ }
179
+ ),
180
+ children: [
181
+ startAdornment && /* @__PURE__ */ jsx("div", {
182
+ className: withBaseName("startAdornmentContainer"),
183
+ children: startAdornment
184
+ }),
185
+ /* @__PURE__ */ jsx("input", {
186
+ "aria-describedby": clsx(formFieldDescribedBy, inputDescribedBy),
187
+ "aria-invalid": isOutOfRange(value, min, max),
188
+ "aria-labelledby": clsx(formFieldLabelledBy, inputLabelledBy),
189
+ "aria-valuemax": toFloat(toFixedDecimalPlaces(max, decimalPlaces)),
190
+ "aria-valuemin": toFloat(toFixedDecimalPlaces(min, decimalPlaces)),
191
+ "aria-valuenow": value && !Number.isNaN(toFloat(value)) ? toFloat(toFixedDecimalPlaces(toFloat(value), decimalPlaces)) : void 0,
192
+ className: clsx(
193
+ withBaseName("input"),
194
+ withBaseName(`inputTextAlign${capitalize(textAlign)}`),
195
+ inputClassName
196
+ ),
197
+ disabled: isDisabled,
198
+ onBlur: handleInputBlur,
199
+ onChange: handleInputChange,
200
+ onFocus: !isDisabled ? handleInputFocus : void 0,
201
+ onKeyDown: handleInputKeyDown,
202
+ placeholder,
203
+ readOnly: isReadOnly,
204
+ ref: forkedInputRef,
205
+ required: isRequired,
206
+ role: "spinbutton",
207
+ tabIndex: isDisabled ? -1 : 0,
208
+ value,
209
+ ...restInputProps
210
+ }),
211
+ !isDisabled && validationStatus && /* @__PURE__ */ jsx(StatusAdornment, {
212
+ status: validationStatus
213
+ }),
214
+ endAdornment && /* @__PURE__ */ jsx("div", {
215
+ className: withBaseName("endAdornmentContainer"),
216
+ children: endAdornment
217
+ }),
218
+ /* @__PURE__ */ jsx("div", {
219
+ className: withBaseName("activationIndicator")
220
+ })
221
+ ]
41
222
  }),
42
- !hideButtons && !readOnly && /* @__PURE__ */ jsxs("div", {
223
+ !hideButtons && !isReadOnly && /* @__PURE__ */ jsxs("div", {
43
224
  className: withBaseName("buttonContainer"),
44
225
  children: [
45
226
  /* @__PURE__ */ jsx(Button, {
46
- "aria-label": "increment value",
47
- className: withBaseName("stepperButton"),
48
- ...getButtonProps("increment"),
49
- children: /* @__PURE__ */ jsx(TriangleUpIcon, {
227
+ className: clsx(
228
+ withBaseName("stepperButton"),
229
+ withBaseName("stepperButtonIncrement")
230
+ ),
231
+ ...incrementButtonProps,
232
+ children: /* @__PURE__ */ jsx(IncreaseIcon, {
50
233
  "aria-hidden": true
51
234
  })
52
235
  }),
53
236
  /* @__PURE__ */ jsx(Button, {
54
- "aria-label": "decrement value",
55
- className: withBaseName("stepperButton"),
56
- ...getButtonProps("decrement"),
57
- children: /* @__PURE__ */ jsx(TriangleDownIcon, {
237
+ className: clsx(
238
+ withBaseName("stepperButton"),
239
+ withBaseName("stepperButtonDecrement")
240
+ ),
241
+ ...decrementButtonProps,
242
+ children: /* @__PURE__ */ jsx(DecreaseIcon, {
58
243
  "aria-hidden": true
59
244
  })
60
245
  })
@@ -1 +1 @@
1
- {"version":3,"file":"StepperInput.js","sources":["../src/stepper-input/StepperInput.tsx"],"sourcesContent":["import { Button, Input, type InputProps, makePrefixer } from \"@salt-ds/core\";\nimport { TriangleDownIcon, TriangleUpIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type FocusEventHandler, forwardRef, useRef } from \"react\";\nimport { useStepperInput } from \"./useStepperInput\";\n\nimport stepperInputCss from \"./StepperInput.css\";\n\nconst withBaseName = makePrefixer(\"saltStepperInput\");\n\nexport interface StepperInputProps\n extends Omit<InputProps, \"onChange\" | \"emptyReadOnlyMarker\"> {\n /**\n * A multiplier applied to the `step` when the value is incremented or decremented using the PageDown/PageUp keys.\n */\n block?: number;\n /**\n * The number of decimal places to display.\n */\n decimalPlaces?: number;\n /**\n * Sets the initial default value of the component.\n */\n defaultValue?: number;\n /**\n * The maximum value that can be selected.\n */\n max?: number;\n /**\n * The minimum value that can be selected.\n */\n min?: number;\n /**\n * Whether to hide the stepper buttons. Defaults to `false`.\n */\n hideButtons?: boolean;\n /**\n * Callback when stepper input loses focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Callback when stepper input value is changed.\n */\n onChange?: (changedValue: number | string) => void;\n /**\n * Callback when stepper input gains focus.\n */\n onFocus?: FocusEventHandler<HTMLInputElement>;\n /**\n * The amount to increment or decrement the value by when using the stepper buttons or Up Arrow and Down Arrow keys.\n */\n step?: number;\n /**\n * Determines the text alignment of the display value.\n */\n textAlign?: \"center\" | \"left\" | \"right\";\n /**\n * The value of the stepper input. The component will be controlled if this prop is provided.\n */\n value?: number | string;\n}\n\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(\n function StepperInput(props, ref) {\n const {\n className,\n hideButtons,\n onBlur,\n onChange,\n onFocus,\n readOnly,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-stepper-input\",\n css: stepperInputCss,\n window: targetWindow,\n });\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const { getButtonProps, getInputProps } = useStepperInput(props, inputRef);\n\n return (\n <div className={clsx(withBaseName(), className)} ref={ref}>\n <Input\n onBlur={onBlur}\n onFocus={onFocus}\n ref={inputRef}\n readOnly={readOnly}\n {...getInputProps(rest)}\n />\n {!hideButtons && !readOnly && (\n <div className={withBaseName(\"buttonContainer\")}>\n <Button\n aria-label=\"increment value\"\n className={withBaseName(\"stepperButton\")}\n {...getButtonProps(\"increment\")}\n >\n <TriangleUpIcon aria-hidden />\n </Button>\n <Button\n aria-label=\"decrement value\"\n className={withBaseName(\"stepperButton\")}\n {...getButtonProps(\"decrement\")}\n >\n <TriangleDownIcon aria-hidden />\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["StepperInput","stepperInputCss"],"mappings":";;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA,CAAA;AAsD7C,MAAM,YAAe,GAAA,UAAA;AAAA,EAC1B,SAASA,aAAa,CAAA,KAAA,EAAO,GAAK,EAAA;AAChC,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACG,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,oBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAM,MAAA,QAAA,GAAW,OAAgC,IAAI,CAAA,CAAA;AAErD,IAAA,MAAM,EAAE,cAAgB,EAAA,aAAA,EAAkB,GAAA,eAAA,CAAgB,OAAO,QAAQ,CAAA,CAAA;AAEzE,IAAA,uBACG,IAAA,CAAA,KAAA,EAAA;AAAA,MAAI,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MAAG,GAAA;AAAA,MAC/C,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,KAAA,EAAA;AAAA,UACC,MAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAK,EAAA,QAAA;AAAA,UACL,QAAA;AAAA,UACC,GAAG,cAAc,IAAI,CAAA;AAAA,SACxB,CAAA;AAAA,QACC,CAAC,WAAA,IAAe,CAAC,QAAA,oBACf,IAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAA,EAAW,aAAa,iBAAiB,CAAA;AAAA,UAC5C,QAAA,EAAA;AAAA,4BAAC,GAAA,CAAA,MAAA,EAAA;AAAA,cACC,YAAW,EAAA,iBAAA;AAAA,cACX,SAAA,EAAW,aAAa,eAAe,CAAA;AAAA,cACtC,GAAG,eAAe,WAAW,CAAA;AAAA,cAE9B,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,gBAAe,aAAW,EAAA,IAAA;AAAA,eAAC,CAAA;AAAA,aAC9B,CAAA;AAAA,4BACC,GAAA,CAAA,MAAA,EAAA;AAAA,cACC,YAAW,EAAA,iBAAA;AAAA,cACX,SAAA,EAAW,aAAa,eAAe,CAAA;AAAA,cACtC,GAAG,eAAe,WAAW,CAAA;AAAA,cAE9B,QAAC,kBAAA,GAAA,CAAA,gBAAA,EAAA;AAAA,gBAAiB,aAAW,EAAA,IAAA;AAAA,eAAC,CAAA;AAAA,aAChC,CAAA;AAAA,WAAA;AAAA,SACF,CAAA;AAAA,OAAA;AAAA,KAEJ,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"StepperInput.js","sources":["../src/stepper-input/StepperInput.tsx"],"sourcesContent":["import {\n Button,\n StatusAdornment,\n type ValidationStatus,\n capitalize,\n makePrefixer,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useIcon,\n} from \"@salt-ds/core\";\nimport { TriangleDownIcon, TriangleUpIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\nimport {\n isAllowedNonNumeric,\n isOutOfRange,\n sanitizedInput,\n toFixedDecimalPlaces,\n toFloat,\n} from \"./internal/utils\";\n\nimport stepperInputCss from \"./StepperInput.css\";\nimport { useStepperInput } from \"./useStepperInput\";\n\nconst withBaseName = makePrefixer(\"saltStepperInput\");\n\nexport interface StepperInputProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * A boolean. When `true`, the input will receive a full border.\n */\n bordered?: boolean;\n /**\n * The number of decimal places to display.\n */\n decimalPlaces?: number;\n /**\n * Sets the initial default value of the component.\n */\n defaultValue?: number | string;\n /**\n * If `true`, the stepper input will be disabled.\n */\n disabled?: boolean;\n /**\n * The marker to use in an empty read only Input.\n * Use `''` to disable this feature. Defaults to '—'.\n * @default '—'\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component\n */\n endAdornment?: ReactNode;\n /**\n * Whether to hide the stepper buttons. Defaults to `false`.\n * @default false\n */\n hideButtons?: boolean;\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * Optional ref for the input component\n */\n inputRef?: Ref<HTMLInputElement>;\n /**\n * The maximum value that can be selected. Defaults to Number.MAX_SAFE_INTEGER.\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * The minimum value that can be selected. Defaults to Number.MIN_SAFE_INTEGER.\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n /**\n * Callback when stepper input value is changed.\n * @param event - the event triggers value change, could be undefined during increment / decrement button long press\n */\n onChange?: (\n event: SyntheticEvent | undefined,\n value: number | string,\n ) => void;\n /**\n * A string. Displayed in a dimmed color when the input value is empty.\n */\n placeholder?: string | undefined;\n /**\n * A boolean. If `true`, the component is not editable by the user.\n */\n readOnly?: boolean;\n /**\n * Start adornment component\n */\n startAdornment?: ReactNode;\n /**\n * The amount to increment or decrement the value by when using the stepper buttons or Up Arrow and Down Arrow keys. Default to 1.\n * @default 1\n */\n step?: number;\n /**\n * The amount to change the value when the value is incremented or decremented by holding Shift and pressing Up arrow or Down arrow keys.\n * Defaults to 10.\n * @default 10\n */\n stepBlock?: number;\n /**\n * Alignment of text within container. Defaults to \"left\".\n * @default \"left\"\n */\n textAlign?: \"left\" | \"center\" | \"right\";\n /**\n * Validation status.\n */\n validationStatus?: Extract<ValidationStatus, \"error\" | \"warning\" | \"success\">;\n /**\n * Styling variant. Defaults to \"primary\".\n * @default \"primary\"\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * The value of the stepper input. The component will be controlled if this prop is provided.\n */\n value?: number | string | undefined;\n}\n\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(\n function StepperInput(\n {\n bordered,\n className: classNameProp,\n decimalPlaces = 0,\n defaultValue: defaultValueProp,\n disabled,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n hideButtons,\n inputProps: inputPropsProp = {},\n inputRef: inputRefProp,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n onChange: onChangeProp,\n placeholder,\n readOnly: readOnlyProp,\n startAdornment,\n step = 1,\n stepBlock = 10,\n textAlign = \"left\",\n validationStatus: validationStatusProp,\n value: valueProp,\n variant = \"primary\",\n ...restProps\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-stepper-input\",\n css: stepperInputCss,\n window: targetWindow,\n });\n\n const { IncreaseIcon, DecreaseIcon } = useIcon();\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isDisabled = disabled || formFieldDisabled;\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": inputDescribedBy,\n \"aria-labelledby\": inputLabelledBy,\n className: inputClassName,\n onBlur: inputOnBlur,\n onChange: inputOnChange,\n onFocus: inputOnFocus,\n required: inputRequired,\n onKeyDown: inputOnKeyDown,\n ...restInputProps\n } = inputPropsProp;\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : inputRequired;\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default:\n typeof defaultValueProp === \"number\"\n ? toFixedDecimalPlaces(defaultValueProp, decimalPlaces)\n : defaultValueProp,\n name: \"StepperInput\",\n state: \"value\",\n });\n\n // Won't be needed when `:has` css can be used\n const [focused, setFocused] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const forkedInputRef = useForkRef(inputRef, inputRefProp);\n\n const {\n decrementButtonProps,\n decrementValue,\n incrementButtonProps,\n incrementValue,\n } = useStepperInput({\n inputRef,\n setValue,\n decimalPlaces,\n disabled,\n max,\n min,\n onChange: onChangeProp,\n readOnly: isReadOnly,\n step,\n stepBlock,\n value,\n });\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n\n inputOnFocus?.(event);\n };\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n\n if (value === undefined) return;\n\n const floatValue = toFloat(value);\n if (Number.isNaN(floatValue)) {\n // Keep original value if NaN\n setValue(value);\n onChangeProp?.(event, value);\n } else {\n const roundedValue = toFixedDecimalPlaces(floatValue, decimalPlaces);\n\n if (value !== \"\" && !isAllowedNonNumeric(value)) {\n setValue(roundedValue);\n }\n\n onChangeProp?.(event, roundedValue);\n }\n\n inputOnBlur?.(event);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const changedValue = event.target.value;\n\n setValue(sanitizedInput(changedValue));\n\n onChangeProp?.(event, sanitizedInput(changedValue));\n inputOnChange?.(event);\n };\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n case \"ArrowUp\": {\n event.preventDefault();\n const block = event.shiftKey;\n incrementValue(event, block);\n break;\n }\n case \"ArrowDown\": {\n event.preventDefault();\n const block = event.shiftKey;\n decrementValue(event, block);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n setValue(min);\n onChangeProp?.(event, min);\n break;\n }\n case \"End\": {\n event.preventDefault();\n setValue(max);\n onChangeProp?.(event, max);\n break;\n }\n case \"PageUp\": {\n event.preventDefault();\n incrementValue(event, true);\n break;\n }\n case \"PageDown\": {\n event.preventDefault();\n decrementValue(event, true);\n break;\n }\n }\n\n inputOnKeyDown?.(event);\n };\n\n return (\n <div\n className={clsx(withBaseName(), classNameProp)}\n {...restProps}\n ref={ref}\n >\n <div\n className={clsx(\n withBaseName(\"inputContainer\"),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus || \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n )}\n >\n {startAdornment && (\n <div className={withBaseName(\"startAdornmentContainer\")}>\n {startAdornment}\n </div>\n )}\n <input\n aria-describedby={clsx(formFieldDescribedBy, inputDescribedBy)}\n aria-invalid={isOutOfRange(value, min, max)}\n aria-labelledby={clsx(formFieldLabelledBy, inputLabelledBy)}\n aria-valuemax={toFloat(toFixedDecimalPlaces(max, decimalPlaces))}\n aria-valuemin={toFloat(toFixedDecimalPlaces(min, decimalPlaces))}\n aria-valuenow={\n value && !Number.isNaN(toFloat(value))\n ? toFloat(toFixedDecimalPlaces(toFloat(value), decimalPlaces))\n : undefined\n }\n className={clsx(\n withBaseName(\"input\"),\n withBaseName(`inputTextAlign${capitalize(textAlign)}`),\n inputClassName,\n )}\n disabled={isDisabled}\n onBlur={handleInputBlur}\n onChange={handleInputChange}\n onFocus={!isDisabled ? handleInputFocus : undefined}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n readOnly={isReadOnly}\n ref={forkedInputRef}\n required={isRequired}\n role=\"spinbutton\"\n tabIndex={isDisabled ? -1 : 0}\n value={value}\n {...restInputProps}\n />\n {!isDisabled && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment && (\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {endAdornment}\n </div>\n )}\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n\n {!hideButtons && !isReadOnly && (\n <div className={withBaseName(\"buttonContainer\")}>\n <Button\n className={clsx(\n withBaseName(\"stepperButton\"),\n withBaseName(\"stepperButtonIncrement\"),\n )}\n {...incrementButtonProps}\n >\n <IncreaseIcon aria-hidden />\n </Button>\n <Button\n className={clsx(\n withBaseName(\"stepperButton\"),\n withBaseName(\"stepperButtonDecrement\"),\n )}\n {...decrementButtonProps}\n >\n <DecreaseIcon aria-hidden />\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["StepperInput","stepperInputCss"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { useWindow } from '@salt-ds/window';
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ import { useInterval } from './useInterval.js';
4
+
5
+ const INITIAL_DELAY = 500;
6
+ const INTERVAL_DELAY = 100;
7
+ function useActivateWhileMouseDown(activationFn, isAtLimit) {
8
+ const [buttonDown, setButtonDown] = useState(false);
9
+ const [delay, setDelay] = useState(INITIAL_DELAY);
10
+ const cancelInterval = useCallback(() => {
11
+ setButtonDown(false);
12
+ setDelay(INITIAL_DELAY);
13
+ }, []);
14
+ useEffect(() => {
15
+ if (isAtLimit)
16
+ cancelInterval();
17
+ }, [isAtLimit, cancelInterval]);
18
+ const targetWindow = useWindow();
19
+ useEffect(() => {
20
+ if (targetWindow) {
21
+ targetWindow.addEventListener("mouseup", cancelInterval);
22
+ }
23
+ return () => {
24
+ if (targetWindow) {
25
+ targetWindow.removeEventListener("mouseup", cancelInterval);
26
+ }
27
+ };
28
+ }, [cancelInterval, targetWindow]);
29
+ const activate = (event) => {
30
+ activationFn(event);
31
+ if (event.type === "mousedown") {
32
+ setButtonDown(true);
33
+ }
34
+ };
35
+ useInterval(
36
+ () => {
37
+ if (!buttonDown)
38
+ return;
39
+ activationFn();
40
+ if (delay === INITIAL_DELAY) {
41
+ setDelay(INTERVAL_DELAY);
42
+ }
43
+ },
44
+ buttonDown ? delay : null
45
+ );
46
+ return { activate, buttonDown };
47
+ }
48
+
49
+ export { useActivateWhileMouseDown };
50
+ //# sourceMappingURL=useActivateWhileMouseDown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActivateWhileMouseDown.js","sources":["../src/stepper-input/internal/useActivateWhileMouseDown.ts"],"sourcesContent":["import { useWindow } from \"@salt-ds/window\";\nimport { type SyntheticEvent, useCallback, useEffect, useState } from \"react\";\nimport { useInterval } from \"./useInterval\";\n\nconst INITIAL_DELAY = 500;\nconst INTERVAL_DELAY = 100;\n\nexport function useActivateWhileMouseDown(\n activationFn: (event?: SyntheticEvent) => void,\n isAtLimit: boolean,\n) {\n const [buttonDown, setButtonDown] = useState(false);\n const [delay, setDelay] = useState(INITIAL_DELAY);\n\n const cancelInterval = useCallback(() => {\n setButtonDown(false);\n setDelay(INITIAL_DELAY);\n }, []);\n\n useEffect(() => {\n if (isAtLimit) cancelInterval();\n }, [isAtLimit, cancelInterval]);\n\n const targetWindow = useWindow();\n\n useEffect(() => {\n if (targetWindow) {\n targetWindow.addEventListener(\"mouseup\", cancelInterval);\n }\n return () => {\n if (targetWindow) {\n targetWindow.removeEventListener(\"mouseup\", cancelInterval);\n }\n };\n }, [cancelInterval, targetWindow]);\n\n const activate = (event: SyntheticEvent) => {\n activationFn(event);\n if (event.type === \"mousedown\") {\n setButtonDown(true);\n }\n };\n\n useInterval(\n () => {\n if (!buttonDown) return;\n activationFn();\n if (delay === INITIAL_DELAY) {\n setDelay(INTERVAL_DELAY);\n }\n },\n buttonDown ? delay : null,\n );\n\n return { activate, buttonDown };\n}\n"],"names":[],"mappings":";;;;AAIA,MAAM,aAAgB,GAAA,GAAA,CAAA;AACtB,MAAM,cAAiB,GAAA,GAAA,CAAA;AAEP,SAAA,yBAAA,CACd,cACA,SACA,EAAA;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,aAAa,CAAA,CAAA;AAEhD,EAAM,MAAA,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AACnB,IAAA,QAAA,CAAS,aAAa,CAAA,CAAA;AAAA,GACxB,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,SAAA;AAAW,MAAe,cAAA,EAAA,CAAA;AAAA,GAC7B,EAAA,CAAC,SAAW,EAAA,cAAc,CAAC,CAAA,CAAA;AAE9B,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAc,EAAA;AAChB,MAAa,YAAA,CAAA,gBAAA,CAAiB,WAAW,cAAc,CAAA,CAAA;AAAA,KACzD;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,YAAc,EAAA;AAChB,QAAa,YAAA,CAAA,mBAAA,CAAoB,WAAW,cAAc,CAAA,CAAA;AAAA,OAC5D;AAAA,KACF,CAAA;AAAA,GACC,EAAA,CAAC,cAAgB,EAAA,YAAY,CAAC,CAAA,CAAA;AAEjC,EAAM,MAAA,QAAA,GAAW,CAAC,KAA0B,KAAA;AAC1C,IAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAClB,IAAI,IAAA,KAAA,CAAM,SAAS,WAAa,EAAA;AAC9B,MAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAAA,KACpB;AAAA,GACF,CAAA;AAEA,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAA,IAAI,CAAC,UAAA;AAAY,QAAA,OAAA;AACjB,MAAa,YAAA,EAAA,CAAA;AACb,MAAA,IAAI,UAAU,aAAe,EAAA;AAC3B,QAAA,QAAA,CAAS,cAAc,CAAA,CAAA;AAAA,OACzB;AAAA,KACF;AAAA,IACA,aAAa,KAAQ,GAAA,IAAA;AAAA,GACvB,CAAA;AAEA,EAAO,OAAA,EAAE,UAAU,UAAW,EAAA,CAAA;AAChC;;;;"}
@@ -0,0 +1,32 @@
1
+ const ACCEPT_INPUT = /^[-+]?[0-9]*\.?([0-9]+)?/g;
2
+ const toFixedDecimalPlaces = (inputNumber, decimalPlaces) => inputNumber.toFixed(decimalPlaces);
3
+ const isAllowedNonNumeric = (inputCharacter) => {
4
+ if (typeof inputCharacter === "number")
5
+ return;
6
+ return "-+".includes(inputCharacter) && inputCharacter.length === 1 || inputCharacter === "";
7
+ };
8
+ const toFloat = (inputValue) => {
9
+ if (isAllowedNonNumeric(inputValue))
10
+ return 0;
11
+ return Number.parseFloat(inputValue.toString());
12
+ };
13
+ const sanitizedInput = (numberString) => (numberString.match(ACCEPT_INPUT) || []).join("");
14
+ const isAtMax = (value, max) => {
15
+ if (value === void 0)
16
+ return true;
17
+ return toFloat(value) >= max;
18
+ };
19
+ const isAtMin = (value, min) => {
20
+ if (value === void 0)
21
+ return true;
22
+ return toFloat(value) <= min;
23
+ };
24
+ const isOutOfRange = (value, min, max) => {
25
+ if (value === void 0)
26
+ return true;
27
+ const floatValue = toFloat(value);
28
+ return floatValue > max || floatValue < min;
29
+ };
30
+
31
+ export { ACCEPT_INPUT, isAllowedNonNumeric, isAtMax, isAtMin, isOutOfRange, sanitizedInput, toFixedDecimalPlaces, toFloat };
32
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/stepper-input/internal/utils.ts"],"sourcesContent":["// The input should only accept numbers, decimal points, and plus/minus symbols\nexport const ACCEPT_INPUT = /^[-+]?[0-9]*\\.?([0-9]+)?/g;\n\nexport const toFixedDecimalPlaces = (\n inputNumber: number,\n decimalPlaces: number,\n) => inputNumber.toFixed(decimalPlaces);\n\nexport const isAllowedNonNumeric = (inputCharacter: number | string) => {\n if (typeof inputCharacter === \"number\") return;\n return (\n (\"-+\".includes(inputCharacter) && inputCharacter.length === 1) ||\n inputCharacter === \"\"\n );\n};\n\nexport const toFloat = (inputValue: number | string) => {\n // Plus, minus, and empty characters are treated as 0\n if (isAllowedNonNumeric(inputValue)) return 0;\n return Number.parseFloat(inputValue.toString());\n};\n\nexport const sanitizedInput = (numberString: string) =>\n (numberString.match(ACCEPT_INPUT) || []).join(\"\");\n\nexport const isAtMax = (value: number | string | undefined, max: number) => {\n if (value === undefined) return true;\n return toFloat(value) >= max;\n};\n\nexport const isAtMin = (value: number | string | undefined, min: number) => {\n if (value === undefined) return true;\n return toFloat(value) <= min;\n};\n\nexport const isOutOfRange = (\n value: number | string | undefined,\n min: number,\n max: number,\n) => {\n if (value === undefined) return true;\n const floatValue = toFloat(value);\n return floatValue > max || floatValue < min;\n};\n"],"names":[],"mappings":"AACO,MAAM,YAAe,GAAA,4BAAA;AAErB,MAAM,uBAAuB,CAClC,WAAA,EACA,aACG,KAAA,WAAA,CAAY,QAAQ,aAAa,EAAA;AAEzB,MAAA,mBAAA,GAAsB,CAAC,cAAoC,KAAA;AACtE,EAAA,IAAI,OAAO,cAAmB,KAAA,QAAA;AAAU,IAAA,OAAA;AACxC,EAAA,OACG,KAAK,QAAS,CAAA,cAAc,KAAK,cAAe,CAAA,MAAA,KAAW,KAC5D,cAAmB,KAAA,EAAA,CAAA;AAEvB,EAAA;AAEa,MAAA,OAAA,GAAU,CAAC,UAAgC,KAAA;AAEtD,EAAA,IAAI,oBAAoB,UAAU,CAAA;AAAG,IAAO,OAAA,CAAA,CAAA;AAC5C,EAAA,OAAO,MAAO,CAAA,UAAA,CAAW,UAAW,CAAA,QAAA,EAAU,CAAA,CAAA;AAChD,EAAA;AAEa,MAAA,cAAA,GAAiB,CAAC,YAAA,KAAA,CAC5B,YAAa,CAAA,KAAA,CAAM,YAAY,CAAK,IAAA,EAAI,EAAA,IAAA,CAAK,EAAE,EAAA;AAErC,MAAA,OAAA,GAAU,CAAC,KAAA,EAAoC,GAAgB,KAAA;AAC1E,EAAA,IAAI,KAAU,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AAChC,EAAO,OAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,GAAA,CAAA;AAC3B,EAAA;AAEa,MAAA,OAAA,GAAU,CAAC,KAAA,EAAoC,GAAgB,KAAA;AAC1E,EAAA,IAAI,KAAU,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AAChC,EAAO,OAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,GAAA,CAAA;AAC3B,EAAA;AAEO,MAAM,YAAe,GAAA,CAC1B,KACA,EAAA,GAAA,EACA,GACG,KAAA;AACH,EAAA,IAAI,KAAU,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AAChC,EAAM,MAAA,UAAA,GAAa,QAAQ,KAAK,CAAA,CAAA;AAChC,EAAO,OAAA,UAAA,GAAa,OAAO,UAAa,GAAA,GAAA,CAAA;AAC1C;;;;"}