UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

1 lines 42.9 kB
{"version":3,"file":"NumberInput.cjs","names":["createVarsResolver","getSize","genericFactory","useProps","useStyles","useResolvedStylesApi","noop","UnstyledButton","NumberInputChevron","InputBase","NumericFormat","classes"],"sources":["../../../src/components/NumberInput/NumberInput.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport cx from 'clsx';\nimport { NumberFormatValues, NumericFormat, OnValueChange } from 'react-number-format';\nimport { assignRef, clamp, useMergedRef, useUncontrolled } from '@mantine/hooks';\nimport {\n BoxProps,\n createVarsResolver,\n ElementProps,\n Factory,\n genericFactory,\n getSize,\n noop,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '../../core';\nimport { __BaseInputProps, __InputStylesNames, InputVariant } from '../Input';\nimport { InputBase } from '../InputBase';\nimport { UnstyledButton } from '../UnstyledButton';\nimport { NumberInputChevron } from './NumberInputChevron';\nimport classes from './NumberInput.module.css';\n\n// Re for negative -0, -0., -0.0, -0.00, -0.000 ... strings\n// And for positive 0., 0.0, 0.00, 0.000 ... strings\nconst leadingDecimalZeroPattern = /^(0\\.0*|-0(\\.0*)?)$/;\n\n// Re for 01, 006, 00.02, -0010, -000.293 ... and negative counterparts\nconst leadingZerosPattern = /^-?0\\d+(\\.\\d+)?\\.?$/;\n\n// Re for decimal numbers with trailing zeros like 13.0, 13.00, 5.10 ... strings\nconst trailingZerosPattern = /\\.\\d*0$/;\n\n// Re for numbers with trailing decimal separator like 10. or -3.\nconst trailingDecimalSeparatorPattern = /^-?\\d+\\.$/;\n\nexport interface NumberInputHandlers {\n increment: () => void;\n decrement: () => void;\n}\n\nexport type NumberInputMode = 'number' | 'bigint';\nexport type NumberInputNumericType = number | bigint;\nexport type NumberInputValue<T extends NumberInputNumericType = number> = T | string;\ntype NumberInputNumericValue<T extends NumberInputNumericType = number> = T;\ntype InternalNumberInputValue = string | number | bigint;\n\nfunction isNumberString(value: unknown) {\n return typeof value === 'string' && value !== '' && !Number.isNaN(Number(value));\n}\n\nfunction isBigIntValue(value: unknown): value is bigint {\n return typeof value === 'bigint';\n}\n\nfunction canStep(value: number | string) {\n if (typeof value === 'number') {\n return value < Number.MAX_SAFE_INTEGER;\n }\n\n return value === '' || (isNumberString(value) && Number(value) < Number.MAX_SAFE_INTEGER);\n}\n\nfunction isValidBigIntString(value: string, allowNegative: boolean) {\n if (value === '') {\n return false;\n }\n\n if (value === '-') {\n return false;\n }\n\n if (!allowNegative && value.startsWith('-')) {\n return false;\n }\n\n return /^-?\\d+$/.test(value);\n}\n\nfunction canStepBigInt(value: bigint | string, allowNegative: boolean) {\n if (typeof value === 'bigint') {\n return true;\n }\n\n return value === '' || isValidBigIntString(value, allowNegative);\n}\n\nfunction parseBigIntFromString(value: string): bigint | null {\n if (!/^-?\\d+$/.test(value)) {\n return null;\n }\n\n try {\n return BigInt(value);\n } catch {\n return null;\n }\n}\n\nfunction toBigIntOrUndefined(value: unknown): bigint | undefined {\n if (typeof value === 'bigint') {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value) && Number.isInteger(value)) {\n return BigInt(value);\n }\n\n return undefined;\n}\n\nfunction clampBigInt(value: bigint, min?: bigint, max?: bigint) {\n if (min !== undefined && value < min) {\n return min;\n }\n\n if (max !== undefined && value > max) {\n return max;\n }\n\n return value;\n}\n\nfunction getTotalDigits(inputValue: string | number): number {\n // All digits must be counted, parseFloat precision depends\n // on the number of digits in the input, not only on the decimal scale\n return inputValue.toString().replace('.', '').length;\n}\n\nfunction isValidNumber(floatValue: number | undefined, value: string): floatValue is number {\n return (\n (typeof floatValue === 'number'\n ? floatValue < Number.MAX_SAFE_INTEGER\n : !Number.isNaN(Number(floatValue))) &&\n !Number.isNaN(floatValue) &&\n getTotalDigits(value) < 14 &&\n value !== ''\n );\n}\n\nfunction isInRange(value: number | undefined, min: number | undefined, max: number | undefined) {\n if (value === undefined) {\n return true;\n }\n\n const minValid = min === undefined || value >= min;\n const maxValid = max === undefined || value <= max;\n\n return minValid && maxValid;\n}\n\nexport type NumberInputStylesNames = 'controls' | 'control' | __InputStylesNames;\nexport type NumberInputCssVariables = {\n controls: '--ni-chevron-size';\n};\n\nexport interface NumberInputProps<T extends NumberInputNumericType = number>\n extends\n BoxProps,\n Omit<__BaseInputProps, 'pointer'>,\n StylesApiProps<NumberInputFactory>,\n ElementProps<\n 'input',\n 'size' | 'type' | 'onChange' | 'value' | 'defaultValue' | 'min' | 'max' | 'step'\n > {\n /** Controlled component value */\n value?: NumberInputValue<T>;\n\n /** Uncontrolled component default value */\n defaultValue?: NumberInputValue<T>;\n\n /** Called when value changes */\n onChange?: (value: NumberInputValue<T>) => void;\n\n /** Called when value changes with `react-number-format` payload */\n onValueChange?: OnValueChange;\n\n /** Determines whether leading zeros are allowed during input. If `false`, leading zeros are removed as you type (e.g., typing `007` results in `7`). Works in conjunction with `trimLeadingZeroesOnBlur`. @default true */\n allowLeadingZeros?: boolean;\n\n /** Determines whether negative numbers are allowed. If `false`, the input will not accept negative values, and the decrement button will stop at `0` (when `min` is not set). @default true */\n allowNegative?: boolean;\n\n /** Characters which when pressed result in a decimal separator. These characters will be replaced by the `decimalSeparator` in the input value. @default ['.', ','] */\n allowedDecimalSeparators?: string[];\n\n /** Limits the number of digits that can be entered after the decimal point @default Infinity */\n decimalScale?: number;\n\n /** Character used as a decimal separator. Generally used with `allowedDecimalSeparators` prop. @default '.' */\n decimalSeparator?: string;\n\n /** If `true`, automatically pads the decimal part with zeros to match `decimalScale` (e.g., with `decimalScale={2}`, typing `5.1` displays as `5.10`). Requires `decimalScale` to be set. @default false */\n fixedDecimalScale?: boolean;\n\n /** Prefix added before the input value */\n prefix?: string;\n\n /** Suffix added after the input value */\n suffix?: string;\n\n /** Defines the thousand grouping style. 'thousand' (1,000), 'lakh' (1,00,000), 'wan' (1,0000), 'none'. */\n thousandsGroupStyle?: 'thousand' | 'lakh' | 'wan' | 'none';\n\n /** A function to validate the input value. If this function returns `false`, the `onChange` will not be called and the input value will not change. */\n isAllowed?: (values: NumberFormatValues) => boolean;\n\n /** Advanced: Set to `true` if you're passing numeric strings (e.g., `\"12345\"`) and using formatting props like `prefix` or `suffix`. In most cases, you don't need this prop. See [react-number-format docs](https://www.npmjs.com/package/react-number-format) for details. @default false */\n valueIsNumericString?: boolean;\n\n /** Controls input `type` attribute @default 'text' */\n type?: 'text' | 'tel' | 'password';\n\n /** A character used to separate thousands */\n thousandSeparator?: string | boolean;\n\n /** Minimum possible value */\n min?: NumberInputNumericValue<T>;\n\n /** Maximum possible value */\n max?: NumberInputNumericValue<T>;\n\n /** Number by which value will be incremented/decremented with up/down controls and keyboard arrows @default 1 */\n step?: NumberInputNumericValue<T>;\n\n /** If set, the up/down controls are hidden @default false */\n hideControls?: boolean;\n\n /** Controls how values are clamped to the `min`/`max` range:\n * - `'blur'` (default): User can type any value, but it's clamped when the input loses focus\n * - `'strict'`: User cannot type values outside the range\n * - `'none'`: No clamping; `min`/`max` only apply to increment/decrement controls and arrow keys\n */\n clampBehavior?: 'strict' | 'blur' | 'none';\n\n /** If set, decimal values are allowed @default true */\n allowDecimal?: boolean;\n\n /** Increment/decrement handlers */\n handlersRef?: React.Ref<NumberInputHandlers | undefined>;\n\n /** Value used when incrementing/decrementing an empty input. If `min` is set and `startValue < min`, `min` is used instead. @default 0 */\n startValue?: NumberInputNumericValue<T>;\n\n /** Interval in milliseconds between value steps when increment/decrement button is held down. Can be a number or a function `(stepCount) => number` for dynamic intervals. Requires `stepHoldDelay` to be set. @default undefined */\n stepHoldInterval?: number | ((stepCount: number) => number);\n\n /** Initial delay in milliseconds before stepping the value. */\n stepHoldDelay?: number;\n\n /** If set, up/down keyboard events increment/decrement value @default true */\n withKeyboardEvents?: boolean;\n\n /** If set, leading zeros are removed on blur. For example, `00100` -> `100` @default true */\n trimLeadingZeroesOnBlur?: boolean;\n\n /** If set, all text is selected when the input receives focus @default false */\n selectAllOnFocus?: boolean;\n\n /** Called when the increment button or arrow up key is pressed and the value has reached the maximum */\n onMinReached?: () => void;\n\n /** Called when the decrement button or arrow down key is pressed and the value has reached the minimum */\n onMaxReached?: () => void;\n}\n\nexport type NumberInputFactory = Factory<{\n props: NumberInputProps;\n ref: HTMLInputElement;\n stylesNames: NumberInputStylesNames;\n vars: NumberInputCssVariables;\n variant: InputVariant;\n signature: <T extends NumberInputNumericType = number>(\n props: NumberInputProps<T>\n ) => React.JSX.Element;\n}>;\n\nconst defaultProps = {\n step: 1,\n clampBehavior: 'blur',\n allowDecimal: true,\n allowNegative: true,\n withKeyboardEvents: true,\n allowLeadingZeros: true,\n trimLeadingZeroesOnBlur: true,\n startValue: 0,\n allowedDecimalSeparators: ['.', ','],\n} satisfies Partial<NumberInputProps<number | bigint>>;\n\nconst varsResolver = createVarsResolver<NumberInputFactory>((_, { size }) => ({\n controls: {\n '--ni-chevron-size': getSize(size, 'ni-chevron-size'),\n },\n}));\n\nfunction clampAndSanitizeInput(sanitizedValue: string | number, max?: number, min?: number) {\n const stringValue = sanitizedValue.toString();\n const hasTrailingDecimalSeparator = trailingDecimalSeparatorPattern.test(stringValue);\n\n const replaced = stringValue.replace(/^0+(?=\\d)/, '');\n const parsedValue = parseFloat(replaced);\n\n if (Number.isNaN(parsedValue)) {\n return replaced;\n }\n\n if (parsedValue > Number.MAX_SAFE_INTEGER) {\n return max !== undefined ? max : replaced;\n }\n\n const clamped = clamp(parsedValue, min, max);\n\n if (hasTrailingDecimalSeparator) {\n const clampedString = clamped.toString().replace(/^0+(?=\\d)/, '');\n return `${clampedString}.`;\n }\n\n return clamped;\n}\n\nfunction clampAndSanitizeBigIntInput(\n sanitizedValue: string,\n options: { min?: bigint; max?: bigint; clampBehavior: NumberInputProps['clampBehavior'] }\n) {\n if (sanitizedValue === '' || sanitizedValue === '-') {\n return sanitizedValue;\n }\n\n const parsed = parseBigIntFromString(sanitizedValue);\n\n if (parsed === null) {\n return sanitizedValue;\n }\n\n return options.clampBehavior === 'blur' ? clampBigInt(parsed, options.min, options.max) : parsed;\n}\n\nexport const NumberInput = genericFactory<NumberInputFactory>(\n <T extends NumberInputNumericType = number>(_props: NumberInputProps<T>) => {\n const props = useProps(\n 'NumberInput',\n defaultProps as Partial<NumberInputProps>,\n _props as unknown as NumberInputProps\n );\n const {\n className,\n classNames,\n styles,\n unstyled,\n vars,\n onChange,\n onValueChange,\n value,\n defaultValue,\n max,\n min,\n step,\n hideControls,\n rightSection,\n isAllowed,\n clampBehavior,\n onBlur,\n allowDecimal,\n decimalScale,\n onKeyDown,\n onKeyDownCapture,\n handlersRef,\n startValue,\n disabled,\n rightSectionPointerEvents,\n allowNegative,\n readOnly,\n size,\n rightSectionWidth,\n stepHoldInterval,\n stepHoldDelay,\n allowLeadingZeros,\n withKeyboardEvents,\n trimLeadingZeroesOnBlur,\n allowedDecimalSeparators,\n selectAllOnFocus,\n onMinReached,\n onMaxReached,\n onFocus,\n attributes,\n ref,\n ...others\n } = props;\n const allowNegativeResolved = allowNegative ?? true;\n const allowLeadingZerosResolved = allowLeadingZeros ?? true;\n\n const getStyles = useStyles<NumberInputFactory>({\n name: 'NumberInput',\n classes,\n props: props as NumberInputProps,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<NumberInputFactory>({\n classNames,\n styles,\n props: props as NumberInputProps,\n });\n\n const valueModeRef = useRef<NumberInputMode>(\n isBigIntValue(value) || isBigIntValue(defaultValue) ? 'bigint' : 'number'\n );\n\n if (isBigIntValue(value)) {\n valueModeRef.current = 'bigint';\n } else if (typeof value === 'number') {\n valueModeRef.current = 'number';\n }\n\n const isBigIntMode = valueModeRef.current === 'bigint';\n\n const [_value, setValue] = useUncontrolled<InternalNumberInputValue>({\n value: value as InternalNumberInputValue | undefined,\n defaultValue: defaultValue as InternalNumberInputValue | undefined,\n finalValue: '',\n onChange: onChange as ((value: InternalNumberInputValue) => void) | undefined,\n });\n\n const shouldUseStepInterval = stepHoldDelay !== undefined && stepHoldInterval !== undefined;\n const inputRef = useRef<HTMLInputElement>(null);\n const onStepTimeoutRef = useRef<number | null>(null);\n const stepCountRef = useRef<number>(0);\n\n const minNumber = typeof min === 'number' ? min : undefined;\n const maxNumber = typeof max === 'number' ? max : undefined;\n const stepNumber = typeof step === 'number' ? step : defaultProps.step;\n const startValueNumber = typeof startValue === 'number' ? startValue : defaultProps.startValue;\n\n const minBigInt = toBigIntOrUndefined(min);\n const maxBigInt = toBigIntOrUndefined(max);\n const stepBigInt = toBigIntOrUndefined(step) ?? BigInt(1);\n const startValueBigInt = toBigIntOrUndefined(startValue) ?? BigInt(0);\n\n const parseBigIntOrString = (inputValue: string): bigint | string => {\n if (\n !isValidBigIntString(inputValue, allowNegativeResolved) ||\n (allowLeadingZerosResolved && leadingZerosPattern.test(inputValue))\n ) {\n return inputValue;\n }\n\n const parsed = parseBigIntFromString(inputValue);\n return parsed ?? inputValue;\n };\n\n const getBigIntFloatValue = (inputValue: bigint) => {\n const numericValue = Number(inputValue);\n return Number.isSafeInteger(numericValue) ? numericValue : undefined;\n };\n\n const handleValueChange: OnValueChange = (payload, event) => {\n if (event.source === 'event') {\n if (isBigIntMode) {\n setValue(parseBigIntOrString(payload.value));\n } else {\n setValue(\n isValidNumber(payload.floatValue, payload.value) &&\n !leadingDecimalZeroPattern.test(payload.value) &&\n !(allowLeadingZerosResolved ? leadingZerosPattern.test(payload.value) : false) &&\n !trailingZerosPattern.test(payload.value) &&\n !trailingDecimalSeparatorPattern.test(payload.value)\n ? payload.floatValue\n : payload.value\n );\n }\n }\n onValueChange?.(payload, event);\n };\n\n const getDecimalPlaces = (inputValue: number | string): number => {\n const match = String(inputValue).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) {\n return 0;\n }\n return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0));\n };\n\n const adjustCursor = (position?: number) => {\n if (inputRef.current && typeof position !== 'undefined') {\n inputRef.current.setSelectionRange(position, position);\n }\n };\n\n const incrementRef = useRef<() => void>(noop);\n incrementRef.current = () => {\n if (isBigIntMode) {\n if (!canStepBigInt(_value as bigint | string, allowNegativeResolved)) {\n return;\n }\n\n let val: bigint;\n const currentValue = _value;\n\n if (typeof currentValue === 'bigint') {\n const incrementedValue = currentValue + stepBigInt;\n if (maxBigInt !== undefined && incrementedValue > maxBigInt) {\n onMaxReached?.();\n }\n val =\n maxBigInt !== undefined && incrementedValue > maxBigInt ? maxBigInt : incrementedValue;\n } else if (typeof currentValue === 'string' && currentValue !== '') {\n const parsed = parseBigIntFromString(currentValue);\n if (parsed === null) {\n return;\n }\n\n const incrementedValue = parsed + stepBigInt;\n if (maxBigInt !== undefined && incrementedValue > maxBigInt) {\n onMaxReached?.();\n }\n val =\n maxBigInt !== undefined && incrementedValue > maxBigInt ? maxBigInt : incrementedValue;\n } else {\n val = clampBigInt(startValueBigInt, minBigInt, maxBigInt);\n }\n\n const formattedValue = val.toString();\n setValue(val);\n onValueChange?.(\n { floatValue: getBigIntFloatValue(val), formattedValue, value: formattedValue },\n { source: 'increment' as any }\n );\n setTimeout(() => adjustCursor(inputRef.current?.value.length), 0);\n return;\n }\n\n if (!canStep(_value as number | string)) {\n return;\n }\n\n let val: number;\n const currentValuePrecision = getDecimalPlaces(_value as number | string);\n const stepPrecision = getDecimalPlaces(stepNumber);\n const maxPrecision = Math.max(currentValuePrecision, stepPrecision);\n const factor = 10 ** maxPrecision;\n\n if (!isNumberString(_value) && (typeof _value !== 'number' || Number.isNaN(_value))) {\n val = clamp(startValueNumber, minNumber, maxNumber);\n } else if (maxNumber !== undefined) {\n const incrementedValue =\n (Math.round(Number(_value) * factor) + Math.round(stepNumber * factor)) / factor;\n if (incrementedValue > maxNumber) {\n onMaxReached?.();\n }\n val = incrementedValue <= maxNumber ? incrementedValue : maxNumber;\n } else {\n val = (Math.round(Number(_value) * factor) + Math.round(stepNumber * factor)) / factor;\n }\n\n const formattedValue = val.toFixed(maxPrecision);\n setValue(parseFloat(formattedValue));\n onValueChange?.(\n { floatValue: parseFloat(formattedValue), formattedValue, value: formattedValue },\n { source: 'increment' as any }\n );\n setTimeout(() => adjustCursor(inputRef.current?.value.length), 0);\n };\n\n const decrementRef = useRef<() => void>(noop);\n decrementRef.current = () => {\n if (isBigIntMode) {\n if (!canStepBigInt(_value as bigint | string, allowNegativeResolved)) {\n return;\n }\n\n let val: bigint;\n const minValue =\n minBigInt !== undefined ? minBigInt : !allowNegativeResolved ? BigInt(0) : undefined;\n const currentValue = _value;\n\n if (typeof currentValue === 'bigint') {\n const decrementedValue = currentValue - stepBigInt;\n if (minValue !== undefined && decrementedValue < minValue) {\n onMinReached?.();\n }\n val = minValue !== undefined && decrementedValue < minValue ? minValue : decrementedValue;\n } else if (typeof currentValue === 'string' && currentValue !== '') {\n const parsed = parseBigIntFromString(currentValue);\n if (parsed === null) {\n return;\n }\n\n const decrementedValue = parsed - stepBigInt;\n if (minValue !== undefined && decrementedValue < minValue) {\n onMinReached?.();\n }\n val = minValue !== undefined && decrementedValue < minValue ? minValue : decrementedValue;\n } else {\n val = clampBigInt(startValueBigInt, minValue, maxBigInt);\n }\n\n const formattedValue = val.toString();\n setValue(val);\n onValueChange?.(\n { floatValue: getBigIntFloatValue(val), formattedValue, value: formattedValue },\n { source: 'decrement' as any }\n );\n setTimeout(() => adjustCursor(inputRef.current?.value.length), 0);\n return;\n }\n\n if (!canStep(_value as number | string)) {\n return;\n }\n\n let val: number;\n const minValue =\n minNumber !== undefined ? minNumber : !allowNegativeResolved ? 0 : Number.MIN_SAFE_INTEGER;\n const currentValuePrecision = getDecimalPlaces(_value as number | string);\n const stepPrecision = getDecimalPlaces(stepNumber);\n const maxPrecision = Math.max(currentValuePrecision, stepPrecision);\n const factor = 10 ** maxPrecision;\n\n if ((!isNumberString(_value) && typeof _value !== 'number') || Number.isNaN(_value)) {\n val = clamp(startValueNumber, minValue, maxNumber);\n } else {\n const decrementedValue =\n (Math.round(Number(_value) * factor) - Math.round(stepNumber * factor)) / factor;\n if (minValue !== undefined && decrementedValue < minValue) {\n onMinReached?.();\n }\n val = minValue !== undefined && decrementedValue < minValue ? minValue : decrementedValue;\n }\n\n const formattedValue = val.toFixed(maxPrecision);\n setValue(parseFloat(formattedValue));\n onValueChange?.(\n { floatValue: parseFloat(formattedValue), formattedValue, value: formattedValue },\n { source: 'decrement' as any }\n );\n setTimeout(() => adjustCursor(inputRef.current?.value.length), 0);\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = event.clipboardData.getData('text');\n const _decimalSeparator = others.decimalSeparator || '.';\n const separatorsToReplace = (allowedDecimalSeparators || ['.', ',']).filter(\n (s) => s !== _decimalSeparator\n );\n\n if (separatorsToReplace.some((s) => pastedText.includes(s))) {\n event.preventDefault();\n let modifiedText = pastedText;\n separatorsToReplace.forEach((s) => {\n modifiedText = modifiedText.split(s).join(_decimalSeparator);\n });\n\n const input = inputRef.current;\n if (input) {\n const start = input.selectionStart ?? 0;\n const end = input.selectionEnd ?? 0;\n const currentValue = input.value;\n const newValue =\n currentValue.substring(0, start) + modifiedText + currentValue.substring(end);\n\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n 'value'\n )?.set;\n nativeInputValueSetter?.call(input, newValue);\n input.dispatchEvent(new Event('change', { bubbles: true }));\n\n const cursorPos = start + modifiedText.length;\n setTimeout(() => adjustCursor(cursorPos), 0);\n }\n }\n\n others.onPaste?.(event as any);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n\n if (readOnly || !withKeyboardEvents) {\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n incrementRef.current?.();\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n decrementRef.current?.();\n }\n };\n\n const handleKeyDownCapture = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDownCapture?.(event);\n if (event.key === 'Backspace') {\n const input = inputRef.current;\n if (input && input.selectionStart === 0 && input.selectionStart === input.selectionEnd) {\n event.preventDefault();\n window.setTimeout(() => adjustCursor(0), 0);\n }\n }\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (selectAllOnFocus) {\n setTimeout(() => event.currentTarget.select(), 0);\n }\n onFocus?.(event);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n let sanitizedValue = _value;\n\n if (isBigIntMode) {\n if (clampBehavior === 'blur' && typeof sanitizedValue === 'bigint') {\n sanitizedValue = clampBigInt(sanitizedValue, minBigInt, maxBigInt);\n }\n\n if (trimLeadingZeroesOnBlur && typeof sanitizedValue === 'string') {\n sanitizedValue = clampAndSanitizeBigIntInput(sanitizedValue, {\n min: minBigInt,\n max: maxBigInt,\n clampBehavior,\n });\n }\n } else {\n if (clampBehavior === 'blur' && typeof sanitizedValue === 'number') {\n sanitizedValue = clamp(sanitizedValue, minNumber, maxNumber);\n }\n\n if (\n trimLeadingZeroesOnBlur &&\n typeof sanitizedValue === 'string' &&\n getDecimalPlaces(sanitizedValue) < 15\n ) {\n sanitizedValue = clampAndSanitizeInput(sanitizedValue, maxNumber, minNumber);\n }\n }\n\n if (_value !== sanitizedValue) {\n setValue(sanitizedValue);\n }\n\n onBlur?.(event);\n };\n\n assignRef(handlersRef, { increment: incrementRef.current, decrement: decrementRef.current });\n\n const onStepHandleChange = (isIncrement: boolean) => {\n if (isIncrement) {\n incrementRef.current?.();\n } else {\n decrementRef.current?.();\n }\n stepCountRef.current += 1;\n };\n\n const onStepLoop = (isIncrement: boolean) => {\n onStepHandleChange(isIncrement);\n\n if (shouldUseStepInterval) {\n const interval =\n typeof stepHoldInterval === 'number'\n ? stepHoldInterval\n : stepHoldInterval(stepCountRef.current);\n onStepTimeoutRef.current = window.setTimeout(() => onStepLoop(isIncrement), interval);\n }\n };\n\n const onStep = (\n event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>,\n isIncrement: boolean\n ) => {\n event.preventDefault();\n inputRef.current?.focus();\n onStepHandleChange(isIncrement);\n if (shouldUseStepInterval) {\n onStepTimeoutRef.current = window.setTimeout(() => onStepLoop(isIncrement), stepHoldDelay);\n }\n };\n\n const onStepDone = () => {\n if (onStepTimeoutRef.current) {\n window.clearTimeout(onStepTimeoutRef.current);\n }\n onStepTimeoutRef.current = null;\n stepCountRef.current = 0;\n };\n\n const controls = (\n <div {...getStyles('controls')}>\n <UnstyledButton\n {...getStyles('control')}\n tabIndex={-1}\n aria-hidden\n disabled={\n disabled ||\n (typeof _value === 'number' && maxNumber !== undefined && _value >= maxNumber) ||\n (typeof _value === 'bigint' && maxBigInt !== undefined && _value >= maxBigInt)\n }\n mod={{ direction: 'up' }}\n onMouseDown={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n onStep(event, true);\n }}\n onPointerUp={onStepDone}\n onPointerLeave={onStepDone}\n >\n <NumberInputChevron direction=\"up\" />\n </UnstyledButton>\n <UnstyledButton\n {...getStyles('control')}\n tabIndex={-1}\n aria-hidden\n disabled={\n disabled ||\n (typeof _value === 'number' && minNumber !== undefined && _value <= minNumber) ||\n (typeof _value === 'bigint' && minBigInt !== undefined && _value <= minBigInt)\n }\n mod={{ direction: 'down' }}\n onMouseDown={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n onStep(event, false);\n }}\n onPointerUp={onStepDone}\n onPointerLeave={onStepDone}\n >\n <NumberInputChevron direction=\"down\" />\n </UnstyledButton>\n </div>\n );\n\n return (\n <InputBase\n component={NumericFormat}\n allowNegative={allowNegative}\n className={cx(classes.root, className)}\n size={size}\n {...others}\n inputMode={isBigIntMode ? 'numeric' : 'decimal'}\n readOnly={readOnly}\n disabled={disabled}\n value={typeof _value === 'bigint' ? _value.toString() : _value}\n getInputRef={useMergedRef(ref, inputRef)}\n onValueChange={handleValueChange}\n rightSection={\n hideControls ||\n readOnly ||\n !(isBigIntMode\n ? canStepBigInt(_value as bigint | string, allowNegativeResolved)\n : canStep(_value as number | string))\n ? rightSection\n : rightSection || controls\n }\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n __staticSelector=\"NumberInput\"\n decimalScale={isBigIntMode ? 0 : allowDecimal ? decimalScale : 0}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onKeyDownCapture={handleKeyDownCapture}\n rightSectionPointerEvents={rightSectionPointerEvents ?? (disabled ? 'none' : undefined)}\n rightSectionWidth={rightSectionWidth ?? `var(--ni-right-section-width-${size || 'sm'})`}\n allowLeadingZeros={allowLeadingZeros}\n allowedDecimalSeparators={allowedDecimalSeparators}\n onBlur={handleBlur}\n attributes={attributes}\n isAllowed={(val) => {\n const userAllowed = isAllowed ? isAllowed(val) : true;\n if (!userAllowed) {\n return false;\n }\n\n if (clampBehavior !== 'strict') {\n return true;\n }\n\n if (!isBigIntMode) {\n return isInRange(val.floatValue, minNumber, maxNumber);\n }\n\n if (val.value === '' || val.value === '-') {\n return true;\n }\n\n const parsed = parseBigIntFromString(val.value);\n\n if (parsed === null) {\n return true;\n }\n\n return (\n (minBigInt === undefined || parsed >= minBigInt) &&\n (maxBigInt === undefined || parsed <= maxBigInt)\n );\n }}\n />\n );\n }\n);\n\nNumberInput.classes = { ...InputBase.classes, ...classes };\nNumberInput.varsResolver = varsResolver;\nNumberInput.displayName = '@mantine/core/NumberInput';\n"],"mappings":"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"}