@mantine/core 9.6.0 → 9.6.2

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 (78) hide show
  1. package/cjs/components/Accordion/Accordion.module.cjs.map +1 -1
  2. package/cjs/components/Combobox/use-combobox/use-combobox.cjs +1 -4
  3. package/cjs/components/Combobox/use-combobox/use-combobox.cjs.map +1 -1
  4. package/cjs/components/ComboboxPopover/ComboboxPopover.cjs +1 -1
  5. package/cjs/components/ComboboxPopover/ComboboxPopover.cjs.map +1 -1
  6. package/cjs/components/Drawer/Drawer.cjs +2 -1
  7. package/cjs/components/Drawer/Drawer.cjs.map +1 -1
  8. package/cjs/components/Drawer/DrawerStack.cjs +3 -1
  9. package/cjs/components/Drawer/DrawerStack.cjs.map +1 -1
  10. package/cjs/components/Menu/MenuSub/MenuSub.cjs +1 -1
  11. package/cjs/components/Menu/MenuSub/MenuSub.cjs.map +1 -1
  12. package/cjs/components/Modal/Modal.cjs +2 -1
  13. package/cjs/components/Modal/Modal.cjs.map +1 -1
  14. package/cjs/components/Modal/ModalStack.cjs +3 -1
  15. package/cjs/components/Modal/ModalStack.cjs.map +1 -1
  16. package/cjs/components/ModalBase/ModalBase.cjs +3 -2
  17. package/cjs/components/ModalBase/ModalBase.cjs.map +1 -1
  18. package/cjs/components/ModalBase/use-modal.cjs +7 -2
  19. package/cjs/components/ModalBase/use-modal.cjs.map +1 -1
  20. package/cjs/components/NumberInput/NumberInput.cjs +32 -22
  21. package/cjs/components/NumberInput/NumberInput.cjs.map +1 -1
  22. package/cjs/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.cjs +19 -0
  23. package/cjs/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.cjs.map +1 -0
  24. package/cjs/components/NumberInput/normalize-pasted-value/normalize-pasted-value.cjs +35 -0
  25. package/cjs/components/NumberInput/normalize-pasted-value/normalize-pasted-value.cjs.map +1 -0
  26. package/cjs/components/OverflowList/use-dimensions.cjs +9 -9
  27. package/cjs/components/OverflowList/use-dimensions.cjs.map +1 -1
  28. package/cjs/components/Popover/use-popover.cjs +7 -1
  29. package/cjs/components/Popover/use-popover.cjs.map +1 -1
  30. package/cjs/components/SegmentedControl/SegmentedControl.cjs +12 -1
  31. package/cjs/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  32. package/cjs/components/Textarea/Autosize.cjs +8 -2
  33. package/cjs/components/Textarea/Autosize.cjs.map +1 -1
  34. package/esm/components/Accordion/Accordion.module.mjs.map +1 -1
  35. package/esm/components/Combobox/use-combobox/use-combobox.mjs +1 -4
  36. package/esm/components/Combobox/use-combobox/use-combobox.mjs.map +1 -1
  37. package/esm/components/ComboboxPopover/ComboboxPopover.mjs +1 -1
  38. package/esm/components/ComboboxPopover/ComboboxPopover.mjs.map +1 -1
  39. package/esm/components/Drawer/Drawer.mjs +2 -1
  40. package/esm/components/Drawer/Drawer.mjs.map +1 -1
  41. package/esm/components/Drawer/DrawerStack.mjs +3 -1
  42. package/esm/components/Drawer/DrawerStack.mjs.map +1 -1
  43. package/esm/components/Menu/MenuSub/MenuSub.mjs +1 -1
  44. package/esm/components/Menu/MenuSub/MenuSub.mjs.map +1 -1
  45. package/esm/components/Modal/Modal.mjs +2 -1
  46. package/esm/components/Modal/Modal.mjs.map +1 -1
  47. package/esm/components/Modal/ModalStack.mjs +3 -1
  48. package/esm/components/Modal/ModalStack.mjs.map +1 -1
  49. package/esm/components/ModalBase/ModalBase.mjs +3 -2
  50. package/esm/components/ModalBase/ModalBase.mjs.map +1 -1
  51. package/esm/components/ModalBase/use-modal.mjs +7 -2
  52. package/esm/components/ModalBase/use-modal.mjs.map +1 -1
  53. package/esm/components/NumberInput/NumberInput.mjs +32 -22
  54. package/esm/components/NumberInput/NumberInput.mjs.map +1 -1
  55. package/esm/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.mjs +19 -0
  56. package/esm/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.mjs.map +1 -0
  57. package/esm/components/NumberInput/normalize-pasted-value/normalize-pasted-value.mjs +35 -0
  58. package/esm/components/NumberInput/normalize-pasted-value/normalize-pasted-value.mjs.map +1 -0
  59. package/esm/components/OverflowList/use-dimensions.mjs +9 -9
  60. package/esm/components/OverflowList/use-dimensions.mjs.map +1 -1
  61. package/esm/components/Popover/use-popover.mjs +7 -1
  62. package/esm/components/Popover/use-popover.mjs.map +1 -1
  63. package/esm/components/SegmentedControl/SegmentedControl.mjs +12 -1
  64. package/esm/components/SegmentedControl/SegmentedControl.mjs.map +1 -1
  65. package/esm/components/Textarea/Autosize.mjs +9 -3
  66. package/esm/components/Textarea/Autosize.mjs.map +1 -1
  67. package/lib/components/Drawer/DrawerStack.d.ts +1 -0
  68. package/lib/components/Menu/MenuSub/MenuSub.d.ts +3 -1
  69. package/lib/components/Modal/ModalStack.d.ts +1 -0
  70. package/lib/components/ModalBase/ModalBase.d.ts +2 -1
  71. package/lib/components/ModalBase/use-modal.d.ts +2 -1
  72. package/lib/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.d.ts +1 -0
  73. package/lib/components/NumberInput/normalize-pasted-value/normalize-pasted-value.d.ts +7 -0
  74. package/package.json +2 -2
  75. package/styles/Accordion.css +4 -2
  76. package/styles/Accordion.layer.css +4 -2
  77. package/styles.css +4 -2
  78. package/styles.layer.css +4 -2
@@ -9,6 +9,8 @@ const require_use_styles = require("../../core/styles-api/use-styles/use-styles.
9
9
  const require_factory = require("../../core/factory/factory.cjs");
10
10
  const require_UnstyledButton = require("../UnstyledButton/UnstyledButton.cjs");
11
11
  const require_InputBase = require("../InputBase/InputBase.cjs");
12
+ const require_get_caret_position_after_paste = require("./get-caret-position-after-paste/get-caret-position-after-paste.cjs");
13
+ const require_normalize_pasted_value = require("./normalize-pasted-value/normalize-pasted-value.cjs");
12
14
  const require_NumberInputChevron = require("./NumberInputChevron.cjs");
13
15
  const require_NumberInput_module = require("./NumberInput.module.cjs");
14
16
  let react = require("react");
@@ -83,16 +85,18 @@ const defaultProps = {
83
85
  allowedDecimalSeparators: [".", ","]
84
86
  };
85
87
  const varsResolver = require_create_vars_resolver.createVarsResolver((_, { size }) => ({ controls: { "--ni-chevron-size": require_get_size.getSize(size, "ni-chevron-size") } }));
86
- function clampAndSanitizeInput(sanitizedValue, max, min) {
87
- const stringValue = sanitizedValue.toString();
88
- const hasTrailingDecimalSeparator = trailingDecimalSeparatorPattern.test(stringValue);
89
- const replaced = stringValue.replace(/^0+(?=\d)/, "");
90
- const parsedValue = parseFloat(replaced);
91
- if (Number.isNaN(parsedValue)) return replaced;
92
- if (parsedValue > Number.MAX_SAFE_INTEGER) return max !== void 0 ? max : replaced;
93
- const clamped = (0, _mantine_hooks.clamp)(parsedValue, min, max);
94
- if (hasTrailingDecimalSeparator) return `${clamped.toString().replace(/^0+(?=\d)/, "")}.`;
95
- return clamped;
88
+ function withTrailingSeparator(value, hasTrailingDecimalSeparator) {
89
+ return hasTrailingDecimalSeparator ? `${value}.` : value;
90
+ }
91
+ function sanitizeInputOnBlur(value, options) {
92
+ const hasTrailingDecimalSeparator = trailingDecimalSeparatorPattern.test(value);
93
+ const trimmed = options.trim ? value.replace(/^0+(?=\d)/, "") : value;
94
+ const parsedValue = parseFloat(trimmed);
95
+ if (Number.isNaN(parsedValue)) return trimmed;
96
+ if (!options.clamp) return options.trim ? withTrailingSeparator(parsedValue, hasTrailingDecimalSeparator) : value;
97
+ const clamped = parsedValue > Number.MAX_SAFE_INTEGER && options.max !== void 0 ? options.max : (0, _mantine_hooks.clamp)(parsedValue, options.min, options.max);
98
+ if (!options.trim && clamped === parsedValue) return value;
99
+ return withTrailingSeparator(clamped, hasTrailingDecimalSeparator);
96
100
  }
97
101
  function clampAndSanitizeBigIntInput(sanitizedValue, options) {
98
102
  if (sanitizedValue === "" || sanitizedValue === "-") return sanitizedValue;
@@ -271,13 +275,15 @@ const NumberInput = require_factory.genericFactory((_props) => {
271
275
  const handlePaste = (event) => {
272
276
  const pastedText = event.clipboardData.getData("text");
273
277
  const _decimalSeparator = others.decimalSeparator || ".";
274
- const separatorsToReplace = (allowedDecimalSeparators || [".", ","]).filter((s) => s !== _decimalSeparator);
275
- if (separatorsToReplace.some((s) => pastedText.includes(s))) {
278
+ const _thousandSeparator = others.thousandSeparator === true ? "," : others.thousandSeparator === false ? void 0 : others.thousandSeparator;
279
+ const modifiedText = require_normalize_pasted_value.normalizePastedValue(pastedText, {
280
+ decimalSeparator: _decimalSeparator,
281
+ thousandSeparator: _thousandSeparator,
282
+ allowedDecimalSeparators: allowedDecimalSeparators || [".", ","],
283
+ thousandsGroupStyle: others.thousandsGroupStyle
284
+ });
285
+ if (modifiedText !== pastedText) {
276
286
  event.preventDefault();
277
- let modifiedText = pastedText;
278
- separatorsToReplace.forEach((s) => {
279
- modifiedText = modifiedText.split(s).join(_decimalSeparator);
280
- });
281
287
  const input = inputRef.current;
282
288
  if (input) {
283
289
  const start = input.selectionStart ?? 0;
@@ -286,8 +292,8 @@ const NumberInput = require_factory.genericFactory((_props) => {
286
292
  const newValue = currentValue.substring(0, start) + modifiedText + currentValue.substring(end);
287
293
  (Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set)?.call(input, newValue);
288
294
  input.dispatchEvent(new Event("change", { bubbles: true }));
289
- const cursorPos = start + modifiedText.length;
290
- setTimeout(() => adjustCursor(cursorPos), 0);
295
+ const rawCaret = start + modifiedText.length;
296
+ setTimeout(() => adjustCursor(require_get_caret_position_after_paste.getCaretPositionAfterPaste(newValue, rawCaret, input.value, _decimalSeparator)), 0);
291
297
  }
292
298
  }
293
299
  others.onPaste?.(event);
@@ -327,10 +333,14 @@ const NumberInput = require_factory.genericFactory((_props) => {
327
333
  max: maxBigInt,
328
334
  clampBehavior
329
335
  });
330
- } else {
331
- if (clampBehavior === "blur" && typeof sanitizedValue === "number") sanitizedValue = (0, _mantine_hooks.clamp)(sanitizedValue, minNumber, maxNumber);
332
- if (trimLeadingZeroesOnBlur && typeof sanitizedValue === "string" && getDecimalPlaces(sanitizedValue) < 15) sanitizedValue = clampAndSanitizeInput(sanitizedValue, maxNumber, minNumber);
333
- }
336
+ } else if (typeof sanitizedValue === "number") {
337
+ if (clampBehavior === "blur") sanitizedValue = (0, _mantine_hooks.clamp)(sanitizedValue, minNumber, maxNumber);
338
+ } else if (typeof sanitizedValue === "string") sanitizedValue = sanitizeInputOnBlur(sanitizedValue, {
339
+ min: minNumber,
340
+ max: maxNumber,
341
+ trim: !!trimLeadingZeroesOnBlur && getDecimalPlaces(sanitizedValue) < 15,
342
+ clamp: clampBehavior === "blur"
343
+ });
334
344
  if (_value !== sanitizedValue) setValue(sanitizedValue);
335
345
  onBlur?.(event);
336
346
  };
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.cjs","names":["createVarsResolver","getSize","clamp","genericFactory","useProps","useStyles","useResolvedStylesApi","useRef","useUncontrolled","noop","UnstyledButton","NumberInputChevron","InputBase","NumericFormat","cx","classes","useMergedRef"],"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 size: 'sm',\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 ['Input', 'InputWrapper', '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 window.setTimeout(() => inputRef.current?.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\nexport namespace NumberInput {\n export type Props<T extends NumberInputNumericType = number> = NumberInputProps<T>;\n export type StylesNames = NumberInputStylesNames;\n export type Factory = NumberInputFactory;\n export type CssVariables = NumberInputCssVariables;\n export type Handlers = NumberInputHandlers;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"NumberInput.cjs","names":["createVarsResolver","getSize","clamp","genericFactory","useProps","useStyles","useResolvedStylesApi","useRef","useUncontrolled","noop","normalizePastedValue","getCaretPositionAfterPaste","UnstyledButton","NumberInputChevron","InputBase","NumericFormat","cx","classes","useMergedRef"],"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 { getCaretPositionAfterPaste } from './get-caret-position-after-paste/get-caret-position-after-paste';\nimport { normalizePastedValue } from './normalize-pasted-value/normalize-pasted-value';\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 size: 'sm',\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 withTrailingSeparator(value: number, hasTrailingDecimalSeparator: boolean) {\n return hasTrailingDecimalSeparator ? `${value}.` : value;\n}\n\ninterface SanitizeInputOnBlurOptions {\n min: number | undefined;\n max: number | undefined;\n trim: boolean;\n clamp: boolean;\n}\n\nfunction sanitizeInputOnBlur(value: string, options: SanitizeInputOnBlurOptions) {\n const hasTrailingDecimalSeparator = trailingDecimalSeparatorPattern.test(value);\n const trimmed = options.trim ? value.replace(/^0+(?=\\d)/, '') : value;\n const parsedValue = parseFloat(trimmed);\n\n if (Number.isNaN(parsedValue)) {\n return trimmed;\n }\n\n if (!options.clamp) {\n return options.trim ? withTrailingSeparator(parsedValue, hasTrailingDecimalSeparator) : value;\n }\n\n const clamped =\n parsedValue > Number.MAX_SAFE_INTEGER && options.max !== undefined\n ? options.max\n : clamp(parsedValue, options.min, options.max);\n\n if (!options.trim && clamped === parsedValue) {\n return value;\n }\n\n return withTrailingSeparator(clamped, hasTrailingDecimalSeparator);\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 ['Input', 'InputWrapper', '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 _thousandSeparator =\n others.thousandSeparator === true\n ? ','\n : others.thousandSeparator === false\n ? undefined\n : others.thousandSeparator;\n const modifiedText = normalizePastedValue(pastedText, {\n decimalSeparator: _decimalSeparator,\n thousandSeparator: _thousandSeparator,\n allowedDecimalSeparators: allowedDecimalSeparators || ['.', ','],\n thousandsGroupStyle: others.thousandsGroupStyle,\n });\n\n if (modifiedText !== pastedText) {\n event.preventDefault();\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 rawCaret = start + modifiedText.length;\n setTimeout(\n () =>\n adjustCursor(\n getCaretPositionAfterPaste(newValue, rawCaret, input.value, _decimalSeparator)\n ),\n 0\n );\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 window.setTimeout(() => inputRef.current?.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 if (typeof sanitizedValue === 'number') {\n if (clampBehavior === 'blur') {\n sanitizedValue = clamp(sanitizedValue, minNumber, maxNumber);\n }\n } else if (typeof sanitizedValue === 'string') {\n sanitizedValue = sanitizeInputOnBlur(sanitizedValue, {\n min: minNumber,\n max: maxNumber,\n trim: !!trimLeadingZeroesOnBlur && getDecimalPlaces(sanitizedValue) < 15,\n clamp: clampBehavior === 'blur',\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\nexport namespace NumberInput {\n export type Props<T extends NumberInputNumericType = number> = NumberInputProps<T>;\n export type StylesNames = NumberInputStylesNames;\n export type Factory = NumberInputFactory;\n export type CssVariables = NumberInputCssVariables;\n export type Handlers = NumberInputHandlers;\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ //#region packages/@mantine/core/src/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.ts
3
+ function isSignificant(char, decimalSeparator) {
4
+ return /\d/.test(char) || char === decimalSeparator;
5
+ }
6
+ function getCaretPositionAfterPaste(rawValue, rawCaret, formattedValue, decimalSeparator) {
7
+ let remaining = 0;
8
+ for (let i = 0; i < rawCaret && i < rawValue.length; i += 1) if (isSignificant(rawValue[i], decimalSeparator)) remaining += 1;
9
+ if (remaining === 0) return Math.min(rawCaret, formattedValue.length);
10
+ for (let i = 0; i < formattedValue.length; i += 1) if (isSignificant(formattedValue[i], decimalSeparator)) {
11
+ remaining -= 1;
12
+ if (remaining === 0) return i + 1;
13
+ }
14
+ return formattedValue.length;
15
+ }
16
+ //#endregion
17
+ exports.getCaretPositionAfterPaste = getCaretPositionAfterPaste;
18
+
19
+ //# sourceMappingURL=get-caret-position-after-paste.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-caret-position-after-paste.cjs","names":[],"sources":["../../../../src/components/NumberInput/get-caret-position-after-paste/get-caret-position-after-paste.ts"],"sourcesContent":["function isSignificant(char: string, decimalSeparator: string) {\n return /\\d/.test(char) || char === decimalSeparator;\n}\n\nexport function getCaretPositionAfterPaste(\n rawValue: string,\n rawCaret: number,\n formattedValue: string,\n decimalSeparator: string\n) {\n let remaining = 0;\n for (let i = 0; i < rawCaret && i < rawValue.length; i += 1) {\n if (isSignificant(rawValue[i], decimalSeparator)) {\n remaining += 1;\n }\n }\n\n if (remaining === 0) {\n return Math.min(rawCaret, formattedValue.length);\n }\n\n for (let i = 0; i < formattedValue.length; i += 1) {\n if (isSignificant(formattedValue[i], decimalSeparator)) {\n remaining -= 1;\n if (remaining === 0) {\n return i + 1;\n }\n }\n }\n\n return formattedValue.length;\n}\n"],"mappings":";;AAAA,SAAS,cAAc,MAAc,kBAA0B;CAC7D,OAAO,KAAK,KAAK,IAAI,KAAK,SAAS;AACrC;AAEA,SAAgB,2BACd,UACA,UACA,gBACA,kBACA;CACA,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAI,SAAS,QAAQ,KAAK,GACxD,IAAI,cAAc,SAAS,IAAI,gBAAgB,GAC7C,aAAa;CAIjB,IAAI,cAAc,GAChB,OAAO,KAAK,IAAI,UAAU,eAAe,MAAM;CAGjD,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAC9C,IAAI,cAAc,eAAe,IAAI,gBAAgB,GAAG;EACtD,aAAa;EACb,IAAI,cAAc,GAChB,OAAO,IAAI;CAEf;CAGF,OAAO,eAAe;AACxB"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ //#region packages/@mantine/core/src/components/NumberInput/normalize-pasted-value/normalize-pasted-value.ts
3
+ function countTrailingDigits(value, from) {
4
+ let count = 0;
5
+ while (from + count < value.length && /\d/.test(value[from + count])) count += 1;
6
+ return count;
7
+ }
8
+ function normalizePastedValue(value, { decimalSeparator, thousandSeparator, allowedDecimalSeparators, thousandsGroupStyle }) {
9
+ const candidates = new Set([...allowedDecimalSeparators, decimalSeparator].filter((s) => s.length === 1));
10
+ const chars = value.split("");
11
+ const occurrences = chars.reduce((acc, char, index) => {
12
+ if (candidates.has(char)) acc.push(index);
13
+ return acc;
14
+ }, []);
15
+ if (occurrences.length === 0) return value;
16
+ const lastIndex = occurrences[occurrences.length - 1];
17
+ const lastChar = chars[lastIndex];
18
+ const lastCharCount = occurrences.filter((index) => chars[index] === lastChar).length;
19
+ const lastGroupSize = thousandsGroupStyle === "wan" ? 4 : 3;
20
+ let decimalIndex = -1;
21
+ if (lastCharCount === 1) {
22
+ if (lastChar === decimalSeparator) decimalIndex = lastIndex;
23
+ else if (lastChar === thousandSeparator) decimalIndex = countTrailingDigits(value, lastIndex + 1) === lastGroupSize ? -1 : lastIndex;
24
+ else decimalIndex = lastIndex;
25
+ }
26
+ return chars.map((char, index) => {
27
+ if (index === decimalIndex) return decimalSeparator;
28
+ if (candidates.has(char) && char !== thousandSeparator) return "";
29
+ return char;
30
+ }).join("");
31
+ }
32
+ //#endregion
33
+ exports.normalizePastedValue = normalizePastedValue;
34
+
35
+ //# sourceMappingURL=normalize-pasted-value.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-pasted-value.cjs","names":[],"sources":["../../../../src/components/NumberInput/normalize-pasted-value/normalize-pasted-value.ts"],"sourcesContent":["export interface NormalizePastedValueOptions {\n decimalSeparator: string;\n thousandSeparator?: string;\n allowedDecimalSeparators: string[];\n thousandsGroupStyle?: 'thousand' | 'lakh' | 'wan' | 'none';\n}\n\nfunction countTrailingDigits(value: string, from: number) {\n let count = 0;\n while (from + count < value.length && /\\d/.test(value[from + count])) {\n count += 1;\n }\n return count;\n}\n\nexport function normalizePastedValue(\n value: string,\n {\n decimalSeparator,\n thousandSeparator,\n allowedDecimalSeparators,\n thousandsGroupStyle,\n }: NormalizePastedValueOptions\n) {\n const candidates = new Set(\n [...allowedDecimalSeparators, decimalSeparator].filter((s) => s.length === 1)\n );\n const chars = value.split('');\n const occurrences = chars.reduce<number[]>((acc, char, index) => {\n if (candidates.has(char)) {\n acc.push(index);\n }\n return acc;\n }, []);\n\n if (occurrences.length === 0) {\n return value;\n }\n\n const lastIndex = occurrences[occurrences.length - 1];\n const lastChar = chars[lastIndex];\n const lastCharCount = occurrences.filter((index) => chars[index] === lastChar).length;\n const lastGroupSize = thousandsGroupStyle === 'wan' ? 4 : 3;\n\n let decimalIndex = -1;\n if (lastCharCount === 1) {\n if (lastChar === decimalSeparator) {\n decimalIndex = lastIndex;\n } else if (lastChar === thousandSeparator) {\n decimalIndex = countTrailingDigits(value, lastIndex + 1) === lastGroupSize ? -1 : lastIndex;\n } else {\n decimalIndex = lastIndex;\n }\n }\n\n return chars\n .map((char, index) => {\n if (index === decimalIndex) {\n return decimalSeparator;\n }\n\n if (candidates.has(char) && char !== thousandSeparator) {\n return '';\n }\n\n return char;\n })\n .join('');\n}\n"],"mappings":";;AAOA,SAAS,oBAAoB,OAAe,MAAc;CACxD,IAAI,QAAQ;CACZ,OAAO,OAAO,QAAQ,MAAM,UAAU,KAAK,KAAK,MAAM,OAAO,MAAM,GACjE,SAAS;CAEX,OAAO;AACT;AAEA,SAAgB,qBACd,OACA,EACE,kBACA,mBACA,0BACA,uBAEF;CACA,MAAM,aAAa,IAAI,IACrB,CAAC,GAAG,0BAA0B,gBAAgB,CAAC,CAAC,QAAQ,MAAM,EAAE,WAAW,CAAC,CAC9E;CACA,MAAM,QAAQ,MAAM,MAAM,EAAE;CAC5B,MAAM,cAAc,MAAM,QAAkB,KAAK,MAAM,UAAU;EAC/D,IAAI,WAAW,IAAI,IAAI,GACrB,IAAI,KAAK,KAAK;EAEhB,OAAO;CACT,GAAG,CAAC,CAAC;CAEL,IAAI,YAAY,WAAW,GACzB,OAAO;CAGT,MAAM,YAAY,YAAY,YAAY,SAAS;CACnD,MAAM,WAAW,MAAM;CACvB,MAAM,gBAAgB,YAAY,QAAQ,UAAU,MAAM,WAAW,QAAQ,CAAC,CAAC;CAC/E,MAAM,gBAAgB,wBAAwB,QAAQ,IAAI;CAE1D,IAAI,eAAe;CACnB,IAAI,kBAAkB,GAAG;EACvB,IAAI,aAAa,kBACf,eAAe;OACV,IAAI,aAAa,mBACtB,eAAe,oBAAoB,OAAO,YAAY,CAAC,MAAM,gBAAgB,KAAK;OAElF,eAAe;CAEnB;CAEA,OAAO,MACJ,KAAK,MAAM,UAAU;EACpB,IAAI,UAAU,cACZ,OAAO;EAGT,IAAI,WAAW,IAAI,IAAI,KAAK,SAAS,mBACnC,OAAO;EAGT,OAAO;CACT,CAAC,CAAC,CACD,KAAK,EAAE;AACZ"}
@@ -1,28 +1,28 @@
1
1
  "use client";
2
2
  let react = require("react");
3
- let react_dom = require("react-dom");
4
3
  //#region packages/@mantine/core/src/components/OverflowList/use-dimensions.tsx
5
4
  function useDimensions(elementRef) {
6
5
  const resizeObserverRef = (0, react.useRef)(null);
7
6
  const [dimensions, setDimensions] = (0, react.useState)(null);
8
7
  (0, react.useEffect)(() => {
9
8
  if (!elementRef.current) return;
9
+ let frame = 0;
10
10
  resizeObserverRef.current = new ResizeObserver((entries) => {
11
11
  if (entries[0]) {
12
12
  const entry = entries[0];
13
- const updateDimensions = () => {
14
- setDimensions({
15
- width: entry.borderBoxSize[0]?.inlineSize ?? entry.target.clientWidth,
16
- height: entry.borderBoxSize[0]?.blockSize ?? entry.target.clientHeight,
17
- contentWidth: entry.contentRect.width,
18
- contentHeight: entry.contentRect.height
19
- });
13
+ const nextDimensions = {
14
+ width: entry.borderBoxSize[0]?.inlineSize ?? entry.target.clientWidth,
15
+ height: entry.borderBoxSize[0]?.blockSize ?? entry.target.clientHeight,
16
+ contentWidth: entry.contentRect.width,
17
+ contentHeight: entry.contentRect.height
20
18
  };
21
- (0, react_dom.flushSync)(updateDimensions);
19
+ cancelAnimationFrame(frame);
20
+ frame = requestAnimationFrame(() => setDimensions(nextDimensions));
22
21
  }
23
22
  });
24
23
  resizeObserverRef.current.observe(elementRef.current);
25
24
  return () => {
25
+ cancelAnimationFrame(frame);
26
26
  if (resizeObserverRef.current) {
27
27
  resizeObserverRef.current.disconnect();
28
28
  resizeObserverRef.current = null;
@@ -1 +1 @@
1
- {"version":3,"file":"use-dimensions.cjs","names":["useRef","useState"],"sources":["../../../src/components/OverflowList/use-dimensions.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\n\ninterface ResizeObserverDimensions {\n width: number;\n height: number;\n contentWidth: number;\n contentHeight: number;\n}\nexport function useDimensions<T extends HTMLElement | null>(\n elementRef: React.RefObject<T>\n): ResizeObserverDimensions | null {\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const [dimensions, setDimensions] = useState<ResizeObserverDimensions | null>(null);\n\n useEffect(() => {\n if (!elementRef.current) {\n return;\n }\n\n resizeObserverRef.current = new ResizeObserver((entries) => {\n if (entries[0]) {\n const entry = entries[0];\n const updateDimensions = () => {\n setDimensions({\n width: entry.borderBoxSize[0]?.inlineSize ?? entry.target.clientWidth,\n height: entry.borderBoxSize[0]?.blockSize ?? entry.target.clientHeight,\n contentWidth: entry.contentRect.width,\n contentHeight: entry.contentRect.height,\n });\n };\n\n flushSync(updateDimensions);\n }\n });\n\n resizeObserverRef.current.observe(elementRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n };\n }, [elementRef.current]);\n\n return dimensions;\n}\n"],"mappings":";;;;AASA,SAAgB,cACd,YACiC;CACjC,MAAM,qBAAA,GAAoBA,MAAAA,OAAAA,CAA8B,IAAI;CAC5D,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAA0C,IAAI;CAElF,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,WAAW,SACd;EAGF,kBAAkB,UAAU,IAAI,gBAAgB,YAAY;GAC1D,IAAI,QAAQ,IAAI;IACd,MAAM,QAAQ,QAAQ;IACtB,MAAM,yBAAyB;KAC7B,cAAc;MACZ,OAAO,MAAM,cAAc,EAAE,EAAE,cAAc,MAAM,OAAO;MAC1D,QAAQ,MAAM,cAAc,EAAE,EAAE,aAAa,MAAM,OAAO;MAC1D,cAAc,MAAM,YAAY;MAChC,eAAe,MAAM,YAAY;KACnC,CAAC;IACH;IAEA,CAAA,GAAA,UAAA,UAAA,CAAU,gBAAgB;GAC5B;EACF,CAAC;EAED,kBAAkB,QAAQ,QAAQ,WAAW,OAAO;EAEpD,aAAa;GACX,IAAI,kBAAkB,SAAS;IAC7B,kBAAkB,QAAQ,WAAW;IACrC,kBAAkB,UAAU;GAC9B;EACF;CACF,GAAG,CAAC,WAAW,OAAO,CAAC;CAEvB,OAAO;AACT"}
1
+ {"version":3,"file":"use-dimensions.cjs","names":["useRef","useState"],"sources":["../../../src/components/OverflowList/use-dimensions.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\ninterface ResizeObserverDimensions {\n width: number;\n height: number;\n contentWidth: number;\n contentHeight: number;\n}\nexport function useDimensions<T extends HTMLElement | null>(\n elementRef: React.RefObject<T>\n): ResizeObserverDimensions | null {\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const [dimensions, setDimensions] = useState<ResizeObserverDimensions | null>(null);\n\n useEffect(() => {\n if (!elementRef.current) {\n return;\n }\n\n // The observer watches the same element that the measuring cycle resizes.\n // Updating dimensions synchronously inside the callback resizes an element\n // whose notification is being delivered, which browsers report as\n // \"ResizeObserver loop completed with undelivered notifications\"\n // (a window `error` event). Defer the update to the next frame instead.\n let frame = 0;\n\n resizeObserverRef.current = new ResizeObserver((entries) => {\n if (entries[0]) {\n const entry = entries[0];\n const nextDimensions = {\n width: entry.borderBoxSize[0]?.inlineSize ?? entry.target.clientWidth,\n height: entry.borderBoxSize[0]?.blockSize ?? entry.target.clientHeight,\n contentWidth: entry.contentRect.width,\n contentHeight: entry.contentRect.height,\n };\n\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => setDimensions(nextDimensions));\n }\n });\n\n resizeObserverRef.current.observe(elementRef.current);\n\n return () => {\n cancelAnimationFrame(frame);\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n };\n }, [elementRef.current]);\n\n return dimensions;\n}\n"],"mappings":";;;AAQA,SAAgB,cACd,YACiC;CACjC,MAAM,qBAAA,GAAoBA,MAAAA,OAAAA,CAA8B,IAAI;CAC5D,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAA0C,IAAI;CAElF,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,WAAW,SACd;EAQF,IAAI,QAAQ;EAEZ,kBAAkB,UAAU,IAAI,gBAAgB,YAAY;GAC1D,IAAI,QAAQ,IAAI;IACd,MAAM,QAAQ,QAAQ;IACtB,MAAM,iBAAiB;KACrB,OAAO,MAAM,cAAc,EAAE,EAAE,cAAc,MAAM,OAAO;KAC1D,QAAQ,MAAM,cAAc,EAAE,EAAE,aAAa,MAAM,OAAO;KAC1D,cAAc,MAAM,YAAY;KAChC,eAAe,MAAM,YAAY;IACnC;IAEA,qBAAqB,KAAK;IAC1B,QAAQ,4BAA4B,cAAc,cAAc,CAAC;GACnE;EACF,CAAC;EAED,kBAAkB,QAAQ,QAAQ,WAAW,OAAO;EAEpD,aAAa;GACX,qBAAqB,KAAK;GAC1B,IAAI,kBAAkB,SAAS;IAC7B,kBAAkB,QAAQ,WAAW;IACrC,kBAAkB,UAAU;GAC9B;EACF;CACF,GAAG,CAAC,WAAW,OAAO,CAAC;CAEvB,OAAO;AACT"}
@@ -70,6 +70,7 @@ function usePopover(options) {
70
70
  onChange: options.onChange
71
71
  });
72
72
  const previouslyOpened = (0, react.useRef)(_opened);
73
+ const measuredAfterShowRef = (0, react.useRef)(false);
73
74
  const [lockedPlacement, setLockedPlacement] = (0, react.useState)(null);
74
75
  const lockEnabled = options.preventPositionChangeWhenVisible !== false;
75
76
  const wasOpenedRef = (0, react.useRef)(_opened);
@@ -77,6 +78,12 @@ function usePopover(options) {
77
78
  wasOpenedRef.current = _opened;
78
79
  if (_opened && lockedPlacement !== null) setLockedPlacement(null);
79
80
  }
81
+ const previousPositionRef = (0, react.useRef)(options.position);
82
+ if (options.position !== previousPositionRef.current) {
83
+ previousPositionRef.current = options.position;
84
+ measuredAfterShowRef.current = false;
85
+ if (lockedPlacement !== null) setLockedPlacement(null);
86
+ }
80
87
  const resetLockedPlacement = (0, react.useCallback)(() => setLockedPlacement(null), []);
81
88
  const onClose = () => {
82
89
  if (_opened && !options.disabled) setOpened(false);
@@ -103,7 +110,6 @@ function usePopover(options) {
103
110
  floating.elements.reference,
104
111
  floating.elements.floating
105
112
  ]);
106
- const measuredAfterShowRef = (0, react.useRef)(false);
107
113
  (0, _mantine_hooks.useIsomorphicEffect)(() => {
108
114
  if (!_opened) {
109
115
  measuredAfterShowRef.current = false;
@@ -1 +1 @@
1
- {"version":3,"file":"use-popover.cjs","names":["offset","hide","flip","shift","limitShift","inline","arrow","size","useUncontrolled","useRef","useState","useCallback","useFloating","autoUpdate"],"sources":["../../../src/components/Popover/use-popover.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n arrow,\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n Middleware,\n offset,\n shift,\n size,\n useFloating,\n UseFloatingReturn,\n} from '@floating-ui/react';\nimport { useDidUpdate, useIsomorphicEffect, useUncontrolled } from '@mantine/hooks';\nimport { FloatingAxesOffsets, FloatingPosition, FloatingStrategy } from '../../utils/Floating';\nimport { PopoverMiddlewares, PopoverWidth } from './Popover.types';\n\ninterface UsePopoverOptions {\n offset: number | FloatingAxesOffsets;\n position: FloatingPosition;\n onPositionChange?: (position: FloatingPosition) => void;\n opened: boolean | undefined;\n defaultOpened: boolean | undefined;\n onChange?: (opened: boolean) => void;\n onClose?: () => void;\n onDismiss?: () => void;\n onOpen?: () => void;\n width: PopoverWidth;\n middlewares: PopoverMiddlewares | undefined;\n arrowRef: React.RefObject<HTMLDivElement | null>;\n arrowOffset: number;\n strategy?: FloatingStrategy;\n disabled: boolean | undefined;\n preventPositionChangeWhenVisible: boolean | undefined;\n keepMounted: boolean | undefined;\n}\n\nfunction getDefaultMiddlewares(middlewares: PopoverMiddlewares | undefined): PopoverMiddlewares {\n if (middlewares === undefined) {\n return { shift: true, flip: true };\n }\n\n const result = { ...middlewares };\n if (middlewares.shift === undefined) {\n result.shift = true;\n }\n\n if (middlewares.flip === undefined) {\n result.flip = true;\n }\n\n return result;\n}\n\nfunction getPopoverMiddlewares(\n options: UsePopoverOptions,\n getFloating: () => UseFloatingReturn<Element>,\n disableFlip: boolean,\n lockEnabled: boolean\n) {\n const middlewaresOptions = getDefaultMiddlewares(options.middlewares);\n const middlewares: Middleware[] = [offset(options.offset), hide()];\n\n if (middlewaresOptions.flip && !disableFlip) {\n const userFlip = typeof middlewaresOptions.flip === 'boolean' ? {} : middlewaresOptions.flip;\n const flipOptions = lockEnabled\n ? { fallbackStrategy: 'initialPlacement' as const, ...userFlip }\n : userFlip;\n middlewares.push(flip(flipOptions));\n }\n\n if (middlewaresOptions.shift) {\n const shiftOptions =\n typeof middlewaresOptions.shift === 'boolean' ? {} : middlewaresOptions.shift;\n middlewares.push(\n shift((state) => {\n const isVerticalPlacement =\n state.placement.startsWith('top') || state.placement.startsWith('bottom');\n return {\n limiter: limitShift(),\n padding: 5,\n ...(options.width === 'target' && isVerticalPlacement ? { mainAxis: false } : null),\n ...shiftOptions,\n };\n })\n );\n }\n\n if (middlewaresOptions.inline) {\n middlewares.push(\n typeof middlewaresOptions.inline === 'boolean' ? inline() : inline(middlewaresOptions.inline)\n );\n }\n\n middlewares.push(arrow({ element: options.arrowRef, padding: options.arrowOffset }));\n\n if (middlewaresOptions.size || options.width === 'target') {\n middlewares.push(\n size({\n ...(typeof middlewaresOptions.size === 'boolean' ? {} : middlewaresOptions.size),\n apply({ rects, availableWidth, availableHeight, ...rest }) {\n const floating = getFloating();\n const styles = floating.refs.floating.current?.style ?? {};\n\n if (middlewaresOptions.size) {\n // If custom apply function is given use that else set defaults\n if (typeof middlewaresOptions.size === 'object' && !!middlewaresOptions.size.apply) {\n middlewaresOptions.size.apply({ rects, availableWidth, availableHeight, ...rest });\n } else {\n Object.assign(styles, {\n maxWidth: `${availableWidth}px`,\n maxHeight: `${availableHeight}px`,\n });\n }\n }\n\n if (options.width === 'target') {\n Object.assign(styles, {\n width: `${rects.reference.width}px`,\n });\n }\n },\n })\n );\n }\n\n return middlewares;\n}\n\nexport function usePopover(options: UsePopoverOptions) {\n const [_opened, setOpened] = useUncontrolled({\n value: options.opened,\n defaultValue: options.defaultOpened,\n finalValue: false,\n onChange: options.onChange,\n });\n\n const previouslyOpened = useRef(_opened);\n\n const [lockedPlacement, setLockedPlacement] = useState<FloatingPosition | null>(null);\n const lockEnabled = options.preventPositionChangeWhenVisible !== false;\n\n const wasOpenedRef = useRef(_opened);\n if (_opened !== wasOpenedRef.current) {\n wasOpenedRef.current = _opened;\n if (_opened && lockedPlacement !== null) {\n setLockedPlacement(null);\n }\n }\n\n const resetLockedPlacement = useCallback(() => setLockedPlacement(null), []);\n\n const onClose = () => {\n if (_opened && !options.disabled) {\n setOpened(false);\n }\n };\n\n const onToggle = () => {\n if (!options.disabled) {\n setOpened(!_opened);\n }\n };\n\n const floating: UseFloatingReturn<Element> = useFloating({\n open: _opened,\n strategy: options.strategy,\n placement: lockEnabled ? (lockedPlacement ?? options.position) : options.position,\n middleware: getPopoverMiddlewares(\n options,\n () => floating,\n lockEnabled && lockedPlacement !== null,\n lockEnabled\n ),\n whileElementsMounted: !options.keepMounted ? autoUpdate : undefined,\n });\n\n useEffect(() => {\n if (!options.keepMounted) {\n return undefined;\n }\n\n const referenceElement = floating.refs.reference.current;\n const floatingElement = floating.refs.floating.current;\n\n if (_opened && referenceElement && floatingElement) {\n return autoUpdate(referenceElement, floatingElement, floating.update);\n }\n\n return undefined;\n }, [\n options.keepMounted,\n _opened,\n floating.update,\n floating.elements.reference,\n floating.elements.floating,\n ]);\n\n const measuredAfterShowRef = useRef(false);\n\n useIsomorphicEffect(() => {\n if (!_opened) {\n measuredAfterShowRef.current = false;\n return;\n }\n\n if (!lockEnabled || lockedPlacement !== null) {\n return;\n }\n\n const flEl = floating.refs.floating.current as HTMLElement | null;\n if (!flEl || flEl.offsetHeight === 0 || flEl.offsetWidth === 0) {\n return;\n }\n\n if (!measuredAfterShowRef.current) {\n measuredAfterShowRef.current = true;\n floating.update();\n return;\n }\n\n if (floating.isPositioned) {\n setLockedPlacement(floating.placement);\n }\n }, [\n lockEnabled,\n _opened,\n floating.isPositioned,\n floating.placement,\n lockedPlacement,\n floating.update,\n ]);\n\n const previousPlacementRef = useRef(floating.placement);\n useIsomorphicEffect(() => {\n if (previousPlacementRef.current !== floating.placement) {\n previousPlacementRef.current = floating.placement;\n options.onPositionChange?.(floating.placement);\n }\n }, [floating.placement]);\n\n useDidUpdate(() => {\n if (_opened !== previouslyOpened.current) {\n if (!_opened) {\n options.onClose?.();\n } else {\n options.onOpen?.();\n }\n }\n\n previouslyOpened.current = _opened;\n }, [_opened, options.onClose, options.onOpen]);\n\n return {\n floating,\n controlled: typeof options.opened === 'boolean',\n opened: _opened,\n onClose,\n onToggle,\n resetLockedPlacement,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-popover.cjs","names":["offset","hide","flip","shift","limitShift","inline","arrow","size","useUncontrolled","useRef","useState","useCallback","useFloating","autoUpdate"],"sources":["../../../src/components/Popover/use-popover.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n arrow,\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n Middleware,\n offset,\n shift,\n size,\n useFloating,\n UseFloatingReturn,\n} from '@floating-ui/react';\nimport { useDidUpdate, useIsomorphicEffect, useUncontrolled } from '@mantine/hooks';\nimport { FloatingAxesOffsets, FloatingPosition, FloatingStrategy } from '../../utils/Floating';\nimport { PopoverMiddlewares, PopoverWidth } from './Popover.types';\n\ninterface UsePopoverOptions {\n offset: number | FloatingAxesOffsets;\n position: FloatingPosition;\n onPositionChange?: (position: FloatingPosition) => void;\n opened: boolean | undefined;\n defaultOpened: boolean | undefined;\n onChange?: (opened: boolean) => void;\n onClose?: () => void;\n onDismiss?: () => void;\n onOpen?: () => void;\n width: PopoverWidth;\n middlewares: PopoverMiddlewares | undefined;\n arrowRef: React.RefObject<HTMLDivElement | null>;\n arrowOffset: number;\n strategy?: FloatingStrategy;\n disabled: boolean | undefined;\n preventPositionChangeWhenVisible: boolean | undefined;\n keepMounted: boolean | undefined;\n}\n\nfunction getDefaultMiddlewares(middlewares: PopoverMiddlewares | undefined): PopoverMiddlewares {\n if (middlewares === undefined) {\n return { shift: true, flip: true };\n }\n\n const result = { ...middlewares };\n if (middlewares.shift === undefined) {\n result.shift = true;\n }\n\n if (middlewares.flip === undefined) {\n result.flip = true;\n }\n\n return result;\n}\n\nfunction getPopoverMiddlewares(\n options: UsePopoverOptions,\n getFloating: () => UseFloatingReturn<Element>,\n disableFlip: boolean,\n lockEnabled: boolean\n) {\n const middlewaresOptions = getDefaultMiddlewares(options.middlewares);\n const middlewares: Middleware[] = [offset(options.offset), hide()];\n\n if (middlewaresOptions.flip && !disableFlip) {\n const userFlip = typeof middlewaresOptions.flip === 'boolean' ? {} : middlewaresOptions.flip;\n const flipOptions = lockEnabled\n ? { fallbackStrategy: 'initialPlacement' as const, ...userFlip }\n : userFlip;\n middlewares.push(flip(flipOptions));\n }\n\n if (middlewaresOptions.shift) {\n const shiftOptions =\n typeof middlewaresOptions.shift === 'boolean' ? {} : middlewaresOptions.shift;\n middlewares.push(\n shift((state) => {\n const isVerticalPlacement =\n state.placement.startsWith('top') || state.placement.startsWith('bottom');\n return {\n limiter: limitShift(),\n padding: 5,\n ...(options.width === 'target' && isVerticalPlacement ? { mainAxis: false } : null),\n ...shiftOptions,\n };\n })\n );\n }\n\n if (middlewaresOptions.inline) {\n middlewares.push(\n typeof middlewaresOptions.inline === 'boolean' ? inline() : inline(middlewaresOptions.inline)\n );\n }\n\n middlewares.push(arrow({ element: options.arrowRef, padding: options.arrowOffset }));\n\n if (middlewaresOptions.size || options.width === 'target') {\n middlewares.push(\n size({\n ...(typeof middlewaresOptions.size === 'boolean' ? {} : middlewaresOptions.size),\n apply({ rects, availableWidth, availableHeight, ...rest }) {\n const floating = getFloating();\n const styles = floating.refs.floating.current?.style ?? {};\n\n if (middlewaresOptions.size) {\n // If custom apply function is given use that else set defaults\n if (typeof middlewaresOptions.size === 'object' && !!middlewaresOptions.size.apply) {\n middlewaresOptions.size.apply({ rects, availableWidth, availableHeight, ...rest });\n } else {\n Object.assign(styles, {\n maxWidth: `${availableWidth}px`,\n maxHeight: `${availableHeight}px`,\n });\n }\n }\n\n if (options.width === 'target') {\n Object.assign(styles, {\n width: `${rects.reference.width}px`,\n });\n }\n },\n })\n );\n }\n\n return middlewares;\n}\n\nexport function usePopover(options: UsePopoverOptions) {\n const [_opened, setOpened] = useUncontrolled({\n value: options.opened,\n defaultValue: options.defaultOpened,\n finalValue: false,\n onChange: options.onChange,\n });\n\n const previouslyOpened = useRef(_opened);\n\n const measuredAfterShowRef = useRef(false);\n const [lockedPlacement, setLockedPlacement] = useState<FloatingPosition | null>(null);\n const lockEnabled = options.preventPositionChangeWhenVisible !== false;\n\n const wasOpenedRef = useRef(_opened);\n if (_opened !== wasOpenedRef.current) {\n wasOpenedRef.current = _opened;\n if (_opened && lockedPlacement !== null) {\n setLockedPlacement(null);\n }\n }\n\n const previousPositionRef = useRef(options.position);\n if (options.position !== previousPositionRef.current) {\n previousPositionRef.current = options.position;\n measuredAfterShowRef.current = false;\n if (lockedPlacement !== null) {\n setLockedPlacement(null);\n }\n }\n\n const resetLockedPlacement = useCallback(() => setLockedPlacement(null), []);\n\n const onClose = () => {\n if (_opened && !options.disabled) {\n setOpened(false);\n }\n };\n\n const onToggle = () => {\n if (!options.disabled) {\n setOpened(!_opened);\n }\n };\n\n const floating: UseFloatingReturn<Element> = useFloating({\n open: _opened,\n strategy: options.strategy,\n placement: lockEnabled ? (lockedPlacement ?? options.position) : options.position,\n middleware: getPopoverMiddlewares(\n options,\n () => floating,\n lockEnabled && lockedPlacement !== null,\n lockEnabled\n ),\n whileElementsMounted: !options.keepMounted ? autoUpdate : undefined,\n });\n\n useEffect(() => {\n if (!options.keepMounted) {\n return undefined;\n }\n\n const referenceElement = floating.refs.reference.current;\n const floatingElement = floating.refs.floating.current;\n\n if (_opened && referenceElement && floatingElement) {\n return autoUpdate(referenceElement, floatingElement, floating.update);\n }\n\n return undefined;\n }, [\n options.keepMounted,\n _opened,\n floating.update,\n floating.elements.reference,\n floating.elements.floating,\n ]);\n\n useIsomorphicEffect(() => {\n if (!_opened) {\n measuredAfterShowRef.current = false;\n return;\n }\n\n if (!lockEnabled || lockedPlacement !== null) {\n return;\n }\n\n const flEl = floating.refs.floating.current as HTMLElement | null;\n if (!flEl || flEl.offsetHeight === 0 || flEl.offsetWidth === 0) {\n return;\n }\n\n if (!measuredAfterShowRef.current) {\n measuredAfterShowRef.current = true;\n floating.update();\n return;\n }\n\n if (floating.isPositioned) {\n setLockedPlacement(floating.placement);\n }\n }, [\n lockEnabled,\n _opened,\n floating.isPositioned,\n floating.placement,\n lockedPlacement,\n floating.update,\n ]);\n\n const previousPlacementRef = useRef(floating.placement);\n useIsomorphicEffect(() => {\n if (previousPlacementRef.current !== floating.placement) {\n previousPlacementRef.current = floating.placement;\n options.onPositionChange?.(floating.placement);\n }\n }, [floating.placement]);\n\n useDidUpdate(() => {\n if (_opened !== previouslyOpened.current) {\n if (!_opened) {\n options.onClose?.();\n } else {\n options.onOpen?.();\n }\n }\n\n previouslyOpened.current = _opened;\n }, [_opened, options.onClose, options.onOpen]);\n\n return {\n floating,\n controlled: typeof options.opened === 'boolean',\n opened: _opened,\n onClose,\n onToggle,\n resetLockedPlacement,\n };\n}\n"],"mappings":"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"}
@@ -51,8 +51,9 @@ const SegmentedControl = require_factory.genericFactory((_props) => {
51
51
  const [parent, setParent] = (0, react.useState)(null);
52
52
  const [refs, setRefs] = (0, react.useState)({});
53
53
  const setElementRef = (element, val) => {
54
+ if (element === null || refs[val] === element) return;
54
55
  refs[val] = element;
55
- setRefs(refs);
56
+ setRefs({ ...refs });
56
57
  };
57
58
  const [_value, handleValueChange] = (0, _mantine_hooks.useUncontrolled)({
58
59
  value,
@@ -61,6 +62,7 @@ const SegmentedControl = require_factory.genericFactory((_props) => {
61
62
  onChange
62
63
  });
63
64
  const uuid = (0, _mantine_hooks.useId)(name);
65
+ const dataValues = _data.map((item) => `${item.value}`);
64
66
  const controls = _data.map((item) => /* @__PURE__ */ (0, react.createElement)(require_Box.Box, {
65
67
  ...getStyles("control"),
66
68
  mod: {
@@ -103,6 +105,15 @@ const SegmentedControl = require_factory.genericFactory((_props) => {
103
105
  (0, _mantine_hooks.useShallowEffect)(() => {
104
106
  setKey((0, _mantine_hooks.randomId)());
105
107
  }, [data.length]);
108
+ (0, _mantine_hooks.useShallowEffect)(() => {
109
+ setRefs((current) => {
110
+ const next = {};
111
+ dataValues.forEach((value) => {
112
+ if (value in current) next[value] = current[value];
113
+ });
114
+ return Object.keys(next).length === Object.keys(current).length ? current : next;
115
+ });
116
+ }, [dataValues]);
106
117
  if (data.length === 0) return null;
107
118
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Box.Box, {
108
119
  ...getStyles("root"),