@comitor/ui 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +5 -1
  2. package/dist/components/composite/toast.d.ts +2 -1
  3. package/dist/components/composite/toast.js +3 -9
  4. package/dist/components/composite/toast.js.map +1 -1
  5. package/dist/components/ui/action-bar.js +45 -1
  6. package/dist/components/ui/action-bar.js.map +1 -1
  7. package/dist/components/ui/circular-progress.js +10 -2
  8. package/dist/components/ui/circular-progress.js.map +1 -1
  9. package/dist/components/ui/kanban.js +9 -3
  10. package/dist/components/ui/kanban.js.map +1 -1
  11. package/dist/components/ui/key-value.js +70 -76
  12. package/dist/components/ui/key-value.js.map +1 -1
  13. package/dist/components/ui/mask-input-constants.js +31 -71
  14. package/dist/components/ui/mask-input-constants.js.map +1 -1
  15. package/dist/components/ui/mask-input.js +18 -20
  16. package/dist/components/ui/mask-input.js.map +1 -1
  17. package/dist/components/ui/phone-input.js +5 -2
  18. package/dist/components/ui/phone-input.js.map +1 -1
  19. package/dist/components/ui/rating.js +4 -2
  20. package/dist/components/ui/rating.js.map +1 -1
  21. package/dist/components/ui/slider.d.ts +1 -1
  22. package/dist/components/ui/slider.js +15 -1
  23. package/dist/components/ui/slider.js.map +1 -1
  24. package/dist/components/ui/sonner.js +2 -0
  25. package/dist/components/ui/sonner.js.map +1 -1
  26. package/dist/components/ui/toggle-group.js +12 -1
  27. package/dist/components/ui/toggle-group.js.map +1 -1
  28. package/dist/components/ui/tour.js +3 -2
  29. package/dist/components/ui/tour.js.map +1 -1
  30. package/dist/data-grid/use-data-grid.d.ts +2 -2
  31. package/dist/i18n/locale-provider.d.ts +18 -0
  32. package/dist/i18n/locale-provider.js.map +1 -1
  33. package/dist/i18n/namespaces/rating.js +2 -1
  34. package/dist/i18n/namespaces/rating.js.map +1 -1
  35. package/dist/i18n/namespaces/shell.d.ts +4 -0
  36. package/dist/i18n/namespaces/shell.js +1 -1
  37. package/dist/i18n/namespaces/shell.js.map +1 -1
  38. package/dist/i18n/namespaces/toast.d.ts +3 -2
  39. package/dist/i18n/namespaces/toast.js.map +1 -1
  40. package/dist/lib/toast-language.d.ts +8 -0
  41. package/dist/lib/toast-language.js +19 -0
  42. package/dist/lib/toast-language.js.map +1 -0
  43. package/dist/shell/display-axis-provider.d.ts +1 -1
  44. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/mask-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/mask-input) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\n/*\n * ⚠ Khác thượng nguồn: thượng nguồn là MỘT file. Ở đây nửa trên (bảng `MASK_PATTERNS` + mọi hàm\n * thuần) nằm ở `mask-input-constants.ts` — hằng dữ liệu export ra không được sống trong file\n * `\"use client\"` (Server Component đọc ra `undefined`, không throw). File này chỉ còn component,\n * và chỉ `import` từ đó, KHÔNG `export` lại (re-export vòng qua file client là vô hiệu).\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { useComitorLocale } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport {\n applyMask,\n CURRENCY_PERCENTAGE_SYMBOLS,\n DEFAULT_CURRENCY,\n fromUnmaskedIndex,\n getCurrencyCaretPosition,\n getPatternCaretPosition,\n getUnmaskedValue,\n isCurrencyAtEnd,\n isCurrencyMask,\n MASK_PATTERNS,\n type MaskPattern,\n type MaskPatternKey,\n NUMERIC_MASK_PATTERNS,\n REGEX_CACHE,\n toUnmaskedIndex\n} from \"./mask-input-constants.js\";\n\ntype InputElement = React.ComponentRef<\"input\">;\n\ninterface MaskInputProps extends React.ComponentProps<\"input\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (maskedValue: string, unmaskedValue: string) => void;\n onValidate?: (isValid: boolean, unmaskedValue: string) => void;\n validationMode?: \"onChange\" | \"onBlur\" | \"onSubmit\" | \"onTouched\" | \"all\";\n /**\n * Tên một mẫu dựng sẵn (`\"currency\"`, `\"percentage\"`, `\"time\"`, `\"creditCard\"`…) hoặc một\n * `MaskPattern` tự viết. ⚠ `\"phone\"`, `\"date\"`, `\"ssn\"`, `\"zipCode\"`, `\"ein\"` là định dạng Hoa Kỳ\n * — số điện thoại ở app Comitor dùng `PhoneInput`.\n */\n mask?: MaskPatternKey | MaskPattern;\n maskPlaceholder?: string;\n /**\n * Mã tiền tệ ISO 4217 cho `mask=\"currency\"`. Mặc định `\"USD\"`, như thượng nguồn.\n *\n * Tiền tệ là thiết lập VÙNG / nghiệp vụ, không suy từ ngôn ngữ: app Comitor truyền từ cài đặt\n * workspace (vd `\"VND\"`). Trước `3.0.0` mặc định cứng là `\"VND\"`.\n */\n currency?: string;\n /**\n * Locale BCP 47 cho `mask=\"currency\"` — quyết định dấu nhóm, dấu thập phân và vị trí ký hiệu.\n * Không truyền thì theo `locale` của `ComitorLocaleProvider` (không có provider → `\"en\"` →\n * `$1,234,567`; `\"vi\"` kèm `currency=\"VND\"` → `1.234.567 ₫`).\n *\n * ⚠ Khác thượng nguồn: thượng nguồn mặc định cứng `\"en-US\"`. Trước `3.0.0` mặc định cứng là\n * `\"vi-VN\"`.\n */\n locale?: string;\n asChild?: boolean;\n invalid?: boolean;\n withoutMask?: boolean;\n}\n\nfunction MaskInput(props: MaskInputProps) {\n const {\n value: valueProp,\n defaultValue,\n onValueChange: onValueChangeProp,\n onValidate,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onPaste: onPasteProp,\n onCompositionStart: onCompositionStartProp,\n onCompositionEnd: onCompositionEndProp,\n validationMode = \"onChange\",\n mask,\n maskPlaceholder,\n currency = DEFAULT_CURRENCY,\n locale: localeProp,\n placeholder,\n inputMode,\n min,\n max,\n maxLength,\n asChild = false,\n disabled = false,\n invalid = false,\n readOnly = false,\n required = false,\n withoutMask = false,\n className,\n ref,\n ...inputProps\n } = props;\n\n const { locale: providerLocale } = useComitorLocale();\n const locale = localeProp ?? providerLocale;\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? \"\");\n const [focused, setFocused] = React.useState(false);\n const [composing, setComposing] = React.useState(false);\n const [touched, setTouched] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const composedRef = useComposedRefs(ref, inputRef);\n\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const maskPattern = React.useMemo(() => {\n if (typeof mask === \"string\") {\n return MASK_PATTERNS[mask];\n }\n return mask;\n }, [mask]);\n\n const transformOpts = React.useMemo(\n () => ({\n currency,\n locale\n }),\n [currency, locale]\n );\n\n const placeholderValue = React.useMemo(() => {\n if (withoutMask) return placeholder;\n\n if (placeholder && maskPlaceholder) {\n return focused ? maskPlaceholder : placeholder;\n }\n\n if (maskPlaceholder) {\n return focused ? maskPlaceholder : undefined;\n }\n\n return placeholder;\n }, [placeholder, maskPlaceholder, focused, withoutMask]);\n\n const displayValue = React.useMemo(() => {\n if (withoutMask || !maskPattern || !value) return value ?? \"\";\n const unmasked = getUnmaskedValue({\n value,\n transform: maskPattern.transform,\n ...transformOpts\n });\n return applyMask({\n value: unmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n }, [value, maskPattern, withoutMask, transformOpts, mask]);\n\n const tokenCount = React.useMemo(() => {\n if (!maskPattern || CURRENCY_PERCENTAGE_SYMBOLS.test(maskPattern.pattern)) return undefined;\n return maskPattern.pattern.match(REGEX_CACHE.hashPattern)?.length ?? 0;\n }, [maskPattern]);\n\n const calculatedMaxLength = tokenCount ? maskPattern?.pattern.length : maxLength;\n\n const calculatedInputMode = React.useMemo(() => {\n if (inputMode) return inputMode;\n if (!maskPattern) return undefined;\n\n if (mask === \"currency\" || mask === \"percentage\" || mask === \"ipv4\") {\n return \"decimal\";\n }\n\n if (typeof mask === \"string\" && NUMERIC_MASK_PATTERNS.test(mask)) {\n return \"numeric\";\n }\n return undefined;\n }, [maskPattern, mask, inputMode]);\n\n const shouldValidate = React.useCallback(\n (trigger: \"change\" | \"blur\") => {\n if (!onValidate || !maskPattern?.validate) return false;\n\n switch (validationMode) {\n case \"onChange\":\n return trigger === \"change\";\n case \"onBlur\":\n return trigger === \"blur\";\n case \"onSubmit\":\n return false;\n case \"onTouched\":\n return touched ? trigger === \"change\" : trigger === \"blur\";\n case \"all\":\n return true;\n default:\n return trigger === \"change\";\n }\n },\n [onValidate, maskPattern, validationMode, touched]\n );\n\n const validationOpts = React.useMemo(\n () => ({\n min: typeof min === \"string\" ? Number.parseFloat(min) : min,\n max: typeof max === \"string\" ? Number.parseFloat(max) : max\n }),\n [min, max]\n );\n\n const onInputValidate = React.useCallback(\n (unmaskedValue: string) => {\n if (onValidate && maskPattern?.validate) {\n const isValid = maskPattern.validate(unmaskedValue, validationOpts);\n onValidate(isValid, unmaskedValue);\n }\n },\n [onValidate, maskPattern?.validate, validationOpts]\n );\n\n const onValueChange = React.useCallback(\n (event: React.ChangeEvent<InputElement>) => {\n const inputValue = event.target.value;\n let newValue = inputValue;\n let unmaskedValue = inputValue;\n\n if (composing) {\n if (!isControlled) setInternalValue(inputValue);\n return;\n }\n\n if (withoutMask || !maskPattern) {\n if (!isControlled) setInternalValue(inputValue);\n if (shouldValidate(\"change\")) onValidate?.(true, inputValue);\n onValueChangeProp?.(inputValue, inputValue);\n return;\n }\n\n if (maskPattern) {\n unmaskedValue = getUnmaskedValue({\n value: inputValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n newValue = applyMask({\n value: unmaskedValue,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n if (inputRef.current && newValue !== inputValue) {\n const inputElement = inputRef.current;\n if (!(inputElement instanceof HTMLInputElement)) return;\n\n const oldCursorPosition = inputElement.selectionStart ?? 0;\n\n inputElement.value = newValue;\n\n const currentUnmasked = getUnmaskedValue({\n value: newValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n\n let newCursorPosition: number;\n\n const previousUnmasked = getUnmaskedValue({\n value,\n transform: maskPattern.transform,\n ...transformOpts\n });\n\n if (CURRENCY_PERCENTAGE_SYMBOLS.test(maskPattern.pattern)) {\n newCursorPosition = getCurrencyCaretPosition({\n newValue,\n mask,\n transformOpts,\n oldCursorPosition,\n oldValue: inputValue,\n previousUnmasked\n });\n } else {\n newCursorPosition = getPatternCaretPosition({\n newValue,\n maskPattern,\n currentUnmasked,\n oldCursorPosition,\n oldValue: inputValue,\n previousUnmasked\n });\n }\n\n if (isCurrencyMask({ mask, pattern: maskPattern.pattern })) {\n if (mask === \"currency\") {\n const currencyAtEnd = isCurrencyAtEnd(transformOpts);\n if (!currencyAtEnd) {\n newCursorPosition = Math.max(1, newCursorPosition);\n }\n } else {\n newCursorPosition = Math.max(1, newCursorPosition);\n }\n } else if (maskPattern.pattern.includes(\"%\")) {\n newCursorPosition = Math.min(newValue.length - 1, newCursorPosition);\n }\n\n newCursorPosition = Math.min(newCursorPosition, newValue.length);\n\n inputElement.setSelectionRange(newCursorPosition, newCursorPosition);\n }\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n if (shouldValidate(\"change\")) {\n onInputValidate(unmaskedValue);\n }\n\n onValueChangeProp?.(newValue, unmaskedValue);\n },\n [\n maskPattern,\n isControlled,\n onValueChangeProp,\n onValidate,\n onInputValidate,\n composing,\n shouldValidate,\n withoutMask,\n transformOpts,\n mask,\n value\n ]\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onFocusProp?.(event);\n if (event.defaultPrevented) return;\n\n setFocused(true);\n },\n [onFocusProp]\n );\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onBlurProp?.(event);\n if (event.defaultPrevented) return;\n\n setFocused(false);\n\n if (!touched) {\n setTouched(true);\n }\n\n if (shouldValidate(\"blur\")) {\n const currentValue = event.target.value;\n const unmaskedValue = maskPattern\n ? getUnmaskedValue({\n value: currentValue,\n transform: maskPattern.transform,\n ...transformOpts\n })\n : currentValue;\n onInputValidate(unmaskedValue);\n }\n },\n [onBlurProp, touched, shouldValidate, onInputValidate, maskPattern, transformOpts]\n );\n\n const onCompositionStart = React.useCallback(\n (event: React.CompositionEvent<InputElement>) => {\n onCompositionStartProp?.(event);\n if (event.defaultPrevented) return;\n\n setComposing(true);\n },\n [onCompositionStartProp]\n );\n\n const onCompositionEnd = React.useCallback(\n (event: React.CompositionEvent<InputElement>) => {\n onCompositionEndProp?.(event);\n if (event.defaultPrevented) return;\n\n setComposing(false);\n\n const inputElement = inputRef.current;\n if (!inputElement) return;\n if (!(inputElement instanceof HTMLInputElement)) return;\n const inputValue = inputElement.value;\n\n if (!maskPattern || withoutMask) {\n if (!isControlled) setInternalValue(inputValue);\n if (shouldValidate(\"change\")) onValidate?.(true, inputValue);\n onValueChangeProp?.(inputValue, inputValue);\n return;\n }\n\n const unmasked = getUnmaskedValue({\n value: inputValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n const masked = applyMask({\n value: unmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n if (!isControlled) setInternalValue(masked);\n if (shouldValidate(\"change\")) onInputValidate(unmasked);\n onValueChangeProp?.(masked, unmasked);\n },\n [\n onCompositionEndProp,\n maskPattern,\n withoutMask,\n isControlled,\n shouldValidate,\n onValidate,\n onValueChangeProp,\n transformOpts,\n mask,\n onInputValidate\n ]\n );\n\n const onPaste = React.useCallback(\n (event: React.ClipboardEvent<InputElement>) => {\n onPasteProp?.(event);\n if (event.defaultPrevented) return;\n\n if (withoutMask || !maskPattern) return;\n\n if (mask === \"ipv4\") return;\n\n const target = event.target as InputElement;\n if (!(target instanceof HTMLInputElement)) return;\n\n const pastedData = event.clipboardData.getData(\"text\");\n if (!pastedData) return;\n\n event.preventDefault();\n\n const currentValue = target.value;\n const selectionStart = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n\n const beforeSelection = currentValue.slice(0, selectionStart);\n const afterSelection = currentValue.slice(selectionEnd);\n const newInputValue = beforeSelection + pastedData + afterSelection;\n\n const unmasked = getUnmaskedValue({\n value: newInputValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n const newMaskedValue = applyMask({\n value: unmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n target.value = newMaskedValue;\n\n if (isCurrencyMask({ mask, pattern: maskPattern.pattern })) {\n const currencyAtEnd = isCurrencyAtEnd(transformOpts);\n const caret = currencyAtEnd ? newMaskedValue.search(/\\s*[^\\d\\s]+$/) : newMaskedValue.length;\n target.setSelectionRange(caret, caret);\n return;\n }\n\n if (maskPattern.pattern.includes(\"%\")) {\n target.setSelectionRange(newMaskedValue.length - 1, newMaskedValue.length - 1);\n return;\n }\n\n let newCursorPosition = newMaskedValue.length;\n try {\n const unmaskedCount = unmasked.length;\n let position = 0;\n let count = 0;\n\n for (let i = 0; i < maskPattern.pattern.length && i < newMaskedValue.length; i++) {\n if (maskPattern.pattern[i] === \"#\") {\n count++;\n if (count <= unmaskedCount) {\n position = i + 1;\n }\n }\n }\n newCursorPosition = position;\n } catch {\n // Lỗi thì để con trỏ ở cuối.\n }\n\n target.setSelectionRange(newCursorPosition, newCursorPosition);\n\n if (!isControlled) setInternalValue(newMaskedValue);\n if (shouldValidate(\"change\")) onInputValidate(unmasked);\n onValueChangeProp?.(newMaskedValue, unmasked);\n },\n [\n onPasteProp,\n withoutMask,\n maskPattern,\n mask,\n transformOpts,\n isControlled,\n shouldValidate,\n onInputValidate,\n onValueChangeProp\n ]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<InputElement>) => {\n onKeyDownProp?.(event);\n if (event.defaultPrevented) return;\n\n if (withoutMask || !maskPattern) return;\n\n if (mask === \"ipv4\") return;\n\n if (event.key === \"Backspace\") {\n const target = event.target as InputElement;\n if (!(target instanceof HTMLInputElement)) return;\n const cursorPosition = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n const currentValue = target.value;\n\n if (\n mask === \"currency\" ||\n mask === \"percentage\" ||\n maskPattern.pattern.includes(\"$\") ||\n maskPattern.pattern.includes(\"€\") ||\n maskPattern.pattern.includes(\"%\")\n ) {\n return;\n }\n\n if (cursorPosition !== selectionEnd) {\n return;\n }\n\n if (cursorPosition > 0) {\n const charBeforeCursor = currentValue[cursorPosition - 1];\n\n if (charBeforeCursor) {\n event.preventDefault();\n\n const unmaskedIndex = toUnmaskedIndex({\n masked: currentValue,\n pattern: maskPattern.pattern,\n caret: cursorPosition\n });\n\n if (unmaskedIndex > 0) {\n const currentUnmasked = getUnmaskedValue({\n value: currentValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n const nextUnmasked = currentUnmasked.slice(0, unmaskedIndex - 1) + currentUnmasked.slice(unmaskedIndex);\n const nextMasked = applyMask({\n value: nextUnmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n target.value = nextMasked;\n const nextCaret = fromUnmaskedIndex({\n masked: nextMasked,\n pattern: maskPattern.pattern,\n unmaskedIndex: unmaskedIndex - 1\n });\n\n target.setSelectionRange(nextCaret, nextCaret);\n\n onValueChangeProp?.(nextMasked, nextUnmasked);\n }\n return;\n }\n }\n }\n\n if (event.key === \"Delete\") {\n const target = event.target as InputElement;\n if (!(target instanceof HTMLInputElement)) return;\n const cursorPosition = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n const currentValue = target.value;\n\n if (\n mask === \"currency\" ||\n mask === \"percentage\" ||\n maskPattern.pattern.includes(\"$\") ||\n maskPattern.pattern.includes(\"€\") ||\n maskPattern.pattern.includes(\"%\")\n ) {\n return;\n }\n\n if (cursorPosition !== selectionEnd) {\n return;\n }\n\n if (cursorPosition < currentValue.length) {\n const charAtCursor = currentValue[cursorPosition];\n\n if (charAtCursor) {\n event.preventDefault();\n\n const unmaskedIndex = toUnmaskedIndex({\n masked: currentValue,\n pattern: maskPattern.pattern,\n caret: cursorPosition\n });\n\n const currentUnmasked = getUnmaskedValue({\n value: currentValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n\n if (unmaskedIndex < currentUnmasked.length) {\n const nextUnmasked = currentUnmasked.slice(0, unmaskedIndex) + currentUnmasked.slice(unmaskedIndex + 1);\n const nextMasked = applyMask({\n value: nextUnmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n target.value = nextMasked;\n const nextCaret = fromUnmaskedIndex({\n masked: nextMasked,\n pattern: maskPattern.pattern,\n unmaskedIndex: unmaskedIndex\n });\n\n target.setSelectionRange(nextCaret, nextCaret);\n\n onValueChangeProp?.(nextMasked, nextUnmasked);\n }\n return;\n }\n }\n }\n },\n [maskPattern, onKeyDownProp, onValueChangeProp, transformOpts, mask, withoutMask]\n );\n\n const InputPrimitive = asChild ? Slot : \"input\";\n\n return (\n <InputPrimitive\n // ⚠ Khác thượng nguồn: chỉ phát thuộc tính khi THẬT SỰ lỗi — `aria-invalid=\"false\"` hợp lệ\n // nhưng thừa, và cùng quy ước với `Input`/`Combobox` của gói. Đặt TRƯỚC spread để\n // `aria-invalid` do `<FormControl>` dán vào vẫn thắng.\n aria-invalid={invalid || undefined}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n data-required={required ? \"\" : undefined}\n data-slot=\"mask-input\"\n {...inputProps}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: chuỗi lớp của `Input` Comitor thay cho của shadcn, để ô có mặt nạ\n * đứng cạnh ô nhập thường trong cùng một form không lệch nhau (cao, nền, viền, cỡ chữ,\n * focus). Số đo của từng vai trò ở chú thích đầu `input.tsx`:\n * viền nghỉ `border-input` · hover `--control-edge-strong` · focus `--primary-ink`;\n * lỗi `border-destructive-ink` (không phải `border-destructive` — token TÔ NỀN).\n * Bỏ `dark:bg-input/30` (viết thẳng thang màu — bảng tương phản cao không đổi được) và\n * `shadow-xs` (không có trong bộ bóng của gói).\n */\n \"w-full h-9 px-3 rounded-md border bg-background text-sm text-foreground placeholder:text-muted-foreground\",\n \"transition-colors duration-150 ease-out\",\n \"focus:outline-none focus:ring-2 focus:ring-ring/50 focus:border-primary-ink\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-muted\",\n \"border-input hover:border-control-edge-strong\",\n \"aria-invalid:border-destructive-ink aria-invalid:hover:border-destructive-ink aria-invalid:focus:border-destructive-ink aria-invalid:focus:ring-destructive/30\",\n className\n )}\n placeholder={placeholderValue}\n ref={composedRef}\n value={displayValue}\n disabled={disabled}\n maxLength={calculatedMaxLength}\n readOnly={readOnly}\n required={required}\n inputMode={calculatedInputMode}\n min={min}\n max={max}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onChange={onValueChange}\n onCompositionStart={onCompositionStart}\n onCompositionEnd={onCompositionEnd}\n />\n );\n}\n\nexport { MaskInput, type MaskInputProps };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/mask-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/mask-input) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\n/*\n * ⚠ Khác thượng nguồn: thượng nguồn là MỘT file. Ở đây nửa trên (bảng `MASK_PATTERNS` + mọi hàm\n * thuần) nằm ở `mask-input-constants.ts` — hằng dữ liệu export ra không được sống trong file\n * `\"use client\"` (Server Component đọc ra `undefined`, không throw). File này chỉ còn component,\n * và chỉ `import` từ đó, KHÔNG `export` lại (re-export vòng qua file client là vô hiệu).\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { useComitorLocale } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport {\n applyMask,\n CURRENCY_PERCENTAGE_SYMBOLS,\n DEFAULT_CURRENCY,\n fromUnmaskedIndex,\n getCurrencyCaretPosition,\n getPatternCaretPosition,\n getUnmaskedValue,\n isCurrencyAtEnd,\n isCurrencyMask,\n MASK_PATTERNS,\n type MaskPattern,\n type MaskPatternKey,\n NUMERIC_MASK_PATTERNS,\n REGEX_CACHE,\n toUnmaskedIndex\n} from \"./mask-input-constants.js\";\n\ntype InputElement = React.ComponentRef<\"input\">;\n\ninterface MaskInputProps extends React.ComponentProps<\"input\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (maskedValue: string, unmaskedValue: string) => void;\n onValidate?: (isValid: boolean, unmaskedValue: string) => void;\n validationMode?: \"onChange\" | \"onBlur\" | \"onSubmit\" | \"onTouched\" | \"all\";\n /**\n * Tên một mẫu dựng sẵn (`\"currency\"`, `\"percentage\"`, `\"time\"`, `\"creditCard\"`…) hoặc một\n * `MaskPattern` tự viết. ⚠ `\"phone\"`, `\"date\"`, `\"ssn\"`, `\"zipCode\"`, `\"ein\"` là định dạng Hoa Kỳ\n * — số điện thoại ở app Comitor dùng `PhoneInput`.\n */\n mask?: MaskPatternKey | MaskPattern;\n maskPlaceholder?: string;\n /**\n * Mã tiền tệ ISO 4217 cho `mask=\"currency\"`. Mặc định `\"USD\"`, như thượng nguồn.\n *\n * Tiền tệ là thiết lập VÙNG / nghiệp vụ, không suy từ ngôn ngữ: app Comitor truyền từ cài đặt\n * workspace (vd `\"VND\"`). Trước `3.0.0` mặc định cứng là `\"VND\"`.\n */\n currency?: string;\n /**\n * Locale BCP 47 cho `mask=\"currency\"` — quyết định dấu nhóm, dấu thập phân và vị trí ký hiệu.\n * Không truyền thì theo `locale` của `ComitorLocaleProvider` (không có provider → `\"en\"` →\n * `$1,234,567`; `\"vi\"` kèm `currency=\"VND\"` → `1.234.567 ₫`).\n *\n * ⚠ Khác thượng nguồn: thượng nguồn mặc định cứng `\"en-US\"`. Trước `3.0.0` mặc định cứng là\n * `\"vi-VN\"`.\n */\n locale?: string;\n asChild?: boolean;\n invalid?: boolean;\n withoutMask?: boolean;\n}\n\nfunction MaskInput(props: MaskInputProps) {\n const {\n value: valueProp,\n defaultValue,\n onValueChange: onValueChangeProp,\n onValidate,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onPaste: onPasteProp,\n onCompositionStart: onCompositionStartProp,\n onCompositionEnd: onCompositionEndProp,\n validationMode = \"onChange\",\n mask,\n maskPlaceholder,\n currency = DEFAULT_CURRENCY,\n locale: localeProp,\n placeholder,\n inputMode,\n min,\n max,\n maxLength,\n asChild = false,\n disabled = false,\n invalid = false,\n readOnly = false,\n required = false,\n withoutMask = false,\n className,\n ref,\n ...inputProps\n } = props;\n\n const { locale: providerLocale } = useComitorLocale();\n const locale = localeProp ?? providerLocale;\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? \"\");\n const [focused, setFocused] = React.useState(false);\n const [composing, setComposing] = React.useState(false);\n const [touched, setTouched] = React.useState(false);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const composedRef = useComposedRefs(ref, inputRef);\n\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const maskPattern = React.useMemo(() => {\n if (typeof mask === \"string\") {\n return MASK_PATTERNS[mask];\n }\n return mask;\n }, [mask]);\n\n const transformOpts = React.useMemo(\n () => ({\n currency,\n locale\n }),\n [currency, locale]\n );\n\n const placeholderValue = React.useMemo(() => {\n if (withoutMask) return placeholder;\n\n if (placeholder && maskPlaceholder) {\n return focused ? maskPlaceholder : placeholder;\n }\n\n if (maskPlaceholder) {\n return focused ? maskPlaceholder : undefined;\n }\n\n return placeholder;\n }, [placeholder, maskPlaceholder, focused, withoutMask]);\n\n const displayValue = React.useMemo(() => {\n if (withoutMask || !maskPattern || !value) return value ?? \"\";\n const unmasked = getUnmaskedValue({\n value,\n transform: maskPattern.transform,\n ...transformOpts\n });\n return applyMask({\n value: unmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n }, [value, maskPattern, withoutMask, transformOpts, mask]);\n\n const tokenCount = React.useMemo(() => {\n if (!maskPattern || CURRENCY_PERCENTAGE_SYMBOLS.test(maskPattern.pattern)) return undefined;\n return maskPattern.pattern.match(REGEX_CACHE.hashPattern)?.length ?? 0;\n }, [maskPattern]);\n\n const calculatedMaxLength = tokenCount ? maskPattern?.pattern.length : maxLength;\n\n const calculatedInputMode = React.useMemo(() => {\n if (inputMode) return inputMode;\n if (!maskPattern) return undefined;\n\n if (mask === \"currency\" || mask === \"percentage\" || mask === \"ipv4\") {\n return \"decimal\";\n }\n\n if (typeof mask === \"string\" && NUMERIC_MASK_PATTERNS.test(mask)) {\n return \"numeric\";\n }\n return undefined;\n }, [maskPattern, mask, inputMode]);\n\n const shouldValidate = React.useCallback(\n (trigger: \"change\" | \"blur\") => {\n if (!onValidate || !maskPattern?.validate) return false;\n\n switch (validationMode) {\n case \"onChange\":\n return trigger === \"change\";\n case \"onBlur\":\n return trigger === \"blur\";\n case \"onSubmit\":\n return false;\n case \"onTouched\":\n return touched ? trigger === \"change\" : trigger === \"blur\";\n case \"all\":\n return true;\n default:\n return trigger === \"change\";\n }\n },\n [onValidate, maskPattern, validationMode, touched]\n );\n\n const validationOpts = React.useMemo(\n () => ({\n min: typeof min === \"string\" ? Number.parseFloat(min) : min,\n max: typeof max === \"string\" ? Number.parseFloat(max) : max\n }),\n [min, max]\n );\n\n const onInputValidate = React.useCallback(\n (unmaskedValue: string) => {\n if (onValidate && maskPattern?.validate) {\n const isValid = maskPattern.validate(unmaskedValue, validationOpts);\n onValidate(isValid, unmaskedValue);\n }\n },\n [onValidate, maskPattern?.validate, validationOpts]\n );\n\n const onValueChange = React.useCallback(\n (event: React.ChangeEvent<InputElement>) => {\n const inputValue = event.target.value;\n let newValue = inputValue;\n let unmaskedValue = inputValue;\n\n if (composing) {\n if (!isControlled) setInternalValue(inputValue);\n return;\n }\n\n if (withoutMask || !maskPattern) {\n if (!isControlled) setInternalValue(inputValue);\n if (shouldValidate(\"change\")) onValidate?.(true, inputValue);\n onValueChangeProp?.(inputValue, inputValue);\n return;\n }\n\n if (maskPattern) {\n unmaskedValue = getUnmaskedValue({\n value: inputValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n newValue = applyMask({\n value: unmaskedValue,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n if (inputRef.current && newValue !== inputValue) {\n const inputElement = inputRef.current;\n if (!(inputElement instanceof HTMLInputElement)) return;\n\n const oldCursorPosition = inputElement.selectionStart ?? 0;\n\n inputElement.value = newValue;\n\n const currentUnmasked = getUnmaskedValue({\n value: newValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n\n let newCursorPosition: number;\n\n const previousUnmasked = getUnmaskedValue({\n value,\n transform: maskPattern.transform,\n ...transformOpts\n });\n\n if (CURRENCY_PERCENTAGE_SYMBOLS.test(maskPattern.pattern)) {\n newCursorPosition = getCurrencyCaretPosition({\n newValue,\n mask,\n transformOpts,\n oldCursorPosition,\n oldValue: inputValue,\n previousUnmasked\n });\n } else {\n newCursorPosition = getPatternCaretPosition({\n newValue,\n maskPattern,\n currentUnmasked,\n oldCursorPosition,\n oldValue: inputValue,\n previousUnmasked\n });\n }\n\n if (isCurrencyMask({ mask, pattern: maskPattern.pattern })) {\n if (mask === \"currency\") {\n const currencyAtEnd = isCurrencyAtEnd(transformOpts);\n if (!currencyAtEnd) {\n newCursorPosition = Math.max(1, newCursorPosition);\n }\n } else {\n newCursorPosition = Math.max(1, newCursorPosition);\n }\n } else if (maskPattern.pattern.includes(\"%\")) {\n newCursorPosition = Math.min(newValue.length - 1, newCursorPosition);\n }\n\n newCursorPosition = Math.min(newCursorPosition, newValue.length);\n\n inputElement.setSelectionRange(newCursorPosition, newCursorPosition);\n }\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n if (shouldValidate(\"change\")) {\n onInputValidate(unmaskedValue);\n }\n\n onValueChangeProp?.(newValue, unmaskedValue);\n },\n [\n maskPattern,\n isControlled,\n onValueChangeProp,\n onValidate,\n onInputValidate,\n composing,\n shouldValidate,\n withoutMask,\n transformOpts,\n mask,\n value\n ]\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onFocusProp?.(event);\n if (event.defaultPrevented) return;\n\n setFocused(true);\n },\n [onFocusProp]\n );\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onBlurProp?.(event);\n if (event.defaultPrevented) return;\n\n setFocused(false);\n\n if (!touched) {\n setTouched(true);\n }\n\n if (shouldValidate(\"blur\")) {\n const currentValue = event.target.value;\n const unmaskedValue = maskPattern\n ? getUnmaskedValue({\n value: currentValue,\n transform: maskPattern.transform,\n ...transformOpts\n })\n : currentValue;\n onInputValidate(unmaskedValue);\n }\n },\n [onBlurProp, touched, shouldValidate, onInputValidate, maskPattern, transformOpts]\n );\n\n const onCompositionStart = React.useCallback(\n (event: React.CompositionEvent<InputElement>) => {\n onCompositionStartProp?.(event);\n if (event.defaultPrevented) return;\n\n setComposing(true);\n },\n [onCompositionStartProp]\n );\n\n const onCompositionEnd = React.useCallback(\n (event: React.CompositionEvent<InputElement>) => {\n onCompositionEndProp?.(event);\n if (event.defaultPrevented) return;\n\n setComposing(false);\n\n const inputElement = inputRef.current;\n if (!inputElement) return;\n if (!(inputElement instanceof HTMLInputElement)) return;\n const inputValue = inputElement.value;\n\n if (!maskPattern || withoutMask) {\n if (!isControlled) setInternalValue(inputValue);\n if (shouldValidate(\"change\")) onValidate?.(true, inputValue);\n onValueChangeProp?.(inputValue, inputValue);\n return;\n }\n\n const unmasked = getUnmaskedValue({\n value: inputValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n const masked = applyMask({\n value: unmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n if (!isControlled) setInternalValue(masked);\n if (shouldValidate(\"change\")) onInputValidate(unmasked);\n onValueChangeProp?.(masked, unmasked);\n },\n [\n onCompositionEndProp,\n maskPattern,\n withoutMask,\n isControlled,\n shouldValidate,\n onValidate,\n onValueChangeProp,\n transformOpts,\n mask,\n onInputValidate\n ]\n );\n\n const onPaste = React.useCallback(\n (event: React.ClipboardEvent<InputElement>) => {\n onPasteProp?.(event);\n if (event.defaultPrevented) return;\n\n if (withoutMask || !maskPattern) return;\n\n if (mask === \"ipv4\") return;\n\n const target = event.target as InputElement;\n if (!(target instanceof HTMLInputElement)) return;\n\n const pastedData = event.clipboardData.getData(\"text\");\n if (!pastedData) return;\n\n event.preventDefault();\n\n const currentValue = target.value;\n const selectionStart = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n\n const beforeSelection = currentValue.slice(0, selectionStart);\n const afterSelection = currentValue.slice(selectionEnd);\n const newInputValue = beforeSelection + pastedData + afterSelection;\n\n const unmasked = getUnmaskedValue({\n value: newInputValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n const newMaskedValue = applyMask({\n value: unmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n target.value = newMaskedValue;\n\n /*\n * ⚠ Khác thượng nguồn (3.0.1): nhánh tiền tệ và phần trăm chỉ đặt con trỏ rồi đi TIẾP xuống\n * phần báo giá trị. Bản gốc `return` ngay trong hai nhánh này, nên dán vào ô tiền/phần trăm\n * chỉ đổi DOM: `onValueChange` không chạy, state nội bộ không đổi, và lần render kế tiếp trả\n * ô về số cũ — đo trên comitor-ds: dán \"777\" hiện `777 US$`, app vẫn giữ 12345.56.\n */\n let newCursorPosition = newMaskedValue.length;\n if (isCurrencyMask({ mask, pattern: maskPattern.pattern })) {\n const currencyAtEnd = isCurrencyAtEnd(transformOpts);\n const symbolStart = newMaskedValue.search(/\\s*[^\\d\\s]+$/);\n newCursorPosition = currencyAtEnd && symbolStart !== -1 ? symbolStart : newMaskedValue.length;\n } else if (maskPattern.pattern.includes(\"%\")) {\n newCursorPosition = Math.max(0, newMaskedValue.length - 1);\n } else {\n try {\n const unmaskedCount = unmasked.length;\n let position = 0;\n let count = 0;\n\n for (let i = 0; i < maskPattern.pattern.length && i < newMaskedValue.length; i++) {\n if (maskPattern.pattern[i] === \"#\") {\n count++;\n if (count <= unmaskedCount) {\n position = i + 1;\n }\n }\n }\n newCursorPosition = position;\n } catch {\n // Lỗi thì để con trỏ ở cuối.\n }\n }\n\n target.setSelectionRange(newCursorPosition, newCursorPosition);\n\n if (!isControlled) setInternalValue(newMaskedValue);\n if (shouldValidate(\"change\")) onInputValidate(unmasked);\n onValueChangeProp?.(newMaskedValue, unmasked);\n },\n [\n onPasteProp,\n withoutMask,\n maskPattern,\n mask,\n transformOpts,\n isControlled,\n shouldValidate,\n onInputValidate,\n onValueChangeProp\n ]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<InputElement>) => {\n onKeyDownProp?.(event);\n if (event.defaultPrevented) return;\n\n if (withoutMask || !maskPattern) return;\n\n if (mask === \"ipv4\") return;\n\n if (event.key === \"Backspace\") {\n const target = event.target as InputElement;\n if (!(target instanceof HTMLInputElement)) return;\n const cursorPosition = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n const currentValue = target.value;\n\n if (\n mask === \"currency\" ||\n mask === \"percentage\" ||\n maskPattern.pattern.includes(\"$\") ||\n maskPattern.pattern.includes(\"€\") ||\n maskPattern.pattern.includes(\"%\")\n ) {\n return;\n }\n\n if (cursorPosition !== selectionEnd) {\n return;\n }\n\n if (cursorPosition > 0) {\n const charBeforeCursor = currentValue[cursorPosition - 1];\n\n if (charBeforeCursor) {\n event.preventDefault();\n\n const unmaskedIndex = toUnmaskedIndex({\n masked: currentValue,\n pattern: maskPattern.pattern,\n caret: cursorPosition\n });\n\n if (unmaskedIndex > 0) {\n const currentUnmasked = getUnmaskedValue({\n value: currentValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n const nextUnmasked = currentUnmasked.slice(0, unmaskedIndex - 1) + currentUnmasked.slice(unmaskedIndex);\n const nextMasked = applyMask({\n value: nextUnmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n target.value = nextMasked;\n const nextCaret = fromUnmaskedIndex({\n masked: nextMasked,\n pattern: maskPattern.pattern,\n unmaskedIndex: unmaskedIndex - 1\n });\n\n target.setSelectionRange(nextCaret, nextCaret);\n\n onValueChangeProp?.(nextMasked, nextUnmasked);\n }\n return;\n }\n }\n }\n\n if (event.key === \"Delete\") {\n const target = event.target as InputElement;\n if (!(target instanceof HTMLInputElement)) return;\n const cursorPosition = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n const currentValue = target.value;\n\n if (\n mask === \"currency\" ||\n mask === \"percentage\" ||\n maskPattern.pattern.includes(\"$\") ||\n maskPattern.pattern.includes(\"€\") ||\n maskPattern.pattern.includes(\"%\")\n ) {\n return;\n }\n\n if (cursorPosition !== selectionEnd) {\n return;\n }\n\n if (cursorPosition < currentValue.length) {\n const charAtCursor = currentValue[cursorPosition];\n\n if (charAtCursor) {\n event.preventDefault();\n\n const unmaskedIndex = toUnmaskedIndex({\n masked: currentValue,\n pattern: maskPattern.pattern,\n caret: cursorPosition\n });\n\n const currentUnmasked = getUnmaskedValue({\n value: currentValue,\n transform: maskPattern.transform,\n ...transformOpts\n });\n\n if (unmaskedIndex < currentUnmasked.length) {\n const nextUnmasked = currentUnmasked.slice(0, unmaskedIndex) + currentUnmasked.slice(unmaskedIndex + 1);\n const nextMasked = applyMask({\n value: nextUnmasked,\n pattern: maskPattern.pattern,\n ...transformOpts,\n mask\n });\n\n target.value = nextMasked;\n const nextCaret = fromUnmaskedIndex({\n masked: nextMasked,\n pattern: maskPattern.pattern,\n unmaskedIndex: unmaskedIndex\n });\n\n target.setSelectionRange(nextCaret, nextCaret);\n\n onValueChangeProp?.(nextMasked, nextUnmasked);\n }\n return;\n }\n }\n }\n },\n [maskPattern, onKeyDownProp, onValueChangeProp, transformOpts, mask, withoutMask]\n );\n\n const InputPrimitive = asChild ? Slot : \"input\";\n\n return (\n <InputPrimitive\n // ⚠ Khác thượng nguồn: chỉ phát thuộc tính khi THẬT SỰ lỗi — `aria-invalid=\"false\"` hợp lệ\n // nhưng thừa, và cùng quy ước với `Input`/`Combobox` của gói. Đặt TRƯỚC spread để\n // `aria-invalid` do `<FormControl>` dán vào vẫn thắng.\n aria-invalid={invalid || undefined}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n data-required={required ? \"\" : undefined}\n data-slot=\"mask-input\"\n {...inputProps}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: chuỗi lớp của `Input` Comitor thay cho của shadcn, để ô có mặt nạ\n * đứng cạnh ô nhập thường trong cùng một form không lệch nhau (cao, nền, viền, cỡ chữ,\n * focus). Số đo của từng vai trò ở chú thích đầu `input.tsx`:\n * viền nghỉ `border-input` · hover `--control-edge-strong` · focus `--primary-ink`;\n * lỗi `border-destructive-ink` (không phải `border-destructive` — token TÔ NỀN).\n * Bỏ `dark:bg-input/30` (viết thẳng thang màu — bảng tương phản cao không đổi được) và\n * `shadow-xs` (không có trong bộ bóng của gói).\n */\n \"w-full h-9 px-3 rounded-md border bg-background text-sm text-foreground placeholder:text-muted-foreground\",\n \"transition-colors duration-150 ease-out\",\n \"focus:outline-none focus:ring-2 focus:ring-ring/50 focus:border-primary-ink\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-muted\",\n \"border-input hover:border-control-edge-strong\",\n \"aria-invalid:border-destructive-ink aria-invalid:hover:border-destructive-ink aria-invalid:focus:border-destructive-ink aria-invalid:focus:ring-destructive/30\",\n className\n )}\n placeholder={placeholderValue}\n ref={composedRef}\n value={displayValue}\n disabled={disabled}\n maxLength={calculatedMaxLength}\n readOnly={readOnly}\n required={required}\n inputMode={calculatedInputMode}\n min={min}\n max={max}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onChange={onValueChange}\n onCompositionStart={onCompositionStart}\n onCompositionEnd={onCompositionEnd}\n />\n );\n}\n\nexport { MaskInput, type MaskInputProps };\n"],"mappings":"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","names":[]}
@@ -577,7 +577,7 @@ function PhoneInput(props) {
577
577
  }
578
578
  function PhoneInputCountrySelect(props) {
579
579
  const { disabled: disabledProp, className, children, onOpenChange: onOpenChangeProp, ...popoverProps } = props;
580
- const { countries, inputRef, disabled, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);
580
+ const { countries, inputRef, disabled, readOnly, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);
581
581
  const store = useStoreContext(COUNTRY_SELECT_NAME);
582
582
  const country = useStore((state) => state.country);
583
583
  const open = useStore((state) => state.open);
@@ -586,10 +586,11 @@ function PhoneInputCountrySelect(props) {
586
586
  const countryContext = countries.find((c) => c.code === country);
587
587
  const onOpenChange = React.useCallback(
588
588
  (open2) => {
589
+ if (open2 && readOnly) return;
589
590
  store.setState("open", open2);
590
591
  onOpenChangeRef.current?.(open2);
591
592
  },
592
- [store, onOpenChangeRef]
593
+ [store, onOpenChangeRef, readOnly]
593
594
  );
594
595
  return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange, ...popoverProps, children: [
595
596
  /* @__PURE__ */ jsxs(
@@ -597,6 +598,8 @@ function PhoneInputCountrySelect(props) {
597
598
  {
598
599
  "data-slot": "phone-input-country-select",
599
600
  "aria-label": labels.countrySelect(countryContext),
601
+ "aria-disabled": readOnly && !isDisabled ? true : void 0,
602
+ "data-readonly": readOnly ? "" : void 0,
600
603
  disabled: isDisabled,
601
604
  className: cn(
602
605
  /*
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/phone-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/phone-input) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { defaultFilter } from \"cmdk\";\nimport { Check, ChevronDown, Globe } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useComitorLabels, useComitorLocale } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useAsRef } from \"../../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../../lib/use-lazy-ref.js\";\nimport { VisuallyHiddenInput } from \"../../lib/visually-hidden-input.js\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"./command.js\";\nimport { Input } from \"./input.js\";\nimport type { PhoneInputCountry as Country, PhoneInputLabels } from \"./phone-input-constants.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover.js\";\n\nconst ROOT_NAME = \"PhoneInput\";\nconst COUNTRY_SELECT_NAME = \"PhoneInputCountrySelect\";\nconst FIELD_NAME = \"PhoneInputField\";\n\n/*\n * Quốc gia mặc định: KHÔNG CÓ — như thượng nguồn (nút chọn hiện quả địa cầu, chưa chọn gì). Nước\n * là thiết lập của VÙNG, không phải của ngôn ngữ (xem `src/i18n/locale.ts`): app Comitor truyền\n * `defaultCountry` / `country` từ cài đặt workspace. Trước `3.0.0` mặc định cứng là `\"VN\"`.\n *\n * ⚠ Khác thượng nguồn: tên quốc gia theo `locale` của `ComitorLocaleProvider` (prop `locale` đè)\n * thay vì ghim tiếng Anh. Trước `3.0.0` mặc định cứng là `\"vi\"`.\n */\n\n/**\n * Bảng mã quay số theo quốc gia (≈250 nước), dạng `[iso2, mã quay số]`.\n * @see https://github.com/mukeshsoni/country-telephone-data/blob/master/country_telephone_data.js\n * @format [iso2, dialCode]\n */\nconst COUNTRY_DATA: [string, string][] = [\n [\"af\", \"93\"],\n [\"ax\", \"358\"],\n [\"al\", \"355\"],\n [\"dz\", \"213\"],\n [\"as\", \"1684\"],\n [\"ad\", \"376\"],\n [\"ao\", \"244\"],\n [\"ai\", \"1264\"],\n [\"ag\", \"1268\"],\n [\"ar\", \"54\"],\n [\"am\", \"374\"],\n [\"aw\", \"297\"],\n [\"au\", \"61\"],\n [\"at\", \"43\"],\n [\"az\", \"994\"],\n [\"bs\", \"1242\"],\n [\"bh\", \"973\"],\n [\"bd\", \"880\"],\n [\"bb\", \"1246\"],\n [\"by\", \"375\"],\n [\"be\", \"32\"],\n [\"bz\", \"501\"],\n [\"bj\", \"229\"],\n [\"bm\", \"1441\"],\n [\"bt\", \"975\"],\n [\"bo\", \"591\"],\n [\"ba\", \"387\"],\n [\"bw\", \"267\"],\n [\"br\", \"55\"],\n [\"io\", \"246\"],\n [\"vg\", \"1284\"],\n [\"bn\", \"673\"],\n [\"bg\", \"359\"],\n [\"bf\", \"226\"],\n [\"bi\", \"257\"],\n [\"kh\", \"855\"],\n [\"cm\", \"237\"],\n [\"ca\", \"1\"],\n [\"cv\", \"238\"],\n [\"bq\", \"599\"],\n [\"ky\", \"1345\"],\n [\"cf\", \"236\"],\n [\"td\", \"235\"],\n [\"cl\", \"56\"],\n [\"cn\", \"86\"],\n [\"co\", \"57\"],\n [\"km\", \"269\"],\n [\"cd\", \"243\"],\n [\"cg\", \"242\"],\n [\"ck\", \"682\"],\n [\"cr\", \"506\"],\n [\"ci\", \"225\"],\n [\"hr\", \"385\"],\n [\"cu\", \"53\"],\n [\"cw\", \"599\"],\n [\"cy\", \"357\"],\n [\"cz\", \"420\"],\n [\"dk\", \"45\"],\n [\"dj\", \"253\"],\n [\"dm\", \"1767\"],\n [\"do\", \"1\"],\n [\"ec\", \"593\"],\n [\"eg\", \"20\"],\n [\"sv\", \"503\"],\n [\"gq\", \"240\"],\n [\"er\", \"291\"],\n [\"ee\", \"372\"],\n [\"et\", \"251\"],\n [\"fk\", \"500\"],\n [\"fo\", \"298\"],\n [\"fj\", \"679\"],\n [\"fi\", \"358\"],\n [\"fr\", \"33\"],\n [\"gf\", \"594\"],\n [\"pf\", \"689\"],\n [\"ga\", \"241\"],\n [\"gm\", \"220\"],\n [\"ge\", \"995\"],\n [\"de\", \"49\"],\n [\"gh\", \"233\"],\n [\"gi\", \"350\"],\n [\"gr\", \"30\"],\n [\"gl\", \"299\"],\n [\"gd\", \"1473\"],\n [\"gp\", \"590\"],\n [\"gu\", \"1671\"],\n [\"gt\", \"502\"],\n [\"gg\", \"44\"],\n [\"gn\", \"224\"],\n [\"gw\", \"245\"],\n [\"gy\", \"592\"],\n [\"ht\", \"509\"],\n [\"hn\", \"504\"],\n [\"hk\", \"852\"],\n [\"hu\", \"36\"],\n [\"is\", \"354\"],\n [\"in\", \"91\"],\n [\"id\", \"62\"],\n [\"ir\", \"98\"],\n [\"iq\", \"964\"],\n [\"ie\", \"353\"],\n [\"im\", \"44\"],\n [\"il\", \"972\"],\n [\"it\", \"39\"],\n [\"jm\", \"1876\"],\n [\"jp\", \"81\"],\n [\"je\", \"44\"],\n [\"jo\", \"962\"],\n [\"kz\", \"7\"],\n [\"ke\", \"254\"],\n [\"ki\", \"686\"],\n [\"xk\", \"383\"],\n [\"kw\", \"965\"],\n [\"kg\", \"996\"],\n [\"la\", \"856\"],\n [\"lv\", \"371\"],\n [\"lb\", \"961\"],\n [\"ls\", \"266\"],\n [\"lr\", \"231\"],\n [\"ly\", \"218\"],\n [\"li\", \"423\"],\n [\"lt\", \"370\"],\n [\"lu\", \"352\"],\n [\"mo\", \"853\"],\n [\"mk\", \"389\"],\n [\"mg\", \"261\"],\n [\"mw\", \"265\"],\n [\"my\", \"60\"],\n [\"mv\", \"960\"],\n [\"ml\", \"223\"],\n [\"mt\", \"356\"],\n [\"mh\", \"692\"],\n [\"mq\", \"596\"],\n [\"mr\", \"222\"],\n [\"mu\", \"230\"],\n [\"mx\", \"52\"],\n [\"fm\", \"691\"],\n [\"md\", \"373\"],\n [\"mc\", \"377\"],\n [\"mn\", \"976\"],\n [\"me\", \"382\"],\n [\"ms\", \"1664\"],\n [\"ma\", \"212\"],\n [\"mz\", \"258\"],\n [\"mm\", \"95\"],\n [\"na\", \"264\"],\n [\"nr\", \"674\"],\n [\"np\", \"977\"],\n [\"nl\", \"31\"],\n [\"nc\", \"687\"],\n [\"nz\", \"64\"],\n [\"ni\", \"505\"],\n [\"ne\", \"227\"],\n [\"ng\", \"234\"],\n [\"nu\", \"683\"],\n [\"nf\", \"672\"],\n [\"kp\", \"850\"],\n [\"mp\", \"1670\"],\n [\"no\", \"47\"],\n [\"om\", \"968\"],\n [\"pk\", \"92\"],\n [\"pw\", \"680\"],\n [\"ps\", \"970\"],\n [\"pa\", \"507\"],\n [\"pg\", \"675\"],\n [\"py\", \"595\"],\n [\"pe\", \"51\"],\n [\"ph\", \"63\"],\n [\"pl\", \"48\"],\n [\"pt\", \"351\"],\n [\"pr\", \"1\"],\n [\"qa\", \"974\"],\n [\"re\", \"262\"],\n [\"ro\", \"40\"],\n [\"ru\", \"7\"],\n [\"rw\", \"250\"],\n [\"bl\", \"590\"],\n [\"sh\", \"290\"],\n [\"kn\", \"1869\"],\n [\"lc\", \"1758\"],\n [\"mf\", \"590\"],\n [\"pm\", \"508\"],\n [\"vc\", \"1784\"],\n [\"ws\", \"685\"],\n [\"sm\", \"378\"],\n [\"st\", \"239\"],\n [\"sa\", \"966\"],\n [\"sn\", \"221\"],\n [\"rs\", \"381\"],\n [\"sc\", \"248\"],\n [\"sl\", \"232\"],\n [\"sg\", \"65\"],\n [\"sx\", \"1721\"],\n [\"sk\", \"421\"],\n [\"si\", \"386\"],\n [\"sb\", \"677\"],\n [\"so\", \"252\"],\n [\"za\", \"27\"],\n [\"kr\", \"82\"],\n [\"ss\", \"211\"],\n [\"es\", \"34\"],\n [\"lk\", \"94\"],\n [\"sd\", \"249\"],\n [\"sr\", \"597\"],\n [\"sz\", \"268\"],\n [\"se\", \"46\"],\n [\"ch\", \"41\"],\n [\"sy\", \"963\"],\n [\"tw\", \"886\"],\n [\"tj\", \"992\"],\n [\"tz\", \"255\"],\n [\"th\", \"66\"],\n [\"tl\", \"670\"],\n [\"tg\", \"228\"],\n [\"tk\", \"690\"],\n [\"to\", \"676\"],\n [\"tt\", \"1868\"],\n [\"tn\", \"216\"],\n [\"tr\", \"90\"],\n [\"tm\", \"993\"],\n [\"tc\", \"1649\"],\n [\"tv\", \"688\"],\n [\"vi\", \"1340\"],\n [\"ug\", \"256\"],\n [\"ua\", \"380\"],\n [\"ae\", \"971\"],\n [\"gb\", \"44\"],\n [\"us\", \"1\"],\n [\"uy\", \"598\"],\n [\"uz\", \"998\"],\n [\"vu\", \"678\"],\n [\"va\", \"39\"],\n [\"ve\", \"58\"],\n [\"vn\", \"84\"],\n [\"wf\", \"681\"],\n [\"eh\", \"212\"],\n [\"ye\", \"967\"],\n [\"zm\", \"260\"],\n [\"zw\", \"263\"]\n];\n\nfunction getCountryName(countryCode: string, regionNames: Intl.DisplayNames | undefined): string {\n try {\n return regionNames?.of(countryCode) ?? countryCode;\n } catch {\n return countryCode;\n }\n}\n\nfunction getFlagEmoji(countryCode: string): string {\n const codePoints = countryCode\n .toUpperCase()\n .split(\"\")\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n}\n\n/*\n * ⚠ Khác thượng nguồn, ba chỗ:\n * 1. Tên theo `locale` (mặc định: `locale` của `ComitorLocaleProvider`) thay vì ghim \"en\".\n * 2. `Intl.DisplayNames` + `Intl.Collator` dựng MỘT lần cho cả danh sách. Thượng nguồn dựng\n * `DisplayNames` cho từng nước (≈250 lần) và gọi hàm này làm giá trị mặc định của prop, tức\n * MỖI LƯỢT RENDER — mỗi phím gõ vào ô số là dựng lại cả danh sách.\n * 3. Sắp xếp bằng collator của đúng `locale` đó (\"Đan Mạch\" sau \"Dominica\" như từ điển tiếng\n * Việt), không theo locale mặc định của máy chạy — server và trình duyệt mới ra cùng thứ tự.\n */\nfunction getCountries(locale: string): Country[] {\n let regionNames: Intl.DisplayNames | undefined;\n let collator: Intl.Collator | undefined;\n try {\n regionNames = new Intl.DisplayNames([locale], { type: \"region\" });\n collator = new Intl.Collator(locale);\n } catch {\n // `locale` không hợp lệ → tên rơi về mã nước, thứ tự theo `localeCompare` mặc định.\n }\n\n return COUNTRY_DATA.map(([iso2, dialCode]): Country => {\n const code = iso2.toUpperCase();\n return {\n code,\n name: getCountryName(code, regionNames),\n dialCode: `+${dialCode}`,\n flag: getFlagEmoji(code)\n };\n }).sort((a, b) => (collator ? collator.compare(a.name, b.name) : a.name.localeCompare(b.name)));\n}\n\n/*\n * ⚠ Khác thượng nguồn: tìm quốc gia KHÔNG DẤU — gõ \"viet nam\" ra \"Việt Nam\", \"duc\" ra \"Đức\".\n * Vẫn dùng `defaultFilter` của cmdk (giữ cách chấm điểm/xếp hạng của thượng nguồn), chỉ bỏ dấu\n * hai vế trước khi so. Chuẩn hoá viết tại chỗ vì hàm bỏ dấu của gói (`removeVietnameseTones`) nằm\n * ở tầng composite, mà tầng primitive không được nhập ngược lên.\n */\nfunction removeDiacritics(text: string): string {\n return text\n .normalize(\"NFD\")\n .replace(/\\p{Diacritic}/gu, \"\")\n .replace(/đ/g, \"d\")\n .replace(/Đ/g, \"D\");\n}\n\nfunction filterCountries(value: string, search: string, keywords?: string[]): number {\n return defaultFilter(removeDiacritics(value), removeDiacritics(search), keywords?.map(removeDiacritics));\n}\n\n/*\n * ⚠ Khác thượng nguồn: 8 mã quay số trong `COUNTRY_DATA` là của CHUNG nhiều nước. Thượng nguồn chỉ\n * xử lý riêng +1 → US; mã còn lại rơi vào nước đứng TRƯỚC theo thứ tự chữ cái của TÊN, tức phụ\n * thuộc ngôn ngữ hiển thị. Đo được (ICU của Node 24): tên tiếng Anh cho +7 → Kazakhstan, +44 →\n * Guernsey, +358 → Quần đảo Åland, +599 → Ca-ri-bê Hà Lan; tên tiếng Việt cho +7 → Kazakhstan,\n * +44 → Đảo Man, +599 → Ca-ri-bê Hà Lan. Bảng này ghim nước chính của từng mã, bất kể ngôn ngữ.\n */\nconst PRIMARY_COUNTRY_BY_DIAL_CODE: Record<string, string> = {\n \"+1\": \"US\",\n \"+7\": \"RU\",\n \"+39\": \"IT\",\n \"+44\": \"GB\",\n \"+212\": \"MA\",\n \"+358\": \"FI\",\n \"+590\": \"GP\",\n \"+599\": \"CW\"\n};\n\nfunction detectCountryFromNumber(value: string, countries: Country[], currentCode?: string): Country | undefined {\n if (!value?.startsWith(\"+\")) return undefined;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n if (!digits) return undefined;\n\n const sorted = [...countries].sort((a, b) => b.dialCode.length - a.dialCode.length);\n\n const matches: Country[] = [];\n for (const country of sorted) {\n const dialCode = country.dialCode.slice(1);\n if (digits.startsWith(dialCode)) {\n matches.push(country);\n }\n }\n\n const best = matches[0];\n if (!best) return undefined;\n\n /*\n * ⚠ Khác thượng nguồn: nhiều nước cùng khớp mã DÀI NHẤT → ưu tiên nước ĐANG CHỌN nếu nó nằm trong\n * số đó, rồi mới tới nước chính của mã. Thượng nguồn luôn trả US cho +1, nên người dùng chọn\n * \"Canada\" rồi gõ \"+1 604…\" bị lật cờ sang Hoa Kỳ ngay phím đầu tiên.\n */\n const tied = matches.filter((c) => c.dialCode === best.dialCode);\n if (tied.length > 1) {\n const current = tied.find((c) => c.code === currentCode);\n if (current) return current;\n const primary = tied.find((c) => c.code === PRIMARY_COUNTRY_BY_DIAL_CODE[best.dialCode]);\n if (primary) return primary;\n }\n\n return best;\n}\n\nfunction formatPhoneNumber(value: string, countries: Country[]): string {\n if (!value) return \"\";\n\n const normalized = value.startsWith(\"+\") ? value : `+${value}`;\n\n const digits = normalized.slice(1).replace(/\\D/g, \"\");\n if (!digits) return \"+\";\n\n const detected = detectCountryFromNumber(`+${digits}`, countries);\n const dialCodeLength = detected ? detected.dialCode.slice(1).length : Math.min(digits.length, 3);\n\n const countryCode = digits.slice(0, dialCodeLength);\n const rest = digits.slice(dialCodeLength);\n\n let formatted = `+${countryCode}`;\n\n if (rest) {\n formatted += \" \";\n for (let i = 0; i < rest.length; i++) {\n if (i > 0 && i % 3 === 0) {\n formatted += \" \";\n }\n formatted += rest[i];\n }\n }\n\n return formatted;\n}\n\n/*\n * ⚠ Khác thượng nguồn — SỐ NỘI ĐỊA. CRM/HR phải lưu số dạng E.164 (`+84912345678`), mà người Việt\n * gõ số của mình kèm số 0 đầu (`0912 345 678`). Thượng nguồn coi chữ số đầu tiên luôn là mã quốc\n * gia nên lưu ra `+0912345678` — một số không tồn tại. Luật ở đây: chuỗi gõ vào KHÔNG bắt đầu bằng\n * `+` và đang có quốc gia được chọn → đó là số NỘI ĐỊA của nước ấy: bỏ MỘT số 0 đầu (tiền tố trung\n * kế) rồi ghép mã quay số của nước đang chọn. Bắt đầu bằng `+` → như thượng nguồn (nước suy từ mã).\n * Không có quốc gia nào được chọn → như thượng nguồn. Từ `3.0.0` đó là trạng thái MẶC ĐỊNH (không\n * còn `\"VN\"` ngầm định): luật nội địa chỉ chạy khi app truyền `defaultCountry`/`country` hoặc\n * người dùng chọn nước trước khi gõ.\n *\n * `COUNTRY_DATA` không có thông tin tiền tố trung kế, nên số 0 đầu mặc định được coi là tiền tố —\n * TRỪ các nước trong bảng dưới: không có tiền tố trung kế mà số thật lại bắt đầu bằng 0 (máy bàn Ý\n * `06 …` → `+39 06 …`, cả San Marino và Vatican dùng chung luật đánh số đó). Nước có tiền tố trung\n * kế KHÁC 0 (Nga/Kazakhstan `8`, Bắc Mỹ `1`) chưa được xử lý: gõ kèm tiền tố ấy thì nó lọt vào số.\n */\nconst NO_TRUNK_PREFIX_COUNTRIES = new Set([\"IT\", \"SM\", \"VA\"]);\n\n/** Ký tự bị gạt khỏi ô khi gõ số nội địa — giữ chữ số và các dấu ngăn cách quen tay. */\nconst NATIONAL_INPUT_DISALLOWED = /[^\\d\\s().-]/g;\n\nfunction nationalToE164(nationalInput: string, country: Country): string {\n let digits = nationalInput.replace(/\\D/g, \"\");\n if (digits.startsWith(\"0\") && !NO_TRUNK_PREFIX_COUNTRIES.has(country.code)) {\n digits = digits.slice(1);\n }\n return digits ? `${country.dialCode}${digits}` : \"\";\n}\n\n/**\n * Chuỗi nội địa người dùng đang gõ — CHỈ khi nó còn khớp giá trị hiện tại. App đặt lại `value` từ\n * ngoài (reset form, nạp bản ghi khác) thì chuỗi cũ hết đúng, ô quay về dạng quốc tế đã tách nhóm.\n */\nfunction getNationalInput(state: StoreState, countries: Country[]): string | null {\n const { nationalInput, country, value } = state;\n if (nationalInput === null) return null;\n const selected = countries.find((c) => c.code === country);\n if (!selected || nationalToE164(nationalInput, selected) !== value) return null;\n return nationalInput;\n}\n\ntype RootElement = React.ComponentRef<typeof PhoneInput>;\n\ninterface StoreState {\n value: string;\n country: string;\n open: boolean;\n startsWithPlus: boolean;\n /**\n * ⚠ Thêm so với thượng nguồn: chữ người dùng gõ ở chế độ số nội địa, đúng như gõ (đã gạt ký tự\n * lạ), để ô hiện lại nguyên văn thay vì dạng `+84 …`. `null` = chế độ quốc tế của thượng nguồn.\n */\n nationalInput: string | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T, ogStore?: Store | null): T {\n const contextStore = React.useContext(StoreContext);\n\n const store = ogStore ?? contextStore;\n\n if (!store) {\n throw new Error(`\\`usePhoneInput\\` phải được gọi bên trong \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface PhoneInputContextValue {\n rootId: string;\n countries: Country[];\n placeholder: string;\n labels: PhoneInputLabels;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nconst PhoneInputContext = React.createContext<PhoneInputContextValue | null>(null);\n\nfunction usePhoneInputContext(consumerName: string) {\n const context = React.useContext(PhoneInputContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\n/**\n * Ô nhập số điện thoại quốc tế: nút chọn quốc gia (`PhoneInputCountrySelect`) + ô số\n * (`PhoneInputField`). Giá trị (`value` / `onValueChange` / input ẩn khi submit form) luôn là E.164\n * chỉ gồm chữ số: `\"+84912345678\"`. Người dùng gõ được theo HAI cách:\n *\n * - **Số nội địa** — chuỗi KHÔNG bắt đầu bằng `+`, và đang có quốc gia được chọn (`defaultCountry`\n * / `country`, hoặc người dùng chọn): bỏ một số 0 đầu rồi ghép mã quay số của nước đang chọn. Ô hiện NGUYÊN VĂN chữ đã gõ\n * (chỉ gạt ký tự không phải số hay `space ( ) . -`), con trỏ không nhảy; đổi quốc gia thì giá trị\n * ghép lại theo mã mới, còn chữ trên ô giữ nguyên.\n * Nước là Việt Nam, gõ `0912 345 678` → ô hiện `0912 345 678`, `onValueChange(\"+84912345678\")`.\n * ⚠ Khác thượng nguồn — bản gốc ra `+0912345678`. Ý, San Marino, Vatican giữ số 0 đầu (máy bàn\n * `06 …` → `+39 06 …`).\n * - **Số quốc tế** — chuỗi bắt đầu bằng `+` (như thượng nguồn): ô hiện tách nhóm\n * (`+84 912 345 678`), quốc gia tự nhận theo mã quay số.\n * Gõ `+84 912 345 678` → `onValueChange(\"+84912345678\")`, cờ chuyển sang Việt Nam.\n *\n * Giá trị nạp từ ngoài (`value`/`defaultValue`) luôn hiện ở dạng quốc tế. Không có quốc gia nào\n * được chọn — MẶC ĐỊNH từ `3.0.0` — thì mọi chữ số đầu bị coi là mã quốc gia, như thượng nguồn:\n * gõ `0912 345 678` ra `+0912345678`, gõ `84 912 345 678` ra `+84912345678` và cờ tự nhận Việt Nam.\n *\n * Gốc là `role=\"group\"` chưa có tên: đặt `aria-label` (vd \"Phone number\") hoặc `aria-labelledby`\n * cho chính `PhoneInput`.\n */\ninterface PhoneInputProps extends React.ComponentProps<\"div\"> {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n /**\n * Quốc gia ban đầu (mã ISO alpha-2, viết HOA). Mặc định: KHÔNG CÓ, như thượng nguồn — nước là\n * thiết lập VÙNG, không suy từ ngôn ngữ; app Comitor truyền từ cài đặt workspace.\n *\n * ⚠ Không có quốc gia thì chế độ số NỘI ĐỊA tắt (xem JSDoc của `PhoneInput`). Trước `3.0.0`\n * mặc định cứng là `\"VN\"`.\n */\n defaultCountry?: string;\n country?: string;\n onCountryChange?: (country: string) => void;\n countries?: Country[];\n name?: string;\n /** Placeholder ô nhập số — thắng khoá `labels.placeholder` (namespace `phoneInput`). */\n placeholder?: string;\n /**\n * Locale BCP 47 để gọi tên quốc gia (`Intl.DisplayNames`) và sắp xếp danh sách. Không truyền thì\n * theo `locale` của `ComitorLocaleProvider` (không có provider → `\"en\"`; trước `3.0.0` mặc định\n * cứng là `\"vi\"`). Bỏ qua khi app truyền `countries` riêng (tên lấy nguyên từ đó).\n *\n * ⚠ Thêm so với thượng nguồn — bản gốc ghim tên tiếng Anh.\n */\n locale?: string;\n /**\n * Chuỗi hiển thị/đọc màn hình (phần chọn quốc gia + placeholder ô số) — override từng khoá. Không\n * truyền thì theo namespace `phoneInput` của `ComitorLocaleProvider` (mặc định tiếng Anh).\n */\n labels?: Partial<PhoneInputLabels>;\n asChild?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag?: boolean;\n}\n\nfunction PhoneInput(props: PhoneInputProps) {\n const {\n value: valueProp,\n defaultValue,\n defaultCountry,\n country: countryProp,\n onValueChange,\n onCountryChange,\n countries: countriesProp,\n name,\n placeholder: placeholderProp,\n locale: localeProp,\n labels: labelsProp,\n asChild,\n disabled,\n required,\n readOnly,\n invalid,\n showFlag = true,\n className,\n id,\n ref,\n ...rootProps\n } = props;\n\n const { locale: providerLocale } = useComitorLocale();\n const locale = localeProp ?? providerLocale;\n const labels = useComitorLabels(\"phoneInput\", labelsProp);\n const placeholder = placeholderProp ?? labels.placeholder;\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // ⚠ Khác thượng nguồn: ghi nhớ danh sách (thượng nguồn dựng lại mỗi lượt render — xem `getCountries`).\n const countries = React.useMemo(() => countriesProp ?? getCountries(locale), [countriesProp, locale]);\n\n const [formTrigger, setFormTrigger] = React.useState<RootElement | null>(null);\n const composedRef = useComposedRefs(ref, (node) => setFormTrigger(node));\n const isFormControl = formTrigger ? !!formTrigger.closest(\"form\") : true;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => {\n const initialValue = valueProp ?? defaultValue ?? \"\";\n const initialCountry = countryProp ?? defaultCountry ?? \"\";\n\n return {\n value: initialValue,\n country: initialCountry,\n open: false,\n startsWithPlus: initialValue.startsWith(\"+\"),\n nationalInput: null\n };\n });\n\n const propsRef = useAsRef({\n onValueChange,\n onCountryChange,\n countries\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else if (key === \"country\" && typeof value === \"string\") {\n // Đọc TRƯỚC khi đổi nước: chuỗi nội địa chỉ còn hiệu lực nếu khớp giá trị theo nước CŨ.\n const nationalInput = getNationalInput(stateRef.current, propsRef.current.countries);\n stateRef.current.country = value;\n propsRef.current.onCountryChange?.(value);\n\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa mà đổi quốc gia → chữ trên ô giờ là số nội địa\n * của nước MỚI, giá trị ghép lại mã quay số mới (ô giữ nguyên chữ). Nước mới không có\n * trong danh sách (bỏ chọn) → thôi chế độ nội địa, giữ nguyên giá trị E.164 đang có.\n */\n if (nationalInput !== null) {\n const selected = propsRef.current.countries.find((c) => c.code === value);\n if (selected) {\n const nextValue = nationalToE164(nationalInput, selected);\n if (nextValue !== stateRef.current.value) {\n stateRef.current.value = nextValue;\n propsRef.current.onValueChange?.(nextValue);\n }\n } else {\n stateRef.current.nationalInput = null;\n }\n }\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n };\n }, [listenersRef, stateRef, propsRef]);\n\n const value = useStore((state) => state.value, store);\n const country = useStore((state) => state.country, store);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp]);\n\n useIsomorphicLayoutEffect(() => {\n if (countryProp !== undefined) {\n store.setState(\"country\", countryProp);\n }\n }, [countryProp]);\n\n const startsWithPlus = useStore((state) => state.startsWithPlus, store);\n const nationalInput = useStore((state) => getNationalInput(state, countries), store);\n\n React.useEffect(() => {\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa thì quốc gia ĐANG CHỌN là nguồn sự thật — dò lại theo\n * mã quay số lúc này chỉ có thể sai: Hoa Kỳ + `340 555 1234` → `+13405551234` → dò ra Quần đảo\n * Virgin (+1340), rồi giá trị bị ghép lại theo mã mới thành số rác.\n */\n if (!value || nationalInput !== null) return;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n const shouldDetect = startsWithPlus || digits.length >= 10;\n\n if (!shouldDetect) return;\n\n const detected = detectCountryFromNumber(value, countries, country);\n if (detected && detected.code !== country) {\n store.setState(\"country\", detected.code);\n }\n }, [value, countries, country, store, startsWithPlus, nationalInput]);\n\n const contextValue = React.useMemo<PhoneInputContextValue>(\n () => ({\n rootId,\n countries,\n placeholder,\n labels,\n disabled,\n readOnly,\n required,\n invalid,\n showFlag,\n inputRef\n }),\n [rootId, countries, placeholder, labels, disabled, required, readOnly, invalid, showFlag]\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <PhoneInputContext.Provider value={contextValue}>\n <RootPrimitive\n role=\"group\"\n data-slot=\"phone-input\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n id={rootId}\n {...rootProps}\n ref={composedRef}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: khung mượn đúng vai trò màu của `Input` Comitor để đứng cạnh ô\n * nhập thường trong một form không lệch (cao `h-9` thay vì `h-10`, nền `bg-background`\n * thay vì `dark:bg-input/30` — viết thẳng thang màu thì bảng tương phản cao không đổi\n * được). Số đo từng vai trò: chú thích đầu `input.tsx`.\n *\n * Focus: thượng nguồn soi `[data-slot=input-group-control]` — slot KHÔNG tồn tại trong\n * component này, nên khung không bao giờ sáng. Ở đây soi đúng slot của ô số.\n *\n * Lỗi: HAI đường như `InputGroup` — `aria-invalid` trên ô số (prop `invalid`), hoặc\n * trên CHÍNH gốc khi `<FormControl>` của `@comitor/ui/form` dán nó vào con trực tiếp.\n * Viền lỗi là `--destructive-ink` (không phải `--destructive` — token TÔ NỀN).\n *\n * Vô hiệu: thượng nguồn làm mờ CẢ gốc (`data-disabled:opacity-50`) trong khi nút và ô\n * số bên trong cũng tự mờ theo `:disabled` → nội dung còn 25%. Ở đây gốc KHÔNG mờ (như\n * `InputGroup`); hai con tự mờ bằng `:disabled` gốc của HTML, gốc chỉ đổi nền theo ô số.\n * `data-disabled` còn không được cổng tương phản coi là trạng thái vô hiệu — nó không\n * chứng minh phần tử đã inert — còn `:disabled` thì có.\n */\n \"relative flex h-9 w-full items-center rounded-md border border-input bg-background transition-colors duration-150 ease-out hover:border-control-edge-strong\",\n \"has-[[data-slot=phone-input-field]:focus-visible]:border-primary-ink has-[[data-slot=phone-input-field]:focus-visible]:ring-2 has-[[data-slot=phone-input-field]:focus-visible]:ring-ring/50\",\n \"has-[[data-slot][aria-invalid=true]]:border-destructive-ink has-[[data-slot][aria-invalid=true]]:ring-destructive/30\",\n \"aria-invalid:border-destructive-ink aria-invalid:hover:border-destructive-ink aria-invalid:ring-destructive/30\",\n \"data-disabled:cursor-not-allowed has-[[data-slot=phone-input-field]:disabled]:bg-muted\",\n className\n )}\n />\n {isFormControl && (\n <VisuallyHiddenInput\n type=\"hidden\"\n control={formTrigger}\n name={name}\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n />\n )}\n </PhoneInputContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface PhoneInputCountrySelectProps\n extends React.ComponentProps<typeof Popover>,\n Pick<React.ComponentProps<typeof PopoverTrigger>, \"disabled\" | \"className\"> {}\n\nfunction PhoneInputCountrySelect(props: PhoneInputCountrySelectProps) {\n const { disabled: disabledProp, className, children, onOpenChange: onOpenChangeProp, ...popoverProps } = props;\n\n const { countries, inputRef, disabled, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);\n const store = useStoreContext(COUNTRY_SELECT_NAME);\n const country = useStore((state) => state.country);\n const open = useStore((state) => state.open);\n const onOpenChangeRef = useAsRef(onOpenChangeProp);\n\n const isDisabled = disabledProp || disabled;\n\n const countryContext = countries.find((c) => c.code === country);\n\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n store.setState(\"open\", open);\n onOpenChangeRef.current?.(open);\n },\n [store, onOpenChangeRef]\n );\n\n return (\n <Popover open={open} onOpenChange={onOpenChange} {...popoverProps}>\n <PopoverTrigger\n data-slot=\"phone-input-country-select\"\n // ⚠ Khác thượng nguồn: bản gốc là một nút KHÔNG TÊN (chỉ có lá cờ emoji + mũi tên, hoặc\n // ô xám trống khi chưa chọn). Tên nói luôn giá trị hiện tại — xem `PhoneInputLabels`.\n aria-label={labels.countrySelect(countryContext)}\n disabled={isDisabled}\n className={cn(\n /*\n * Hover `bg-muted` như nút `ghost` của gói. Viền focus cùng khuôn `Button`\n * (`outline-ring`), nhưng THỤT VÀO trong (`-outline-offset-2`) vì nút nằm lọt trong khung\n * của ô — viền đẩy ra ngoài sẽ đè lên khung và lên ô số bên cạnh.\n */\n \"flex h-full shrink-0 items-center gap-2 rounded-l-md border-r border-input bg-transparent px-3 text-sm transition-colors duration-150 ease-out hover:bg-muted focus-visible:outline-2 focus-visible:outline-ring focus-visible:-outline-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n >\n {/* `span` thay cho `div` của thượng nguồn: `<button>` chỉ nhận nội dung phrasing. */}\n {!countryContext ? (\n /*\n * ⚠ Khác thượng nguồn: bản gốc vẽ một ô `bg-muted/50` trống — 1,00:1 trên nền hover\n * `--muted`, tức biến mất đúng lúc người dùng rê chuột vào (cổng tương phản chặn). Quả\n * địa cầu nói được \"chưa chọn quốc gia\"; giữ bề rộng `w-6` của lá cờ để chọn xong không\n * xô lệch.\n */\n <span aria-hidden=\"true\" className=\"flex w-6 justify-center\">\n <Globe className=\"size-4 text-muted-foreground\" />\n </span>\n ) : (\n showFlag &&\n countryContext.flag && (\n <span aria-hidden=\"true\" className=\"w-6 text-lg leading-none\">\n {countryContext.flag}\n </span>\n )\n )}\n {/* Mũi tên chỉ trạng thái → ngưỡng 3:1; `text-muted-foreground` như chevron của `SelectTrigger`. */}\n <ChevronDown aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\n <Command filter={filterCountries}>\n <CommandInput placeholder={labels.searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{labels.empty}</CommandEmpty>\n <CommandGroup>\n {countries.map((c) => (\n <CommandItem\n key={c.code}\n value={`${c.name} ${c.dialCode} ${c.code}`}\n onSelect={() => {\n store.setState(\"country\", c.code);\n store.setState(\"open\", false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }}\n >\n {/* Cờ là trang trí — tên nước ngay bên cạnh đã nói đủ; không ẩn thì bị đọc hai lần. */}\n {showFlag && c.flag && (\n <span aria-hidden=\"true\" className=\"text-lg\">\n {c.flag}\n </span>\n )}\n <span className=\"flex-1\">{c.name}</span>\n <span className=\"text-muted-foreground\">{c.dialCode}</span>\n <Check\n aria-hidden=\"true\"\n className={cn(\"size-4\", country === c.code ? \"opacity-100\" : \"opacity-0\")}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PhoneInputFieldProps = React.ComponentProps<\"input\">;\n\nfunction PhoneInputField(props: PhoneInputFieldProps) {\n const {\n onChange: onChangeProp,\n className,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n required: requiredProp,\n placeholder: placeholderProp,\n ref,\n ...inputProps\n } = props;\n\n const { inputRef, disabled, invalid, readOnly, required, placeholder, countries } = usePhoneInputContext(FIELD_NAME);\n const store = useStoreContext(FIELD_NAME);\n const value = useStore((state) => state.value);\n const nationalInput = useStore((state) => getNationalInput(state, countries));\n\n const composedRef = useComposedRefs(ref, inputRef);\n\n const onChangeRef = useAsRef(onChangeProp);\n\n const isDisabled = disabledProp || disabled;\n const isReadOnly = readOnlyProp || readOnly;\n const isRequired = requiredProp || required;\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isDisabled || isReadOnly) return;\n\n onChangeRef.current?.(event);\n if (event.defaultPrevented) return;\n\n const inputValue = event.target.value;\n\n // ⚠ Khác thượng nguồn: bỏ khoảng trắng đầu trước khi xét dấu `+` — chuỗi dán vào hay kèm nó.\n const startsWithPlus = inputValue.trimStart().startsWith(\"+\");\n\n // ⚠ Khác thượng nguồn — số NỘI ĐỊA (luật và lý do: chú thích trên `nationalToE164`).\n const selectedCountry = startsWithPlus ? undefined : countries.find((c) => c.code === store.getState().country);\n\n if (selectedCountry) {\n const nextNationalInput = inputValue.replace(NATIONAL_INPUT_DISALLOWED, \"\");\n\n if (nextNationalInput !== inputValue) {\n // Gạt ký tự lạ NGAY trên DOM và đặt lại con trỏ tại chỗ: nhờ vậy lúc render React thấy\n // DOM đã đúng giá trị, không ghi đè — ghi đè là con trỏ nhảy về cuối ô.\n const target = event.target;\n const caret = target.selectionStart ?? inputValue.length;\n const nextCaret = inputValue.slice(0, caret).replace(NATIONAL_INPUT_DISALLOWED, \"\").length;\n target.value = nextNationalInput;\n target.setSelectionRange(nextCaret, nextCaret);\n }\n\n store.setState(\"startsWithPlus\", false);\n store.setState(\"nationalInput\", nextNationalInput);\n store.setState(\"value\", nationalToE164(nextNationalInput, selectedCountry));\n return;\n }\n\n const digits = inputValue.replace(/\\D/g, \"\");\n const newValue = digits ? `+${digits}` : startsWithPlus ? \"+\" : \"\";\n store.setState(\"startsWithPlus\", startsWithPlus);\n store.setState(\"nationalInput\", null);\n store.setState(\"value\", newValue);\n },\n [store, countries, onChangeRef, isDisabled, isReadOnly]\n );\n\n // Số nội địa hiện NGUYÊN VĂN chữ đã gõ (con trỏ không nhảy); số quốc tế tách nhóm như thượng nguồn.\n const displayValue = React.useMemo(() => {\n return nationalInput ?? formatPhoneNumber(value, countries);\n }, [nationalInput, value, countries]);\n\n return (\n <Input\n type=\"tel\"\n inputMode=\"tel\"\n aria-required={isRequired}\n aria-invalid={invalid}\n data-slot=\"phone-input-field\"\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n {...inputProps}\n ref={composedRef}\n className={cn(\n // Viền, quầng focus và nền (kể cả nền `--muted` lúc vô hiệu) đều do khung gốc vẽ; ô số\n // trong suốt và phẳng. `focus:ring-0` chứ không `focus-visible:` — `Input` vẽ quầng bằng `focus:`.\n \"h-full flex-1 rounded-l-none rounded-r-md border-0 bg-transparent focus:ring-0 disabled:bg-transparent\",\n className\n )}\n // ⚠ Khác thượng nguồn: bản gốc đặt placeholder của gốc SAU `{...inputProps}`, nên\n // `<PhoneInputField placeholder=\"…\" />` (chính demo của thượng nguồn) bị lờ đi.\n placeholder={placeholderProp ?? placeholder}\n value={displayValue}\n onChange={onChange}\n />\n );\n}\n\nexport {\n PhoneInput,\n PhoneInputCountrySelect,\n type PhoneInputCountrySelectProps,\n PhoneInputField,\n type PhoneInputFieldProps,\n type PhoneInputProps,\n useStore as usePhoneInput\n};\n"],"mappings":"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AAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,M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","names":["value","nationalInput","open"]}
1
+ {"version":3,"sources":["../../../src/components/ui/phone-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/phone-input) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { defaultFilter } from \"cmdk\";\nimport { Check, ChevronDown, Globe } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useComitorLabels, useComitorLocale } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useAsRef } from \"../../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../../lib/use-lazy-ref.js\";\nimport { VisuallyHiddenInput } from \"../../lib/visually-hidden-input.js\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"./command.js\";\nimport { Input } from \"./input.js\";\nimport type { PhoneInputCountry as Country, PhoneInputLabels } from \"./phone-input-constants.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover.js\";\n\nconst ROOT_NAME = \"PhoneInput\";\nconst COUNTRY_SELECT_NAME = \"PhoneInputCountrySelect\";\nconst FIELD_NAME = \"PhoneInputField\";\n\n/*\n * Quốc gia mặc định: KHÔNG CÓ — như thượng nguồn (nút chọn hiện quả địa cầu, chưa chọn gì). Nước\n * là thiết lập của VÙNG, không phải của ngôn ngữ (xem `src/i18n/locale.ts`): app Comitor truyền\n * `defaultCountry` / `country` từ cài đặt workspace. Trước `3.0.0` mặc định cứng là `\"VN\"`.\n *\n * ⚠ Khác thượng nguồn: tên quốc gia theo `locale` của `ComitorLocaleProvider` (prop `locale` đè)\n * thay vì ghim tiếng Anh. Trước `3.0.0` mặc định cứng là `\"vi\"`.\n */\n\n/**\n * Bảng mã quay số theo quốc gia (≈250 nước), dạng `[iso2, mã quay số]`.\n * @see https://github.com/mukeshsoni/country-telephone-data/blob/master/country_telephone_data.js\n * @format [iso2, dialCode]\n */\nconst COUNTRY_DATA: [string, string][] = [\n [\"af\", \"93\"],\n [\"ax\", \"358\"],\n [\"al\", \"355\"],\n [\"dz\", \"213\"],\n [\"as\", \"1684\"],\n [\"ad\", \"376\"],\n [\"ao\", \"244\"],\n [\"ai\", \"1264\"],\n [\"ag\", \"1268\"],\n [\"ar\", \"54\"],\n [\"am\", \"374\"],\n [\"aw\", \"297\"],\n [\"au\", \"61\"],\n [\"at\", \"43\"],\n [\"az\", \"994\"],\n [\"bs\", \"1242\"],\n [\"bh\", \"973\"],\n [\"bd\", \"880\"],\n [\"bb\", \"1246\"],\n [\"by\", \"375\"],\n [\"be\", \"32\"],\n [\"bz\", \"501\"],\n [\"bj\", \"229\"],\n [\"bm\", \"1441\"],\n [\"bt\", \"975\"],\n [\"bo\", \"591\"],\n [\"ba\", \"387\"],\n [\"bw\", \"267\"],\n [\"br\", \"55\"],\n [\"io\", \"246\"],\n [\"vg\", \"1284\"],\n [\"bn\", \"673\"],\n [\"bg\", \"359\"],\n [\"bf\", \"226\"],\n [\"bi\", \"257\"],\n [\"kh\", \"855\"],\n [\"cm\", \"237\"],\n [\"ca\", \"1\"],\n [\"cv\", \"238\"],\n [\"bq\", \"599\"],\n [\"ky\", \"1345\"],\n [\"cf\", \"236\"],\n [\"td\", \"235\"],\n [\"cl\", \"56\"],\n [\"cn\", \"86\"],\n [\"co\", \"57\"],\n [\"km\", \"269\"],\n [\"cd\", \"243\"],\n [\"cg\", \"242\"],\n [\"ck\", \"682\"],\n [\"cr\", \"506\"],\n [\"ci\", \"225\"],\n [\"hr\", \"385\"],\n [\"cu\", \"53\"],\n [\"cw\", \"599\"],\n [\"cy\", \"357\"],\n [\"cz\", \"420\"],\n [\"dk\", \"45\"],\n [\"dj\", \"253\"],\n [\"dm\", \"1767\"],\n [\"do\", \"1\"],\n [\"ec\", \"593\"],\n [\"eg\", \"20\"],\n [\"sv\", \"503\"],\n [\"gq\", \"240\"],\n [\"er\", \"291\"],\n [\"ee\", \"372\"],\n [\"et\", \"251\"],\n [\"fk\", \"500\"],\n [\"fo\", \"298\"],\n [\"fj\", \"679\"],\n [\"fi\", \"358\"],\n [\"fr\", \"33\"],\n [\"gf\", \"594\"],\n [\"pf\", \"689\"],\n [\"ga\", \"241\"],\n [\"gm\", \"220\"],\n [\"ge\", \"995\"],\n [\"de\", \"49\"],\n [\"gh\", \"233\"],\n [\"gi\", \"350\"],\n [\"gr\", \"30\"],\n [\"gl\", \"299\"],\n [\"gd\", \"1473\"],\n [\"gp\", \"590\"],\n [\"gu\", \"1671\"],\n [\"gt\", \"502\"],\n [\"gg\", \"44\"],\n [\"gn\", \"224\"],\n [\"gw\", \"245\"],\n [\"gy\", \"592\"],\n [\"ht\", \"509\"],\n [\"hn\", \"504\"],\n [\"hk\", \"852\"],\n [\"hu\", \"36\"],\n [\"is\", \"354\"],\n [\"in\", \"91\"],\n [\"id\", \"62\"],\n [\"ir\", \"98\"],\n [\"iq\", \"964\"],\n [\"ie\", \"353\"],\n [\"im\", \"44\"],\n [\"il\", \"972\"],\n [\"it\", \"39\"],\n [\"jm\", \"1876\"],\n [\"jp\", \"81\"],\n [\"je\", \"44\"],\n [\"jo\", \"962\"],\n [\"kz\", \"7\"],\n [\"ke\", \"254\"],\n [\"ki\", \"686\"],\n [\"xk\", \"383\"],\n [\"kw\", \"965\"],\n [\"kg\", \"996\"],\n [\"la\", \"856\"],\n [\"lv\", \"371\"],\n [\"lb\", \"961\"],\n [\"ls\", \"266\"],\n [\"lr\", \"231\"],\n [\"ly\", \"218\"],\n [\"li\", \"423\"],\n [\"lt\", \"370\"],\n [\"lu\", \"352\"],\n [\"mo\", \"853\"],\n [\"mk\", \"389\"],\n [\"mg\", \"261\"],\n [\"mw\", \"265\"],\n [\"my\", \"60\"],\n [\"mv\", \"960\"],\n [\"ml\", \"223\"],\n [\"mt\", \"356\"],\n [\"mh\", \"692\"],\n [\"mq\", \"596\"],\n [\"mr\", \"222\"],\n [\"mu\", \"230\"],\n [\"mx\", \"52\"],\n [\"fm\", \"691\"],\n [\"md\", \"373\"],\n [\"mc\", \"377\"],\n [\"mn\", \"976\"],\n [\"me\", \"382\"],\n [\"ms\", \"1664\"],\n [\"ma\", \"212\"],\n [\"mz\", \"258\"],\n [\"mm\", \"95\"],\n [\"na\", \"264\"],\n [\"nr\", \"674\"],\n [\"np\", \"977\"],\n [\"nl\", \"31\"],\n [\"nc\", \"687\"],\n [\"nz\", \"64\"],\n [\"ni\", \"505\"],\n [\"ne\", \"227\"],\n [\"ng\", \"234\"],\n [\"nu\", \"683\"],\n [\"nf\", \"672\"],\n [\"kp\", \"850\"],\n [\"mp\", \"1670\"],\n [\"no\", \"47\"],\n [\"om\", \"968\"],\n [\"pk\", \"92\"],\n [\"pw\", \"680\"],\n [\"ps\", \"970\"],\n [\"pa\", \"507\"],\n [\"pg\", \"675\"],\n [\"py\", \"595\"],\n [\"pe\", \"51\"],\n [\"ph\", \"63\"],\n [\"pl\", \"48\"],\n [\"pt\", \"351\"],\n [\"pr\", \"1\"],\n [\"qa\", \"974\"],\n [\"re\", \"262\"],\n [\"ro\", \"40\"],\n [\"ru\", \"7\"],\n [\"rw\", \"250\"],\n [\"bl\", \"590\"],\n [\"sh\", \"290\"],\n [\"kn\", \"1869\"],\n [\"lc\", \"1758\"],\n [\"mf\", \"590\"],\n [\"pm\", \"508\"],\n [\"vc\", \"1784\"],\n [\"ws\", \"685\"],\n [\"sm\", \"378\"],\n [\"st\", \"239\"],\n [\"sa\", \"966\"],\n [\"sn\", \"221\"],\n [\"rs\", \"381\"],\n [\"sc\", \"248\"],\n [\"sl\", \"232\"],\n [\"sg\", \"65\"],\n [\"sx\", \"1721\"],\n [\"sk\", \"421\"],\n [\"si\", \"386\"],\n [\"sb\", \"677\"],\n [\"so\", \"252\"],\n [\"za\", \"27\"],\n [\"kr\", \"82\"],\n [\"ss\", \"211\"],\n [\"es\", \"34\"],\n [\"lk\", \"94\"],\n [\"sd\", \"249\"],\n [\"sr\", \"597\"],\n [\"sz\", \"268\"],\n [\"se\", \"46\"],\n [\"ch\", \"41\"],\n [\"sy\", \"963\"],\n [\"tw\", \"886\"],\n [\"tj\", \"992\"],\n [\"tz\", \"255\"],\n [\"th\", \"66\"],\n [\"tl\", \"670\"],\n [\"tg\", \"228\"],\n [\"tk\", \"690\"],\n [\"to\", \"676\"],\n [\"tt\", \"1868\"],\n [\"tn\", \"216\"],\n [\"tr\", \"90\"],\n [\"tm\", \"993\"],\n [\"tc\", \"1649\"],\n [\"tv\", \"688\"],\n [\"vi\", \"1340\"],\n [\"ug\", \"256\"],\n [\"ua\", \"380\"],\n [\"ae\", \"971\"],\n [\"gb\", \"44\"],\n [\"us\", \"1\"],\n [\"uy\", \"598\"],\n [\"uz\", \"998\"],\n [\"vu\", \"678\"],\n [\"va\", \"39\"],\n [\"ve\", \"58\"],\n [\"vn\", \"84\"],\n [\"wf\", \"681\"],\n [\"eh\", \"212\"],\n [\"ye\", \"967\"],\n [\"zm\", \"260\"],\n [\"zw\", \"263\"]\n];\n\nfunction getCountryName(countryCode: string, regionNames: Intl.DisplayNames | undefined): string {\n try {\n return regionNames?.of(countryCode) ?? countryCode;\n } catch {\n return countryCode;\n }\n}\n\nfunction getFlagEmoji(countryCode: string): string {\n const codePoints = countryCode\n .toUpperCase()\n .split(\"\")\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n}\n\n/*\n * ⚠ Khác thượng nguồn, ba chỗ:\n * 1. Tên theo `locale` (mặc định: `locale` của `ComitorLocaleProvider`) thay vì ghim \"en\".\n * 2. `Intl.DisplayNames` + `Intl.Collator` dựng MỘT lần cho cả danh sách. Thượng nguồn dựng\n * `DisplayNames` cho từng nước (≈250 lần) và gọi hàm này làm giá trị mặc định của prop, tức\n * MỖI LƯỢT RENDER — mỗi phím gõ vào ô số là dựng lại cả danh sách.\n * 3. Sắp xếp bằng collator của đúng `locale` đó (\"Đan Mạch\" sau \"Dominica\" như từ điển tiếng\n * Việt), không theo locale mặc định của máy chạy — server và trình duyệt mới ra cùng thứ tự.\n */\nfunction getCountries(locale: string): Country[] {\n let regionNames: Intl.DisplayNames | undefined;\n let collator: Intl.Collator | undefined;\n try {\n regionNames = new Intl.DisplayNames([locale], { type: \"region\" });\n collator = new Intl.Collator(locale);\n } catch {\n // `locale` không hợp lệ → tên rơi về mã nước, thứ tự theo `localeCompare` mặc định.\n }\n\n return COUNTRY_DATA.map(([iso2, dialCode]): Country => {\n const code = iso2.toUpperCase();\n return {\n code,\n name: getCountryName(code, regionNames),\n dialCode: `+${dialCode}`,\n flag: getFlagEmoji(code)\n };\n }).sort((a, b) => (collator ? collator.compare(a.name, b.name) : a.name.localeCompare(b.name)));\n}\n\n/*\n * ⚠ Khác thượng nguồn: tìm quốc gia KHÔNG DẤU — gõ \"viet nam\" ra \"Việt Nam\", \"duc\" ra \"Đức\".\n * Vẫn dùng `defaultFilter` của cmdk (giữ cách chấm điểm/xếp hạng của thượng nguồn), chỉ bỏ dấu\n * hai vế trước khi so. Chuẩn hoá viết tại chỗ vì hàm bỏ dấu của gói (`removeVietnameseTones`) nằm\n * ở tầng composite, mà tầng primitive không được nhập ngược lên.\n */\nfunction removeDiacritics(text: string): string {\n return text\n .normalize(\"NFD\")\n .replace(/\\p{Diacritic}/gu, \"\")\n .replace(/đ/g, \"d\")\n .replace(/Đ/g, \"D\");\n}\n\nfunction filterCountries(value: string, search: string, keywords?: string[]): number {\n return defaultFilter(removeDiacritics(value), removeDiacritics(search), keywords?.map(removeDiacritics));\n}\n\n/*\n * ⚠ Khác thượng nguồn: 8 mã quay số trong `COUNTRY_DATA` là của CHUNG nhiều nước. Thượng nguồn chỉ\n * xử lý riêng +1 → US; mã còn lại rơi vào nước đứng TRƯỚC theo thứ tự chữ cái của TÊN, tức phụ\n * thuộc ngôn ngữ hiển thị. Đo được (ICU của Node 24): tên tiếng Anh cho +7 → Kazakhstan, +44 →\n * Guernsey, +358 → Quần đảo Åland, +599 → Ca-ri-bê Hà Lan; tên tiếng Việt cho +7 → Kazakhstan,\n * +44 → Đảo Man, +599 → Ca-ri-bê Hà Lan. Bảng này ghim nước chính của từng mã, bất kể ngôn ngữ.\n */\nconst PRIMARY_COUNTRY_BY_DIAL_CODE: Record<string, string> = {\n \"+1\": \"US\",\n \"+7\": \"RU\",\n \"+39\": \"IT\",\n \"+44\": \"GB\",\n \"+212\": \"MA\",\n \"+358\": \"FI\",\n \"+590\": \"GP\",\n \"+599\": \"CW\"\n};\n\nfunction detectCountryFromNumber(value: string, countries: Country[], currentCode?: string): Country | undefined {\n if (!value?.startsWith(\"+\")) return undefined;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n if (!digits) return undefined;\n\n const sorted = [...countries].sort((a, b) => b.dialCode.length - a.dialCode.length);\n\n const matches: Country[] = [];\n for (const country of sorted) {\n const dialCode = country.dialCode.slice(1);\n if (digits.startsWith(dialCode)) {\n matches.push(country);\n }\n }\n\n const best = matches[0];\n if (!best) return undefined;\n\n /*\n * ⚠ Khác thượng nguồn: nhiều nước cùng khớp mã DÀI NHẤT → ưu tiên nước ĐANG CHỌN nếu nó nằm trong\n * số đó, rồi mới tới nước chính của mã. Thượng nguồn luôn trả US cho +1, nên người dùng chọn\n * \"Canada\" rồi gõ \"+1 604…\" bị lật cờ sang Hoa Kỳ ngay phím đầu tiên.\n */\n const tied = matches.filter((c) => c.dialCode === best.dialCode);\n if (tied.length > 1) {\n const current = tied.find((c) => c.code === currentCode);\n if (current) return current;\n const primary = tied.find((c) => c.code === PRIMARY_COUNTRY_BY_DIAL_CODE[best.dialCode]);\n if (primary) return primary;\n }\n\n return best;\n}\n\nfunction formatPhoneNumber(value: string, countries: Country[]): string {\n if (!value) return \"\";\n\n const normalized = value.startsWith(\"+\") ? value : `+${value}`;\n\n const digits = normalized.slice(1).replace(/\\D/g, \"\");\n if (!digits) return \"+\";\n\n const detected = detectCountryFromNumber(`+${digits}`, countries);\n const dialCodeLength = detected ? detected.dialCode.slice(1).length : Math.min(digits.length, 3);\n\n const countryCode = digits.slice(0, dialCodeLength);\n const rest = digits.slice(dialCodeLength);\n\n let formatted = `+${countryCode}`;\n\n if (rest) {\n formatted += \" \";\n for (let i = 0; i < rest.length; i++) {\n if (i > 0 && i % 3 === 0) {\n formatted += \" \";\n }\n formatted += rest[i];\n }\n }\n\n return formatted;\n}\n\n/*\n * ⚠ Khác thượng nguồn — SỐ NỘI ĐỊA. CRM/HR phải lưu số dạng E.164 (`+84912345678`), mà người Việt\n * gõ số của mình kèm số 0 đầu (`0912 345 678`). Thượng nguồn coi chữ số đầu tiên luôn là mã quốc\n * gia nên lưu ra `+0912345678` — một số không tồn tại. Luật ở đây: chuỗi gõ vào KHÔNG bắt đầu bằng\n * `+` và đang có quốc gia được chọn → đó là số NỘI ĐỊA của nước ấy: bỏ MỘT số 0 đầu (tiền tố trung\n * kế) rồi ghép mã quay số của nước đang chọn. Bắt đầu bằng `+` → như thượng nguồn (nước suy từ mã).\n * Không có quốc gia nào được chọn → như thượng nguồn. Từ `3.0.0` đó là trạng thái MẶC ĐỊNH (không\n * còn `\"VN\"` ngầm định): luật nội địa chỉ chạy khi app truyền `defaultCountry`/`country` hoặc\n * người dùng chọn nước trước khi gõ.\n *\n * `COUNTRY_DATA` không có thông tin tiền tố trung kế, nên số 0 đầu mặc định được coi là tiền tố —\n * TRỪ các nước trong bảng dưới: không có tiền tố trung kế mà số thật lại bắt đầu bằng 0 (máy bàn Ý\n * `06 …` → `+39 06 …`, cả San Marino và Vatican dùng chung luật đánh số đó). Nước có tiền tố trung\n * kế KHÁC 0 (Nga/Kazakhstan `8`, Bắc Mỹ `1`) chưa được xử lý: gõ kèm tiền tố ấy thì nó lọt vào số.\n */\nconst NO_TRUNK_PREFIX_COUNTRIES = new Set([\"IT\", \"SM\", \"VA\"]);\n\n/** Ký tự bị gạt khỏi ô khi gõ số nội địa — giữ chữ số và các dấu ngăn cách quen tay. */\nconst NATIONAL_INPUT_DISALLOWED = /[^\\d\\s().-]/g;\n\nfunction nationalToE164(nationalInput: string, country: Country): string {\n let digits = nationalInput.replace(/\\D/g, \"\");\n if (digits.startsWith(\"0\") && !NO_TRUNK_PREFIX_COUNTRIES.has(country.code)) {\n digits = digits.slice(1);\n }\n return digits ? `${country.dialCode}${digits}` : \"\";\n}\n\n/**\n * Chuỗi nội địa người dùng đang gõ — CHỈ khi nó còn khớp giá trị hiện tại. App đặt lại `value` từ\n * ngoài (reset form, nạp bản ghi khác) thì chuỗi cũ hết đúng, ô quay về dạng quốc tế đã tách nhóm.\n */\nfunction getNationalInput(state: StoreState, countries: Country[]): string | null {\n const { nationalInput, country, value } = state;\n if (nationalInput === null) return null;\n const selected = countries.find((c) => c.code === country);\n if (!selected || nationalToE164(nationalInput, selected) !== value) return null;\n return nationalInput;\n}\n\ntype RootElement = React.ComponentRef<typeof PhoneInput>;\n\ninterface StoreState {\n value: string;\n country: string;\n open: boolean;\n startsWithPlus: boolean;\n /**\n * ⚠ Thêm so với thượng nguồn: chữ người dùng gõ ở chế độ số nội địa, đúng như gõ (đã gạt ký tự\n * lạ), để ô hiện lại nguyên văn thay vì dạng `+84 …`. `null` = chế độ quốc tế của thượng nguồn.\n */\n nationalInput: string | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T, ogStore?: Store | null): T {\n const contextStore = React.useContext(StoreContext);\n\n const store = ogStore ?? contextStore;\n\n if (!store) {\n throw new Error(`\\`usePhoneInput\\` phải được gọi bên trong \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface PhoneInputContextValue {\n rootId: string;\n countries: Country[];\n placeholder: string;\n labels: PhoneInputLabels;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nconst PhoneInputContext = React.createContext<PhoneInputContextValue | null>(null);\n\nfunction usePhoneInputContext(consumerName: string) {\n const context = React.useContext(PhoneInputContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\n/**\n * Ô nhập số điện thoại quốc tế: nút chọn quốc gia (`PhoneInputCountrySelect`) + ô số\n * (`PhoneInputField`). Giá trị (`value` / `onValueChange` / input ẩn khi submit form) luôn là E.164\n * chỉ gồm chữ số: `\"+84912345678\"`. Người dùng gõ được theo HAI cách:\n *\n * - **Số nội địa** — chuỗi KHÔNG bắt đầu bằng `+`, và đang có quốc gia được chọn (`defaultCountry`\n * / `country`, hoặc người dùng chọn): bỏ một số 0 đầu rồi ghép mã quay số của nước đang chọn. Ô hiện NGUYÊN VĂN chữ đã gõ\n * (chỉ gạt ký tự không phải số hay `space ( ) . -`), con trỏ không nhảy; đổi quốc gia thì giá trị\n * ghép lại theo mã mới, còn chữ trên ô giữ nguyên.\n * Nước là Việt Nam, gõ `0912 345 678` → ô hiện `0912 345 678`, `onValueChange(\"+84912345678\")`.\n * ⚠ Khác thượng nguồn — bản gốc ra `+0912345678`. Ý, San Marino, Vatican giữ số 0 đầu (máy bàn\n * `06 …` → `+39 06 …`).\n * - **Số quốc tế** — chuỗi bắt đầu bằng `+` (như thượng nguồn): ô hiện tách nhóm\n * (`+84 912 345 678`), quốc gia tự nhận theo mã quay số.\n * Gõ `+84 912 345 678` → `onValueChange(\"+84912345678\")`, cờ chuyển sang Việt Nam.\n *\n * Giá trị nạp từ ngoài (`value`/`defaultValue`) luôn hiện ở dạng quốc tế. Không có quốc gia nào\n * được chọn — MẶC ĐỊNH từ `3.0.0` — thì mọi chữ số đầu bị coi là mã quốc gia, như thượng nguồn:\n * gõ `0912 345 678` ra `+0912345678`, gõ `84 912 345 678` ra `+84912345678` và cờ tự nhận Việt Nam.\n *\n * Gốc là `role=\"group\"` chưa có tên: đặt `aria-label` (vd \"Phone number\") hoặc `aria-labelledby`\n * cho chính `PhoneInput`.\n */\ninterface PhoneInputProps extends React.ComponentProps<\"div\"> {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n /**\n * Quốc gia ban đầu (mã ISO alpha-2, viết HOA). Mặc định: KHÔNG CÓ, như thượng nguồn — nước là\n * thiết lập VÙNG, không suy từ ngôn ngữ; app Comitor truyền từ cài đặt workspace.\n *\n * ⚠ Không có quốc gia thì chế độ số NỘI ĐỊA tắt (xem JSDoc của `PhoneInput`). Trước `3.0.0`\n * mặc định cứng là `\"VN\"`.\n */\n defaultCountry?: string;\n country?: string;\n onCountryChange?: (country: string) => void;\n countries?: Country[];\n name?: string;\n /** Placeholder ô nhập số — thắng khoá `labels.placeholder` (namespace `phoneInput`). */\n placeholder?: string;\n /**\n * Locale BCP 47 để gọi tên quốc gia (`Intl.DisplayNames`) và sắp xếp danh sách. Không truyền thì\n * theo `locale` của `ComitorLocaleProvider` (không có provider → `\"en\"`; trước `3.0.0` mặc định\n * cứng là `\"vi\"`). Bỏ qua khi app truyền `countries` riêng (tên lấy nguyên từ đó).\n *\n * ⚠ Thêm so với thượng nguồn — bản gốc ghim tên tiếng Anh.\n */\n locale?: string;\n /**\n * Chuỗi hiển thị/đọc màn hình (phần chọn quốc gia + placeholder ô số) — override từng khoá. Không\n * truyền thì theo namespace `phoneInput` của `ComitorLocaleProvider` (mặc định tiếng Anh).\n */\n labels?: Partial<PhoneInputLabels>;\n asChild?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n showFlag?: boolean;\n}\n\nfunction PhoneInput(props: PhoneInputProps) {\n const {\n value: valueProp,\n defaultValue,\n defaultCountry,\n country: countryProp,\n onValueChange,\n onCountryChange,\n countries: countriesProp,\n name,\n placeholder: placeholderProp,\n locale: localeProp,\n labels: labelsProp,\n asChild,\n disabled,\n required,\n readOnly,\n invalid,\n showFlag = true,\n className,\n id,\n ref,\n ...rootProps\n } = props;\n\n const { locale: providerLocale } = useComitorLocale();\n const locale = localeProp ?? providerLocale;\n const labels = useComitorLabels(\"phoneInput\", labelsProp);\n const placeholder = placeholderProp ?? labels.placeholder;\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // ⚠ Khác thượng nguồn: ghi nhớ danh sách (thượng nguồn dựng lại mỗi lượt render — xem `getCountries`).\n const countries = React.useMemo(() => countriesProp ?? getCountries(locale), [countriesProp, locale]);\n\n const [formTrigger, setFormTrigger] = React.useState<RootElement | null>(null);\n const composedRef = useComposedRefs(ref, (node) => setFormTrigger(node));\n const isFormControl = formTrigger ? !!formTrigger.closest(\"form\") : true;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => {\n const initialValue = valueProp ?? defaultValue ?? \"\";\n const initialCountry = countryProp ?? defaultCountry ?? \"\";\n\n return {\n value: initialValue,\n country: initialCountry,\n open: false,\n startsWithPlus: initialValue.startsWith(\"+\"),\n nationalInput: null\n };\n });\n\n const propsRef = useAsRef({\n onValueChange,\n onCountryChange,\n countries\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else if (key === \"country\" && typeof value === \"string\") {\n // Đọc TRƯỚC khi đổi nước: chuỗi nội địa chỉ còn hiệu lực nếu khớp giá trị theo nước CŨ.\n const nationalInput = getNationalInput(stateRef.current, propsRef.current.countries);\n stateRef.current.country = value;\n propsRef.current.onCountryChange?.(value);\n\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa mà đổi quốc gia → chữ trên ô giờ là số nội địa\n * của nước MỚI, giá trị ghép lại mã quay số mới (ô giữ nguyên chữ). Nước mới không có\n * trong danh sách (bỏ chọn) → thôi chế độ nội địa, giữ nguyên giá trị E.164 đang có.\n */\n if (nationalInput !== null) {\n const selected = propsRef.current.countries.find((c) => c.code === value);\n if (selected) {\n const nextValue = nationalToE164(nationalInput, selected);\n if (nextValue !== stateRef.current.value) {\n stateRef.current.value = nextValue;\n propsRef.current.onValueChange?.(nextValue);\n }\n } else {\n stateRef.current.nationalInput = null;\n }\n }\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n };\n }, [listenersRef, stateRef, propsRef]);\n\n const value = useStore((state) => state.value, store);\n const country = useStore((state) => state.country, store);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp]);\n\n useIsomorphicLayoutEffect(() => {\n if (countryProp !== undefined) {\n store.setState(\"country\", countryProp);\n }\n }, [countryProp]);\n\n const startsWithPlus = useStore((state) => state.startsWithPlus, store);\n const nationalInput = useStore((state) => getNationalInput(state, countries), store);\n\n React.useEffect(() => {\n /*\n * ⚠ Khác thượng nguồn: đang gõ số nội địa thì quốc gia ĐANG CHỌN là nguồn sự thật — dò lại theo\n * mã quay số lúc này chỉ có thể sai: Hoa Kỳ + `340 555 1234` → `+13405551234` → dò ra Quần đảo\n * Virgin (+1340), rồi giá trị bị ghép lại theo mã mới thành số rác.\n */\n if (!value || nationalInput !== null) return;\n\n const digits = value.slice(1).replace(/\\D/g, \"\");\n const shouldDetect = startsWithPlus || digits.length >= 10;\n\n if (!shouldDetect) return;\n\n const detected = detectCountryFromNumber(value, countries, country);\n if (detected && detected.code !== country) {\n store.setState(\"country\", detected.code);\n }\n }, [value, countries, country, store, startsWithPlus, nationalInput]);\n\n const contextValue = React.useMemo<PhoneInputContextValue>(\n () => ({\n rootId,\n countries,\n placeholder,\n labels,\n disabled,\n readOnly,\n required,\n invalid,\n showFlag,\n inputRef\n }),\n [rootId, countries, placeholder, labels, disabled, required, readOnly, invalid, showFlag]\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <PhoneInputContext.Provider value={contextValue}>\n <RootPrimitive\n role=\"group\"\n data-slot=\"phone-input\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n id={rootId}\n {...rootProps}\n ref={composedRef}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: khung mượn đúng vai trò màu của `Input` Comitor để đứng cạnh ô\n * nhập thường trong một form không lệch (cao `h-9` thay vì `h-10`, nền `bg-background`\n * thay vì `dark:bg-input/30` — viết thẳng thang màu thì bảng tương phản cao không đổi\n * được). Số đo từng vai trò: chú thích đầu `input.tsx`.\n *\n * Focus: thượng nguồn soi `[data-slot=input-group-control]` — slot KHÔNG tồn tại trong\n * component này, nên khung không bao giờ sáng. Ở đây soi đúng slot của ô số.\n *\n * Lỗi: HAI đường như `InputGroup` — `aria-invalid` trên ô số (prop `invalid`), hoặc\n * trên CHÍNH gốc khi `<FormControl>` của `@comitor/ui/form` dán nó vào con trực tiếp.\n * Viền lỗi là `--destructive-ink` (không phải `--destructive` — token TÔ NỀN).\n *\n * Vô hiệu: thượng nguồn làm mờ CẢ gốc (`data-disabled:opacity-50`) trong khi nút và ô\n * số bên trong cũng tự mờ theo `:disabled` → nội dung còn 25%. Ở đây gốc KHÔNG mờ (như\n * `InputGroup`); hai con tự mờ bằng `:disabled` gốc của HTML, gốc chỉ đổi nền theo ô số.\n * `data-disabled` còn không được cổng tương phản coi là trạng thái vô hiệu — nó không\n * chứng minh phần tử đã inert — còn `:disabled` thì có.\n */\n \"relative flex h-9 w-full items-center rounded-md border border-input bg-background transition-colors duration-150 ease-out hover:border-control-edge-strong\",\n \"has-[[data-slot=phone-input-field]:focus-visible]:border-primary-ink has-[[data-slot=phone-input-field]:focus-visible]:ring-2 has-[[data-slot=phone-input-field]:focus-visible]:ring-ring/50\",\n \"has-[[data-slot][aria-invalid=true]]:border-destructive-ink has-[[data-slot][aria-invalid=true]]:ring-destructive/30\",\n \"aria-invalid:border-destructive-ink aria-invalid:hover:border-destructive-ink aria-invalid:ring-destructive/30\",\n \"data-disabled:cursor-not-allowed has-[[data-slot=phone-input-field]:disabled]:bg-muted\",\n className\n )}\n />\n {isFormControl && (\n <VisuallyHiddenInput\n type=\"hidden\"\n control={formTrigger}\n name={name}\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n />\n )}\n </PhoneInputContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface PhoneInputCountrySelectProps\n extends React.ComponentProps<typeof Popover>,\n Pick<React.ComponentProps<typeof PopoverTrigger>, \"disabled\" | \"className\"> {}\n\nfunction PhoneInputCountrySelect(props: PhoneInputCountrySelectProps) {\n const { disabled: disabledProp, className, children, onOpenChange: onOpenChangeProp, ...popoverProps } = props;\n\n const { countries, inputRef, disabled, readOnly, showFlag, labels } = usePhoneInputContext(COUNTRY_SELECT_NAME);\n const store = useStoreContext(COUNTRY_SELECT_NAME);\n const country = useStore((state) => state.country);\n const open = useStore((state) => state.open);\n const onOpenChangeRef = useAsRef(onOpenChangeProp);\n\n const isDisabled = disabledProp || disabled;\n\n const countryContext = countries.find((c) => c.code === country);\n\n /*\n * ⚠ Khác thượng nguồn (3.0.1): `readOnly` khoá cả nút chọn nước. Trước đó chỉ ô số bị khoá, nút cờ\n * vẫn mở danh sách và đổi được nước — tức đổi được mã vùng, tức đổi được GIÁ TRỊ của một ô chỉ\n * đọc. Nút vẫn nhận focus (như ô `readOnly` bên cạnh) và vẫn đọc tên nước hiện tại, nhưng không\n * mở; `aria-disabled` nói với trình đọc màn hình rằng nó không thao tác được.\n */\n const onOpenChange = React.useCallback(\n (open: boolean) => {\n if (open && readOnly) return;\n store.setState(\"open\", open);\n onOpenChangeRef.current?.(open);\n },\n [store, onOpenChangeRef, readOnly]\n );\n\n return (\n <Popover open={open} onOpenChange={onOpenChange} {...popoverProps}>\n <PopoverTrigger\n data-slot=\"phone-input-country-select\"\n // ⚠ Khác thượng nguồn: bản gốc là một nút KHÔNG TÊN (chỉ có lá cờ emoji + mũi tên, hoặc\n // ô xám trống khi chưa chọn). Tên nói luôn giá trị hiện tại — xem `PhoneInputLabels`.\n aria-label={labels.countrySelect(countryContext)}\n aria-disabled={readOnly && !isDisabled ? true : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n disabled={isDisabled}\n className={cn(\n /*\n * Hover `bg-muted` như nút `ghost` của gói. Viền focus cùng khuôn `Button`\n * (`outline-ring`), nhưng THỤT VÀO trong (`-outline-offset-2`) vì nút nằm lọt trong khung\n * của ô — viền đẩy ra ngoài sẽ đè lên khung và lên ô số bên cạnh.\n */\n \"flex h-full shrink-0 items-center gap-2 rounded-l-md border-r border-input bg-transparent px-3 text-sm transition-colors duration-150 ease-out hover:bg-muted focus-visible:outline-2 focus-visible:outline-ring focus-visible:-outline-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n >\n {/* `span` thay cho `div` của thượng nguồn: `<button>` chỉ nhận nội dung phrasing. */}\n {!countryContext ? (\n /*\n * ⚠ Khác thượng nguồn: bản gốc vẽ một ô `bg-muted/50` trống — 1,00:1 trên nền hover\n * `--muted`, tức biến mất đúng lúc người dùng rê chuột vào (cổng tương phản chặn). Quả\n * địa cầu nói được \"chưa chọn quốc gia\"; giữ bề rộng `w-6` của lá cờ để chọn xong không\n * xô lệch.\n */\n <span aria-hidden=\"true\" className=\"flex w-6 justify-center\">\n <Globe className=\"size-4 text-muted-foreground\" />\n </span>\n ) : (\n showFlag &&\n countryContext.flag && (\n <span aria-hidden=\"true\" className=\"w-6 text-lg leading-none\">\n {countryContext.flag}\n </span>\n )\n )}\n {/* Mũi tên chỉ trạng thái → ngưỡng 3:1; `text-muted-foreground` như chevron của `SelectTrigger`. */}\n <ChevronDown aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\n <Command filter={filterCountries}>\n <CommandInput placeholder={labels.searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{labels.empty}</CommandEmpty>\n <CommandGroup>\n {countries.map((c) => (\n <CommandItem\n key={c.code}\n value={`${c.name} ${c.dialCode} ${c.code}`}\n onSelect={() => {\n store.setState(\"country\", c.code);\n store.setState(\"open\", false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }}\n >\n {/* Cờ là trang trí — tên nước ngay bên cạnh đã nói đủ; không ẩn thì bị đọc hai lần. */}\n {showFlag && c.flag && (\n <span aria-hidden=\"true\" className=\"text-lg\">\n {c.flag}\n </span>\n )}\n <span className=\"flex-1\">{c.name}</span>\n <span className=\"text-muted-foreground\">{c.dialCode}</span>\n <Check\n aria-hidden=\"true\"\n className={cn(\"size-4\", country === c.code ? \"opacity-100\" : \"opacity-0\")}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PhoneInputFieldProps = React.ComponentProps<\"input\">;\n\nfunction PhoneInputField(props: PhoneInputFieldProps) {\n const {\n onChange: onChangeProp,\n className,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n required: requiredProp,\n placeholder: placeholderProp,\n ref,\n ...inputProps\n } = props;\n\n const { inputRef, disabled, invalid, readOnly, required, placeholder, countries } = usePhoneInputContext(FIELD_NAME);\n const store = useStoreContext(FIELD_NAME);\n const value = useStore((state) => state.value);\n const nationalInput = useStore((state) => getNationalInput(state, countries));\n\n const composedRef = useComposedRefs(ref, inputRef);\n\n const onChangeRef = useAsRef(onChangeProp);\n\n const isDisabled = disabledProp || disabled;\n const isReadOnly = readOnlyProp || readOnly;\n const isRequired = requiredProp || required;\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isDisabled || isReadOnly) return;\n\n onChangeRef.current?.(event);\n if (event.defaultPrevented) return;\n\n const inputValue = event.target.value;\n\n // ⚠ Khác thượng nguồn: bỏ khoảng trắng đầu trước khi xét dấu `+` — chuỗi dán vào hay kèm nó.\n const startsWithPlus = inputValue.trimStart().startsWith(\"+\");\n\n // ⚠ Khác thượng nguồn — số NỘI ĐỊA (luật và lý do: chú thích trên `nationalToE164`).\n const selectedCountry = startsWithPlus ? undefined : countries.find((c) => c.code === store.getState().country);\n\n if (selectedCountry) {\n const nextNationalInput = inputValue.replace(NATIONAL_INPUT_DISALLOWED, \"\");\n\n if (nextNationalInput !== inputValue) {\n // Gạt ký tự lạ NGAY trên DOM và đặt lại con trỏ tại chỗ: nhờ vậy lúc render React thấy\n // DOM đã đúng giá trị, không ghi đè — ghi đè là con trỏ nhảy về cuối ô.\n const target = event.target;\n const caret = target.selectionStart ?? inputValue.length;\n const nextCaret = inputValue.slice(0, caret).replace(NATIONAL_INPUT_DISALLOWED, \"\").length;\n target.value = nextNationalInput;\n target.setSelectionRange(nextCaret, nextCaret);\n }\n\n store.setState(\"startsWithPlus\", false);\n store.setState(\"nationalInput\", nextNationalInput);\n store.setState(\"value\", nationalToE164(nextNationalInput, selectedCountry));\n return;\n }\n\n const digits = inputValue.replace(/\\D/g, \"\");\n const newValue = digits ? `+${digits}` : startsWithPlus ? \"+\" : \"\";\n store.setState(\"startsWithPlus\", startsWithPlus);\n store.setState(\"nationalInput\", null);\n store.setState(\"value\", newValue);\n },\n [store, countries, onChangeRef, isDisabled, isReadOnly]\n );\n\n // Số nội địa hiện NGUYÊN VĂN chữ đã gõ (con trỏ không nhảy); số quốc tế tách nhóm như thượng nguồn.\n const displayValue = React.useMemo(() => {\n return nationalInput ?? formatPhoneNumber(value, countries);\n }, [nationalInput, value, countries]);\n\n return (\n <Input\n type=\"tel\"\n inputMode=\"tel\"\n aria-required={isRequired}\n aria-invalid={invalid}\n data-slot=\"phone-input-field\"\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n {...inputProps}\n ref={composedRef}\n className={cn(\n // Viền, quầng focus và nền (kể cả nền `--muted` lúc vô hiệu) đều do khung gốc vẽ; ô số\n // trong suốt và phẳng. `focus:ring-0` chứ không `focus-visible:` — `Input` vẽ quầng bằng `focus:`.\n \"h-full flex-1 rounded-l-none rounded-r-md border-0 bg-transparent focus:ring-0 disabled:bg-transparent\",\n className\n )}\n // ⚠ Khác thượng nguồn: bản gốc đặt placeholder của gốc SAU `{...inputProps}`, nên\n // `<PhoneInputField placeholder=\"…\" />` (chính demo của thượng nguồn) bị lờ đi.\n placeholder={placeholderProp ?? placeholder}\n value={displayValue}\n onChange={onChange}\n />\n );\n}\n\nexport {\n PhoneInput,\n PhoneInputCountrySelect,\n type PhoneInputCountrySelectProps,\n PhoneInputField,\n type PhoneInputFieldProps,\n type PhoneInputProps,\n useStore as usePhoneInput\n};\n"],"mappings":"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AAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,M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","names":["value","nationalInput","open"]}
@@ -454,7 +454,9 @@ function RatingItem(props) {
454
454
  if (event.defaultPrevented) return;
455
455
  focusContext.onItemFocus(itemId);
456
456
  const isKeyboardFocus = !isMouseClickRef.current;
457
- if (!isDisabled && !isReadOnly && activationMode !== "manual" && isKeyboardFocus) {
457
+ const previous = event.relatedTarget;
458
+ const cameFromSibling = previous instanceof HTMLElement && previous !== event.currentTarget && previous.getAttribute("data-slot") === "rating-item" && previous.closest('[data-slot="rating"]') === event.currentTarget.closest('[data-slot="rating"]');
459
+ if (!isDisabled && !isReadOnly && activationMode !== "manual" && isKeyboardFocus && cameFromSibling) {
458
460
  const isHalfStepValue = step < 1 && value === itemValue - step;
459
461
  if (!isHalfStepValue) {
460
462
  const newValue = clearable && value === itemValue ? 0 : itemValue;
@@ -603,7 +605,7 @@ function RatingItem(props) {
603
605
  role: "radio",
604
606
  type: "button",
605
607
  id: itemId,
606
- "aria-label": context.itemLabel(itemValue, context.max),
608
+ "aria-label": context.itemLabel(isChecked && value !== itemValue ? value : itemValue, context.max),
607
609
  "aria-checked": isChecked,
608
610
  "aria-posinset": itemValue,
609
611
  "aria-setsize": context.max,