@yamada-ui/number-input 1.2.4-dev-20241214144625 → 1.2.4
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.
- package/dist/{chunk-MZV5BX62.mjs → chunk-OW4A5AQU.mjs} +69 -55
- package/dist/chunk-OW4A5AQU.mjs.map +1 -0
- package/dist/index.js +68 -54
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/number-input.d.mts +14 -9
- package/dist/number-input.d.ts +14 -9
- package/dist/number-input.js +68 -54
- package/dist/number-input.js.map +1 -1
- package/dist/number-input.mjs +1 -1
- package/package.json +8 -8
- package/dist/chunk-MZV5BX62.mjs.map +0 -1
|
@@ -46,7 +46,7 @@ var getStep = ({
|
|
|
46
46
|
return ratio;
|
|
47
47
|
};
|
|
48
48
|
var useNumberInput = (props = {}) => {
|
|
49
|
-
|
|
49
|
+
const {
|
|
50
50
|
id,
|
|
51
51
|
name,
|
|
52
52
|
allowMouseWheel,
|
|
@@ -58,20 +58,19 @@ var useNumberInput = (props = {}) => {
|
|
|
58
58
|
inputMode = "decimal",
|
|
59
59
|
isValidCharacter: isValidCharacterProp,
|
|
60
60
|
keepWithinRange = true,
|
|
61
|
-
max = Number.MAX_SAFE_INTEGER,
|
|
62
|
-
min = Number.MIN_SAFE_INTEGER,
|
|
61
|
+
max: maxValue = Number.MAX_SAFE_INTEGER,
|
|
62
|
+
min: minValue = Number.MIN_SAFE_INTEGER,
|
|
63
63
|
parse: parseProp,
|
|
64
64
|
pattern = "[0-9]*(.[0-9]+)?",
|
|
65
65
|
precision,
|
|
66
66
|
step: stepProp,
|
|
67
|
-
validCharacter,
|
|
68
67
|
value: valueProp,
|
|
69
68
|
onChange: onChangeProp,
|
|
70
69
|
onInvalid: onInvalidProp,
|
|
71
70
|
...rest
|
|
72
71
|
} = useFormControlProps(props);
|
|
73
72
|
const {
|
|
74
|
-
"aria-invalid":
|
|
73
|
+
"aria-invalid": invalid,
|
|
75
74
|
disabled,
|
|
76
75
|
readOnly,
|
|
77
76
|
required,
|
|
@@ -79,12 +78,8 @@ var useNumberInput = (props = {}) => {
|
|
|
79
78
|
onFocus: onFocusProp,
|
|
80
79
|
...formControlProps
|
|
81
80
|
} = pickObject(rest, formControlProperties);
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
const isReadOnly = readOnly;
|
|
85
|
-
const isDisabled = disabled;
|
|
86
|
-
const [isFocused, setFocused] = useState(false);
|
|
87
|
-
const isInteractive = !(readOnly || disabled);
|
|
81
|
+
const [focused, setFocused] = useState(false);
|
|
82
|
+
const interactive = !(readOnly || disabled);
|
|
88
83
|
const inputRef = useRef(null);
|
|
89
84
|
const inputSelectionRef = useRef(null);
|
|
90
85
|
const incrementRef = useRef(null);
|
|
@@ -107,13 +102,13 @@ var useNumberInput = (props = {}) => {
|
|
|
107
102
|
const onInvalid = useCallbackRef(onInvalidProp);
|
|
108
103
|
const getAriaValueText = useCallbackRef(getAriaValueTextProp);
|
|
109
104
|
const isValidCharacter = useCallbackRef(
|
|
110
|
-
|
|
105
|
+
isValidCharacterProp != null ? isValidCharacterProp : isDefaultValidCharacter
|
|
111
106
|
);
|
|
112
107
|
const {
|
|
113
108
|
cast,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
109
|
+
max,
|
|
110
|
+
min,
|
|
111
|
+
out,
|
|
117
112
|
setValue,
|
|
118
113
|
update,
|
|
119
114
|
value,
|
|
@@ -122,8 +117,8 @@ var useNumberInput = (props = {}) => {
|
|
|
122
117
|
} = useCounter({
|
|
123
118
|
defaultValue,
|
|
124
119
|
keepWithinRange,
|
|
125
|
-
max,
|
|
126
|
-
min,
|
|
120
|
+
max: maxValue,
|
|
121
|
+
min: minValue,
|
|
127
122
|
precision,
|
|
128
123
|
step: stepProp,
|
|
129
124
|
value: valueProp,
|
|
@@ -155,28 +150,28 @@ var useNumberInput = (props = {}) => {
|
|
|
155
150
|
);
|
|
156
151
|
const increment = useCallback(
|
|
157
152
|
(step = stepProp != null ? stepProp : 1) => {
|
|
158
|
-
if (
|
|
153
|
+
if (interactive) counter.increment(step);
|
|
159
154
|
},
|
|
160
|
-
[
|
|
155
|
+
[interactive, counter, stepProp]
|
|
161
156
|
);
|
|
162
157
|
const decrement = useCallback(
|
|
163
158
|
(step = stepProp != null ? stepProp : 1) => {
|
|
164
|
-
if (
|
|
159
|
+
if (interactive) counter.decrement(step);
|
|
165
160
|
},
|
|
166
|
-
[
|
|
161
|
+
[interactive, counter, stepProp]
|
|
167
162
|
);
|
|
168
163
|
const validateAndClamp = useCallback(() => {
|
|
169
|
-
let
|
|
164
|
+
let nextValue = value;
|
|
170
165
|
if (value === "") return;
|
|
171
166
|
const valueStartsWithE = /^[eE]/.test(value.toString());
|
|
172
167
|
if (valueStartsWithE) {
|
|
173
168
|
setValue("");
|
|
174
169
|
} else {
|
|
175
|
-
if (valueAsNumber <
|
|
176
|
-
if (valueAsNumber >
|
|
177
|
-
cast(
|
|
170
|
+
if (valueAsNumber < minValue) nextValue = minValue;
|
|
171
|
+
if (valueAsNumber > maxValue) nextValue = maxValue;
|
|
172
|
+
cast(nextValue);
|
|
178
173
|
}
|
|
179
|
-
}, [cast,
|
|
174
|
+
}, [cast, maxValue, minValue, setValue, value, valueAsNumber]);
|
|
180
175
|
const onChange = useCallback(
|
|
181
176
|
(ev) => {
|
|
182
177
|
if (ev.nativeEvent.isComposing) return;
|
|
@@ -198,15 +193,23 @@ var useNumberInput = (props = {}) => {
|
|
|
198
193
|
const keyMap = {
|
|
199
194
|
ArrowDown: () => decrement(step),
|
|
200
195
|
ArrowUp: () => increment(step),
|
|
201
|
-
End: () => update(
|
|
202
|
-
Home: () => update(
|
|
196
|
+
End: () => update(maxValue),
|
|
197
|
+
Home: () => update(minValue)
|
|
203
198
|
};
|
|
204
199
|
const action = keyMap[ev.key];
|
|
205
200
|
if (!action) return;
|
|
206
201
|
ev.preventDefault();
|
|
207
202
|
action(ev);
|
|
208
203
|
},
|
|
209
|
-
[
|
|
204
|
+
[
|
|
205
|
+
decrement,
|
|
206
|
+
increment,
|
|
207
|
+
isValidCharacter,
|
|
208
|
+
maxValue,
|
|
209
|
+
minValue,
|
|
210
|
+
stepProp,
|
|
211
|
+
update
|
|
212
|
+
]
|
|
210
213
|
);
|
|
211
214
|
const { down, isSpinning, stop, up } = useSpinner(increment, decrement);
|
|
212
215
|
useAttributeObserver(incrementRef, ["disabled"], isSpinning, stop);
|
|
@@ -235,9 +238,9 @@ var useNumberInput = (props = {}) => {
|
|
|
235
238
|
[focusInput, down]
|
|
236
239
|
);
|
|
237
240
|
useUpdateEffect(() => {
|
|
238
|
-
if (valueAsNumber >
|
|
241
|
+
if (valueAsNumber > maxValue) {
|
|
239
242
|
onInvalid("rangeOverflow", format(value), valueAsNumber);
|
|
240
|
-
} else if (valueAsNumber <
|
|
243
|
+
} else if (valueAsNumber < minValue) {
|
|
241
244
|
onInvalid("rangeOverflow", format(value), valueAsNumber);
|
|
242
245
|
}
|
|
243
246
|
}, [valueAsNumber, value, format, onInvalid]);
|
|
@@ -254,8 +257,8 @@ var useNumberInput = (props = {}) => {
|
|
|
254
257
|
(ev) => {
|
|
255
258
|
var _a, _b;
|
|
256
259
|
const ownerDocument = (_b = (_a = inputRef.current) == null ? void 0 : _a.ownerDocument) != null ? _b : document;
|
|
257
|
-
const
|
|
258
|
-
if (!allowMouseWheel || !
|
|
260
|
+
const focused2 = ownerDocument.activeElement === inputRef.current;
|
|
261
|
+
if (!allowMouseWheel || !focused2) return;
|
|
259
262
|
ev.preventDefault();
|
|
260
263
|
const step = getStep(ev) * (stepProp != null ? stepProp : 1);
|
|
261
264
|
const direction = Math.sign(ev.deltaY);
|
|
@@ -281,15 +284,15 @@ var useNumberInput = (props = {}) => {
|
|
|
281
284
|
...formControlProps,
|
|
282
285
|
...props2,
|
|
283
286
|
ref: mergeRefs(inputRef, ref),
|
|
284
|
-
"aria-invalid": ariaAttr(
|
|
285
|
-
"aria-valuemax":
|
|
286
|
-
"aria-valuemin":
|
|
287
|
+
"aria-invalid": ariaAttr(invalid != null ? invalid : out),
|
|
288
|
+
"aria-valuemax": maxValue,
|
|
289
|
+
"aria-valuemin": minValue,
|
|
287
290
|
"aria-valuenow": Number.isNaN(valueAsNumber) ? void 0 : valueAsNumber,
|
|
288
291
|
"aria-valuetext": valueText,
|
|
289
292
|
autoComplete: "off",
|
|
290
293
|
autoCorrect: "off",
|
|
291
|
-
max,
|
|
292
|
-
min,
|
|
294
|
+
max: maxValue,
|
|
295
|
+
min: minValue,
|
|
293
296
|
step: stepProp,
|
|
294
297
|
value: format(value),
|
|
295
298
|
onBlur: handlerAll(props2.onBlur, onBlur),
|
|
@@ -306,15 +309,15 @@ var useNumberInput = (props = {}) => {
|
|
|
306
309
|
disabled,
|
|
307
310
|
readOnly,
|
|
308
311
|
formControlProps,
|
|
309
|
-
|
|
310
|
-
|
|
312
|
+
maxValue,
|
|
313
|
+
minValue,
|
|
311
314
|
stepProp,
|
|
312
315
|
format,
|
|
313
316
|
value,
|
|
314
317
|
valueAsNumber,
|
|
315
318
|
valueText,
|
|
316
|
-
|
|
317
|
-
|
|
319
|
+
invalid,
|
|
320
|
+
out,
|
|
318
321
|
onChange,
|
|
319
322
|
onKeyDown,
|
|
320
323
|
onFocus,
|
|
@@ -324,7 +327,7 @@ var useNumberInput = (props = {}) => {
|
|
|
324
327
|
const getIncrementProps = useCallback(
|
|
325
328
|
(props2 = {}, ref = null) => {
|
|
326
329
|
var _a;
|
|
327
|
-
const trulyDisabled = disabled || keepWithinRange &&
|
|
330
|
+
const trulyDisabled = disabled || keepWithinRange && max;
|
|
328
331
|
return {
|
|
329
332
|
"aria-label": "Increase",
|
|
330
333
|
disabled: trulyDisabled,
|
|
@@ -348,7 +351,7 @@ var useNumberInput = (props = {}) => {
|
|
|
348
351
|
[
|
|
349
352
|
disabled,
|
|
350
353
|
keepWithinRange,
|
|
351
|
-
|
|
354
|
+
max,
|
|
352
355
|
required,
|
|
353
356
|
readOnly,
|
|
354
357
|
formControlProps,
|
|
@@ -359,7 +362,7 @@ var useNumberInput = (props = {}) => {
|
|
|
359
362
|
const getDecrementProps = useCallback(
|
|
360
363
|
(props2 = {}, ref = null) => {
|
|
361
364
|
var _a;
|
|
362
|
-
const trulyDisabled = disabled || keepWithinRange &&
|
|
365
|
+
const trulyDisabled = disabled || keepWithinRange && min;
|
|
363
366
|
return {
|
|
364
367
|
"aria-label": "Decrease",
|
|
365
368
|
disabled: trulyDisabled,
|
|
@@ -383,7 +386,7 @@ var useNumberInput = (props = {}) => {
|
|
|
383
386
|
[
|
|
384
387
|
disabled,
|
|
385
388
|
keepWithinRange,
|
|
386
|
-
|
|
389
|
+
min,
|
|
387
390
|
required,
|
|
388
391
|
readOnly,
|
|
389
392
|
formControlProps,
|
|
@@ -392,11 +395,23 @@ var useNumberInput = (props = {}) => {
|
|
|
392
395
|
]
|
|
393
396
|
);
|
|
394
397
|
return {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
398
|
+
disabled,
|
|
399
|
+
focused,
|
|
400
|
+
/**
|
|
401
|
+
* @deprecated Use `disabled` instead.
|
|
402
|
+
*/
|
|
403
|
+
isDisabled: disabled,
|
|
404
|
+
/**
|
|
405
|
+
* @deprecated Use `readOnly` instead.
|
|
406
|
+
*/
|
|
407
|
+
isReadOnly: readOnly,
|
|
408
|
+
/**
|
|
409
|
+
* @deprecated Use `required` instead.
|
|
410
|
+
*/
|
|
411
|
+
isRequired: required,
|
|
399
412
|
props: rest,
|
|
413
|
+
readOnly,
|
|
414
|
+
required,
|
|
400
415
|
value: format(value),
|
|
401
416
|
valueAsNumber,
|
|
402
417
|
getDecrementProps,
|
|
@@ -467,10 +482,10 @@ var [NumberInputContextProvider, useNumberInputContext] = createContext({
|
|
|
467
482
|
var NumberInput = forwardRef(
|
|
468
483
|
(props, ref) => {
|
|
469
484
|
const [styles, mergedProps] = useComponentMultiStyle("NumberInput", props);
|
|
470
|
-
|
|
485
|
+
const {
|
|
471
486
|
className,
|
|
472
487
|
isStepper = true,
|
|
473
|
-
stepper,
|
|
488
|
+
stepper = isStepper,
|
|
474
489
|
addonProps,
|
|
475
490
|
containerProps,
|
|
476
491
|
decrementProps,
|
|
@@ -483,7 +498,6 @@ var NumberInput = forwardRef(
|
|
|
483
498
|
getIncrementProps,
|
|
484
499
|
getInputProps
|
|
485
500
|
} = useNumberInput(computedProps);
|
|
486
|
-
stepper != null ? stepper : stepper = isStepper;
|
|
487
501
|
const css = {
|
|
488
502
|
position: "relative",
|
|
489
503
|
zIndex: 0,
|
|
@@ -502,7 +516,7 @@ var NumberInput = forwardRef(
|
|
|
502
516
|
...containerProps,
|
|
503
517
|
children: [
|
|
504
518
|
/* @__PURE__ */ jsx(NumberInputField, { ...getInputProps(rest, ref) }),
|
|
505
|
-
|
|
519
|
+
stepper ? /* @__PURE__ */ jsxs(NumberInputAddon, { ...addonProps, children: [
|
|
506
520
|
/* @__PURE__ */ jsx(NumberIncrementStepper, { ...incrementProps }),
|
|
507
521
|
/* @__PURE__ */ jsx(NumberDecrementStepper, { ...decrementProps })
|
|
508
522
|
] }) : null
|
|
@@ -611,4 +625,4 @@ export {
|
|
|
611
625
|
useNumberInput,
|
|
612
626
|
NumberInput
|
|
613
627
|
};
|
|
614
|
-
//# sourceMappingURL=chunk-
|
|
628
|
+
//# sourceMappingURL=chunk-OW4A5AQU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/number-input.tsx"],"sourcesContent":["import type {\n ColorModeToken,\n CSS,\n CSSUIObject,\n HTMLUIProps,\n PropGetter,\n ThemeProps,\n} from \"@yamada-ui/core\"\nimport type { UseFormControlProps } from \"@yamada-ui/form-control\"\nimport type { UseCounterProps } from \"@yamada-ui/use-counter\"\nimport type {\n ChangeEvent,\n InputHTMLAttributes,\n KeyboardEvent,\n KeyboardEventHandler,\n} from \"react\"\nimport {\n forwardRef,\n omitThemeProps,\n ui,\n useComponentMultiStyle,\n} from \"@yamada-ui/core\"\nimport {\n formControlProperties,\n useFormControlProps,\n} from \"@yamada-ui/form-control\"\nimport { ChevronIcon } from \"@yamada-ui/icon\"\nimport { useCounter } from \"@yamada-ui/use-counter\"\nimport { useEventListener } from \"@yamada-ui/use-event-listener\"\nimport { useInterval } from \"@yamada-ui/use-interval\"\nimport {\n ariaAttr,\n createContext,\n cx,\n handlerAll,\n mergeRefs,\n pickObject,\n useCallbackRef,\n useSafeLayoutEffect,\n useUpdateEffect,\n} from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nconst isDefaultValidCharacter = (character: string) =>\n /^[Ee0-9+\\-.]$/.test(character)\n\nconst isValidNumericKeyboardEvent = (\n { key, altKey, ctrlKey, metaKey }: KeyboardEvent,\n isValid: (key: string) => boolean,\n) => {\n const isModifierKey = ctrlKey || altKey || metaKey\n const isSingleCharacterKey = key.length === 1\n\n if (!isSingleCharacterKey || isModifierKey) return true\n\n return isValid(key)\n}\n\nconst getStep = <Y extends KeyboardEvent | WheelEvent>({\n ctrlKey,\n metaKey,\n shiftKey,\n}: Y) => {\n let ratio = 1\n\n if (metaKey || ctrlKey) ratio = 0.1\n\n if (shiftKey) ratio = 10\n\n return ratio\n}\n\ntype ValidityState = \"rangeOverflow\" | \"rangeUnderflow\"\n\nexport interface UseNumberInputProps\n extends UseFormControlProps<HTMLInputElement>,\n UseCounterProps {\n /**\n * The HTML `name` attribute used for forms.\n */\n name?: string\n /**\n * If `true`, the input's value will change based on mouse wheel.\n *\n * @default false\n */\n allowMouseWheel?: boolean\n /**\n * This controls the value update when you blur out of the input.\n * - If `true` and the value is greater than `max`, the value will be reset to `max`.\n * - Else, the value remains the same.\n *\n * @default true\n */\n clampValueOnBlur?: boolean\n /**\n * If `true`, the input will be focused as you increment or decrement the value with the stepper.\n *\n * @default true\n */\n focusInputOnChange?: boolean\n /**\n * If using a custom display format, this converts the default format to the custom format.\n */\n format?: (value: number | string) => number | string\n /**\n * This is used to format the value so that screen readers\n * can speak out a more human-friendly value.\n *\n * It is used to set the `aria-valuetext` property of the input.\n */\n getAriaValueText?: (value: number | string) => string | undefined\n /**\n * Hints at the type of data that might be entered by the user.\n * It also determines the type of keyboard shown to the user on mobile devices.\n *\n * @default 'decimal'\n */\n inputMode?: InputHTMLAttributes<any>[\"inputMode\"]\n /**\n * Whether the pressed key should be allowed in the input.\n * The default behavior is to allow DOM floating point characters defined by /^[Ee0-9+\\-.]$/.\n */\n isValidCharacter?: (value: string) => boolean\n /**\n * If using a custom display format, this converts the custom format to a format `parseFloat` understands.\n */\n parse?: (value: string) => string\n /**\n * The pattern used to check the <input> element's value against on form submission.\n *\n * @default '[0-9]*(.[0-9]+)?'\n */\n pattern?: InputHTMLAttributes<any>[\"pattern\"]\n /**\n * The callback invoked when invalid number is entered.\n */\n onInvalid?: (\n message: ValidityState,\n value: string,\n valueAsNumber: number,\n ) => void\n}\n\nexport const useNumberInput = (props: UseNumberInputProps = {}) => {\n const {\n id,\n name,\n allowMouseWheel,\n clampValueOnBlur = true,\n defaultValue,\n focusInputOnChange = true,\n format: formatProp,\n getAriaValueText: getAriaValueTextProp,\n inputMode = \"decimal\",\n isValidCharacter: isValidCharacterProp,\n keepWithinRange = true,\n max: maxValue = Number.MAX_SAFE_INTEGER,\n min: minValue = Number.MIN_SAFE_INTEGER,\n parse: parseProp,\n pattern = \"[0-9]*(.[0-9]+)?\",\n precision,\n step: stepProp,\n value: valueProp,\n onChange: onChangeProp,\n onInvalid: onInvalidProp,\n ...rest\n } = useFormControlProps(props)\n const {\n \"aria-invalid\": invalid,\n disabled,\n readOnly,\n required,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n ...formControlProps\n } = pickObject(rest, formControlProperties)\n const [focused, setFocused] = useState(false)\n const interactive = !(readOnly || disabled)\n const inputRef = useRef<HTMLInputElement>(null)\n const inputSelectionRef = useRef<{\n end: null | number\n start: null | number\n } | null>(null)\n const incrementRef = useRef<HTMLButtonElement>(null)\n const decrementRef = useRef<HTMLButtonElement>(null)\n\n const onFocus = useCallbackRef(\n handlerAll(onFocusProp, (ev) => {\n setFocused(true)\n\n if (!inputSelectionRef.current) return\n\n ev.target.selectionStart =\n inputSelectionRef.current.start ?? ev.currentTarget.value.length\n ev.currentTarget.selectionEnd =\n inputSelectionRef.current.end ?? ev.currentTarget.selectionStart\n }),\n )\n const onBlur = useCallbackRef(\n handlerAll(onBlurProp, () => {\n setFocused(false)\n\n if (clampValueOnBlur) validateAndClamp()\n }),\n )\n const onInvalid = useCallbackRef(onInvalidProp)\n const getAriaValueText = useCallbackRef(getAriaValueTextProp)\n const isValidCharacter = useCallbackRef(\n isValidCharacterProp ?? isDefaultValidCharacter,\n )\n\n const {\n cast,\n max,\n min,\n out,\n setValue,\n update,\n value,\n valueAsNumber,\n ...counter\n } = useCounter({\n defaultValue,\n keepWithinRange,\n max: maxValue,\n min: minValue,\n precision,\n step: stepProp,\n value: valueProp,\n onChange: onChangeProp,\n })\n\n const valueText = useMemo(() => {\n let text = getAriaValueText(value)\n\n if (text != null) return text\n\n text = value.toString()\n\n return !text ? undefined : text\n }, [value, getAriaValueText])\n\n const sanitize = useCallback(\n (value: string) => value.split(\"\").filter(isValidCharacter).join(\"\"),\n [isValidCharacter],\n )\n\n const parse = useCallback(\n (value: string) => parseProp?.(value) ?? value,\n [parseProp],\n )\n\n const format = useCallback(\n (value: number | string) => (formatProp?.(value) ?? value).toString(),\n [formatProp],\n )\n\n const increment = useCallback(\n (step = stepProp ?? 1) => {\n if (interactive) counter.increment(step)\n },\n [interactive, counter, stepProp],\n )\n\n const decrement = useCallback(\n (step = stepProp ?? 1) => {\n if (interactive) counter.decrement(step)\n },\n [interactive, counter, stepProp],\n )\n\n const validateAndClamp = useCallback(() => {\n let nextValue = value as number | string\n\n if (value === \"\") return\n\n const valueStartsWithE = /^[eE]/.test(value.toString())\n\n if (valueStartsWithE) {\n setValue(\"\")\n } else {\n if (valueAsNumber < minValue) nextValue = minValue\n\n if (valueAsNumber > maxValue) nextValue = maxValue\n\n cast(nextValue)\n }\n }, [cast, maxValue, minValue, setValue, value, valueAsNumber])\n\n const onChange = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if ((ev.nativeEvent as InputEvent).isComposing) return\n\n const parsedInput = parse(ev.currentTarget.value)\n\n update(sanitize(parsedInput))\n\n inputSelectionRef.current = {\n end: ev.currentTarget.selectionEnd,\n start: ev.currentTarget.selectionStart,\n }\n },\n [parse, update, sanitize],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent) => {\n if (ev.nativeEvent.isComposing) return\n\n if (!isValidNumericKeyboardEvent(ev, isValidCharacter))\n ev.preventDefault()\n\n const step = getStep(ev) * (stepProp ?? 1)\n\n const keyMap: { [key: string]: KeyboardEventHandler } = {\n ArrowDown: () => decrement(step),\n ArrowUp: () => increment(step),\n End: () => update(maxValue),\n Home: () => update(minValue),\n }\n\n const action = keyMap[ev.key]\n\n if (!action) return\n\n ev.preventDefault()\n action(ev)\n },\n [\n decrement,\n increment,\n isValidCharacter,\n maxValue,\n minValue,\n stepProp,\n update,\n ],\n )\n\n const { down, isSpinning, stop, up } = useSpinner(increment, decrement)\n\n useAttributeObserver(incrementRef, [\"disabled\"], isSpinning, stop)\n useAttributeObserver(decrementRef, [\"disabled\"], isSpinning, stop)\n\n const focusInput = useCallback(() => {\n if (focusInputOnChange)\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n })\n }, [focusInputOnChange])\n\n const eventUp = useCallback(\n (ev: any) => {\n ev.preventDefault()\n up()\n focusInput()\n },\n [focusInput, up],\n )\n\n const eventDown = useCallback(\n (ev: any) => {\n ev.preventDefault()\n down()\n focusInput()\n },\n [focusInput, down],\n )\n\n useUpdateEffect(() => {\n if (valueAsNumber > maxValue) {\n onInvalid(\"rangeOverflow\", format(value), valueAsNumber)\n } else if (valueAsNumber < minValue) {\n onInvalid(\"rangeOverflow\", format(value), valueAsNumber)\n }\n }, [valueAsNumber, value, format, onInvalid])\n\n useSafeLayoutEffect(() => {\n if (!inputRef.current) return\n\n const notInSync = inputRef.current.value != value\n\n if (!notInSync) return\n\n const parsedInput = parse(inputRef.current.value)\n\n setValue(sanitize(parsedInput))\n }, [parse, sanitize])\n\n useEventListener(\n () => inputRef.current,\n \"wheel\",\n (ev) => {\n const ownerDocument = inputRef.current?.ownerDocument ?? document\n const focused = ownerDocument.activeElement === inputRef.current\n\n if (!allowMouseWheel || !focused) return\n\n ev.preventDefault()\n\n const step = getStep(ev as any) * (stepProp ?? 1)\n const direction = Math.sign(ev.deltaY)\n\n if (direction === -1) {\n increment(step)\n } else if (direction === 1) {\n decrement(step)\n }\n },\n { passive: false },\n )\n\n const getInputProps: PropGetter<\"input\"> = useCallback(\n (props = {}, ref = null) => ({\n id,\n type: \"text\",\n name,\n disabled,\n inputMode,\n pattern,\n readOnly,\n required,\n role: \"spinbutton\",\n ...formControlProps,\n ...props,\n ref: mergeRefs(inputRef, ref),\n \"aria-invalid\": ariaAttr(invalid ?? out),\n \"aria-valuemax\": maxValue,\n \"aria-valuemin\": minValue,\n \"aria-valuenow\": Number.isNaN(valueAsNumber) ? undefined : valueAsNumber,\n \"aria-valuetext\": valueText,\n autoComplete: \"off\",\n autoCorrect: \"off\",\n max: maxValue,\n min: minValue,\n step: stepProp,\n value: format(value),\n onBlur: handlerAll(props.onBlur, onBlur),\n onChange: handlerAll(props.onChange, onChange),\n onFocus: handlerAll(props.onFocus, onFocus),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n [\n id,\n name,\n inputMode,\n pattern,\n required,\n disabled,\n readOnly,\n formControlProps,\n maxValue,\n minValue,\n stepProp,\n format,\n value,\n valueAsNumber,\n valueText,\n invalid,\n out,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n ],\n )\n\n const getIncrementProps: PropGetter<\"button\"> = useCallback(\n (props = {}, ref = null) => {\n const trulyDisabled = disabled || (keepWithinRange && max)\n\n return {\n \"aria-label\": \"Increase\",\n disabled: trulyDisabled,\n readOnly,\n required,\n ...formControlProps,\n ...props,\n ref: mergeRefs(ref, incrementRef),\n style: {\n ...props.style,\n cursor: readOnly ? \"not-allowed\" : props.style?.cursor,\n },\n tabIndex: -1,\n onPointerDown: handlerAll(props.onPointerDown, (ev) => {\n if (ev.button === 0 && !trulyDisabled) eventUp(ev)\n }),\n onPointerLeave: handlerAll(props.onPointerLeave, stop),\n onPointerUp: handlerAll(props.onPointerUp, stop),\n }\n },\n [\n disabled,\n keepWithinRange,\n max,\n required,\n readOnly,\n formControlProps,\n stop,\n eventUp,\n ],\n )\n\n const getDecrementProps: PropGetter<\"button\"> = useCallback(\n (props = {}, ref = null) => {\n const trulyDisabled = disabled || (keepWithinRange && min)\n\n return {\n \"aria-label\": \"Decrease\",\n disabled: trulyDisabled,\n readOnly,\n required,\n ...formControlProps,\n ...props,\n ref: mergeRefs(ref, decrementRef),\n style: {\n ...props.style,\n cursor: readOnly ? \"not-allowed\" : props.style?.cursor,\n },\n tabIndex: -1,\n onPointerDown: handlerAll(props.onPointerDown, (ev) => {\n if (ev.button === 0 && !trulyDisabled) eventDown(ev)\n }),\n onPointerLeave: handlerAll(props.onPointerLeave, stop),\n onPointerUp: handlerAll(props.onPointerUp, stop),\n }\n },\n [\n disabled,\n keepWithinRange,\n min,\n required,\n readOnly,\n formControlProps,\n stop,\n eventDown,\n ],\n )\n\n return {\n disabled,\n focused,\n /**\n * @deprecated Use `disabled` instead.\n */\n isDisabled: disabled,\n /**\n * @deprecated Use `readOnly` instead.\n */\n isReadOnly: readOnly,\n /**\n * @deprecated Use `required` instead.\n */\n isRequired: required,\n props: rest,\n readOnly,\n required,\n value: format(value),\n valueAsNumber,\n getDecrementProps,\n getIncrementProps,\n getInputProps,\n }\n}\n\nexport type UseNumberInputReturn = ReturnType<typeof useNumberInput>\n\nconst INTERVAL = 50\n\nconst DELAY = 300\n\ntype Action = \"decrement\" | \"increment\"\n\nconst useSpinner = (increment: Function, decrement: Function) => {\n const [isSpinning, setIsSpinning] = useState(false)\n const [action, setAction] = useState<Action | null>(null)\n const [isOnce, setIsOnce] = useState(true)\n const timeoutRef = useRef<any>(null)\n\n const removeTimeout = () => clearTimeout(timeoutRef.current)\n\n useInterval(\n () => {\n if (action === \"increment\") increment()\n\n if (action === \"decrement\") decrement()\n },\n isSpinning ? INTERVAL : null,\n )\n\n const up = useCallback(() => {\n if (isOnce) increment()\n\n timeoutRef.current = setTimeout(() => {\n setIsOnce(false)\n setIsSpinning(true)\n setAction(\"increment\")\n }, DELAY)\n }, [increment, isOnce])\n\n const down = useCallback(() => {\n if (isOnce) decrement()\n\n timeoutRef.current = setTimeout(() => {\n setIsOnce(false)\n setIsSpinning(true)\n setAction(\"decrement\")\n }, DELAY)\n }, [decrement, isOnce])\n\n const stop = useCallback(() => {\n setIsOnce(true)\n setIsSpinning(false)\n removeTimeout()\n }, [])\n\n useEffect(() => {\n return () => removeTimeout()\n }, [])\n\n return { down, isSpinning, stop, up }\n}\n\nconst useAttributeObserver = (\n ref: React.RefObject<HTMLElement | null>,\n attributeFilter: string[],\n enabled: boolean,\n func: () => void,\n) => {\n useEffect(() => {\n if (!ref.current || !enabled) return\n\n const ownerDocument = ref.current.ownerDocument.defaultView ?? window\n\n const observer = new ownerDocument.MutationObserver((changes) => {\n for (const { type, attributeName } of changes) {\n if (\n type === \"attributes\" &&\n attributeName &&\n attributeFilter.includes(attributeName)\n )\n func()\n }\n })\n\n observer.observe(ref.current, { attributeFilter, attributes: true })\n\n return () => observer.disconnect()\n })\n}\n\ninterface NumberInputOptions {\n /**\n * The border color when the input is invalid.\n */\n errorBorderColor?: ColorModeToken<CSS.Property.BorderColor, \"colors\">\n /**\n * The border color when the input is focused.\n */\n focusBorderColor?: ColorModeToken<CSS.Property.BorderColor, \"colors\">\n /**\n * If `true`, display the addon for the number input.\n *\n * @deprecated Use `stepper` instead.\n */\n isStepper?: boolean\n /**\n * If `true`, display the addon for the number input.\n */\n stepper?: boolean\n /**\n * Props for addon component.\n */\n addonProps?: HTMLUIProps\n /**\n * Props for container element.\n */\n containerProps?: HTMLUIProps\n /**\n * Props for decrement component.\n */\n decrementProps?: NumberDecrementStepperProps\n /**\n * Props for increment component.\n */\n incrementProps?: NumberIncrementStepperProps\n}\n\nexport interface NumberInputProps\n extends Omit<\n HTMLUIProps<\"input\">,\n | \"defaultValue\"\n | \"max\"\n | \"min\"\n | \"onChange\"\n | \"onInvalid\"\n | \"size\"\n | \"step\"\n | \"value\"\n >,\n ThemeProps<\"NumberInput\">,\n UseNumberInputProps,\n NumberInputOptions {}\n\ninterface NumberInputContext {\n styles: { [key: string]: CSSUIObject | undefined }\n getDecrementProps: PropGetter<\"button\">\n getIncrementProps: PropGetter<\"button\">\n getInputProps: PropGetter<\"input\">\n}\n\nconst [NumberInputContextProvider, useNumberInputContext] =\n createContext<NumberInputContext>({\n name: \"NumberInputContext\",\n errorMessage: `useNumberInputContext returned is 'undefined'. Seems you forgot to wrap the components in \"<NumberInput />\"`,\n })\n\n/**\n * `NumberInput` is a component used to obtain numeric input from the user.\n *\n * @see Docs https://yamada-ui.com/components/forms/number-input\n */\nexport const NumberInput = forwardRef<NumberInputProps, \"input\">(\n (props, ref) => {\n const [styles, mergedProps] = useComponentMultiStyle(\"NumberInput\", props)\n const {\n className,\n isStepper = true,\n stepper = isStepper,\n addonProps,\n containerProps,\n decrementProps,\n incrementProps,\n ...computedProps\n } = omitThemeProps(mergedProps)\n const {\n props: rest,\n getDecrementProps,\n getIncrementProps,\n getInputProps,\n } = useNumberInput(computedProps)\n const css: CSSUIObject = {\n position: \"relative\",\n zIndex: 0,\n ...styles.container,\n }\n\n return (\n <NumberInputContextProvider\n value={{ styles, getDecrementProps, getIncrementProps, getInputProps }}\n >\n <ui.div\n className={cx(\"ui-number-input\", className)}\n role=\"group\"\n __css={css}\n {...containerProps}\n >\n <NumberInputField {...getInputProps(rest, ref)} />\n\n {stepper ? (\n <NumberInputAddon {...addonProps}>\n <NumberIncrementStepper {...incrementProps} />\n <NumberDecrementStepper {...decrementProps} />\n </NumberInputAddon>\n ) : null}\n </ui.div>\n </NumberInputContextProvider>\n )\n },\n)\n\nNumberInput.displayName = \"NumberInput\"\nNumberInput.__ui__ = \"NumberInput\"\n\ntype NumberInputFieldProps = Omit<HTMLUIProps<\"input\">, \"size\">\n\nconst NumberInputField = forwardRef<NumberInputFieldProps, \"input\">(\n ({ className, ...rest }, ref) => {\n const { styles } = useNumberInputContext()\n\n const css: CSSUIObject = {\n width: \"100%\",\n ...styles.field,\n }\n\n return (\n <ui.input\n ref={ref}\n className={cx(\"ui-number-input__field\", className)}\n __css={css}\n {...rest}\n />\n )\n },\n)\n\nNumberInputField.displayName = \"NumberInputField\"\nNumberInputField.__ui__ = \"NumberInputField\"\n\ntype NumberInputAddonProps = HTMLUIProps\n\nconst NumberInputAddon = forwardRef<NumberInputAddonProps, \"div\">(\n ({ className, ...rest }, ref) => {\n const { styles } = useNumberInputContext()\n\n const css: CSSUIObject = {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"calc(100% - 2px)\",\n insetEnd: \"0px\",\n margin: \"1px\",\n position: \"absolute\",\n top: \"0\",\n zIndex: \"fallback(yamcha, 1)\",\n ...styles.addon,\n }\n\n return (\n <ui.div\n ref={ref}\n className={cx(\"ui-number-input__addon\", className)}\n aria-hidden\n __css={css}\n {...rest}\n />\n )\n },\n)\n\nNumberInputAddon.displayName = \"NumberInputAddon\"\nNumberInputAddon.__ui__ = \"NumberInputAddon\"\n\nconst Stepper = ui(\"button\", {\n baseStyle: {\n alignItems: \"center\",\n cursor: \"pointer\",\n display: \"flex\",\n flex: 1,\n justifyContent: \"center\",\n lineHeight: \"normal\",\n transitionDuration: \"normal\",\n transitionProperty: \"common\",\n userSelect: \"none\",\n },\n})\n\ntype NumberIncrementStepperProps = HTMLUIProps<\"button\">\n\nconst NumberIncrementStepper = forwardRef<\n NumberIncrementStepperProps,\n \"button\"\n>(({ className, children, ...rest }, ref) => {\n const { styles, getIncrementProps } = useNumberInputContext()\n\n const css: CSSUIObject = { ...styles.stepper }\n\n return (\n <Stepper\n className={cx(\"ui-number-input__stepper--up\", className)}\n {...getIncrementProps(rest, ref)}\n __css={css}\n >\n {children ?? <ChevronIcon __css={{ transform: \"rotate(180deg)\" }} />}\n </Stepper>\n )\n})\n\nNumberIncrementStepper.displayName = \"NumberIncrementStepper\"\nNumberIncrementStepper.__ui__ = \"NumberIncrementStepper\"\n\ntype NumberDecrementStepperProps = HTMLUIProps<\"button\">\n\nconst NumberDecrementStepper = forwardRef<\n NumberDecrementStepperProps,\n \"button\"\n>(({ className, children, ...rest }, ref) => {\n const { styles, getDecrementProps } = useNumberInputContext()\n\n const css: CSSUIObject = { ...styles.stepper }\n\n return (\n <Stepper\n className={cx(\"ui-number-input__stepper--down\", className)}\n {...getDecrementProps(rest, ref)}\n __css={css}\n >\n {children ?? <ChevronIcon />}\n </Stepper>\n )\n})\n\nNumberDecrementStepper.displayName = \"NumberDecrementStepper\"\nNumberDecrementStepper.__ui__ = \"NumberDecrementStepper\"\n"],"mappings":"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","names":["value","focused","props"]}
|
package/dist/index.js
CHANGED
|
@@ -54,7 +54,7 @@ var getStep = ({
|
|
|
54
54
|
return ratio;
|
|
55
55
|
};
|
|
56
56
|
var useNumberInput = (props = {}) => {
|
|
57
|
-
|
|
57
|
+
const {
|
|
58
58
|
id,
|
|
59
59
|
name,
|
|
60
60
|
allowMouseWheel,
|
|
@@ -66,20 +66,19 @@ var useNumberInput = (props = {}) => {
|
|
|
66
66
|
inputMode = "decimal",
|
|
67
67
|
isValidCharacter: isValidCharacterProp,
|
|
68
68
|
keepWithinRange = true,
|
|
69
|
-
max = Number.MAX_SAFE_INTEGER,
|
|
70
|
-
min = Number.MIN_SAFE_INTEGER,
|
|
69
|
+
max: maxValue = Number.MAX_SAFE_INTEGER,
|
|
70
|
+
min: minValue = Number.MIN_SAFE_INTEGER,
|
|
71
71
|
parse: parseProp,
|
|
72
72
|
pattern = "[0-9]*(.[0-9]+)?",
|
|
73
73
|
precision,
|
|
74
74
|
step: stepProp,
|
|
75
|
-
validCharacter,
|
|
76
75
|
value: valueProp,
|
|
77
76
|
onChange: onChangeProp,
|
|
78
77
|
onInvalid: onInvalidProp,
|
|
79
78
|
...rest
|
|
80
79
|
} = (0, import_form_control.useFormControlProps)(props);
|
|
81
80
|
const {
|
|
82
|
-
"aria-invalid":
|
|
81
|
+
"aria-invalid": invalid,
|
|
83
82
|
disabled,
|
|
84
83
|
readOnly,
|
|
85
84
|
required,
|
|
@@ -87,12 +86,8 @@ var useNumberInput = (props = {}) => {
|
|
|
87
86
|
onFocus: onFocusProp,
|
|
88
87
|
...formControlProps
|
|
89
88
|
} = (0, import_utils.pickObject)(rest, import_form_control.formControlProperties);
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
const isReadOnly = readOnly;
|
|
93
|
-
const isDisabled = disabled;
|
|
94
|
-
const [isFocused, setFocused] = (0, import_react.useState)(false);
|
|
95
|
-
const isInteractive = !(readOnly || disabled);
|
|
89
|
+
const [focused, setFocused] = (0, import_react.useState)(false);
|
|
90
|
+
const interactive = !(readOnly || disabled);
|
|
96
91
|
const inputRef = (0, import_react.useRef)(null);
|
|
97
92
|
const inputSelectionRef = (0, import_react.useRef)(null);
|
|
98
93
|
const incrementRef = (0, import_react.useRef)(null);
|
|
@@ -115,13 +110,13 @@ var useNumberInput = (props = {}) => {
|
|
|
115
110
|
const onInvalid = (0, import_utils.useCallbackRef)(onInvalidProp);
|
|
116
111
|
const getAriaValueText = (0, import_utils.useCallbackRef)(getAriaValueTextProp);
|
|
117
112
|
const isValidCharacter = (0, import_utils.useCallbackRef)(
|
|
118
|
-
|
|
113
|
+
isValidCharacterProp != null ? isValidCharacterProp : isDefaultValidCharacter
|
|
119
114
|
);
|
|
120
115
|
const {
|
|
121
116
|
cast,
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
117
|
+
max,
|
|
118
|
+
min,
|
|
119
|
+
out,
|
|
125
120
|
setValue,
|
|
126
121
|
update,
|
|
127
122
|
value,
|
|
@@ -130,8 +125,8 @@ var useNumberInput = (props = {}) => {
|
|
|
130
125
|
} = (0, import_use_counter.useCounter)({
|
|
131
126
|
defaultValue,
|
|
132
127
|
keepWithinRange,
|
|
133
|
-
max,
|
|
134
|
-
min,
|
|
128
|
+
max: maxValue,
|
|
129
|
+
min: minValue,
|
|
135
130
|
precision,
|
|
136
131
|
step: stepProp,
|
|
137
132
|
value: valueProp,
|
|
@@ -163,28 +158,28 @@ var useNumberInput = (props = {}) => {
|
|
|
163
158
|
);
|
|
164
159
|
const increment = (0, import_react.useCallback)(
|
|
165
160
|
(step = stepProp != null ? stepProp : 1) => {
|
|
166
|
-
if (
|
|
161
|
+
if (interactive) counter.increment(step);
|
|
167
162
|
},
|
|
168
|
-
[
|
|
163
|
+
[interactive, counter, stepProp]
|
|
169
164
|
);
|
|
170
165
|
const decrement = (0, import_react.useCallback)(
|
|
171
166
|
(step = stepProp != null ? stepProp : 1) => {
|
|
172
|
-
if (
|
|
167
|
+
if (interactive) counter.decrement(step);
|
|
173
168
|
},
|
|
174
|
-
[
|
|
169
|
+
[interactive, counter, stepProp]
|
|
175
170
|
);
|
|
176
171
|
const validateAndClamp = (0, import_react.useCallback)(() => {
|
|
177
|
-
let
|
|
172
|
+
let nextValue = value;
|
|
178
173
|
if (value === "") return;
|
|
179
174
|
const valueStartsWithE = /^[eE]/.test(value.toString());
|
|
180
175
|
if (valueStartsWithE) {
|
|
181
176
|
setValue("");
|
|
182
177
|
} else {
|
|
183
|
-
if (valueAsNumber <
|
|
184
|
-
if (valueAsNumber >
|
|
185
|
-
cast(
|
|
178
|
+
if (valueAsNumber < minValue) nextValue = minValue;
|
|
179
|
+
if (valueAsNumber > maxValue) nextValue = maxValue;
|
|
180
|
+
cast(nextValue);
|
|
186
181
|
}
|
|
187
|
-
}, [cast,
|
|
182
|
+
}, [cast, maxValue, minValue, setValue, value, valueAsNumber]);
|
|
188
183
|
const onChange = (0, import_react.useCallback)(
|
|
189
184
|
(ev) => {
|
|
190
185
|
if (ev.nativeEvent.isComposing) return;
|
|
@@ -206,15 +201,23 @@ var useNumberInput = (props = {}) => {
|
|
|
206
201
|
const keyMap = {
|
|
207
202
|
ArrowDown: () => decrement(step),
|
|
208
203
|
ArrowUp: () => increment(step),
|
|
209
|
-
End: () => update(
|
|
210
|
-
Home: () => update(
|
|
204
|
+
End: () => update(maxValue),
|
|
205
|
+
Home: () => update(minValue)
|
|
211
206
|
};
|
|
212
207
|
const action = keyMap[ev.key];
|
|
213
208
|
if (!action) return;
|
|
214
209
|
ev.preventDefault();
|
|
215
210
|
action(ev);
|
|
216
211
|
},
|
|
217
|
-
[
|
|
212
|
+
[
|
|
213
|
+
decrement,
|
|
214
|
+
increment,
|
|
215
|
+
isValidCharacter,
|
|
216
|
+
maxValue,
|
|
217
|
+
minValue,
|
|
218
|
+
stepProp,
|
|
219
|
+
update
|
|
220
|
+
]
|
|
218
221
|
);
|
|
219
222
|
const { down, isSpinning, stop, up } = useSpinner(increment, decrement);
|
|
220
223
|
useAttributeObserver(incrementRef, ["disabled"], isSpinning, stop);
|
|
@@ -243,9 +246,9 @@ var useNumberInput = (props = {}) => {
|
|
|
243
246
|
[focusInput, down]
|
|
244
247
|
);
|
|
245
248
|
(0, import_utils.useUpdateEffect)(() => {
|
|
246
|
-
if (valueAsNumber >
|
|
249
|
+
if (valueAsNumber > maxValue) {
|
|
247
250
|
onInvalid("rangeOverflow", format(value), valueAsNumber);
|
|
248
|
-
} else if (valueAsNumber <
|
|
251
|
+
} else if (valueAsNumber < minValue) {
|
|
249
252
|
onInvalid("rangeOverflow", format(value), valueAsNumber);
|
|
250
253
|
}
|
|
251
254
|
}, [valueAsNumber, value, format, onInvalid]);
|
|
@@ -262,8 +265,8 @@ var useNumberInput = (props = {}) => {
|
|
|
262
265
|
(ev) => {
|
|
263
266
|
var _a, _b;
|
|
264
267
|
const ownerDocument = (_b = (_a = inputRef.current) == null ? void 0 : _a.ownerDocument) != null ? _b : document;
|
|
265
|
-
const
|
|
266
|
-
if (!allowMouseWheel || !
|
|
268
|
+
const focused2 = ownerDocument.activeElement === inputRef.current;
|
|
269
|
+
if (!allowMouseWheel || !focused2) return;
|
|
267
270
|
ev.preventDefault();
|
|
268
271
|
const step = getStep(ev) * (stepProp != null ? stepProp : 1);
|
|
269
272
|
const direction = Math.sign(ev.deltaY);
|
|
@@ -289,15 +292,15 @@ var useNumberInput = (props = {}) => {
|
|
|
289
292
|
...formControlProps,
|
|
290
293
|
...props2,
|
|
291
294
|
ref: (0, import_utils.mergeRefs)(inputRef, ref),
|
|
292
|
-
"aria-invalid": (0, import_utils.ariaAttr)(
|
|
293
|
-
"aria-valuemax":
|
|
294
|
-
"aria-valuemin":
|
|
295
|
+
"aria-invalid": (0, import_utils.ariaAttr)(invalid != null ? invalid : out),
|
|
296
|
+
"aria-valuemax": maxValue,
|
|
297
|
+
"aria-valuemin": minValue,
|
|
295
298
|
"aria-valuenow": Number.isNaN(valueAsNumber) ? void 0 : valueAsNumber,
|
|
296
299
|
"aria-valuetext": valueText,
|
|
297
300
|
autoComplete: "off",
|
|
298
301
|
autoCorrect: "off",
|
|
299
|
-
max,
|
|
300
|
-
min,
|
|
302
|
+
max: maxValue,
|
|
303
|
+
min: minValue,
|
|
301
304
|
step: stepProp,
|
|
302
305
|
value: format(value),
|
|
303
306
|
onBlur: (0, import_utils.handlerAll)(props2.onBlur, onBlur),
|
|
@@ -314,15 +317,15 @@ var useNumberInput = (props = {}) => {
|
|
|
314
317
|
disabled,
|
|
315
318
|
readOnly,
|
|
316
319
|
formControlProps,
|
|
317
|
-
|
|
318
|
-
|
|
320
|
+
maxValue,
|
|
321
|
+
minValue,
|
|
319
322
|
stepProp,
|
|
320
323
|
format,
|
|
321
324
|
value,
|
|
322
325
|
valueAsNumber,
|
|
323
326
|
valueText,
|
|
324
|
-
|
|
325
|
-
|
|
327
|
+
invalid,
|
|
328
|
+
out,
|
|
326
329
|
onChange,
|
|
327
330
|
onKeyDown,
|
|
328
331
|
onFocus,
|
|
@@ -332,7 +335,7 @@ var useNumberInput = (props = {}) => {
|
|
|
332
335
|
const getIncrementProps = (0, import_react.useCallback)(
|
|
333
336
|
(props2 = {}, ref = null) => {
|
|
334
337
|
var _a;
|
|
335
|
-
const trulyDisabled = disabled || keepWithinRange &&
|
|
338
|
+
const trulyDisabled = disabled || keepWithinRange && max;
|
|
336
339
|
return {
|
|
337
340
|
"aria-label": "Increase",
|
|
338
341
|
disabled: trulyDisabled,
|
|
@@ -356,7 +359,7 @@ var useNumberInput = (props = {}) => {
|
|
|
356
359
|
[
|
|
357
360
|
disabled,
|
|
358
361
|
keepWithinRange,
|
|
359
|
-
|
|
362
|
+
max,
|
|
360
363
|
required,
|
|
361
364
|
readOnly,
|
|
362
365
|
formControlProps,
|
|
@@ -367,7 +370,7 @@ var useNumberInput = (props = {}) => {
|
|
|
367
370
|
const getDecrementProps = (0, import_react.useCallback)(
|
|
368
371
|
(props2 = {}, ref = null) => {
|
|
369
372
|
var _a;
|
|
370
|
-
const trulyDisabled = disabled || keepWithinRange &&
|
|
373
|
+
const trulyDisabled = disabled || keepWithinRange && min;
|
|
371
374
|
return {
|
|
372
375
|
"aria-label": "Decrease",
|
|
373
376
|
disabled: trulyDisabled,
|
|
@@ -391,7 +394,7 @@ var useNumberInput = (props = {}) => {
|
|
|
391
394
|
[
|
|
392
395
|
disabled,
|
|
393
396
|
keepWithinRange,
|
|
394
|
-
|
|
397
|
+
min,
|
|
395
398
|
required,
|
|
396
399
|
readOnly,
|
|
397
400
|
formControlProps,
|
|
@@ -400,11 +403,23 @@ var useNumberInput = (props = {}) => {
|
|
|
400
403
|
]
|
|
401
404
|
);
|
|
402
405
|
return {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
406
|
+
disabled,
|
|
407
|
+
focused,
|
|
408
|
+
/**
|
|
409
|
+
* @deprecated Use `disabled` instead.
|
|
410
|
+
*/
|
|
411
|
+
isDisabled: disabled,
|
|
412
|
+
/**
|
|
413
|
+
* @deprecated Use `readOnly` instead.
|
|
414
|
+
*/
|
|
415
|
+
isReadOnly: readOnly,
|
|
416
|
+
/**
|
|
417
|
+
* @deprecated Use `required` instead.
|
|
418
|
+
*/
|
|
419
|
+
isRequired: required,
|
|
407
420
|
props: rest,
|
|
421
|
+
readOnly,
|
|
422
|
+
required,
|
|
408
423
|
value: format(value),
|
|
409
424
|
valueAsNumber,
|
|
410
425
|
getDecrementProps,
|
|
@@ -475,10 +490,10 @@ var [NumberInputContextProvider, useNumberInputContext] = (0, import_utils.creat
|
|
|
475
490
|
var NumberInput = (0, import_core.forwardRef)(
|
|
476
491
|
(props, ref) => {
|
|
477
492
|
const [styles, mergedProps] = (0, import_core.useComponentMultiStyle)("NumberInput", props);
|
|
478
|
-
|
|
493
|
+
const {
|
|
479
494
|
className,
|
|
480
495
|
isStepper = true,
|
|
481
|
-
stepper,
|
|
496
|
+
stepper = isStepper,
|
|
482
497
|
addonProps,
|
|
483
498
|
containerProps,
|
|
484
499
|
decrementProps,
|
|
@@ -491,7 +506,6 @@ var NumberInput = (0, import_core.forwardRef)(
|
|
|
491
506
|
getIncrementProps,
|
|
492
507
|
getInputProps
|
|
493
508
|
} = useNumberInput(computedProps);
|
|
494
|
-
stepper != null ? stepper : stepper = isStepper;
|
|
495
509
|
const css = {
|
|
496
510
|
position: "relative",
|
|
497
511
|
zIndex: 0,
|
|
@@ -510,7 +524,7 @@ var NumberInput = (0, import_core.forwardRef)(
|
|
|
510
524
|
...containerProps,
|
|
511
525
|
children: [
|
|
512
526
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(NumberInputField, { ...getInputProps(rest, ref) }),
|
|
513
|
-
|
|
527
|
+
stepper ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(NumberInputAddon, { ...addonProps, children: [
|
|
514
528
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(NumberIncrementStepper, { ...incrementProps }),
|
|
515
529
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(NumberDecrementStepper, { ...decrementProps })
|
|
516
530
|
] }) : null
|