raqam 0.2.2 → 0.2.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/useControllableState.ts","../src/core/formatter.ts","../src/core/normalizer.ts","../src/core/parser.ts","../src/react/useNumberFieldState.ts","../src/core/cursor.ts","../src/react/usePressAndHold.ts","../src/react/useNumberField.ts","../src/react/useNumberFieldFormat.ts","../src/react/context.ts","../src/react/useScrubArea.ts","../src/react/NumberField.tsx"],"names":["useControllableState","value","defaultValue","onChange","isControlled","wasControlled","useRef","internalValue","setInternalValue","useState","set","useCallback","next","nextValue","formatterCache","getFormatter","locale","options","key","fmt","extractLocaleInfo","parts","decimalSeparator","groupingSeparator","minusSign","zero","part","zeroParts","rtlLocales","resolvedLocale","isRTL","createFormatter","opts","intlOptions","intlFmt","cachedLocaleInfo","getLocaleInfo","formatToParts","result","format","formatted","formatResult","p","BUILTIN_DIGIT_BLOCKS","registeredBlocks","normalizeDigits","input","ch","code","start","end","digit","escapeRegex","s","checkIntermediate","normalized","info","allowNegative","allowDecimal","dec","minus","createParser","stripAffordances","raw","accountingMatch","parse","stripped","n","isIntermediate","clamp","min","max","v","preciseAdd","a","b","factor","decimalPlaces","idx","useNumberFieldState","formatOptions","minValue","maxValue","step","largeStep","smallStep","maximumFractionDigits","minimumFractionDigits","fixedDecimalScale","clampBehavior","prefix","suffix","allowOutOfRange","validate","onRawChange","customFormatValue","formatter","useMemo","parser","numberValue","setNumberValue","formatDisplay","initialDisplay","inputValue","setInputValueRaw","lastFormattedRef","rawValue","setRawValueState","runValidation","val","initialValidation","initVal","validationState","setValidationState","validationError","setValidationError","isScrubbing","setIsScrubbing","isFocused","setIsFocused","lastChangeReasonRef","_setLastChangeReason","reason","_getLastChangeReason","externalValue","prevExternalValueRef","applyValidation","vs","ve","setInputValue","setNumericValue","rawStr","commit","clamped","resolvedLargeStep","resolvedSmallStep","canIncrement","canDecrement","increment","amount","decrement","incrementToMax","decrementToMin","isAccepted","countAcceptedBefore","str","cursor","normalised","count","getCaretBoundary","formattedValue","len","boundary","i","computeNewCursorPosition","oldInput","oldCursor","newFormatted","inputType","acceptedCount","normNew","pos","snapToBoundary","usePressAndHold","callback","delay","interval","disabled","callbackRef","useEffect","delayRef","intervalRef","delayTimerRef","repeatTimerRef","isHeldRef","clearTimers","scheduleRepeat","currentInterval","nextInterval","onPointerDown","e","onPointerUp","onPointerLeave","useNumberField","props","state","inputRef","allowMouseWheel","liveFormat","name","readOnly","required","onFocus","onBlur","copyBehavior","stepHoldDelay","stepHoldInterval","customParseValue","autoId","useId","inputId","labelId","descriptionId","errorId","pendingCursor","useLayoutEffect","el","handler","isComposing","handleCompositionStart","handleCompositionEnd","composedValue","displayValue","handleChange","rawInputValue","cursorPos","handlePaste","text","localeInfo","allowedCharsPattern","stripped2","result2","handleCopy","handleCut","handleKeyDown","selEnd","currentValue","rawEdited","parseResult","direction","handleBlur","handleFocus","incrementHold","decrementHold","ariaValueText","isInvalid","labelProps","groupProps","inputProps","hiddenInputProps","incrementButtonProps","decrementButtonProps","useNumberFieldFormat","NumberFieldContext","createContext","useNumberFieldContext","ctx","useContext","useScrubArea","pixelSensitivity","setIsScrubbingLocal","stateRef","directionRef","sensitivityRef","isScrubbingRef","accumulatorRef","elementRef","virtualCursorRef","virtualCursor","setVirtualCursor","stableMouseMove","nx","ny","dir","delta","sensitivity","stablePointerLockChange","onKeyDown","cursorStyle","scrubAreaProps","renderWith","defaultElement","render","React","stateDataAttrs","DIV_ONLY_KEYS","splitProps","fieldProps","divProps","Root","forwardRef","children","onValueChange","onValueCommitted","allProps","ref","onValueChangeRef","wrappedProps","aria","jsx","Label","rest","Group","Input","_ref","Increment","Decrement","HiddenInput","ScrubArea","ScrubAreaCursor","style","Description","ErrorMessage","content","Formatted","NumberField"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useCallback, useRef, useState } from \"react\";\n\ninterface UseControllableStateOptions<T> {\n value?: T;\n defaultValue?: T;\n onChange?: (value: T) => void;\n}\n\n/**\n * Manages controlled vs uncontrolled state.\n * - If `value` is provided, the component is controlled.\n * - Otherwise it manages its own state starting from `defaultValue`.\n * Warns in dev mode if the component switches between controlled/uncontrolled.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [\n T | undefined,\n (next: T | ((prev: T | undefined) => T)) => void,\n] {\n const isControlled = value !== undefined;\n const wasControlled = useRef(isControlled);\n\n if (\n typeof window !== \"undefined\" &&\n (window as unknown as { __DEV__?: boolean }).__DEV__ !== false\n ) {\n if (wasControlled.current !== isControlled) {\n console.warn(\n `[raqam] Component is changing from ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } to ${isControlled ? \"controlled\" : \"uncontrolled\"}. Decide between using a controlled or uncontrolled component and don't switch.`\n );\n }\n }\n\n const [internalValue, setInternalValue] = useState<T | undefined>(defaultValue);\n\n const set = useCallback(\n (next: T | ((prev: T | undefined) => T)) => {\n const nextValue =\n typeof next === \"function\"\n ? (next as (prev: T | undefined) => T)(isControlled ? value : internalValue)\n : next;\n\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n onChange?.(nextValue);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isControlled, value, internalValue, onChange]\n );\n\n return [isControlled ? value : internalValue, set];\n}\n","import type { FormatResult, LocaleInfo } from \"./types.js\";\n\n// ── Internal ──────────────────────────────────────────────────────────────────\n\n/** Probe value that will surface decimal AND grouping parts */\nconst PROBE_VALUE = 12345.6;\n\n/** Cache key = locale + JSON.stringify(options) */\nconst formatterCache = new Map<string, Intl.NumberFormat>();\n\nfunction getFormatter(\n locale: string | undefined,\n options: Intl.NumberFormatOptions | undefined\n): Intl.NumberFormat {\n const key = `${locale ?? \"\"}::${JSON.stringify(options ?? {})}`;\n let fmt = formatterCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, options);\n formatterCache.set(key, fmt);\n }\n return fmt;\n}\n\n/** Extract locale meta from formatToParts — never hardcoded. */\nfunction extractLocaleInfo(\n locale: string | undefined,\n options: Intl.NumberFormatOptions | undefined\n): LocaleInfo {\n const fmt = getFormatter(locale, options);\n // Use a simple decimal number — we only need the separators\n const parts = fmt.formatToParts(PROBE_VALUE);\n\n let decimalSeparator = \".\";\n let groupingSeparator = \",\";\n let minusSign = \"-\";\n let zero = \"0\";\n\n for (const part of parts) {\n if (part.type === \"decimal\") decimalSeparator = part.value;\n if (part.type === \"group\") groupingSeparator = part.value;\n if (part.type === \"minusSign\") minusSign = part.value;\n }\n\n // Detect locale zero digit\n const zeroParts = fmt.formatToParts(0);\n for (const part of zeroParts) {\n if (part.type === \"integer\") {\n zero = part.value;\n break;\n }\n }\n\n // RTL locales: Arabic / Hebrew / Persian / Urdu / Syriac etc.\n const rtlLocales = /^(ar|he|fa|ur|syc|nqo|ug|yi)/i;\n const resolvedLocale = fmt.resolvedOptions().locale;\n const isRTL = rtlLocales.test(resolvedLocale);\n\n return { decimalSeparator, groupingSeparator, minusSign, zero, isRTL };\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport interface FormatterOptions {\n locale?: string;\n formatOptions?: Intl.NumberFormatOptions;\n prefix?: string;\n suffix?: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n fixedDecimalScale?: boolean;\n}\n\nexport interface Formatter {\n format(value: number): string;\n formatToParts(value: number): Intl.NumberFormatPart[];\n getLocaleInfo(): LocaleInfo;\n formatResult(value: number): FormatResult;\n}\n\n/**\n * Create a formatter instance. Intl.NumberFormat is cached — safe to call\n * on every render.\n */\nexport function createFormatter(opts: FormatterOptions): Formatter {\n // Merge fraction digit overrides into formatOptions\n const intlOptions: Intl.NumberFormatOptions = { ...opts.formatOptions };\n\n if (opts.minimumFractionDigits !== undefined) {\n intlOptions.minimumFractionDigits = opts.minimumFractionDigits;\n }\n if (opts.maximumFractionDigits !== undefined) {\n intlOptions.maximumFractionDigits = opts.maximumFractionDigits;\n }\n if (opts.fixedDecimalScale && opts.maximumFractionDigits !== undefined) {\n intlOptions.minimumFractionDigits = opts.maximumFractionDigits;\n intlOptions.maximumFractionDigits = opts.maximumFractionDigits;\n }\n\n const intlFmt = getFormatter(opts.locale, intlOptions);\n // Lazy — computed once on first call\n let cachedLocaleInfo: LocaleInfo | null = null;\n\n function getLocaleInfo(): LocaleInfo {\n if (!cachedLocaleInfo) {\n cachedLocaleInfo = extractLocaleInfo(opts.locale, intlOptions);\n }\n return cachedLocaleInfo;\n }\n\n function formatToParts(value: number): Intl.NumberFormatPart[] {\n const parts = intlFmt.formatToParts(value);\n if (!opts.prefix && !opts.suffix) return parts;\n\n const result: Intl.NumberFormatPart[] = [];\n if (opts.prefix) result.push({ type: \"literal\", value: opts.prefix });\n result.push(...parts);\n if (opts.suffix) result.push({ type: \"literal\", value: opts.suffix });\n return result;\n }\n\n function format(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n const formatted = intlFmt.format(value);\n return (opts.prefix ?? \"\") + formatted + (opts.suffix ?? \"\");\n }\n\n function formatResult(value: number): FormatResult {\n const parts = formatToParts(value);\n const formatted = parts.map((p) => p.value).join(\"\");\n return { formatted, parts };\n }\n\n return { format, formatToParts, getLocaleInfo, formatResult };\n}\n","import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","import { createFormatter } from \"./formatter.js\";\nimport { normalizeDigits } from \"./normalizer.js\";\nimport type { LocaleInfo, ParseResult } from \"./types.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Escape a string so it can be used literally inside a RegExp.\n */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Returns true if `s` represents a valid-but-incomplete number:\n * \"-\" lone minus\n * \"1.\" trailing decimal separator (any locale)\n * \"1.0\" trailing zero after decimal\n * \"1.00\" etc.\n *\n * These should NOT be reformatted while the user is still typing.\n */\nfunction checkIntermediate(\n normalized: string,\n info: LocaleInfo,\n allowNegative: boolean,\n allowDecimal: boolean\n): boolean {\n const dec = escapeRegex(info.decimalSeparator);\n const minus = escapeRegex(info.minusSign);\n\n // Lone minus sign\n if (allowNegative && (normalized === \"-\" || normalized === info.minusSign)) {\n return true;\n }\n // Trailing decimal separator\n if (allowDecimal && new RegExp(`^${minus}?\\\\d+${dec}$`).test(normalized)) {\n return true;\n }\n // Trailing zeros after decimal (e.g. \"1.0\", \"1.00\", \"-1.0\")\n if (allowDecimal && new RegExp(`^${minus}?\\\\d+${dec}\\\\d*0+$`).test(normalized)) {\n return true;\n }\n return false;\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport interface ParserOptions {\n locale?: string;\n formatOptions?: Intl.NumberFormatOptions;\n allowNegative?: boolean;\n allowDecimal?: boolean;\n prefix?: string;\n suffix?: string;\n}\n\nexport interface Parser {\n parse(input: string): ParseResult;\n isIntermediate(input: string): boolean;\n getLocaleInfo(): LocaleInfo;\n}\n\n/**\n * Create a locale-aware parser. Separator characters are extracted from\n * Intl.NumberFormat — never hardcoded.\n */\nexport function createParser(opts: ParserOptions = {}): Parser {\n const allowNegative = opts.allowNegative ?? true;\n const allowDecimal = opts.allowDecimal ?? true;\n\n // Re-use the formatter to get locale info\n const fmt = createFormatter({\n locale: opts.locale,\n formatOptions: opts.formatOptions,\n prefix: opts.prefix,\n suffix: opts.suffix,\n });\n\n function getLocaleInfo(): LocaleInfo {\n return fmt.getLocaleInfo();\n }\n\n function stripAffordances(raw: string): string {\n const info = getLocaleInfo();\n\n // 1. Normalise non-Latin digits to ASCII\n let s = normalizeDigits(raw);\n\n // 2. Accounting format: \"(1,234.56)\" or \"($1,234.56)\" → negative\n // Intl.NumberFormat with currencySign:\"accounting\" wraps negatives in parens\n const accountingMatch = s.match(/^\\((.+)\\)$/);\n if (accountingMatch) {\n s = `-${accountingMatch[1]}`;\n }\n\n // 3. Strip prefix / suffix\n if (opts.prefix && s.startsWith(opts.prefix)) {\n s = s.slice(opts.prefix.length);\n }\n if (opts.suffix && s.endsWith(opts.suffix)) {\n s = s.slice(0, -opts.suffix.length);\n }\n\n // 4. Strip grouping separators (escape special chars)\n if (info.groupingSeparator) {\n s = s.split(info.groupingSeparator).join(\"\");\n }\n\n // 5. Replace locale decimal separator with ASCII \".\"\n if (info.decimalSeparator !== \".\") {\n s = s.split(info.decimalSeparator).join(\".\");\n }\n\n // 6. Replace locale minus sign with ASCII \"-\"\n if (info.minusSign !== \"-\") {\n s = s.split(info.minusSign).join(\"-\");\n }\n\n // 7. Strip currency symbol, percent sign, spaces that Intl might prepend/append\n // Strip any remaining non-numeric chars except digits, \".\", \"-\"\n // (handles currency prefixes/suffixes from Intl)\n s = s.replace(/[^\\d.\\-]/g, \"\").trim();\n\n return s;\n }\n\n function parse(input: string): ParseResult {\n if (!input || input.trim() === \"\") {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n const info = getLocaleInfo();\n\n // Check for intermediate state before stripping\n if (checkIntermediate(input, info, allowNegative, allowDecimal)) {\n return { value: null, isValid: false, isIntermediate: true };\n }\n\n const stripped = stripAffordances(input);\n\n if (stripped === \"\") {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n if (stripped === \"-\") {\n // Lone minus after stripping — only intermediate if negatives are allowed\n return { value: null, isValid: false, isIntermediate: allowNegative };\n }\n\n // Reject if not a valid numeric string\n if (!/^-?\\d+\\.?\\d*$/.test(stripped)) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n if (!allowNegative && stripped.startsWith(\"-\")) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n if (!allowDecimal && stripped.includes(\".\")) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n const n = Number.parseFloat(stripped);\n if (!Number.isFinite(n)) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n return { value: n, isValid: true, isIntermediate: false };\n }\n\n function isIntermediate(input: string): boolean {\n const info = getLocaleInfo();\n return checkIntermediate(input, info, allowNegative, allowDecimal);\n }\n\n return { parse, isIntermediate, getLocaleInfo };\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { createFormatter } from \"../core/formatter.js\";\nimport { createParser } from \"../core/parser.js\";\nimport type { ChangeReason, NumberFieldState, UseNumberFieldStateOptions } from \"../core/types.js\";\nimport { useControllableState } from \"./useControllableState.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction clamp(value: number, min?: number, max?: number): number {\n let v = value;\n if (min !== undefined) v = Math.max(v, min);\n if (max !== undefined) v = Math.min(v, max);\n return v;\n}\n\nfunction preciseAdd(a: number, b: number): number {\n // Simple float precision fix — avoids 0.1 + 0.2 = 0.30000000000000004\n const precision = Math.max(decimalPlaces(a), decimalPlaces(b));\n const factor = 10 ** precision;\n return Math.round(a * factor + b * factor) / factor;\n}\n\nfunction decimalPlaces(n: number): number {\n const s = String(n);\n const idx = s.indexOf(\".\");\n return idx === -1 ? 0 : s.length - idx - 1;\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────────\n\nexport function useNumberFieldState(options: UseNumberFieldStateOptions): NumberFieldState {\n const {\n locale,\n formatOptions,\n minValue,\n maxValue,\n step = 1,\n largeStep,\n smallStep,\n allowNegative = true,\n allowDecimal = true,\n maximumFractionDigits,\n minimumFractionDigits,\n fixedDecimalScale,\n clampBehavior = \"blur\",\n prefix,\n suffix,\n allowOutOfRange = false,\n validate,\n onRawChange,\n formatValue: customFormatValue,\n } = options;\n\n // ── Formatter & parser (re-created only when deps change) ──────────────────\n const formatter = useMemo(\n () =>\n createFormatter({\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n locale,\n // JSON-serialize to detect object identity changes\n JSON.stringify(formatOptions),\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n ]\n );\n\n const parser = useMemo(\n () =>\n createParser({\n locale,\n formatOptions,\n allowNegative,\n allowDecimal,\n prefix,\n suffix,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [locale, JSON.stringify(formatOptions), allowNegative, allowDecimal, prefix, suffix]\n );\n\n // ── Controlled/uncontrolled numeric value ──────────────────────────────────\n const [numberValue, setNumberValue] = useControllableState<number | null>({\n value: options.value,\n defaultValue: options.defaultValue ?? null,\n onChange: options.onChange,\n });\n\n // ── Display string ─────────────────────────────────────────────────────────\n // Stored in local state — can transiently diverge from numberValue\n // (e.g. while typing \"1.\" which isn't a valid JS number yet)\n const formatDisplay = useCallback(\n (n: number): string => (customFormatValue ? customFormatValue(n) : formatter.format(n)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [formatter, customFormatValue]\n );\n\n const initialDisplay = useMemo(() => {\n if (options.defaultValue != null) {\n return formatDisplay(options.defaultValue);\n }\n if (options.value != null) {\n return formatDisplay(options.value);\n }\n return \"\";\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only on mount\n\n const [inputValue, setInputValueRaw] = useState<string>(initialDisplay);\n\n // Track last formatted value so we can sync controlled value changes\n const lastFormattedRef = useRef<string>(initialDisplay);\n\n // ── Raw value (precision-preserving string) ────────────────────────────────\n const [rawValue, setRawValueState] = useState<string | null>(\n options.defaultValue != null ? String(options.defaultValue) : null\n );\n\n // ── Validation state ───────────────────────────────────────────────────────\n const runValidation = useCallback(\n (\n val: number | null\n ): { validationState: \"valid\" | \"invalid\"; validationError: string | null } => {\n if (!validate) return { validationState: \"valid\", validationError: null };\n const result = validate(val);\n if (result === false) return { validationState: \"invalid\", validationError: null };\n if (typeof result === \"string\")\n return { validationState: \"invalid\", validationError: result };\n return { validationState: \"valid\", validationError: null };\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [validate]\n );\n\n const initialValidation = useMemo(() => {\n const initVal = options.defaultValue ?? options.value ?? null;\n return runValidation(initVal != null ? initVal : null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only on mount\n\n const [validationState, setValidationState] = useState<\"valid\" | \"invalid\">(\n initialValidation.validationState\n );\n const [validationError, setValidationError] = useState<string | null>(\n initialValidation.validationError\n );\n\n // ── isScrubbing / isFocused state ──────────────────────────────────────────\n const [isScrubbing, setIsScrubbing] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n // ── Change reason ref (no re-render needed) ────────────────────────────────\n const lastChangeReasonRef = useRef<ChangeReason>(\"input\");\n const _setLastChangeReason = useCallback((reason: ChangeReason) => {\n lastChangeReasonRef.current = reason;\n }, []);\n\n const _getLastChangeReason = useCallback((): ChangeReason => {\n return lastChangeReasonRef.current;\n }, []);\n\n // ── Sync controlled value → display string when value changes externally ───\n const externalValue = options.value;\n const prevExternalValueRef = useRef(externalValue);\n if (prevExternalValueRef.current !== externalValue) {\n prevExternalValueRef.current = externalValue;\n if (externalValue != null) {\n const formatted = formatter.format(externalValue);\n if (formatted !== lastFormattedRef.current) {\n lastFormattedRef.current = formatted;\n }\n } else {\n lastFormattedRef.current = \"\";\n }\n }\n\n // ── Internal helper: apply validation after a value change ────────────────\n const applyValidation = useCallback(\n (val: number | null) => {\n const { validationState: vs, validationError: ve } = runValidation(val);\n setValidationState(vs);\n setValidationError(ve);\n },\n [runValidation]\n );\n\n // ── setInputValue ──────────────────────────────────────────────────────────\n const setInputValue = useCallback(\n (val: string) => {\n const result = parser.parse(val);\n\n // Strict clamping: reject input that goes out of range (skipped when allowOutOfRange)\n if (clampBehavior === \"strict\" && !allowOutOfRange && result.value !== null) {\n if (minValue !== undefined && result.value < minValue) return;\n if (maxValue !== undefined && result.value > maxValue) return;\n }\n\n setInputValueRaw(val);\n setNumberValue(result.value);\n // rawValue tracks what user typed, not the formatted output\n setRawValueState(result.value !== null ? val : null);\n onRawChange?.(result.value !== null ? val : null);\n applyValidation(result.value);\n },\n [\n parser,\n clampBehavior,\n allowOutOfRange,\n minValue,\n maxValue,\n setNumberValue,\n onRawChange,\n applyValidation,\n ]\n );\n\n // ── setNumberValue (external) ──────────────────────────────────────────────\n const setNumericValue = useCallback(\n (val: number | null) => {\n setNumberValue(val);\n if (val != null) {\n const formatted = formatDisplay(val);\n setInputValueRaw(formatted);\n lastFormattedRef.current = formatted;\n const rawStr = String(val);\n setRawValueState(rawStr);\n onRawChange?.(rawStr);\n } else {\n setInputValueRaw(\"\");\n lastFormattedRef.current = \"\";\n setRawValueState(null);\n onRawChange?.(null);\n }\n applyValidation(val);\n },\n [formatDisplay, setNumberValue, onRawChange, applyValidation]\n );\n\n // ── commit (called on blur) ────────────────────────────────────────────────\n const commit = useCallback(() => {\n if (numberValue == null) {\n setInputValueRaw(\"\");\n lastFormattedRef.current = \"\";\n return;\n }\n\n let clamped = numberValue;\n // Clamp on blur, unless allowOutOfRange is true\n if (clampBehavior === \"blur\" && !allowOutOfRange) {\n clamped = clamp(numberValue, minValue, maxValue);\n }\n\n const formatted = formatDisplay(clamped);\n setInputValueRaw(formatted);\n lastFormattedRef.current = formatted;\n\n if (clamped !== numberValue) {\n setNumberValue(clamped);\n }\n applyValidation(clamped);\n }, [\n numberValue,\n clampBehavior,\n allowOutOfRange,\n minValue,\n maxValue,\n formatter,\n setNumberValue,\n applyValidation,\n ]);\n\n // ── Step computation ───────────────────────────────────────────────────────\n const resolvedLargeStep = largeStep ?? step * 10;\n const resolvedSmallStep = smallStep ?? step * 0.1;\n\n const canIncrement =\n !options.disabled &&\n !options.readOnly &&\n (allowOutOfRange ||\n maxValue === undefined ||\n (numberValue ?? Number.NEGATIVE_INFINITY) < maxValue);\n\n const canDecrement =\n !options.disabled &&\n !options.readOnly &&\n (allowOutOfRange ||\n minValue === undefined ||\n (numberValue ?? Number.POSITIVE_INFINITY) > minValue);\n\n const increment = useCallback(\n (amount?: number) => {\n const s = amount ?? step;\n const base = numberValue ?? 0;\n const next = clamp(preciseAdd(base, s), minValue, maxValue);\n setNumericValue(next);\n },\n [numberValue, step, minValue, maxValue, setNumericValue]\n );\n\n const decrement = useCallback(\n (amount?: number) => {\n const s = amount ?? step;\n const base = numberValue ?? 0;\n const next = clamp(preciseAdd(base, -s), minValue, maxValue);\n setNumericValue(next);\n },\n [numberValue, step, minValue, maxValue, setNumericValue]\n );\n\n const incrementToMax = useCallback(() => {\n if (maxValue !== undefined) setNumericValue(maxValue);\n }, [maxValue, setNumericValue]);\n\n const decrementToMin = useCallback(() => {\n if (minValue !== undefined) setNumericValue(minValue);\n }, [minValue, setNumericValue]);\n\n return {\n inputValue,\n numberValue: numberValue ?? null,\n rawValue,\n canIncrement,\n canDecrement,\n isScrubbing,\n setIsScrubbing,\n isFocused,\n setIsFocused,\n validationState,\n validationError,\n _setLastChangeReason,\n _getLastChangeReason,\n setInputValue,\n setNumberValue: setNumericValue,\n commit,\n increment,\n decrement,\n incrementToMax,\n decrementToMin,\n options: {\n ...options,\n step,\n largeStep: resolvedLargeStep,\n smallStep: resolvedSmallStep,\n },\n };\n}\n","import { normalizeDigits } from \"./normalizer.js\";\nimport type { CaretBoundary, LocaleInfo } from \"./types.js\";\n\n// ── Accepted-character helpers ────────────────────────────────────────────────\n\n/**\n * Returns true if `ch` is an \"accepted\" character — one that the user typed\n * intentionally and that contributes to the numeric value:\n * - ASCII digit 0-9\n * - The locale decimal separator\n * - The locale minus sign\n */\nfunction isAccepted(ch: string, info: LocaleInfo): boolean {\n if (ch >= \"0\" && ch <= \"9\") return true;\n if (ch === info.decimalSeparator) return true;\n if (ch === info.minusSign || ch === \"-\") return true;\n return false;\n}\n\n/**\n * Count how many \"accepted\" characters appear before position `cursor`\n * in `str` (after normalising non-Latin digits to ASCII).\n */\nfunction countAcceptedBefore(str: string, cursor: number, info: LocaleInfo): number {\n const normalised = normalizeDigits(str);\n let count = 0;\n for (let i = 0; i < cursor && i < normalised.length; i++) {\n if (isAccepted(normalised[i]!, info)) count++;\n }\n return count;\n}\n\n// ── Caret boundary ────────────────────────────────────────────────────────────\n\n/**\n * Build a boolean array of length `formattedValue.length + 1`.\n * `true` → cursor may rest at this position.\n * `false` → cursor must snap away (sits inside a formatting-only character\n * such as a grouping separator or a currency prefix).\n *\n * Rules:\n * - Start and end positions are always valid.\n * - A position immediately AFTER a grouping separator is invalid (the\n * cursor would look like it's between two digits but moving left would\n * skip the comma).\n * - A position immediately BEFORE a grouping separator is valid.\n */\nexport function getCaretBoundary(formattedValue: string, info: LocaleInfo): CaretBoundary {\n const len = formattedValue.length;\n const boundary: CaretBoundary = new Array(len + 1).fill(true) as boolean[];\n\n for (let i = 0; i < len; i++) {\n const ch = formattedValue[i]!;\n if (ch === info.groupingSeparator) {\n // Position immediately after the grouping separator is invalid\n boundary[i + 1] = false;\n }\n }\n\n // First and last are always valid\n boundary[0] = true;\n boundary[len] = true;\n\n return boundary;\n}\n\n// ── Cursor computation ────────────────────────────────────────────────────────\n\n/**\n * Compute the new cursor position in `newFormatted` that corresponds\n * semantically to `oldCursor` in `oldInput`.\n *\n * Algorithm (3 stages from the spec):\n *\n * 1. Count accepted characters before `oldCursor` in `oldInput`.\n * 2. Adjust for backspace-over-separator edge case.\n * 3. Walk `newFormatted` to find the position where the same count of\n * accepted chars precede it; snap to the nearest valid boundary.\n *\n * @param oldInput The raw string the user just typed into (pre-format)\n * @param oldCursor selectionStart captured from the native event\n * @param newFormatted The formatted string we're about to display\n * @param info Locale separators\n * @param inputType e.nativeEvent.inputType (optional — for backspace detection)\n */\nexport function computeNewCursorPosition(\n oldInput: string,\n oldCursor: number,\n newFormatted: string,\n info: LocaleInfo,\n inputType?: string\n): number {\n const normalised = normalizeDigits(oldInput);\n\n // Stage 1: count accepted chars before cursor in old input\n let acceptedCount = countAcceptedBefore(normalised, oldCursor, info);\n\n // Stage 2: backspace on grouping separator — also delete the preceding digit\n if (\n inputType === \"deleteContentBackward\" &&\n oldCursor > 0 &&\n oldInput[oldCursor - 1] === info.groupingSeparator\n ) {\n // The separator was deleted but we want to remove the preceding digit too\n acceptedCount = Math.max(0, acceptedCount - 1);\n }\n\n // Stage 3: build boundary and walk new formatted string\n const boundary = getCaretBoundary(newFormatted, info);\n const normNew = normalizeDigits(newFormatted);\n let count = 0;\n let pos = 0;\n\n for (let i = 0; i < normNew.length; i++) {\n if (count === acceptedCount) {\n pos = i;\n break;\n }\n if (isAccepted(normNew[i]!, info)) count++;\n pos = i + 1;\n }\n\n // If we ran through the entire string without reaching the target count,\n // place the cursor at the end. Note: acceptedCount === 0 means we correctly\n // want pos = 0 (set in the loop), so we must NOT override that case.\n if (acceptedCount > 0 && count < acceptedCount) {\n pos = newFormatted.length;\n }\n\n // Snap to nearest valid boundary\n pos = snapToBoundary(pos, boundary);\n\n return pos;\n}\n\n/**\n * If `pos` is at a false (invalid) boundary position, find the nearest\n * true position. Prefers moving forward; falls back to backward.\n */\nfunction snapToBoundary(pos: number, boundary: CaretBoundary): number {\n if (boundary[pos]) return pos;\n\n // Try forward first\n for (let i = pos + 1; i < boundary.length; i++) {\n if (boundary[i]) return i;\n }\n // Fall back to backward\n for (let i = pos - 1; i >= 0; i--) {\n if (boundary[i]) return i;\n }\n return 0;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface UsePressAndHoldOptions {\n /** Milliseconds before repeating starts (default: 400) */\n delay?: number;\n /** Initial milliseconds between repeats — halves each tick, floors at 50 (default: 200) */\n interval?: number;\n /** Whether the element is disabled */\n disabled?: boolean;\n}\n\nexport interface PressAndHoldProps {\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerUp: (e: React.PointerEvent) => void;\n onPointerLeave: (e: React.PointerEvent) => void;\n}\n\n/**\n * Returns pointer event handlers that call `callback` immediately on press,\n * then repeatedly with accelerating frequency while held down.\n *\n * Acceleration schedule (default settings):\n * immediate → 400ms wait → 200ms → 100ms → 50ms (floor, stays until release)\n *\n * All timing is handled via refs — zero state updates, zero re-renders.\n */\nexport function usePressAndHold(\n callback: () => void,\n options: UsePressAndHoldOptions = {}\n): PressAndHoldProps {\n const { delay = 400, interval = 200, disabled = false } = options;\n\n // Stable refs so handlers don't re-create on every render\n const callbackRef = useRef(callback);\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n const delayRef = useRef(delay);\n useEffect(() => {\n delayRef.current = delay;\n });\n\n const intervalRef = useRef(interval);\n useEffect(() => {\n intervalRef.current = interval;\n });\n\n // Timer handle refs (null = no active timer)\n const delayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const repeatTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isHeldRef = useRef(false);\n\n const clearTimers = useCallback(() => {\n isHeldRef.current = false;\n if (delayTimerRef.current !== null) {\n clearTimeout(delayTimerRef.current);\n delayTimerRef.current = null;\n }\n if (repeatTimerRef.current !== null) {\n clearTimeout(repeatTimerRef.current);\n repeatTimerRef.current = null;\n }\n }, []);\n\n // Recursive accelerating repeat\n const scheduleRepeat = useCallback((currentInterval: number) => {\n if (!isHeldRef.current) return;\n callbackRef.current();\n const nextInterval = Math.max(50, Math.floor(currentInterval / 2));\n repeatTimerRef.current = setTimeout(() => {\n scheduleRepeat(nextInterval);\n }, currentInterval);\n }, []);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n // Only primary button (left mouse / single touch / pen)\n if (e.button !== 0 && e.pointerType === \"mouse\") return;\n\n // Fire immediately\n callbackRef.current();\n isHeldRef.current = true;\n\n // After initial delay, start accelerating repeats\n delayTimerRef.current = setTimeout(() => {\n scheduleRepeat(intervalRef.current);\n }, delayRef.current);\n },\n [disabled, scheduleRepeat]\n );\n\n const onPointerUp = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n clearTimers();\n },\n [clearTimers]\n );\n\n const onPointerLeave = useCallback(\n (e: React.PointerEvent) => {\n void e;\n clearTimers();\n },\n [clearTimers]\n );\n\n // Safety: clear on unmount\n useEffect(() => clearTimers, [clearTimers]);\n\n return { onPointerDown, onPointerUp, onPointerLeave };\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { computeNewCursorPosition } from \"../core/cursor.js\";\nimport { createFormatter } from \"../core/formatter.js\";\nimport { normalizeDigits } from \"../core/normalizer.js\";\nimport { createParser } from \"../core/parser.js\";\nimport type { NumberFieldAria, NumberFieldState, UseNumberFieldProps } from \"../core/types.js\";\nimport { usePressAndHold } from \"./usePressAndHold.js\";\n\n// ── Tiny helper to safely escape regex special chars (including hyphen) ──────\n\nfunction escapeRegex(s: string): string {\n // Escaping hyphen prevents it from being misinterpreted as a range indicator\n // inside a character class (e.g. [.--] would be invalid without this)\n return s.replace(/[.*+?^${}()|[\\]\\\\\\-]/g, \"\\\\$&\");\n}\n\nexport function useNumberField(\n props: UseNumberFieldProps,\n state: NumberFieldState,\n inputRef: React.RefObject<HTMLInputElement | null>\n): NumberFieldAria {\n const {\n locale,\n formatOptions,\n minValue,\n maxValue,\n allowNegative = true,\n allowDecimal = true,\n allowMouseWheel = false,\n liveFormat = true,\n prefix,\n suffix,\n name,\n disabled,\n readOnly,\n required,\n onFocus,\n onBlur,\n maximumFractionDigits,\n minimumFractionDigits,\n fixedDecimalScale,\n copyBehavior = \"formatted\",\n stepHoldDelay = 400,\n stepHoldInterval = 200,\n formatValue: customFormatValue,\n parseValue: customParseValue,\n } = props; // formatValue/parseValue are on UseNumberFieldStateOptions (inherited)\n\n const { step = 1, largeStep = step * 10, smallStep = step * 0.1 } = state.options;\n\n const autoId = useId();\n const inputId = props.id ?? `raqam-${autoId}`;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const errorId = `${inputId}-error`;\n\n // ── Formatter & parser (kept in sync with state's) ──────────────────────\n const formatter = useMemo(\n () =>\n createFormatter({\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n locale,\n JSON.stringify(formatOptions),\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n ]\n );\n\n const parser = useMemo(\n () =>\n createParser({\n locale,\n formatOptions,\n allowNegative,\n allowDecimal,\n prefix,\n suffix,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [locale, JSON.stringify(formatOptions), allowNegative, allowDecimal, prefix, suffix]\n );\n\n // ── Cursor engine ────────────────────────────────────────────────────────\n const pendingCursor = useRef<number | null>(null);\n\n // Restore cursor synchronously after React commits the new value to DOM\n useLayoutEffect(() => {\n if (\n pendingCursor.current !== null &&\n inputRef.current &&\n document.activeElement === inputRef.current\n ) {\n inputRef.current.setSelectionRange(pendingCursor.current, pendingCursor.current);\n pendingCursor.current = null;\n }\n // Run after every inputValue change\n }, [state.inputValue, inputRef]);\n\n // ── Mouse wheel (non-passive native listener) ────────────────────────────\n // React's synthetic onWheel is passive in React 17+; it cannot call\n // preventDefault(). We must attach a native, non-passive listener instead.\n useEffect(() => {\n const el = inputRef.current;\n if (!el || !allowMouseWheel) return;\n\n const handler = (e: WheelEvent) => {\n if (disabled || readOnly) return;\n if (document.activeElement !== el) return;\n e.preventDefault();\n state._setLastChangeReason(\"wheel\");\n if (e.deltaY < 0) {\n state.increment();\n } else {\n state.decrement();\n }\n };\n\n el.addEventListener(\"wheel\", handler, { passive: false });\n return () => el.removeEventListener(\"wheel\", handler);\n }, [allowMouseWheel, disabled, readOnly, state, inputRef]);\n\n // ── IME Composition state ────────────────────────────────────────────────\n // During CJK IME input, partial composed characters must not trigger live\n // formatting. We suspend formatting during composition and resume on end.\n const isComposing = useRef(false);\n\n const handleCompositionStart = useCallback(() => {\n isComposing.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent<HTMLInputElement>) => {\n isComposing.current = false;\n // After composition ends, run the full format cycle on the composed value\n const composedValue = e.currentTarget.value;\n const info = formatter.getLocaleInfo();\n const normalized = normalizeDigits(composedValue);\n\n let displayValue: string;\n if (customParseValue) {\n const result = customParseValue(normalized);\n if (result.isIntermediate) {\n displayValue = normalized;\n } else if (result.value !== null && customFormatValue) {\n displayValue = customFormatValue(result.value);\n } else if (result.value !== null) {\n displayValue = formatter.format(result.value);\n } else {\n displayValue = normalized;\n }\n // Disable cursor engine for custom format/parse\n pendingCursor.current = displayValue.length;\n } else if (liveFormat) {\n const result = parser.parse(normalized);\n if (result.isIntermediate) {\n displayValue = normalized;\n } else if (result.value !== null) {\n displayValue = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n } else {\n displayValue = normalized === \"\" ? \"\" : normalized;\n }\n pendingCursor.current = computeNewCursorPosition(\n composedValue,\n composedValue.length,\n displayValue,\n info,\n \"insertCompositionText\"\n );\n } else {\n displayValue = normalized;\n pendingCursor.current = normalized.length;\n }\n\n state._setLastChangeReason(\"input\");\n state.setInputValue(displayValue);\n },\n [formatter, parser, liveFormat, state, customFormatValue, customParseValue]\n );\n\n // ── onChange handler ─────────────────────────────────────────────────────\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawInputValue = e.target.value;\n const cursorPos = e.target.selectionStart ?? rawInputValue.length;\n const inputType = (e.nativeEvent as InputEvent).inputType;\n const info = formatter.getLocaleInfo();\n\n // During IME composition, skip live formatting — just track the raw value\n if (isComposing.current) {\n state.setInputValue(rawInputValue);\n return;\n }\n\n // Normalise non-Latin digits\n const normalized = normalizeDigits(rawInputValue);\n\n let displayValue: string;\n\n // Custom parse/format escape hatch\n if (customParseValue) {\n const result = customParseValue(normalized);\n if (result.isIntermediate) {\n displayValue = normalized;\n } else if (result.value !== null) {\n displayValue = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n } else if (normalized === \"\") {\n displayValue = \"\";\n } else {\n displayValue = normalized;\n }\n // Can't predict cursor position with custom formatter — place at end\n pendingCursor.current = displayValue.length;\n } else if (liveFormat) {\n const result = parser.parse(normalized);\n\n if (result.isIntermediate) {\n // Preserve intermediate states (lone \"-\", trailing \"1.\", etc.)\n displayValue = normalized;\n } else if (result.value !== null) {\n displayValue = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n } else if (normalized === \"\") {\n displayValue = \"\";\n } else {\n // Invalid input — keep the raw normalised string so the user can\n // see what they typed (they'll get corrected on blur)\n displayValue = normalized;\n }\n\n if (customFormatValue) {\n // Custom format: can't predict cursor, place at end\n pendingCursor.current = displayValue.length;\n } else {\n // Compute and stash cursor position for useLayoutEffect\n pendingCursor.current = computeNewCursorPosition(\n rawInputValue,\n cursorPos,\n displayValue,\n info,\n inputType\n );\n }\n } else {\n // No live format — just pass through normalised digits\n displayValue = normalized;\n pendingCursor.current = cursorPos;\n }\n\n state._setLastChangeReason(\"input\");\n state.setInputValue(displayValue);\n },\n [formatter, parser, liveFormat, state, customFormatValue, customParseValue]\n );\n\n // ── Paste handler ────────────────────────────────────────────────────────\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const text = e.clipboardData.getData(\"text/plain\");\n if (!text) return;\n\n // 1. Strip common currency symbols (global currencies)\n const stripped = text.replace(/[€$£¥₹₺₽﷼฿₩¢₦₨₪₫₱]/g, \"\").trim();\n\n // 2. Normalize non-Latin digits to ASCII\n const normalized = normalizeDigits(stripped);\n\n state._setLastChangeReason(\"paste\");\n\n // Custom parse escape hatch\n if (customParseValue) {\n const result = customParseValue(normalized);\n if (result.value !== null) {\n const formatted = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n state.setInputValue(formatted);\n pendingCursor.current = formatted.length;\n }\n return;\n }\n\n // 3. Try parse with current locale parser\n const result = parser.parse(normalized);\n\n if (result.value !== null) {\n const formatted = formatter.format(result.value);\n state.setInputValue(formatted);\n pendingCursor.current = formatted.length;\n return;\n }\n\n // 4. Fallback: strip everything except digits, locale decimal, minus sign\n const localeInfo = formatter.getLocaleInfo();\n const allowedCharsPattern = new RegExp(\n `[^0-9${escapeRegex(localeInfo.decimalSeparator)}${escapeRegex(localeInfo.minusSign)}-]`,\n \"g\"\n );\n const stripped2 = normalized.replace(allowedCharsPattern, \"\");\n const result2 = parser.parse(stripped2);\n\n if (result2.value !== null) {\n const formatted = formatter.format(result2.value);\n state.setInputValue(formatted);\n pendingCursor.current = formatted.length;\n }\n // If still invalid, silently discard — don't paste garbage into the field\n },\n [parser, formatter, state, customFormatValue, customParseValue]\n );\n\n // ── Copy / Cut handlers ──────────────────────────────────────────────────\n const handleCopy = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (copyBehavior === \"formatted\") return; // browser handles it natively\n\n e.preventDefault();\n const text = String(state.numberValue ?? \"\");\n e.clipboardData.setData(\"text/plain\", text);\n },\n [copyBehavior, state.numberValue]\n );\n\n const handleCut = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (copyBehavior === \"formatted\") return; // browser handles it\n\n e.preventDefault();\n const text = String(state.numberValue ?? \"\");\n e.clipboardData.setData(\"text/plain\", text);\n // Clear the field after cut\n state.setInputValue(\"\");\n },\n [copyBehavior, state]\n );\n\n // ── Keyboard handler ─────────────────────────────────────────────────────\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled || readOnly) return;\n\n const key = e.key;\n\n // Smart backspace: when cursor is immediately after a grouping separator\n // (no selection active, no modifier keys), delete both the separator and\n // the preceding digit so the user can backspace through formatted numbers\n // without the comma \"blocking\" deletion.\n //\n // This must be handled in keydown — by the time onChange fires, the\n // browser has already removed the separator character, making it\n // impossible to detect what was deleted.\n if (key === \"Backspace\" && !e.shiftKey && !e.altKey && !e.metaKey && !e.ctrlKey) {\n const input = inputRef.current;\n if (input) {\n const cursor = input.selectionStart ?? 0;\n const selEnd = input.selectionEnd ?? cursor;\n const currentValue = input.value;\n const info = formatter.getLocaleInfo();\n\n if (\n cursor === selEnd && // no text selection — single caret\n cursor >= 2 &&\n currentValue[cursor - 1] === info.groupingSeparator\n ) {\n e.preventDefault();\n // Remove the grouping separator (cursor-1) AND the digit before it (cursor-2)\n const rawEdited = currentValue.slice(0, cursor - 2) + currentValue.slice(cursor);\n const parseResult = parser.parse(rawEdited);\n\n state._setLastChangeReason(\"input\");\n if (parseResult.value !== null) {\n const formatted = formatter.format(parseResult.value);\n state.setInputValue(formatted);\n } else {\n // Empty or intermediate — store as-is (blur will clean up)\n state.setInputValue(rawEdited);\n }\n pendingCursor.current = cursor - 2;\n return;\n }\n }\n }\n\n if (key === \"ArrowUp\" || key === \"ArrowDown\") {\n e.preventDefault();\n const direction = key === \"ArrowUp\" ? 1 : -1;\n state._setLastChangeReason(\"keyboard\");\n if (e.shiftKey) {\n direction > 0 ? state.increment(largeStep) : state.decrement(largeStep);\n } else if (e.metaKey || e.ctrlKey) {\n direction > 0 ? state.increment(smallStep) : state.decrement(smallStep);\n } else {\n direction > 0 ? state.increment() : state.decrement();\n }\n return;\n }\n\n if (key === \"PageUp\") {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.increment(largeStep);\n return;\n }\n\n if (key === \"PageDown\") {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.decrement(largeStep);\n return;\n }\n\n if (key === \"Home\") {\n if (minValue !== undefined) {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.decrementToMin();\n }\n return;\n }\n\n if (key === \"End\") {\n if (maxValue !== undefined) {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.incrementToMax();\n }\n return;\n }\n\n if (key === \"Enter\") {\n state._setLastChangeReason(\"blur\");\n state.commit();\n return;\n }\n },\n [\n disabled,\n readOnly,\n state,\n largeStep,\n smallStep,\n minValue,\n maxValue,\n formatter,\n parser,\n inputRef,\n ]\n );\n\n // ── Blur handler ─────────────────────────────────────────────────────────\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n state.setIsFocused(false);\n state._setLastChangeReason(\"blur\");\n state.commit();\n onBlur?.(e);\n },\n [state, onBlur]\n );\n\n // ── Focus handler ────────────────────────────────────────────────────────\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n state.setIsFocused(true);\n onFocus?.(e);\n },\n [state, onFocus]\n );\n\n // ── Press-and-hold for increment/decrement buttons ───────────────────────\n const incrementHold = usePressAndHold(\n () => {\n state._setLastChangeReason(\"increment\");\n state.increment();\n },\n {\n delay: stepHoldDelay,\n interval: stepHoldInterval,\n disabled: disabled || !state.canIncrement,\n }\n );\n\n const decrementHold = usePressAndHold(\n () => {\n state._setLastChangeReason(\"decrement\");\n state.decrement();\n },\n {\n delay: stepHoldDelay,\n interval: stepHoldInterval,\n disabled: disabled || !state.canDecrement,\n }\n );\n\n // ── ARIA valuetext ───────────────────────────────────────────────────────\n const ariaValueText = useMemo(() => {\n if (state.numberValue == null) return undefined;\n return customFormatValue\n ? customFormatValue(state.numberValue)\n : formatter.format(state.numberValue);\n }, [state.numberValue, formatter, customFormatValue]);\n\n // ── RTL detection ────────────────────────────────────────────────────────\n const localeInfo = formatter.getLocaleInfo();\n\n // ── Out-of-range + validation detection (for aria-invalid + data-invalid) ─\n const isOutOfRange =\n state.numberValue !== null &&\n ((minValue !== undefined && state.numberValue < minValue) ||\n (maxValue !== undefined && state.numberValue > maxValue));\n\n const isInvalid = isOutOfRange || state.validationState === \"invalid\";\n\n // ── Prop maps ────────────────────────────────────────────────────────────\n\n const labelProps: React.LabelHTMLAttributes<HTMLLabelElement> = {\n id: labelId,\n htmlFor: inputId,\n };\n\n const groupProps: React.HTMLAttributes<HTMLDivElement> = {\n role: \"group\",\n \"aria-labelledby\": props[\"aria-labelledby\"] ?? labelId,\n };\n\n const inputProps: React.InputHTMLAttributes<HTMLInputElement> = {\n id: inputId,\n type: \"text\",\n inputMode: \"decimal\",\n role: \"spinbutton\",\n autoComplete: \"off\",\n autoCorrect: \"off\",\n spellCheck: false,\n \"aria-label\": props[\"aria-label\"],\n \"aria-labelledby\": props[\"aria-labelledby\"] ?? labelId,\n \"aria-describedby\": props[\"aria-describedby\"],\n \"aria-valuenow\": state.numberValue ?? undefined,\n \"aria-valuemin\": minValue,\n \"aria-valuemax\": maxValue,\n \"aria-valuetext\": ariaValueText,\n \"aria-disabled\": disabled || undefined,\n \"aria-readonly\": readOnly || undefined,\n \"aria-required\": required || undefined,\n \"aria-invalid\": isInvalid ? true : undefined,\n \"aria-errormessage\": isInvalid && state.validationError ? errorId : undefined,\n disabled,\n readOnly,\n required,\n value: state.inputValue,\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onPaste: handlePaste,\n onCopy: copyBehavior !== \"formatted\" ? handleCopy : undefined,\n onCut: copyBehavior !== \"formatted\" ? handleCut : undefined,\n onCompositionStart: handleCompositionStart,\n onCompositionEnd: handleCompositionEnd,\n // RTL: numbers are always LTR, align-right in RTL contexts\n // unicodeBidi: embed isolates the LTR number from surrounding RTL text\n style: localeInfo.isRTL\n ? { direction: \"ltr\", textAlign: \"right\", unicodeBidi: \"embed\" }\n : undefined,\n // Data attributes for CSS styling\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-readonly\": readOnly ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n \"data-invalid\": isInvalid ? \"\" : undefined,\n \"data-rtl\": localeInfo.isRTL ? \"\" : undefined,\n } as React.InputHTMLAttributes<HTMLInputElement>;\n\n const hiddenInputProps: React.InputHTMLAttributes<HTMLInputElement> | null = name\n ? {\n type: \"hidden\",\n name,\n value: state.numberValue ?? \"\",\n \"aria-hidden\": true,\n }\n : null;\n\n const incrementButtonProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {\n type: \"button\",\n tabIndex: -1,\n \"aria-label\": \"Increase\",\n disabled: disabled || !state.canIncrement,\n // Press-and-hold handlers replace simple onClick\n ...incrementHold,\n \"data-disabled\": disabled || !state.canIncrement ? \"\" : undefined,\n } as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n const decrementButtonProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {\n type: \"button\",\n tabIndex: -1,\n \"aria-label\": \"Decrease\",\n disabled: disabled || !state.canDecrement,\n // Press-and-hold handlers replace simple onClick\n ...decrementHold,\n \"data-disabled\": disabled || !state.canDecrement ? \"\" : undefined,\n } as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n const descriptionProps: React.HTMLAttributes<HTMLElement> = {\n id: descriptionId,\n };\n\n const errorMessageProps: React.HTMLAttributes<HTMLElement> = {\n id: errorId,\n role: \"alert\",\n \"aria-live\": \"polite\",\n } as React.HTMLAttributes<HTMLElement>;\n\n return {\n labelProps,\n groupProps,\n inputProps,\n hiddenInputProps,\n incrementButtonProps,\n decrementButtonProps,\n descriptionProps,\n errorMessageProps,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { createFormatter } from \"../core/formatter.js\";\nimport type { UseNumberFieldStateOptions } from \"../core/types.js\";\n\ntype FormatOptions = Pick<\n UseNumberFieldStateOptions,\n | \"locale\"\n | \"formatOptions\"\n | \"prefix\"\n | \"suffix\"\n | \"minimumFractionDigits\"\n | \"maximumFractionDigits\"\n | \"fixedDecimalScale\"\n>;\n\n/**\n * Lightweight display-only formatting hook. Returns the formatted string for\n * a numeric value using the same Intl.NumberFormat engine as the full input.\n *\n * Use this when you need to display a formatted number in a read-only context\n * (table cells, summaries, labels) without the overhead of a full input state machine.\n *\n * @example\n * const price = useNumberFieldFormat(1234567.89, {\n * locale: 'en-US',\n * formatOptions: { style: 'currency', currency: 'USD' },\n * })\n * // price === \"$1,234,567.89\"\n *\n * @example\n * const pct = useNumberFieldFormat(0.4267, {\n * formatOptions: { style: 'percent', maximumFractionDigits: 1 },\n * })\n * // pct === \"42.7%\"\n */\nexport function useNumberFieldFormat(value: number | null, options: FormatOptions = {}): string {\n const {\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n } = options;\n\n const formatter = useMemo(\n () =>\n createFormatter({\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n locale,\n JSON.stringify(formatOptions),\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n ]\n );\n\n return useMemo(() => {\n if (value === null || value === undefined) return \"\";\n return formatter.format(value);\n }, [value, formatter]);\n}\n","import { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { NumberFieldAria, NumberFieldState, UseNumberFieldProps } from \"../core/types.js\";\n\nexport interface NumberFieldContextValue {\n state: NumberFieldState;\n aria: NumberFieldAria;\n inputRef: RefObject<HTMLInputElement | null>;\n props: UseNumberFieldProps;\n}\n\nexport const NumberFieldContext = createContext<NumberFieldContextValue | null>(null);\n\n/**\n * Hook for sub-components to access the NumberField context.\n * Throws if used outside NumberField.Root.\n */\nexport function useNumberFieldContext(): NumberFieldContextValue {\n const ctx = useContext(NumberFieldContext);\n if (!ctx) {\n throw new Error(\"[raqam] NumberField sub-components must be used inside <NumberField.Root>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { NumberFieldState, ScrubAreaOptions } from \"../core/types.js\";\n\nexport interface ScrubAreaReturn {\n /** Whether pointer lock is currently active */\n isScrubbing: boolean;\n /** Props to spread on the scrub area element */\n scrubAreaProps: {\n role: string;\n tabIndex: number;\n style: React.CSSProperties;\n \"aria-label\": string;\n \"data-scrubbing\": string | undefined;\n onPointerDown: (e: React.PointerEvent) => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n };\n /**\n * Virtual cursor position (screen coordinates, updated by mousemove\n * during pointer lock). Use for positioning the ScrubAreaCursor.\n */\n virtualCursor: { x: number; y: number };\n}\n\n/**\n * Implements Pointer Lock API–based drag-to-scrub behavior.\n *\n * Flow:\n * 1. User presses pointer down → element requests pointer lock\n * 2. Browser hides cursor, starts delivering movementX/Y on mousemove\n * 3. Accumulated movement ÷ pixelSensitivity → increment/decrement calls\n * 4. Pointer lock exits on Escape key or programmatic exit\n */\nexport function useScrubArea(\n state: NumberFieldState,\n options: ScrubAreaOptions = {}\n): ScrubAreaReturn {\n const { direction = \"horizontal\", pixelSensitivity = 4 } = options;\n\n const [isScrubbing, setIsScrubbingLocal] = useState(false);\n\n // Keep stable refs to avoid stale closures in event listeners\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const directionRef = useRef(direction);\n directionRef.current = direction;\n\n const sensitivityRef = useRef(pixelSensitivity);\n sensitivityRef.current = pixelSensitivity;\n\n const isScrubbingRef = useRef(false);\n const accumulatorRef = useRef(0);\n const elementRef = useRef<Element | null>(null);\n const virtualCursorRef = useRef({ x: 0, y: 0 });\n const [virtualCursor, setVirtualCursor] = useState({ x: 0, y: 0 });\n\n // Stable mousemove handler (always reads latest state via refs)\n const stableMouseMove = useRef((e: MouseEvent) => {\n if (!isScrubbingRef.current) return;\n\n // Update virtual cursor\n const nx = virtualCursorRef.current.x + e.movementX;\n const ny = virtualCursorRef.current.y + e.movementY;\n virtualCursorRef.current = { x: nx, y: ny };\n setVirtualCursor({ x: nx, y: ny });\n\n // Determine delta based on direction\n const dir = directionRef.current;\n let delta = 0;\n if (dir === \"horizontal\") {\n delta = e.movementX;\n } else if (dir === \"vertical\") {\n delta = -e.movementY;\n } else {\n delta = Math.abs(e.movementX) >= Math.abs(e.movementY) ? e.movementX : -e.movementY;\n }\n\n accumulatorRef.current += delta;\n\n // Fire step when accumulated movement exceeds sensitivity\n const sensitivity = sensitivityRef.current;\n while (accumulatorRef.current >= sensitivity) {\n stateRef.current.increment();\n accumulatorRef.current -= sensitivity;\n }\n while (accumulatorRef.current <= -sensitivity) {\n stateRef.current.decrement();\n accumulatorRef.current += sensitivity;\n }\n });\n\n // Stable pointer lock change handler\n const stablePointerLockChange = useRef(() => {\n if (document.pointerLockElement === elementRef.current) {\n // Lock acquired — start scrubbing\n isScrubbingRef.current = true;\n accumulatorRef.current = 0;\n setIsScrubbingLocal(true);\n stateRef.current.setIsScrubbing(true);\n document.addEventListener(\"mousemove\", stableMouseMove.current);\n } else {\n // Lock released — stop scrubbing\n isScrubbingRef.current = false;\n accumulatorRef.current = 0;\n document.removeEventListener(\"mousemove\", stableMouseMove.current);\n setIsScrubbingLocal(false);\n stateRef.current.setIsScrubbing(false);\n }\n });\n\n // Register stable pointerlockchange listener once on mount\n useEffect(() => {\n const handler = stablePointerLockChange.current;\n document.addEventListener(\"pointerlockchange\", handler);\n return () => {\n document.removeEventListener(\"pointerlockchange\", handler);\n document.removeEventListener(\"mousemove\", stableMouseMove.current);\n };\n }, []); // Empty deps — truly stable refs, no need to re-register\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (stateRef.current.options.disabled || stateRef.current.options.readOnly) return;\n if (e.button !== 0) return;\n\n const el = e.currentTarget as HTMLElement;\n elementRef.current = el;\n virtualCursorRef.current = { x: e.clientX, y: e.clientY };\n setVirtualCursor({ x: e.clientX, y: e.clientY });\n\n el.requestPointerLock();\n },\n [] // No deps — reads via refs\n );\n\n // Keyboard support: arrow keys while scrub area is focused\n const onKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (stateRef.current.options.disabled || stateRef.current.options.readOnly) return;\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n stateRef.current.increment();\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n stateRef.current.decrement();\n }\n }, []);\n\n // Cursor CSS based on direction\n const cursorStyle =\n direction === \"horizontal\" ? \"ew-resize\" : direction === \"vertical\" ? \"ns-resize\" : \"move\";\n\n const scrubAreaProps = {\n role: \"slider\",\n tabIndex: state.options.disabled ? -1 : 0,\n style: {\n cursor: state.options.disabled ? undefined : cursorStyle,\n userSelect: \"none\" as const,\n WebkitUserSelect: \"none\" as const,\n } satisfies React.CSSProperties,\n \"aria-label\": \"Scrub to change value\",\n \"data-scrubbing\": isScrubbing ? \"\" : undefined,\n onPointerDown,\n onKeyDown,\n };\n\n return { isScrubbing, scrubAreaProps, virtualCursor };\n}\n","\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\nimport type {\n NumberFieldRootProps,\n NumberFieldState,\n RenderProp,\n ScrubAreaCursorProps,\n ScrubAreaProps,\n} from \"../core/types.js\";\nimport { NumberFieldContext, useNumberFieldContext } from \"./context.js\";\nimport { useNumberField } from \"./useNumberField.js\";\nimport { useNumberFieldState } from \"./useNumberFieldState.js\";\nimport { useScrubArea } from \"./useScrubArea.js\";\n\n// ── Render prop utility ───────────────────────────────────────────────────────\n\n/**\n * Merge component props with a `render` prop.\n * Accepts either a React element or a render function.\n */\nfunction renderWith(\n defaultElement: React.ReactElement,\n render: RenderProp | undefined,\n state: NumberFieldState\n): React.ReactElement {\n if (!render) return defaultElement;\n\n if (typeof render === \"function\") {\n return render(defaultElement.props as Record<string, unknown>, state);\n }\n\n // Element form: clone with merged props\n return React.cloneElement(\n render,\n Object.assign(\n {},\n defaultElement.props as Record<string, unknown>,\n render.props as Record<string, unknown>\n )\n );\n}\n\n// ── Data attributes helper ────────────────────────────────────────────────────\n\nfunction stateDataAttrs(\n state: NumberFieldState,\n isInvalid: boolean\n): Record<string, string | undefined> {\n const { options } = state;\n return {\n \"data-disabled\": options.disabled ? \"\" : undefined,\n \"data-readonly\": options.readOnly ? \"\" : undefined,\n \"data-required\": options.required ? \"\" : undefined,\n \"data-scrubbing\": state.isScrubbing ? \"\" : undefined,\n \"data-focused\": state.isFocused ? \"\" : undefined,\n \"data-invalid\": isInvalid ? \"\" : undefined,\n };\n}\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\n// HTML attributes that belong on the wrapper div (not passed to state/aria hooks)\nconst DIV_ONLY_KEYS = new Set([\n \"className\",\n \"style\",\n \"id\",\n \"tabIndex\",\n \"title\",\n \"role\",\n \"aria-label\",\n \"data-testid\",\n \"onClick\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n]);\n\nfunction splitProps(props: Record<string, unknown>) {\n const fieldProps: Record<string, unknown> = {};\n const divProps: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(props)) {\n if (DIV_ONLY_KEYS.has(key) || key.startsWith(\"data-\") || key.startsWith(\"aria-\")) {\n divProps[key] = val;\n } else {\n fieldProps[key] = val;\n }\n }\n return { fieldProps, divProps };\n}\n\nconst Root = forwardRef<HTMLDivElement, NumberFieldRootProps>(function NumberFieldRoot(\n { children, onValueChange, onValueCommitted, ...allProps },\n ref\n) {\n const inputRef = useRef<HTMLInputElement>(null);\n const { fieldProps, divProps } = splitProps(allProps as Record<string, unknown>);\n const props = fieldProps as Omit<\n NumberFieldRootProps,\n \"children\" | \"onValueChange\" | \"onValueCommitted\"\n >;\n\n // Keep a stable ref to onValueChange so the onChange closure never goes stale\n const onValueChangeRef = useRef(onValueChange);\n onValueChangeRef.current = onValueChange;\n\n // Keep a stable ref to the state object so onChange can read the current reason\n const stateRef = useRef<NumberFieldState | null>(null);\n\n // Wrap onChange to also fire onValueChange with the tracked reason.\n // This closure captures stateRef (stable) not state (changes each render).\n // _setLastChangeReason is called synchronously BEFORE the state mutation\n // that triggers onChange, so stateRef.current._getLastChangeReason() always\n // returns the correct reason at the time onChange fires.\n const wrappedProps = {\n ...props,\n onChange: (value: number | null) => {\n props.onChange?.(value);\n if (onValueChangeRef.current && stateRef.current) {\n onValueChangeRef.current(value, {\n reason: stateRef.current._getLastChangeReason(),\n formattedValue: stateRef.current.inputValue,\n });\n }\n },\n };\n\n const state = useNumberFieldState(wrappedProps);\n stateRef.current = state; // always keep stateRef pointing to current state\n\n const aria = useNumberField(wrappedProps, state, inputRef);\n\n // Determine if field is invalid (out-of-range or failed validate)\n const isInvalid =\n state.validationState === \"invalid\" ||\n (state.numberValue !== null &&\n ((props.minValue !== undefined && state.numberValue < props.minValue) ||\n (props.maxValue !== undefined && state.numberValue > props.maxValue)));\n\n return (\n <NumberFieldContext.Provider value={{ state, aria, inputRef, props: wrappedProps }}>\n <div\n ref={ref}\n {...(divProps as React.HTMLAttributes<HTMLDivElement>)}\n {...stateDataAttrs(state, isInvalid)}\n >\n {children}\n </div>\n </NumberFieldContext.Provider>\n );\n});\n\n// ── Label ─────────────────────────────────────────────────────────────────────\n\ninterface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(function NumberFieldLabel(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <label ref={ref} {...aria.labelProps} {...rest}>\n {children}\n </label>\n );\n return renderWith(el, render, state);\n});\n\n// ── Group ─────────────────────────────────────────────────────────────────────\n\ninterface GroupProps extends React.HTMLAttributes<HTMLDivElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Group = forwardRef<HTMLDivElement, GroupProps>(function NumberFieldGroup(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <div ref={ref} {...aria.groupProps} {...rest}>\n {children}\n </div>\n );\n return renderWith(el, render, state);\n});\n\n// ── Input ─────────────────────────────────────────────────────────────────────\n\ninterface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n render?: RenderProp;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(function NumberFieldInput(\n { render, ...rest },\n _ref\n) {\n const { aria, state, inputRef } = useNumberFieldContext();\n const el = (\n <input ref={inputRef as React.RefObject<HTMLInputElement>} {...aria.inputProps} {...rest} />\n );\n return renderWith(el, render, state);\n});\n\n// ── Increment ─────────────────────────────────────────────────────────────────\n\ninterface IncrementProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Increment = forwardRef<HTMLButtonElement, IncrementProps>(function NumberFieldIncrement(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <button ref={ref} {...aria.incrementButtonProps} {...rest}>\n {children ?? \"+\"}\n </button>\n );\n return renderWith(el, render, state);\n});\n\n// ── Decrement ─────────────────────────────────────────────────────────────────\n\ninterface DecrementProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Decrement = forwardRef<HTMLButtonElement, DecrementProps>(function NumberFieldDecrement(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <button ref={ref} {...aria.decrementButtonProps} {...rest}>\n {children ?? \"−\"}\n </button>\n );\n return renderWith(el, render, state);\n});\n\n// ── HiddenInput ───────────────────────────────────────────────────────────────\n\nconst HiddenInput = function NumberFieldHiddenInput() {\n const { aria } = useNumberFieldContext();\n if (!aria.hiddenInputProps) return null;\n return <input {...aria.hiddenInputProps} />;\n};\n\n// ── ScrubArea ─────────────────────────────────────────────────────────────────\n\nconst ScrubArea = forwardRef<HTMLSpanElement, ScrubAreaProps>(function NumberFieldScrubArea(\n { render, children, direction = \"horizontal\", pixelSensitivity = 4, ...rest },\n ref\n) {\n const { state } = useNumberFieldContext();\n const { scrubAreaProps } = useScrubArea(state, { direction, pixelSensitivity });\n\n const el = (\n <span ref={ref} {...scrubAreaProps} {...(rest as React.HTMLAttributes<HTMLSpanElement>)}>\n {children}\n </span>\n );\n return renderWith(el, render, state);\n});\n\n// ── ScrubAreaCursor ───────────────────────────────────────────────────────────\n//\n// Renders a custom cursor element positioned at the virtual cursor location\n// during pointer lock. Use this to show a drag handle icon while scrubbing.\n// Rendered only when isScrubbing is true.\n\nconst ScrubAreaCursor = forwardRef<HTMLSpanElement, ScrubAreaCursorProps>(\n function NumberFieldScrubAreaCursor({ render, children, style, ...rest }, ref) {\n const { state } = useNumberFieldContext();\n\n if (!state.isScrubbing) return null;\n\n const el = (\n <span\n ref={ref}\n style={{\n position: \"fixed\",\n pointerEvents: \"none\",\n zIndex: 9999,\n ...style,\n }}\n {...(rest as React.HTMLAttributes<HTMLSpanElement>)}\n >\n {children}\n </span>\n );\n return renderWith(el, render, state);\n }\n);\n\n// ── Description ───────────────────────────────────────────────────────────────\n\ninterface DescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children?: React.ReactNode;\n}\n\nconst Description = forwardRef<HTMLParagraphElement, DescriptionProps>(\n function NumberFieldDescription({ children, ...rest }, ref) {\n const { aria } = useNumberFieldContext();\n return (\n <p ref={ref} {...aria.descriptionProps} {...rest}>\n {children}\n </p>\n );\n }\n);\n\n// ── ErrorMessage ──────────────────────────────────────────────────────────────\n\ninterface ErrorMessageProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children?: React.ReactNode;\n}\n\nconst ErrorMessage = forwardRef<HTMLParagraphElement, ErrorMessageProps>(\n function NumberFieldErrorMessage({ children, ...rest }, ref) {\n const { aria, state } = useNumberFieldContext();\n // If no children provided, fall back to the validation error string (if any)\n const content = children ?? state.validationError ?? null;\n if (!content) return null;\n return (\n <p ref={ref} {...aria.errorMessageProps} {...rest}>\n {content}\n </p>\n );\n }\n);\n\n// ── Formatted ─────────────────────────────────────────────────────────────────\n//\n// Read-only display of the current formatted value. Useful for showing the\n// formatted number inline without an editable input (e.g., in a data table).\n\ninterface FormattedProps extends React.HTMLAttributes<HTMLSpanElement> {\n render?: RenderProp;\n}\n\nconst Formatted = forwardRef<HTMLSpanElement, FormattedProps>(function NumberFieldFormatted(\n { render, ...rest },\n ref\n) {\n const { state } = useNumberFieldContext();\n const el = (\n <span ref={ref} aria-hidden=\"true\" {...rest}>\n {state.inputValue}\n </span>\n );\n return renderWith(el, render, state);\n});\n\n// ── Namespace export ──────────────────────────────────────────────────────────\n\nexport const NumberField = {\n Root,\n Label,\n Group,\n Input,\n Increment,\n Decrement,\n HiddenInput,\n ScrubArea,\n ScrubAreaCursor,\n Description,\n ErrorMessage,\n Formatted,\n};\n"]}
1
+ {"version":3,"sources":["../src/react/useControllableState.ts","../src/core/formatter.ts","../src/core/normalizer.ts","../src/core/parser.ts","../src/react/useNumberFieldState.ts","../src/core/cursor.ts","../src/react/usePressAndHold.ts","../src/react/useNumberField.ts","../src/react/useNumberFieldFormat.ts","../src/react/context.ts","../src/react/useScrubArea.ts","../src/react/NumberField.tsx"],"names":["useControllableState","value","defaultValue","onChange","isControlled","wasControlled","useRef","internalValue","setInternalValue","useState","set","useCallback","next","nextValue","formatterCache","getFormatter","locale","options","key","fmt","extractLocaleInfo","parts","decimalSeparator","groupingSeparator","minusSign","zero","part","zeroParts","rtlLocales","resolvedLocale","isRTL","createFormatter","opts","intlOptions","intlFmt","cachedLocaleInfo","getLocaleInfo","formatToParts","result","format","formatted","formatResult","p","BUILTIN_DIGIT_BLOCKS","registeredBlocks","normalizeDigits","input","ch","code","start","end","digit","escapeRegex","s","checkIntermediate","normalized","info","allowNegative","allowDecimal","dec","minus","createParser","stripAffordances","raw","accountingMatch","parse","stripped","n","isIntermediate","clamp","min","max","v","preciseAdd","a","b","factor","decimalPlaces","idx","useNumberFieldState","formatOptions","minValue","maxValue","step","largeStep","smallStep","maximumFractionDigits","minimumFractionDigits","fixedDecimalScale","clampBehavior","prefix","suffix","allowOutOfRange","validate","onRawChange","customFormatValue","formatter","useMemo","parser","numberValue","setNumberValue","formatDisplay","initialDisplay","inputValue","setInputValueRaw","lastFormattedRef","rawValue","setRawValueState","runValidation","val","initialValidation","initVal","validationState","setValidationState","validationError","setValidationError","isScrubbing","setIsScrubbing","isFocused","setIsFocused","lastChangeReasonRef","_setLastChangeReason","reason","_getLastChangeReason","externalValue","prevExternalValueRef","applyValidation","vs","ve","setInputValue","setNumericValue","rawStr","commit","clamped","resolvedLargeStep","resolvedSmallStep","canIncrement","canDecrement","increment","amount","decrement","incrementToMax","decrementToMin","isAccepted","countAcceptedBefore","str","cursor","normalised","count","getCaretBoundary","formattedValue","len","boundary","i","computeNewCursorPosition","oldInput","oldCursor","newFormatted","inputType","acceptedCount","normNew","pos","snapToBoundary","usePressAndHold","callback","delay","interval","disabled","callbackRef","useEffect","delayRef","intervalRef","delayTimerRef","repeatTimerRef","isHeldRef","clearTimers","scheduleRepeat","currentInterval","nextInterval","onPointerDown","e","onPointerUp","onPointerLeave","useNumberField","props","state","inputRef","allowMouseWheel","liveFormat","name","readOnly","required","onFocus","onBlur","copyBehavior","stepHoldDelay","stepHoldInterval","customParseValue","autoId","useId","inputId","labelId","descriptionId","errorId","pendingCursor","useLayoutEffect","el","handler","isComposing","handleCompositionStart","handleCompositionEnd","composedValue","displayValue","handleChange","rawInputValue","cursorPos","handlePaste","text","localeInfo","allowedCharsPattern","stripped2","result2","handleCopy","handleCut","handleKeyDown","decPos","selEnd","currentValue","rawEdited","parseResult","direction","handleBlur","handleFocus","incrementHold","decrementHold","ariaValueText","isInvalid","labelProps","groupProps","inputProps","hiddenInputProps","incrementButtonProps","decrementButtonProps","useNumberFieldFormat","NumberFieldContext","createContext","useNumberFieldContext","ctx","useContext","useScrubArea","pixelSensitivity","setIsScrubbingLocal","stateRef","directionRef","sensitivityRef","isScrubbingRef","accumulatorRef","elementRef","virtualCursorRef","virtualCursor","setVirtualCursor","stableMouseMove","nx","ny","dir","delta","sensitivity","stablePointerLockChange","onKeyDown","cursorStyle","scrubAreaProps","renderWith","defaultElement","render","React","stateDataAttrs","DIV_ONLY_KEYS","splitProps","fieldProps","divProps","Root","forwardRef","children","onValueChange","onValueCommitted","allProps","ref","onValueChangeRef","wrappedProps","aria","jsx","Label","rest","Group","Input","_ref","Increment","Decrement","HiddenInput","ScrubArea","ScrubAreaCursor","style","Description","ErrorMessage","content","Formatted","NumberField"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useCallback, useRef, useState } from \"react\";\n\ninterface UseControllableStateOptions<T> {\n value?: T;\n defaultValue?: T;\n onChange?: (value: T) => void;\n}\n\n/**\n * Manages controlled vs uncontrolled state.\n * - If `value` is provided, the component is controlled.\n * - Otherwise it manages its own state starting from `defaultValue`.\n * Warns in dev mode if the component switches between controlled/uncontrolled.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [\n T | undefined,\n (next: T | ((prev: T | undefined) => T)) => void,\n] {\n const isControlled = value !== undefined;\n const wasControlled = useRef(isControlled);\n\n if (\n typeof window !== \"undefined\" &&\n (window as unknown as { __DEV__?: boolean }).__DEV__ !== false\n ) {\n if (wasControlled.current !== isControlled) {\n console.warn(\n `[raqam] Component is changing from ${\n wasControlled.current ? \"controlled\" : \"uncontrolled\"\n } to ${isControlled ? \"controlled\" : \"uncontrolled\"}. Decide between using a controlled or uncontrolled component and don't switch.`\n );\n }\n }\n\n const [internalValue, setInternalValue] = useState<T | undefined>(defaultValue);\n\n const set = useCallback(\n (next: T | ((prev: T | undefined) => T)) => {\n const nextValue =\n typeof next === \"function\"\n ? (next as (prev: T | undefined) => T)(isControlled ? value : internalValue)\n : next;\n\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n onChange?.(nextValue);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isControlled, value, internalValue, onChange]\n );\n\n return [isControlled ? value : internalValue, set];\n}\n","import type { FormatResult, LocaleInfo } from \"./types.js\";\n\n// ── Internal ──────────────────────────────────────────────────────────────────\n\n/** Probe value that will surface decimal AND grouping parts */\nconst PROBE_VALUE = 12345.6;\n\n/** Cache key = locale + JSON.stringify(options) */\nconst formatterCache = new Map<string, Intl.NumberFormat>();\n\nfunction getFormatter(\n locale: string | undefined,\n options: Intl.NumberFormatOptions | undefined\n): Intl.NumberFormat {\n const key = `${locale ?? \"\"}::${JSON.stringify(options ?? {})}`;\n let fmt = formatterCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, options);\n formatterCache.set(key, fmt);\n }\n return fmt;\n}\n\n/** Extract locale meta from formatToParts — never hardcoded. */\nfunction extractLocaleInfo(\n locale: string | undefined,\n options: Intl.NumberFormatOptions | undefined\n): LocaleInfo {\n const fmt = getFormatter(locale, options);\n // Use a simple decimal number — we only need the separators\n const parts = fmt.formatToParts(PROBE_VALUE);\n\n let decimalSeparator = \".\";\n let groupingSeparator = \",\";\n let minusSign = \"-\";\n let zero = \"0\";\n\n for (const part of parts) {\n if (part.type === \"decimal\") decimalSeparator = part.value;\n if (part.type === \"group\") groupingSeparator = part.value;\n if (part.type === \"minusSign\") minusSign = part.value;\n }\n\n // Detect locale zero digit\n const zeroParts = fmt.formatToParts(0);\n for (const part of zeroParts) {\n if (part.type === \"integer\") {\n zero = part.value;\n break;\n }\n }\n\n // RTL locales: Arabic / Hebrew / Persian / Urdu / Syriac etc.\n const rtlLocales = /^(ar|he|fa|ur|syc|nqo|ug|yi)/i;\n const resolvedLocale = fmt.resolvedOptions().locale;\n const isRTL = rtlLocales.test(resolvedLocale);\n\n return { decimalSeparator, groupingSeparator, minusSign, zero, isRTL };\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport interface FormatterOptions {\n locale?: string;\n formatOptions?: Intl.NumberFormatOptions;\n prefix?: string;\n suffix?: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n fixedDecimalScale?: boolean;\n}\n\nexport interface Formatter {\n format(value: number): string;\n formatToParts(value: number): Intl.NumberFormatPart[];\n getLocaleInfo(): LocaleInfo;\n formatResult(value: number): FormatResult;\n}\n\n/**\n * Create a formatter instance. Intl.NumberFormat is cached — safe to call\n * on every render.\n */\nexport function createFormatter(opts: FormatterOptions): Formatter {\n // Merge fraction digit overrides into formatOptions\n const intlOptions: Intl.NumberFormatOptions = { ...opts.formatOptions };\n\n if (opts.minimumFractionDigits !== undefined) {\n intlOptions.minimumFractionDigits = opts.minimumFractionDigits;\n }\n if (opts.maximumFractionDigits !== undefined) {\n intlOptions.maximumFractionDigits = opts.maximumFractionDigits;\n }\n if (opts.fixedDecimalScale && opts.maximumFractionDigits !== undefined) {\n intlOptions.minimumFractionDigits = opts.maximumFractionDigits;\n intlOptions.maximumFractionDigits = opts.maximumFractionDigits;\n }\n\n const intlFmt = getFormatter(opts.locale, intlOptions);\n // Lazy — computed once on first call\n let cachedLocaleInfo: LocaleInfo | null = null;\n\n function getLocaleInfo(): LocaleInfo {\n if (!cachedLocaleInfo) {\n cachedLocaleInfo = extractLocaleInfo(opts.locale, intlOptions);\n }\n return cachedLocaleInfo;\n }\n\n function formatToParts(value: number): Intl.NumberFormatPart[] {\n const parts = intlFmt.formatToParts(value);\n if (!opts.prefix && !opts.suffix) return parts;\n\n const result: Intl.NumberFormatPart[] = [];\n if (opts.prefix) result.push({ type: \"literal\", value: opts.prefix });\n result.push(...parts);\n if (opts.suffix) result.push({ type: \"literal\", value: opts.suffix });\n return result;\n }\n\n function format(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n const formatted = intlFmt.format(value);\n return (opts.prefix ?? \"\") + formatted + (opts.suffix ?? \"\");\n }\n\n function formatResult(value: number): FormatResult {\n const parts = formatToParts(value);\n const formatted = parts.map((p) => p.value).join(\"\");\n return { formatted, parts };\n }\n\n return { format, formatToParts, getLocaleInfo, formatResult };\n}\n","import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","import { createFormatter } from \"./formatter.js\";\nimport { normalizeDigits } from \"./normalizer.js\";\nimport type { LocaleInfo, ParseResult } from \"./types.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Escape a string so it can be used literally inside a RegExp.\n */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Returns true if `s` represents a valid-but-incomplete number:\n * \"-\" lone minus\n * \"1.\" trailing decimal separator (any locale)\n * \"1.0\" trailing zero after decimal\n * \"1.00\" etc.\n *\n * These should NOT be reformatted while the user is still typing.\n */\nfunction checkIntermediate(\n normalized: string,\n info: LocaleInfo,\n allowNegative: boolean,\n allowDecimal: boolean\n): boolean {\n const dec = escapeRegex(info.decimalSeparator);\n const minus = escapeRegex(info.minusSign);\n\n // Lone minus sign\n if (allowNegative && (normalized === \"-\" || normalized === info.minusSign)) {\n return true;\n }\n // Trailing decimal separator\n if (allowDecimal && new RegExp(`^${minus}?\\\\d+${dec}$`).test(normalized)) {\n return true;\n }\n // Trailing zeros after decimal (e.g. \"1.0\", \"1.00\", \"-1.0\")\n if (allowDecimal && new RegExp(`^${minus}?\\\\d+${dec}\\\\d*0+$`).test(normalized)) {\n return true;\n }\n return false;\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport interface ParserOptions {\n locale?: string;\n formatOptions?: Intl.NumberFormatOptions;\n allowNegative?: boolean;\n allowDecimal?: boolean;\n prefix?: string;\n suffix?: string;\n}\n\nexport interface Parser {\n parse(input: string): ParseResult;\n isIntermediate(input: string): boolean;\n getLocaleInfo(): LocaleInfo;\n}\n\n/**\n * Create a locale-aware parser. Separator characters are extracted from\n * Intl.NumberFormat — never hardcoded.\n */\nexport function createParser(opts: ParserOptions = {}): Parser {\n const allowNegative = opts.allowNegative ?? true;\n const allowDecimal = opts.allowDecimal ?? true;\n\n // Re-use the formatter to get locale info\n const fmt = createFormatter({\n locale: opts.locale,\n formatOptions: opts.formatOptions,\n prefix: opts.prefix,\n suffix: opts.suffix,\n });\n\n function getLocaleInfo(): LocaleInfo {\n return fmt.getLocaleInfo();\n }\n\n function stripAffordances(raw: string): string {\n const info = getLocaleInfo();\n\n // 1. Normalise non-Latin digits to ASCII\n let s = normalizeDigits(raw);\n\n // 2. Accounting format: \"(1,234.56)\" or \"($1,234.56)\" → negative\n // Intl.NumberFormat with currencySign:\"accounting\" wraps negatives in parens\n const accountingMatch = s.match(/^\\((.+)\\)$/);\n if (accountingMatch) {\n s = `-${accountingMatch[1]}`;\n }\n\n // 3. Strip prefix / suffix\n if (opts.prefix && s.startsWith(opts.prefix)) {\n s = s.slice(opts.prefix.length);\n }\n if (opts.suffix && s.endsWith(opts.suffix)) {\n s = s.slice(0, -opts.suffix.length);\n }\n\n // 4. Strip grouping separators (escape special chars)\n if (info.groupingSeparator) {\n s = s.split(info.groupingSeparator).join(\"\");\n }\n\n // 5. Replace locale decimal separator with ASCII \".\"\n if (info.decimalSeparator !== \".\") {\n s = s.split(info.decimalSeparator).join(\".\");\n }\n\n // 6. Replace locale minus sign with ASCII \"-\"\n if (info.minusSign !== \"-\") {\n s = s.split(info.minusSign).join(\"-\");\n }\n\n // 7. Strip currency symbol, percent sign, spaces that Intl might prepend/append\n // Strip any remaining non-numeric chars except digits, \".\", \"-\"\n // (handles currency prefixes/suffixes from Intl)\n s = s.replace(/[^\\d.\\-]/g, \"\").trim();\n\n return s;\n }\n\n function parse(input: string): ParseResult {\n if (!input || input.trim() === \"\") {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n const info = getLocaleInfo();\n\n // Check for intermediate state before stripping\n if (checkIntermediate(input, info, allowNegative, allowDecimal)) {\n return { value: null, isValid: false, isIntermediate: true };\n }\n\n const stripped = stripAffordances(input);\n\n if (stripped === \"\") {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n if (stripped === \"-\") {\n // Lone minus after stripping — only intermediate if negatives are allowed\n return { value: null, isValid: false, isIntermediate: allowNegative };\n }\n\n // Reject if not a valid numeric string\n if (!/^-?\\d+\\.?\\d*$/.test(stripped)) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n if (!allowNegative && stripped.startsWith(\"-\")) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n if (!allowDecimal && stripped.includes(\".\")) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n const n = Number.parseFloat(stripped);\n if (!Number.isFinite(n)) {\n return { value: null, isValid: false, isIntermediate: false };\n }\n\n return { value: n, isValid: true, isIntermediate: false };\n }\n\n function isIntermediate(input: string): boolean {\n const info = getLocaleInfo();\n return checkIntermediate(input, info, allowNegative, allowDecimal);\n }\n\n return { parse, isIntermediate, getLocaleInfo };\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { createFormatter } from \"../core/formatter.js\";\nimport { createParser } from \"../core/parser.js\";\nimport type { ChangeReason, NumberFieldState, UseNumberFieldStateOptions } from \"../core/types.js\";\nimport { useControllableState } from \"./useControllableState.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction clamp(value: number, min?: number, max?: number): number {\n let v = value;\n if (min !== undefined) v = Math.max(v, min);\n if (max !== undefined) v = Math.min(v, max);\n return v;\n}\n\nfunction preciseAdd(a: number, b: number): number {\n // Simple float precision fix — avoids 0.1 + 0.2 = 0.30000000000000004\n const precision = Math.max(decimalPlaces(a), decimalPlaces(b));\n const factor = 10 ** precision;\n return Math.round(a * factor + b * factor) / factor;\n}\n\nfunction decimalPlaces(n: number): number {\n const s = String(n);\n const idx = s.indexOf(\".\");\n return idx === -1 ? 0 : s.length - idx - 1;\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────────\n\nexport function useNumberFieldState(options: UseNumberFieldStateOptions): NumberFieldState {\n const {\n locale,\n formatOptions,\n minValue,\n maxValue,\n step = 1,\n largeStep,\n smallStep,\n allowNegative = true,\n allowDecimal = true,\n maximumFractionDigits,\n minimumFractionDigits,\n fixedDecimalScale,\n clampBehavior = \"blur\",\n prefix,\n suffix,\n allowOutOfRange = false,\n validate,\n onRawChange,\n formatValue: customFormatValue,\n } = options;\n\n // ── Formatter & parser (re-created only when deps change) ──────────────────\n const formatter = useMemo(\n () =>\n createFormatter({\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n locale,\n // JSON-serialize to detect object identity changes\n JSON.stringify(formatOptions),\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n ]\n );\n\n const parser = useMemo(\n () =>\n createParser({\n locale,\n formatOptions,\n allowNegative,\n allowDecimal,\n prefix,\n suffix,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [locale, JSON.stringify(formatOptions), allowNegative, allowDecimal, prefix, suffix]\n );\n\n // ── Controlled/uncontrolled numeric value ──────────────────────────────────\n const [numberValue, setNumberValue] = useControllableState<number | null>({\n value: options.value,\n defaultValue: options.defaultValue ?? null,\n onChange: options.onChange,\n });\n\n // ── Display string ─────────────────────────────────────────────────────────\n // Stored in local state — can transiently diverge from numberValue\n // (e.g. while typing \"1.\" which isn't a valid JS number yet)\n const formatDisplay = useCallback(\n (n: number): string => (customFormatValue ? customFormatValue(n) : formatter.format(n)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [formatter, customFormatValue]\n );\n\n const initialDisplay = useMemo(() => {\n if (options.defaultValue != null) {\n return formatDisplay(options.defaultValue);\n }\n if (options.value != null) {\n return formatDisplay(options.value);\n }\n return \"\";\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only on mount\n\n const [inputValue, setInputValueRaw] = useState<string>(initialDisplay);\n\n // Track last formatted value so we can sync controlled value changes\n const lastFormattedRef = useRef<string>(initialDisplay);\n\n // ── Raw value (precision-preserving string) ────────────────────────────────\n const [rawValue, setRawValueState] = useState<string | null>(\n options.defaultValue != null ? String(options.defaultValue) : null\n );\n\n // ── Validation state ───────────────────────────────────────────────────────\n const runValidation = useCallback(\n (\n val: number | null\n ): { validationState: \"valid\" | \"invalid\"; validationError: string | null } => {\n if (!validate) return { validationState: \"valid\", validationError: null };\n const result = validate(val);\n if (result === false) return { validationState: \"invalid\", validationError: null };\n if (typeof result === \"string\")\n return { validationState: \"invalid\", validationError: result };\n return { validationState: \"valid\", validationError: null };\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [validate]\n );\n\n const initialValidation = useMemo(() => {\n const initVal = options.defaultValue ?? options.value ?? null;\n return runValidation(initVal != null ? initVal : null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only on mount\n\n const [validationState, setValidationState] = useState<\"valid\" | \"invalid\">(\n initialValidation.validationState\n );\n const [validationError, setValidationError] = useState<string | null>(\n initialValidation.validationError\n );\n\n // ── isScrubbing / isFocused state ──────────────────────────────────────────\n const [isScrubbing, setIsScrubbing] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n // ── Change reason ref (no re-render needed) ────────────────────────────────\n const lastChangeReasonRef = useRef<ChangeReason>(\"input\");\n const _setLastChangeReason = useCallback((reason: ChangeReason) => {\n lastChangeReasonRef.current = reason;\n }, []);\n\n const _getLastChangeReason = useCallback((): ChangeReason => {\n return lastChangeReasonRef.current;\n }, []);\n\n // ── Sync controlled value → display string when value changes externally ───\n const externalValue = options.value;\n const prevExternalValueRef = useRef(externalValue);\n if (prevExternalValueRef.current !== externalValue) {\n prevExternalValueRef.current = externalValue;\n if (externalValue != null) {\n const formatted = formatter.format(externalValue);\n if (formatted !== lastFormattedRef.current) {\n lastFormattedRef.current = formatted;\n }\n } else {\n lastFormattedRef.current = \"\";\n }\n }\n\n // ── Internal helper: apply validation after a value change ────────────────\n const applyValidation = useCallback(\n (val: number | null) => {\n const { validationState: vs, validationError: ve } = runValidation(val);\n setValidationState(vs);\n setValidationError(ve);\n },\n [runValidation]\n );\n\n // ── setInputValue ──────────────────────────────────────────────────────────\n const setInputValue = useCallback(\n (val: string) => {\n const result = parser.parse(val);\n\n // Strict clamping: reject input that goes out of range (skipped when allowOutOfRange)\n if (clampBehavior === \"strict\" && !allowOutOfRange && result.value !== null) {\n if (minValue !== undefined && result.value < minValue) return;\n if (maxValue !== undefined && result.value > maxValue) return;\n }\n\n setInputValueRaw(val);\n setNumberValue(result.value);\n // rawValue tracks what user typed, not the formatted output\n setRawValueState(result.value !== null ? val : null);\n onRawChange?.(result.value !== null ? val : null);\n applyValidation(result.value);\n },\n [\n parser,\n clampBehavior,\n allowOutOfRange,\n minValue,\n maxValue,\n setNumberValue,\n onRawChange,\n applyValidation,\n ]\n );\n\n // ── setNumberValue (external) ──────────────────────────────────────────────\n const setNumericValue = useCallback(\n (val: number | null) => {\n setNumberValue(val);\n if (val != null) {\n const formatted = formatDisplay(val);\n setInputValueRaw(formatted);\n lastFormattedRef.current = formatted;\n const rawStr = String(val);\n setRawValueState(rawStr);\n onRawChange?.(rawStr);\n } else {\n setInputValueRaw(\"\");\n lastFormattedRef.current = \"\";\n setRawValueState(null);\n onRawChange?.(null);\n }\n applyValidation(val);\n },\n [formatDisplay, setNumberValue, onRawChange, applyValidation]\n );\n\n // ── commit (called on blur) ────────────────────────────────────────────────\n const commit = useCallback(() => {\n if (numberValue == null) {\n setInputValueRaw(\"\");\n lastFormattedRef.current = \"\";\n return;\n }\n\n let clamped = numberValue;\n // Clamp on blur, unless allowOutOfRange is true\n if (clampBehavior === \"blur\" && !allowOutOfRange) {\n clamped = clamp(numberValue, minValue, maxValue);\n }\n\n const formatted = formatDisplay(clamped);\n setInputValueRaw(formatted);\n lastFormattedRef.current = formatted;\n\n if (clamped !== numberValue) {\n setNumberValue(clamped);\n }\n applyValidation(clamped);\n }, [\n numberValue,\n clampBehavior,\n allowOutOfRange,\n minValue,\n maxValue,\n formatter,\n setNumberValue,\n applyValidation,\n ]);\n\n // ── Step computation ───────────────────────────────────────────────────────\n const resolvedLargeStep = largeStep ?? step * 10;\n const resolvedSmallStep = smallStep ?? step * 0.1;\n\n const canIncrement =\n !options.disabled &&\n !options.readOnly &&\n (allowOutOfRange ||\n maxValue === undefined ||\n (numberValue ?? Number.NEGATIVE_INFINITY) < maxValue);\n\n const canDecrement =\n !options.disabled &&\n !options.readOnly &&\n (allowOutOfRange ||\n minValue === undefined ||\n (numberValue ?? Number.POSITIVE_INFINITY) > minValue);\n\n const increment = useCallback(\n (amount?: number) => {\n const s = amount ?? step;\n const base = numberValue ?? 0;\n const next = clamp(preciseAdd(base, s), minValue, maxValue);\n setNumericValue(next);\n },\n [numberValue, step, minValue, maxValue, setNumericValue]\n );\n\n const decrement = useCallback(\n (amount?: number) => {\n const s = amount ?? step;\n const base = numberValue ?? 0;\n const next = clamp(preciseAdd(base, -s), minValue, maxValue);\n setNumericValue(next);\n },\n [numberValue, step, minValue, maxValue, setNumericValue]\n );\n\n const incrementToMax = useCallback(() => {\n if (maxValue !== undefined) setNumericValue(maxValue);\n }, [maxValue, setNumericValue]);\n\n const decrementToMin = useCallback(() => {\n if (minValue !== undefined) setNumericValue(minValue);\n }, [minValue, setNumericValue]);\n\n return {\n inputValue,\n numberValue: numberValue ?? null,\n rawValue,\n canIncrement,\n canDecrement,\n isScrubbing,\n setIsScrubbing,\n isFocused,\n setIsFocused,\n validationState,\n validationError,\n _setLastChangeReason,\n _getLastChangeReason,\n setInputValue,\n setNumberValue: setNumericValue,\n commit,\n increment,\n decrement,\n incrementToMax,\n decrementToMin,\n options: {\n ...options,\n step,\n largeStep: resolvedLargeStep,\n smallStep: resolvedSmallStep,\n },\n };\n}\n","import { normalizeDigits } from \"./normalizer.js\";\nimport type { CaretBoundary, LocaleInfo } from \"./types.js\";\n\n// ── Accepted-character helpers ────────────────────────────────────────────────\n\n/**\n * Returns true if `ch` is an \"accepted\" character — one that the user typed\n * intentionally and that contributes to the numeric value:\n * - ASCII digit 0-9\n * - The locale decimal separator\n * - The locale minus sign\n */\nfunction isAccepted(ch: string, info: LocaleInfo): boolean {\n if (ch >= \"0\" && ch <= \"9\") return true;\n if (ch === info.decimalSeparator) return true;\n if (ch === info.minusSign || ch === \"-\") return true;\n return false;\n}\n\n/**\n * Count how many \"accepted\" characters appear before position `cursor`\n * in `str` (after normalising non-Latin digits to ASCII).\n */\nfunction countAcceptedBefore(str: string, cursor: number, info: LocaleInfo): number {\n const normalised = normalizeDigits(str);\n let count = 0;\n for (let i = 0; i < cursor && i < normalised.length; i++) {\n if (isAccepted(normalised[i]!, info)) count++;\n }\n return count;\n}\n\n// ── Caret boundary ────────────────────────────────────────────────────────────\n\n/**\n * Build a boolean array of length `formattedValue.length + 1`.\n * `true` → cursor may rest at this position.\n * `false` → cursor must snap away (sits inside a formatting-only character\n * such as a grouping separator or a currency prefix).\n *\n * Rules:\n * - Start and end positions are always valid.\n * - A position immediately AFTER a grouping separator is invalid (the\n * cursor would look like it's between two digits but moving left would\n * skip the comma).\n * - A position immediately BEFORE a grouping separator is valid.\n */\nexport function getCaretBoundary(formattedValue: string, info: LocaleInfo): CaretBoundary {\n const len = formattedValue.length;\n const boundary: CaretBoundary = new Array(len + 1).fill(true) as boolean[];\n\n for (let i = 0; i < len; i++) {\n const ch = formattedValue[i]!;\n if (ch === info.groupingSeparator) {\n // Position immediately after the grouping separator is invalid\n boundary[i + 1] = false;\n }\n }\n\n // First and last are always valid\n boundary[0] = true;\n boundary[len] = true;\n\n return boundary;\n}\n\n// ── Cursor computation ────────────────────────────────────────────────────────\n\n/**\n * Compute the new cursor position in `newFormatted` that corresponds\n * semantically to `oldCursor` in `oldInput`.\n *\n * Algorithm (3 stages from the spec):\n *\n * 1. Count accepted characters before `oldCursor` in `oldInput`.\n * 2. Adjust for backspace-over-separator edge case.\n * 3. Walk `newFormatted` to find the position where the same count of\n * accepted chars precede it; snap to the nearest valid boundary.\n *\n * @param oldInput The raw string the user just typed into (pre-format)\n * @param oldCursor selectionStart captured from the native event\n * @param newFormatted The formatted string we're about to display\n * @param info Locale separators\n * @param inputType e.nativeEvent.inputType (optional — for backspace detection)\n */\nexport function computeNewCursorPosition(\n oldInput: string,\n oldCursor: number,\n newFormatted: string,\n info: LocaleInfo,\n inputType?: string\n): number {\n const normalised = normalizeDigits(oldInput);\n\n // Stage 1: count accepted chars before cursor in old input\n let acceptedCount = countAcceptedBefore(normalised, oldCursor, info);\n\n // Stage 2: backspace on grouping separator — also delete the preceding digit\n if (\n inputType === \"deleteContentBackward\" &&\n oldCursor > 0 &&\n oldInput[oldCursor - 1] === info.groupingSeparator\n ) {\n // The separator was deleted but we want to remove the preceding digit too\n acceptedCount = Math.max(0, acceptedCount - 1);\n }\n\n // Stage 3: build boundary and walk new formatted string\n const boundary = getCaretBoundary(newFormatted, info);\n const normNew = normalizeDigits(newFormatted);\n let count = 0;\n let pos = 0;\n\n for (let i = 0; i < normNew.length; i++) {\n if (count === acceptedCount) {\n pos = i;\n break;\n }\n if (isAccepted(normNew[i]!, info)) count++;\n pos = i + 1;\n }\n\n // If we ran through the entire string without reaching the target count,\n // place the cursor at the end. Note: acceptedCount === 0 means we correctly\n // want pos = 0 (set in the loop), so we must NOT override that case.\n if (acceptedCount > 0 && count < acceptedCount) {\n pos = newFormatted.length;\n }\n\n // Snap to nearest valid boundary\n pos = snapToBoundary(pos, boundary);\n\n return pos;\n}\n\n/**\n * If `pos` is at a false (invalid) boundary position, find the nearest\n * true position. Prefers moving forward; falls back to backward.\n */\nfunction snapToBoundary(pos: number, boundary: CaretBoundary): number {\n if (boundary[pos]) return pos;\n\n // Try forward first\n for (let i = pos + 1; i < boundary.length; i++) {\n if (boundary[i]) return i;\n }\n // Fall back to backward\n for (let i = pos - 1; i >= 0; i--) {\n if (boundary[i]) return i;\n }\n return 0;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface UsePressAndHoldOptions {\n /** Milliseconds before repeating starts (default: 400) */\n delay?: number;\n /** Initial milliseconds between repeats — halves each tick, floors at 50 (default: 200) */\n interval?: number;\n /** Whether the element is disabled */\n disabled?: boolean;\n}\n\nexport interface PressAndHoldProps {\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerUp: (e: React.PointerEvent) => void;\n onPointerLeave: (e: React.PointerEvent) => void;\n}\n\n/**\n * Returns pointer event handlers that call `callback` immediately on press,\n * then repeatedly with accelerating frequency while held down.\n *\n * Acceleration schedule (default settings):\n * immediate → 400ms wait → 200ms → 100ms → 50ms (floor, stays until release)\n *\n * All timing is handled via refs — zero state updates, zero re-renders.\n */\nexport function usePressAndHold(\n callback: () => void,\n options: UsePressAndHoldOptions = {}\n): PressAndHoldProps {\n const { delay = 400, interval = 200, disabled = false } = options;\n\n // Stable refs so handlers don't re-create on every render\n const callbackRef = useRef(callback);\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n const delayRef = useRef(delay);\n useEffect(() => {\n delayRef.current = delay;\n });\n\n const intervalRef = useRef(interval);\n useEffect(() => {\n intervalRef.current = interval;\n });\n\n // Timer handle refs (null = no active timer)\n const delayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const repeatTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isHeldRef = useRef(false);\n\n const clearTimers = useCallback(() => {\n isHeldRef.current = false;\n if (delayTimerRef.current !== null) {\n clearTimeout(delayTimerRef.current);\n delayTimerRef.current = null;\n }\n if (repeatTimerRef.current !== null) {\n clearTimeout(repeatTimerRef.current);\n repeatTimerRef.current = null;\n }\n }, []);\n\n // Recursive accelerating repeat\n const scheduleRepeat = useCallback((currentInterval: number) => {\n if (!isHeldRef.current) return;\n callbackRef.current();\n const nextInterval = Math.max(50, Math.floor(currentInterval / 2));\n repeatTimerRef.current = setTimeout(() => {\n scheduleRepeat(nextInterval);\n }, currentInterval);\n }, []);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n // Only primary button (left mouse / single touch / pen)\n if (e.button !== 0 && e.pointerType === \"mouse\") return;\n\n // Fire immediately\n callbackRef.current();\n isHeldRef.current = true;\n\n // After initial delay, start accelerating repeats\n delayTimerRef.current = setTimeout(() => {\n scheduleRepeat(intervalRef.current);\n }, delayRef.current);\n },\n [disabled, scheduleRepeat]\n );\n\n const onPointerUp = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n clearTimers();\n },\n [clearTimers]\n );\n\n const onPointerLeave = useCallback(\n (e: React.PointerEvent) => {\n void e;\n clearTimers();\n },\n [clearTimers]\n );\n\n // Safety: clear on unmount\n useEffect(() => clearTimers, [clearTimers]);\n\n return { onPointerDown, onPointerUp, onPointerLeave };\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { computeNewCursorPosition } from \"../core/cursor.js\";\nimport { createFormatter } from \"../core/formatter.js\";\nimport { normalizeDigits } from \"../core/normalizer.js\";\nimport { createParser } from \"../core/parser.js\";\nimport type { NumberFieldAria, NumberFieldState, UseNumberFieldProps } from \"../core/types.js\";\nimport { usePressAndHold } from \"./usePressAndHold.js\";\n\n// ── Tiny helper to safely escape regex special chars (including hyphen) ──────\n\nfunction escapeRegex(s: string): string {\n // Escaping hyphen prevents it from being misinterpreted as a range indicator\n // inside a character class (e.g. [.--] would be invalid without this)\n return s.replace(/[.*+?^${}()|[\\]\\\\\\-]/g, \"\\\\$&\");\n}\n\nexport function useNumberField(\n props: UseNumberFieldProps,\n state: NumberFieldState,\n inputRef: React.RefObject<HTMLInputElement | null>\n): NumberFieldAria {\n const {\n locale,\n formatOptions,\n minValue,\n maxValue,\n allowNegative = true,\n allowDecimal = true,\n allowMouseWheel = false,\n liveFormat = true,\n prefix,\n suffix,\n name,\n disabled,\n readOnly,\n required,\n onFocus,\n onBlur,\n maximumFractionDigits,\n minimumFractionDigits,\n fixedDecimalScale,\n copyBehavior = \"formatted\",\n stepHoldDelay = 400,\n stepHoldInterval = 200,\n formatValue: customFormatValue,\n parseValue: customParseValue,\n } = props; // formatValue/parseValue are on UseNumberFieldStateOptions (inherited)\n\n const { step = 1, largeStep = step * 10, smallStep = step * 0.1 } = state.options;\n\n const autoId = useId();\n const inputId = props.id ?? `raqam-${autoId}`;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const errorId = `${inputId}-error`;\n\n // ── Formatter & parser (kept in sync with state's) ──────────────────────\n const formatter = useMemo(\n () =>\n createFormatter({\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n locale,\n JSON.stringify(formatOptions),\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n ]\n );\n\n const parser = useMemo(\n () =>\n createParser({\n locale,\n formatOptions,\n allowNegative,\n allowDecimal,\n prefix,\n suffix,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [locale, JSON.stringify(formatOptions), allowNegative, allowDecimal, prefix, suffix]\n );\n\n // ── Cursor engine ────────────────────────────────────────────────────────\n const pendingCursor = useRef<number | null>(null);\n\n // Restore cursor synchronously after React commits the new value to DOM\n useLayoutEffect(() => {\n if (\n pendingCursor.current !== null &&\n inputRef.current &&\n document.activeElement === inputRef.current\n ) {\n inputRef.current.setSelectionRange(pendingCursor.current, pendingCursor.current);\n pendingCursor.current = null;\n }\n // Run after every inputValue change\n }, [state.inputValue, inputRef]);\n\n // ── Mouse wheel (non-passive native listener) ────────────────────────────\n // React's synthetic onWheel is passive in React 17+; it cannot call\n // preventDefault(). We must attach a native, non-passive listener instead.\n useEffect(() => {\n const el = inputRef.current;\n if (!el || !allowMouseWheel) return;\n\n const handler = (e: WheelEvent) => {\n if (disabled || readOnly) return;\n if (document.activeElement !== el) return;\n e.preventDefault();\n state._setLastChangeReason(\"wheel\");\n if (e.deltaY < 0) {\n state.increment();\n } else {\n state.decrement();\n }\n };\n\n el.addEventListener(\"wheel\", handler, { passive: false });\n return () => el.removeEventListener(\"wheel\", handler);\n }, [allowMouseWheel, disabled, readOnly, state, inputRef]);\n\n // ── IME Composition state ────────────────────────────────────────────────\n // During CJK IME input, partial composed characters must not trigger live\n // formatting. We suspend formatting during composition and resume on end.\n const isComposing = useRef(false);\n\n const handleCompositionStart = useCallback(() => {\n isComposing.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent<HTMLInputElement>) => {\n isComposing.current = false;\n // After composition ends, run the full format cycle on the composed value\n const composedValue = e.currentTarget.value;\n const info = formatter.getLocaleInfo();\n const normalized = normalizeDigits(composedValue);\n\n let displayValue: string;\n if (customParseValue) {\n const result = customParseValue(normalized);\n if (result.isIntermediate) {\n displayValue = normalized;\n } else if (result.value !== null && customFormatValue) {\n displayValue = customFormatValue(result.value);\n } else if (result.value !== null) {\n displayValue = formatter.format(result.value);\n } else {\n displayValue = normalized;\n }\n // Disable cursor engine for custom format/parse\n pendingCursor.current = displayValue.length;\n } else if (liveFormat) {\n const result = parser.parse(normalized);\n if (result.isIntermediate) {\n displayValue = normalized;\n } else if (result.value !== null) {\n displayValue = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n } else {\n displayValue = normalized === \"\" ? \"\" : normalized;\n }\n pendingCursor.current = computeNewCursorPosition(\n composedValue,\n composedValue.length,\n displayValue,\n info,\n \"insertCompositionText\"\n );\n } else {\n displayValue = normalized;\n pendingCursor.current = normalized.length;\n }\n\n state._setLastChangeReason(\"input\");\n state.setInputValue(displayValue);\n },\n [formatter, parser, liveFormat, state, customFormatValue, customParseValue]\n );\n\n // ── onChange handler ─────────────────────────────────────────────────────\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawInputValue = e.target.value;\n const cursorPos = e.target.selectionStart ?? rawInputValue.length;\n const inputType = (e.nativeEvent as InputEvent).inputType;\n const info = formatter.getLocaleInfo();\n\n // During IME composition, skip live formatting — just track the raw value\n if (isComposing.current) {\n state.setInputValue(rawInputValue);\n return;\n }\n\n // Normalise non-Latin digits\n const normalized = normalizeDigits(rawInputValue);\n\n let displayValue: string;\n\n // Custom parse/format escape hatch\n if (customParseValue) {\n const result = customParseValue(normalized);\n if (result.isIntermediate) {\n displayValue = normalized;\n } else if (result.value !== null) {\n displayValue = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n } else if (normalized === \"\") {\n displayValue = \"\";\n } else {\n displayValue = normalized;\n }\n // Can't predict cursor position with custom formatter — place at end\n pendingCursor.current = displayValue.length;\n } else if (liveFormat) {\n const result = parser.parse(normalized);\n\n if (result.isIntermediate) {\n // Preserve intermediate states (lone \"-\", trailing \"1.\", etc.)\n displayValue = normalized;\n } else if (result.value !== null) {\n displayValue = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n } else if (normalized === \"\") {\n displayValue = \"\";\n } else {\n // Invalid input — keep the raw normalised string so the user can\n // see what they typed (they'll get corrected on blur)\n displayValue = normalized;\n }\n\n if (customFormatValue) {\n // Custom format: can't predict cursor, place at end\n pendingCursor.current = displayValue.length;\n } else {\n // Compute and stash cursor position for useLayoutEffect\n pendingCursor.current = computeNewCursorPosition(\n rawInputValue,\n cursorPos,\n displayValue,\n info,\n inputType\n );\n }\n } else {\n // No live format — just pass through normalised digits\n displayValue = normalized;\n pendingCursor.current = cursorPos;\n }\n\n state._setLastChangeReason(\"input\");\n state.setInputValue(displayValue);\n },\n [formatter, parser, liveFormat, state, customFormatValue, customParseValue]\n );\n\n // ── Paste handler ────────────────────────────────────────────────────────\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const text = e.clipboardData.getData(\"text/plain\");\n if (!text) return;\n\n // 1. Strip common currency symbols (global currencies)\n const stripped = text.replace(/[€$£¥₹₺₽﷼฿₩¢₦₨₪₫₱]/g, \"\").trim();\n\n // 2. Normalize non-Latin digits to ASCII\n const normalized = normalizeDigits(stripped);\n\n state._setLastChangeReason(\"paste\");\n\n // Custom parse escape hatch\n if (customParseValue) {\n const result = customParseValue(normalized);\n if (result.value !== null) {\n const formatted = customFormatValue\n ? customFormatValue(result.value)\n : formatter.format(result.value);\n state.setInputValue(formatted);\n pendingCursor.current = formatted.length;\n }\n return;\n }\n\n // 3. Try parse with current locale parser\n const result = parser.parse(normalized);\n\n if (result.value !== null) {\n const formatted = formatter.format(result.value);\n state.setInputValue(formatted);\n pendingCursor.current = formatted.length;\n return;\n }\n\n // 4. Fallback: strip everything except digits, locale decimal, minus sign\n const localeInfo = formatter.getLocaleInfo();\n const allowedCharsPattern = new RegExp(\n `[^0-9${escapeRegex(localeInfo.decimalSeparator)}${escapeRegex(localeInfo.minusSign)}-]`,\n \"g\"\n );\n const stripped2 = normalized.replace(allowedCharsPattern, \"\");\n const result2 = parser.parse(stripped2);\n\n if (result2.value !== null) {\n const formatted = formatter.format(result2.value);\n state.setInputValue(formatted);\n pendingCursor.current = formatted.length;\n }\n // If still invalid, silently discard — don't paste garbage into the field\n },\n [parser, formatter, state, customFormatValue, customParseValue]\n );\n\n // ── Copy / Cut handlers ──────────────────────────────────────────────────\n const handleCopy = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (copyBehavior === \"formatted\") return; // browser handles it natively\n\n e.preventDefault();\n const text = String(state.numberValue ?? \"\");\n e.clipboardData.setData(\"text/plain\", text);\n },\n [copyBehavior, state.numberValue]\n );\n\n const handleCut = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n if (copyBehavior === \"formatted\") return; // browser handles it\n\n e.preventDefault();\n const text = String(state.numberValue ?? \"\");\n e.clipboardData.setData(\"text/plain\", text);\n // Clear the field after cut\n state.setInputValue(\"\");\n },\n [copyBehavior, state]\n );\n\n // ── Keyboard handler ─────────────────────────────────────────────────────\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled || readOnly) return;\n\n const key = e.key;\n\n // Smart backspace: when cursor is immediately after a grouping separator\n // (no selection active, no modifier keys), delete both the separator and\n // the preceding digit so the user can backspace through formatted numbers\n // without the comma \"blocking\" deletion.\n //\n // This must be handled in keydown — by the time onChange fires, the\n // browser has already removed the separator character, making it\n // impossible to detect what was deleted.\n // Smart decimal: when the user types the decimal separator but one already\n // exists in the formatted value (e.g. \"1.00\" with fixedDecimalScale),\n // move the cursor to just after the decimal separator instead of inserting\n // a duplicate. This enables the financial UX pattern:\n // \"1.00\" → type \".\" → cursor jumps after \".\" → type \"5\" → \"1.50\"\n // Same applies for negative values: \"-1.00\" → type \".\" → cursor after \".\"\n if (!e.metaKey && !e.ctrlKey && !e.altKey && allowDecimal) {\n const localeInfo = formatter.getLocaleInfo();\n // Match only the locale's decimal separator key (e.g. \".\" for en-US,\n // \",\" for de-DE). Do NOT also match \".\" universally — in comma-decimal\n // locales \".\" is the grouping separator and should not trigger a jump.\n if (key === localeInfo.decimalSeparator) {\n const input = inputRef.current;\n if (input) {\n const decPos = input.value.indexOf(localeInfo.decimalSeparator);\n if (decPos !== -1) {\n e.preventDefault();\n input.setSelectionRange(decPos + 1, decPos + 1);\n return;\n }\n }\n }\n }\n\n if (key === \"Backspace\" && !e.shiftKey && !e.altKey && !e.metaKey && !e.ctrlKey) {\n const input = inputRef.current;\n if (input) {\n const cursor = input.selectionStart ?? 0;\n const selEnd = input.selectionEnd ?? cursor;\n const currentValue = input.value;\n const info = formatter.getLocaleInfo();\n\n if (\n cursor === selEnd && // no text selection — single caret\n cursor >= 2 &&\n currentValue[cursor - 1] === info.groupingSeparator\n ) {\n e.preventDefault();\n // Remove the grouping separator (cursor-1) AND the digit before it (cursor-2)\n const rawEdited = currentValue.slice(0, cursor - 2) + currentValue.slice(cursor);\n const parseResult = parser.parse(rawEdited);\n\n state._setLastChangeReason(\"input\");\n if (parseResult.value !== null) {\n const formatted = formatter.format(parseResult.value);\n state.setInputValue(formatted);\n } else {\n // Empty or intermediate — store as-is (blur will clean up)\n state.setInputValue(rawEdited);\n }\n pendingCursor.current = cursor - 2;\n return;\n }\n }\n }\n\n if (key === \"ArrowUp\" || key === \"ArrowDown\") {\n e.preventDefault();\n const direction = key === \"ArrowUp\" ? 1 : -1;\n state._setLastChangeReason(\"keyboard\");\n if (e.shiftKey) {\n direction > 0 ? state.increment(largeStep) : state.decrement(largeStep);\n } else if (e.metaKey || e.ctrlKey) {\n direction > 0 ? state.increment(smallStep) : state.decrement(smallStep);\n } else {\n direction > 0 ? state.increment() : state.decrement();\n }\n return;\n }\n\n if (key === \"PageUp\") {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.increment(largeStep);\n return;\n }\n\n if (key === \"PageDown\") {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.decrement(largeStep);\n return;\n }\n\n if (key === \"Home\") {\n if (minValue !== undefined) {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.decrementToMin();\n }\n return;\n }\n\n if (key === \"End\") {\n if (maxValue !== undefined) {\n e.preventDefault();\n state._setLastChangeReason(\"keyboard\");\n state.incrementToMax();\n }\n return;\n }\n\n if (key === \"Enter\") {\n state._setLastChangeReason(\"blur\");\n state.commit();\n return;\n }\n },\n [\n disabled,\n readOnly,\n state,\n largeStep,\n smallStep,\n minValue,\n maxValue,\n formatter,\n parser,\n inputRef,\n ]\n );\n\n // ── Blur handler ─────────────────────────────────────────────────────────\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n state.setIsFocused(false);\n state._setLastChangeReason(\"blur\");\n state.commit();\n onBlur?.(e);\n },\n [state, onBlur]\n );\n\n // ── Focus handler ────────────────────────────────────────────────────────\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n state.setIsFocused(true);\n onFocus?.(e);\n },\n [state, onFocus]\n );\n\n // ── Press-and-hold for increment/decrement buttons ───────────────────────\n const incrementHold = usePressAndHold(\n () => {\n state._setLastChangeReason(\"increment\");\n state.increment();\n },\n {\n delay: stepHoldDelay,\n interval: stepHoldInterval,\n disabled: disabled || !state.canIncrement,\n }\n );\n\n const decrementHold = usePressAndHold(\n () => {\n state._setLastChangeReason(\"decrement\");\n state.decrement();\n },\n {\n delay: stepHoldDelay,\n interval: stepHoldInterval,\n disabled: disabled || !state.canDecrement,\n }\n );\n\n // ── ARIA valuetext ───────────────────────────────────────────────────────\n const ariaValueText = useMemo(() => {\n if (state.numberValue == null) return undefined;\n return customFormatValue\n ? customFormatValue(state.numberValue)\n : formatter.format(state.numberValue);\n }, [state.numberValue, formatter, customFormatValue]);\n\n // ── RTL detection ────────────────────────────────────────────────────────\n const localeInfo = formatter.getLocaleInfo();\n\n // ── Out-of-range + validation detection (for aria-invalid + data-invalid) ─\n const isOutOfRange =\n state.numberValue !== null &&\n ((minValue !== undefined && state.numberValue < minValue) ||\n (maxValue !== undefined && state.numberValue > maxValue));\n\n const isInvalid = isOutOfRange || state.validationState === \"invalid\";\n\n // ── Prop maps ────────────────────────────────────────────────────────────\n\n const labelProps: React.LabelHTMLAttributes<HTMLLabelElement> = {\n id: labelId,\n htmlFor: inputId,\n };\n\n const groupProps: React.HTMLAttributes<HTMLDivElement> = {\n role: \"group\",\n \"aria-labelledby\": props[\"aria-labelledby\"] ?? labelId,\n };\n\n const inputProps: React.InputHTMLAttributes<HTMLInputElement> = {\n id: inputId,\n type: \"text\",\n inputMode: \"decimal\",\n role: \"spinbutton\",\n autoComplete: \"off\",\n autoCorrect: \"off\",\n spellCheck: false,\n \"aria-label\": props[\"aria-label\"],\n \"aria-labelledby\": props[\"aria-labelledby\"] ?? labelId,\n \"aria-describedby\": props[\"aria-describedby\"],\n \"aria-valuenow\": state.numberValue ?? undefined,\n \"aria-valuemin\": minValue,\n \"aria-valuemax\": maxValue,\n \"aria-valuetext\": ariaValueText,\n \"aria-disabled\": disabled || undefined,\n \"aria-readonly\": readOnly || undefined,\n \"aria-required\": required || undefined,\n \"aria-invalid\": isInvalid ? true : undefined,\n \"aria-errormessage\": isInvalid && state.validationError ? errorId : undefined,\n disabled,\n readOnly,\n required,\n value: state.inputValue,\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onPaste: handlePaste,\n onCopy: copyBehavior !== \"formatted\" ? handleCopy : undefined,\n onCut: copyBehavior !== \"formatted\" ? handleCut : undefined,\n onCompositionStart: handleCompositionStart,\n onCompositionEnd: handleCompositionEnd,\n // RTL: numbers are always LTR, align-right in RTL contexts\n // unicodeBidi: embed isolates the LTR number from surrounding RTL text\n style: localeInfo.isRTL\n ? { direction: \"ltr\", textAlign: \"right\", unicodeBidi: \"embed\" }\n : undefined,\n // Data attributes for CSS styling\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-readonly\": readOnly ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n \"data-invalid\": isInvalid ? \"\" : undefined,\n \"data-rtl\": localeInfo.isRTL ? \"\" : undefined,\n } as React.InputHTMLAttributes<HTMLInputElement>;\n\n const hiddenInputProps: React.InputHTMLAttributes<HTMLInputElement> | null = name\n ? {\n type: \"hidden\",\n name,\n value: state.numberValue ?? \"\",\n \"aria-hidden\": true,\n }\n : null;\n\n const incrementButtonProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {\n type: \"button\",\n tabIndex: -1,\n \"aria-label\": \"Increase\",\n disabled: disabled || !state.canIncrement,\n // Press-and-hold handlers replace simple onClick\n ...incrementHold,\n \"data-disabled\": disabled || !state.canIncrement ? \"\" : undefined,\n } as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n const decrementButtonProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {\n type: \"button\",\n tabIndex: -1,\n \"aria-label\": \"Decrease\",\n disabled: disabled || !state.canDecrement,\n // Press-and-hold handlers replace simple onClick\n ...decrementHold,\n \"data-disabled\": disabled || !state.canDecrement ? \"\" : undefined,\n } as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n const descriptionProps: React.HTMLAttributes<HTMLElement> = {\n id: descriptionId,\n };\n\n const errorMessageProps: React.HTMLAttributes<HTMLElement> = {\n id: errorId,\n role: \"alert\",\n \"aria-live\": \"polite\",\n } as React.HTMLAttributes<HTMLElement>;\n\n return {\n labelProps,\n groupProps,\n inputProps,\n hiddenInputProps,\n incrementButtonProps,\n decrementButtonProps,\n descriptionProps,\n errorMessageProps,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { createFormatter } from \"../core/formatter.js\";\nimport type { UseNumberFieldStateOptions } from \"../core/types.js\";\n\ntype FormatOptions = Pick<\n UseNumberFieldStateOptions,\n | \"locale\"\n | \"formatOptions\"\n | \"prefix\"\n | \"suffix\"\n | \"minimumFractionDigits\"\n | \"maximumFractionDigits\"\n | \"fixedDecimalScale\"\n>;\n\n/**\n * Lightweight display-only formatting hook. Returns the formatted string for\n * a numeric value using the same Intl.NumberFormat engine as the full input.\n *\n * Use this when you need to display a formatted number in a read-only context\n * (table cells, summaries, labels) without the overhead of a full input state machine.\n *\n * @example\n * const price = useNumberFieldFormat(1234567.89, {\n * locale: 'en-US',\n * formatOptions: { style: 'currency', currency: 'USD' },\n * })\n * // price === \"$1,234,567.89\"\n *\n * @example\n * const pct = useNumberFieldFormat(0.4267, {\n * formatOptions: { style: 'percent', maximumFractionDigits: 1 },\n * })\n * // pct === \"42.7%\"\n */\nexport function useNumberFieldFormat(value: number | null, options: FormatOptions = {}): string {\n const {\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n } = options;\n\n const formatter = useMemo(\n () =>\n createFormatter({\n locale,\n formatOptions,\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n locale,\n JSON.stringify(formatOptions),\n prefix,\n suffix,\n minimumFractionDigits,\n maximumFractionDigits,\n fixedDecimalScale,\n ]\n );\n\n return useMemo(() => {\n if (value === null || value === undefined) return \"\";\n return formatter.format(value);\n }, [value, formatter]);\n}\n","import { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { NumberFieldAria, NumberFieldState, UseNumberFieldProps } from \"../core/types.js\";\n\nexport interface NumberFieldContextValue {\n state: NumberFieldState;\n aria: NumberFieldAria;\n inputRef: RefObject<HTMLInputElement | null>;\n props: UseNumberFieldProps;\n}\n\nexport const NumberFieldContext = createContext<NumberFieldContextValue | null>(null);\n\n/**\n * Hook for sub-components to access the NumberField context.\n * Throws if used outside NumberField.Root.\n */\nexport function useNumberFieldContext(): NumberFieldContextValue {\n const ctx = useContext(NumberFieldContext);\n if (!ctx) {\n throw new Error(\"[raqam] NumberField sub-components must be used inside <NumberField.Root>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { NumberFieldState, ScrubAreaOptions } from \"../core/types.js\";\n\nexport interface ScrubAreaReturn {\n /** Whether pointer lock is currently active */\n isScrubbing: boolean;\n /** Props to spread on the scrub area element */\n scrubAreaProps: {\n role: string;\n tabIndex: number;\n style: React.CSSProperties;\n \"aria-label\": string;\n \"data-scrubbing\": string | undefined;\n onPointerDown: (e: React.PointerEvent) => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n };\n /**\n * Virtual cursor position (screen coordinates, updated by mousemove\n * during pointer lock). Use for positioning the ScrubAreaCursor.\n */\n virtualCursor: { x: number; y: number };\n}\n\n/**\n * Implements Pointer Lock API–based drag-to-scrub behavior.\n *\n * Flow:\n * 1. User presses pointer down → element requests pointer lock\n * 2. Browser hides cursor, starts delivering movementX/Y on mousemove\n * 3. Accumulated movement ÷ pixelSensitivity → increment/decrement calls\n * 4. Pointer lock exits on Escape key or programmatic exit\n */\nexport function useScrubArea(\n state: NumberFieldState,\n options: ScrubAreaOptions = {}\n): ScrubAreaReturn {\n const { direction = \"horizontal\", pixelSensitivity = 4 } = options;\n\n const [isScrubbing, setIsScrubbingLocal] = useState(false);\n\n // Keep stable refs to avoid stale closures in event listeners\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const directionRef = useRef(direction);\n directionRef.current = direction;\n\n const sensitivityRef = useRef(pixelSensitivity);\n sensitivityRef.current = pixelSensitivity;\n\n const isScrubbingRef = useRef(false);\n const accumulatorRef = useRef(0);\n const elementRef = useRef<Element | null>(null);\n const virtualCursorRef = useRef({ x: 0, y: 0 });\n const [virtualCursor, setVirtualCursor] = useState({ x: 0, y: 0 });\n\n // Stable mousemove handler (always reads latest state via refs)\n const stableMouseMove = useRef((e: MouseEvent) => {\n if (!isScrubbingRef.current) return;\n\n // Update virtual cursor\n const nx = virtualCursorRef.current.x + e.movementX;\n const ny = virtualCursorRef.current.y + e.movementY;\n virtualCursorRef.current = { x: nx, y: ny };\n setVirtualCursor({ x: nx, y: ny });\n\n // Determine delta based on direction\n const dir = directionRef.current;\n let delta = 0;\n if (dir === \"horizontal\") {\n delta = e.movementX;\n } else if (dir === \"vertical\") {\n delta = -e.movementY;\n } else {\n delta = Math.abs(e.movementX) >= Math.abs(e.movementY) ? e.movementX : -e.movementY;\n }\n\n accumulatorRef.current += delta;\n\n // Fire step when accumulated movement exceeds sensitivity\n const sensitivity = sensitivityRef.current;\n while (accumulatorRef.current >= sensitivity) {\n stateRef.current.increment();\n accumulatorRef.current -= sensitivity;\n }\n while (accumulatorRef.current <= -sensitivity) {\n stateRef.current.decrement();\n accumulatorRef.current += sensitivity;\n }\n });\n\n // Stable pointer lock change handler\n const stablePointerLockChange = useRef(() => {\n if (document.pointerLockElement === elementRef.current) {\n // Lock acquired — start scrubbing\n isScrubbingRef.current = true;\n accumulatorRef.current = 0;\n setIsScrubbingLocal(true);\n stateRef.current.setIsScrubbing(true);\n document.addEventListener(\"mousemove\", stableMouseMove.current);\n } else {\n // Lock released — stop scrubbing\n isScrubbingRef.current = false;\n accumulatorRef.current = 0;\n document.removeEventListener(\"mousemove\", stableMouseMove.current);\n setIsScrubbingLocal(false);\n stateRef.current.setIsScrubbing(false);\n }\n });\n\n // Register stable pointerlockchange listener once on mount\n useEffect(() => {\n const handler = stablePointerLockChange.current;\n document.addEventListener(\"pointerlockchange\", handler);\n return () => {\n document.removeEventListener(\"pointerlockchange\", handler);\n document.removeEventListener(\"mousemove\", stableMouseMove.current);\n };\n }, []); // Empty deps — truly stable refs, no need to re-register\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (stateRef.current.options.disabled || stateRef.current.options.readOnly) return;\n if (e.button !== 0) return;\n\n const el = e.currentTarget as HTMLElement;\n elementRef.current = el;\n virtualCursorRef.current = { x: e.clientX, y: e.clientY };\n setVirtualCursor({ x: e.clientX, y: e.clientY });\n\n el.requestPointerLock();\n },\n [] // No deps — reads via refs\n );\n\n // Keyboard support: arrow keys while scrub area is focused\n const onKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (stateRef.current.options.disabled || stateRef.current.options.readOnly) return;\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n stateRef.current.increment();\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n stateRef.current.decrement();\n }\n }, []);\n\n // Cursor CSS based on direction\n const cursorStyle =\n direction === \"horizontal\" ? \"ew-resize\" : direction === \"vertical\" ? \"ns-resize\" : \"move\";\n\n const scrubAreaProps = {\n role: \"slider\",\n tabIndex: state.options.disabled ? -1 : 0,\n style: {\n cursor: state.options.disabled ? undefined : cursorStyle,\n userSelect: \"none\" as const,\n WebkitUserSelect: \"none\" as const,\n } satisfies React.CSSProperties,\n \"aria-label\": \"Scrub to change value\",\n \"data-scrubbing\": isScrubbing ? \"\" : undefined,\n onPointerDown,\n onKeyDown,\n };\n\n return { isScrubbing, scrubAreaProps, virtualCursor };\n}\n","\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\nimport type {\n NumberFieldRootProps,\n NumberFieldState,\n RenderProp,\n ScrubAreaCursorProps,\n ScrubAreaProps,\n} from \"../core/types.js\";\nimport { NumberFieldContext, useNumberFieldContext } from \"./context.js\";\nimport { useNumberField } from \"./useNumberField.js\";\nimport { useNumberFieldState } from \"./useNumberFieldState.js\";\nimport { useScrubArea } from \"./useScrubArea.js\";\n\n// ── Render prop utility ───────────────────────────────────────────────────────\n\n/**\n * Merge component props with a `render` prop.\n * Accepts either a React element or a render function.\n */\nfunction renderWith(\n defaultElement: React.ReactElement,\n render: RenderProp | undefined,\n state: NumberFieldState\n): React.ReactElement {\n if (!render) return defaultElement;\n\n if (typeof render === \"function\") {\n return render(defaultElement.props as Record<string, unknown>, state);\n }\n\n // Element form: clone with merged props\n return React.cloneElement(\n render,\n Object.assign(\n {},\n defaultElement.props as Record<string, unknown>,\n render.props as Record<string, unknown>\n )\n );\n}\n\n// ── Data attributes helper ────────────────────────────────────────────────────\n\nfunction stateDataAttrs(\n state: NumberFieldState,\n isInvalid: boolean\n): Record<string, string | undefined> {\n const { options } = state;\n return {\n \"data-disabled\": options.disabled ? \"\" : undefined,\n \"data-readonly\": options.readOnly ? \"\" : undefined,\n \"data-required\": options.required ? \"\" : undefined,\n \"data-scrubbing\": state.isScrubbing ? \"\" : undefined,\n \"data-focused\": state.isFocused ? \"\" : undefined,\n \"data-invalid\": isInvalid ? \"\" : undefined,\n };\n}\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\n// HTML attributes that belong on the wrapper div (not passed to state/aria hooks)\nconst DIV_ONLY_KEYS = new Set([\n \"className\",\n \"style\",\n \"id\",\n \"tabIndex\",\n \"title\",\n \"role\",\n \"aria-label\",\n \"data-testid\",\n \"onClick\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n]);\n\nfunction splitProps(props: Record<string, unknown>) {\n const fieldProps: Record<string, unknown> = {};\n const divProps: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(props)) {\n if (DIV_ONLY_KEYS.has(key) || key.startsWith(\"data-\") || key.startsWith(\"aria-\")) {\n divProps[key] = val;\n } else {\n fieldProps[key] = val;\n }\n }\n return { fieldProps, divProps };\n}\n\nconst Root = forwardRef<HTMLDivElement, NumberFieldRootProps>(function NumberFieldRoot(\n { children, onValueChange, onValueCommitted, ...allProps },\n ref\n) {\n const inputRef = useRef<HTMLInputElement>(null);\n const { fieldProps, divProps } = splitProps(allProps as Record<string, unknown>);\n const props = fieldProps as Omit<\n NumberFieldRootProps,\n \"children\" | \"onValueChange\" | \"onValueCommitted\"\n >;\n\n // Keep a stable ref to onValueChange so the onChange closure never goes stale\n const onValueChangeRef = useRef(onValueChange);\n onValueChangeRef.current = onValueChange;\n\n // Keep a stable ref to the state object so onChange can read the current reason\n const stateRef = useRef<NumberFieldState | null>(null);\n\n // Wrap onChange to also fire onValueChange with the tracked reason.\n // This closure captures stateRef (stable) not state (changes each render).\n // _setLastChangeReason is called synchronously BEFORE the state mutation\n // that triggers onChange, so stateRef.current._getLastChangeReason() always\n // returns the correct reason at the time onChange fires.\n const wrappedProps = {\n ...props,\n onChange: (value: number | null) => {\n props.onChange?.(value);\n if (onValueChangeRef.current && stateRef.current) {\n onValueChangeRef.current(value, {\n reason: stateRef.current._getLastChangeReason(),\n formattedValue: stateRef.current.inputValue,\n });\n }\n },\n };\n\n const state = useNumberFieldState(wrappedProps);\n stateRef.current = state; // always keep stateRef pointing to current state\n\n const aria = useNumberField(wrappedProps, state, inputRef);\n\n // Determine if field is invalid (out-of-range or failed validate)\n const isInvalid =\n state.validationState === \"invalid\" ||\n (state.numberValue !== null &&\n ((props.minValue !== undefined && state.numberValue < props.minValue) ||\n (props.maxValue !== undefined && state.numberValue > props.maxValue)));\n\n return (\n <NumberFieldContext.Provider value={{ state, aria, inputRef, props: wrappedProps }}>\n <div\n ref={ref}\n {...(divProps as React.HTMLAttributes<HTMLDivElement>)}\n {...stateDataAttrs(state, isInvalid)}\n >\n {children}\n </div>\n </NumberFieldContext.Provider>\n );\n});\n\n// ── Label ─────────────────────────────────────────────────────────────────────\n\ninterface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(function NumberFieldLabel(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <label ref={ref} {...aria.labelProps} {...rest}>\n {children}\n </label>\n );\n return renderWith(el, render, state);\n});\n\n// ── Group ─────────────────────────────────────────────────────────────────────\n\ninterface GroupProps extends React.HTMLAttributes<HTMLDivElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Group = forwardRef<HTMLDivElement, GroupProps>(function NumberFieldGroup(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <div ref={ref} {...aria.groupProps} {...rest}>\n {children}\n </div>\n );\n return renderWith(el, render, state);\n});\n\n// ── Input ─────────────────────────────────────────────────────────────────────\n\ninterface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n render?: RenderProp;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(function NumberFieldInput(\n { render, ...rest },\n _ref\n) {\n const { aria, state, inputRef } = useNumberFieldContext();\n const el = (\n <input ref={inputRef as React.RefObject<HTMLInputElement>} {...aria.inputProps} {...rest} />\n );\n return renderWith(el, render, state);\n});\n\n// ── Increment ─────────────────────────────────────────────────────────────────\n\ninterface IncrementProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Increment = forwardRef<HTMLButtonElement, IncrementProps>(function NumberFieldIncrement(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <button ref={ref} {...aria.incrementButtonProps} {...rest}>\n {children ?? \"+\"}\n </button>\n );\n return renderWith(el, render, state);\n});\n\n// ── Decrement ─────────────────────────────────────────────────────────────────\n\ninterface DecrementProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n render?: RenderProp;\n children?: React.ReactNode;\n}\n\nconst Decrement = forwardRef<HTMLButtonElement, DecrementProps>(function NumberFieldDecrement(\n { render, children, ...rest },\n ref\n) {\n const { aria, state } = useNumberFieldContext();\n const el = (\n <button ref={ref} {...aria.decrementButtonProps} {...rest}>\n {children ?? \"−\"}\n </button>\n );\n return renderWith(el, render, state);\n});\n\n// ── HiddenInput ───────────────────────────────────────────────────────────────\n\nconst HiddenInput = function NumberFieldHiddenInput() {\n const { aria } = useNumberFieldContext();\n if (!aria.hiddenInputProps) return null;\n return <input {...aria.hiddenInputProps} />;\n};\n\n// ── ScrubArea ─────────────────────────────────────────────────────────────────\n\nconst ScrubArea = forwardRef<HTMLSpanElement, ScrubAreaProps>(function NumberFieldScrubArea(\n { render, children, direction = \"horizontal\", pixelSensitivity = 4, ...rest },\n ref\n) {\n const { state } = useNumberFieldContext();\n const { scrubAreaProps } = useScrubArea(state, { direction, pixelSensitivity });\n\n const el = (\n <span ref={ref} {...scrubAreaProps} {...(rest as React.HTMLAttributes<HTMLSpanElement>)}>\n {children}\n </span>\n );\n return renderWith(el, render, state);\n});\n\n// ── ScrubAreaCursor ───────────────────────────────────────────────────────────\n//\n// Renders a custom cursor element positioned at the virtual cursor location\n// during pointer lock. Use this to show a drag handle icon while scrubbing.\n// Rendered only when isScrubbing is true.\n\nconst ScrubAreaCursor = forwardRef<HTMLSpanElement, ScrubAreaCursorProps>(\n function NumberFieldScrubAreaCursor({ render, children, style, ...rest }, ref) {\n const { state } = useNumberFieldContext();\n\n if (!state.isScrubbing) return null;\n\n const el = (\n <span\n ref={ref}\n style={{\n position: \"fixed\",\n pointerEvents: \"none\",\n zIndex: 9999,\n ...style,\n }}\n {...(rest as React.HTMLAttributes<HTMLSpanElement>)}\n >\n {children}\n </span>\n );\n return renderWith(el, render, state);\n }\n);\n\n// ── Description ───────────────────────────────────────────────────────────────\n\ninterface DescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children?: React.ReactNode;\n}\n\nconst Description = forwardRef<HTMLParagraphElement, DescriptionProps>(\n function NumberFieldDescription({ children, ...rest }, ref) {\n const { aria } = useNumberFieldContext();\n return (\n <p ref={ref} {...aria.descriptionProps} {...rest}>\n {children}\n </p>\n );\n }\n);\n\n// ── ErrorMessage ──────────────────────────────────────────────────────────────\n\ninterface ErrorMessageProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children?: React.ReactNode;\n}\n\nconst ErrorMessage = forwardRef<HTMLParagraphElement, ErrorMessageProps>(\n function NumberFieldErrorMessage({ children, ...rest }, ref) {\n const { aria, state } = useNumberFieldContext();\n // If no children provided, fall back to the validation error string (if any)\n const content = children ?? state.validationError ?? null;\n if (!content) return null;\n return (\n <p ref={ref} {...aria.errorMessageProps} {...rest}>\n {content}\n </p>\n );\n }\n);\n\n// ── Formatted ─────────────────────────────────────────────────────────────────\n//\n// Read-only display of the current formatted value. Useful for showing the\n// formatted number inline without an editable input (e.g., in a data table).\n\ninterface FormattedProps extends React.HTMLAttributes<HTMLSpanElement> {\n render?: RenderProp;\n}\n\nconst Formatted = forwardRef<HTMLSpanElement, FormattedProps>(function NumberFieldFormatted(\n { render, ...rest },\n ref\n) {\n const { state } = useNumberFieldContext();\n const el = (\n <span ref={ref} aria-hidden=\"true\" {...rest}>\n {state.inputValue}\n </span>\n );\n return renderWith(el, render, state);\n});\n\n// ── Namespace export ──────────────────────────────────────────────────────────\n\nexport const NumberField = {\n Root,\n Label,\n Group,\n Input,\n Increment,\n Decrement,\n HiddenInput,\n ScrubArea,\n ScrubAreaCursor,\n Description,\n ErrorMessage,\n Formatted,\n};\n"]}