@ehfuse/mui-form-controls 1.0.0

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -0
  3. package/dist/AddressTextField.d.ts +10 -0
  4. package/dist/Autocomplete.d.ts +10 -0
  5. package/dist/BizNumTextField.d.ts +10 -0
  6. package/dist/CardNumTextField.d.ts +11 -0
  7. package/dist/Checkbox.d.ts +10 -0
  8. package/dist/ClearTextField.d.ts +22 -0
  9. package/dist/DateRange.d.ts +9 -0
  10. package/dist/DateTextField.d.ts +11 -0
  11. package/dist/DateTimeTextField.d.ts +11 -0
  12. package/dist/EmailTextField.d.ts +10 -0
  13. package/dist/JuminTextField.d.ts +10 -0
  14. package/dist/LabelSelect.d.ts +10 -0
  15. package/dist/NumberTextField.d.ts +11 -0
  16. package/dist/PasswordTextField.d.ts +10 -0
  17. package/dist/PhoneTextField.d.ts +11 -0
  18. package/dist/RadioGroup.d.ts +10 -0
  19. package/dist/SearchTextField.d.ts +33 -0
  20. package/dist/Select.d.ts +10 -0
  21. package/dist/Slider.d.ts +10 -0
  22. package/dist/Switch.d.ts +10 -0
  23. package/dist/TextArea.d.ts +24 -0
  24. package/dist/TextAreaTextField.d.ts +24 -0
  25. package/dist/TimeTextField.d.ts +11 -0
  26. package/dist/VerificationCodeTextField.d.ts +10 -0
  27. package/dist/components/ColonBox.d.ts +23 -0
  28. package/dist/components/GroupedInputWrapper.d.ts +36 -0
  29. package/dist/components/SimpleCalendar.d.ts +45 -0
  30. package/dist/components/TimePicker.d.ts +26 -0
  31. package/dist/components/TimeSelector.d.ts +24 -0
  32. package/dist/components/index.d.ts +4 -0
  33. package/dist/hooks/index.d.ts +12 -0
  34. package/dist/hooks/useGroupedInput.d.ts +48 -0
  35. package/dist/hooks/useKoreanHolidays.d.ts +29 -0
  36. package/dist/hooks/useTextFieldBase.d.ts +47 -0
  37. package/dist/icons/CalendarIcon.d.ts +10 -0
  38. package/dist/icons/ChevronLeft.d.ts +8 -0
  39. package/dist/icons/ChevronRight.d.ts +8 -0
  40. package/dist/icons/ClockIcon.d.ts +13 -0
  41. package/dist/icons/ColonIcon.d.ts +13 -0
  42. package/dist/icons/CopyIcon.d.ts +12 -0
  43. package/dist/icons/DashIcon.d.ts +12 -0
  44. package/dist/icons/card-icons.d.ts +21 -0
  45. package/dist/icons/email-icons.d.ts +27 -0
  46. package/dist/icons/index.d.ts +8 -0
  47. package/dist/index.d.ts +33 -0
  48. package/dist/index.js +443 -0
  49. package/dist/index.js.map +7 -0
  50. package/dist/index.mjs +443 -0
  51. package/dist/index.mjs.map +7 -0
  52. package/dist/label-select/LabelSelect.d.ts +9 -0
  53. package/dist/label-select/index.d.ts +9 -0
  54. package/dist/label-select/types.d.ts +38 -0
  55. package/dist/types.d.ts +406 -0
  56. package/dist/utils/biznum.d.ts +12 -0
  57. package/dist/utils/card.d.ts +17 -0
  58. package/dist/utils/date.d.ts +114 -0
  59. package/dist/utils/datetime.d.ts +37 -0
  60. package/dist/utils/email.d.ts +15 -0
  61. package/dist/utils/index.d.ts +17 -0
  62. package/dist/utils/jumin.d.ts +27 -0
  63. package/dist/utils/number.d.ts +15 -0
  64. package/dist/utils/password.d.ts +17 -0
  65. package/dist/utils/phone.d.ts +17 -0
  66. package/dist/utils/time.d.ts +27 -0
  67. package/package.json +78 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/SearchTextField.tsx", "../src/hooks/useTextFieldBase.ts", "../src/hooks/useKoreanHolidays.ts", "../src/hooks/useGroupedInput.ts", "../src/ClearTextField.tsx", "../src/PasswordTextField.tsx", "../src/utils/date.ts", "../src/utils/time.ts", "../src/utils/number.ts", "../src/utils/email.ts", "../src/utils/phone.ts", "../src/utils/password.ts", "../src/utils/biznum.ts", "../src/utils/card.ts", "../src/utils/jumin.ts", "../src/TextArea.tsx", "../src/Checkbox.tsx", "../src/RadioGroup.tsx", "../src/Switch.tsx", "../src/DateRange.tsx", "../src/DateTextField.tsx", "../node_modules/@ehfuse/mui-datetime-picker/src/utils/index.ts", "../node_modules/@ehfuse/mui-datetime-picker/src/locale.ts", "../node_modules/@ehfuse/mui-datetime-picker/src/SimpleCalendar.tsx", "../node_modules/@ehfuse/mui-datetime-picker/src/icons/index.tsx", "../node_modules/@ehfuse/mui-datetime-picker/src/TimeSelector.tsx", "../node_modules/@ehfuse/mui-datetime-picker/src/TimePicker.tsx", "../node_modules/@ehfuse/mui-datetime-picker/src/DatePicker.tsx", "../node_modules/@ehfuse/mui-datetime-picker/src/DateTimePicker.tsx", "../src/icons/CalendarIcon.tsx", "../src/icons/ChevronLeft.tsx", "../src/icons/ChevronRight.tsx", "../src/icons/ClockIcon.tsx", "../src/icons/ColonIcon.tsx", "../src/icons/DashIcon.tsx", "../src/icons/CopyIcon.tsx", "../src/icons/card-icons.tsx", "../src/Slider.tsx", "../src/Autocomplete.tsx", "../src/Select.tsx", "../src/LabelSelect.tsx", "../src/PhoneTextField.tsx", "../src/AddressTextField.tsx", "../src/NumberTextField.tsx", "../src/JuminTextField.tsx", "../src/components/GroupedInputWrapper.tsx", "../src/components/ColonBox.tsx", "../src/VerificationCodeTextField.tsx", "../src/EmailTextField.tsx", "../src/icons/email-icons.tsx", "../src/TimeTextField.tsx", "../src/DateTimeTextField.tsx", "../src/BizNumTextField.tsx", "../src/CardNumTextField.tsx"],
4
+ "sourcesContent": ["/**\n * SearchTextField.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n TextField,\n IconButton,\n InputAdornment,\n CircularProgress,\n} from \"@mui/material\";\nimport ClearIcon from \"@mui/icons-material/Clear\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport type { SearchTextFieldProps } from \"./types\";\nimport { useTextFieldBase } from \"./hooks\";\n\nconst SearchTextFieldBase = forwardRef<HTMLDivElement, SearchTextFieldProps>(\n function SearchTextFieldBase(\n {\n value,\n form,\n loading = false,\n searchIcon = true,\n searchIconColor = \"#666\",\n clearIcon = true,\n clearIconColor = \"#666\",\n debounce = 300,\n readonly,\n spellCheck = false,\n onChange,\n onBlur,\n onClear,\n slotProps,\n size,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n ) {\n const {\n internalValue,\n setInternalValue,\n handleChange,\n handleBlur,\n emitChange,\n } = useTextFieldBase({\n value: (value as string) ?? \"\",\n name: props.name,\n debounce,\n onChange,\n onBlur,\n });\n\n // input ref for focus after clear\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n // size\uC5D0 \uB530\uB978 \uC544\uC774\uCF58 \uD06C\uAE30\n const iconSize = size === \"small\" ? 20 : 24;\n\n // \uD074\uB9AC\uC5B4 \uBC84\uD2BC \uD578\uB4E4\uB7EC\n const handleClear = () => {\n setInternalValue(\"\");\n // \uC989\uC2DC emit\uC744 \uC704\uD574 fake \uC774\uBCA4\uD2B8 \uC0DD\uC131\n const fakeEvent = {\n target: { name: props.name || \"\", value: \"\" },\n } as React.ChangeEvent<HTMLInputElement>;\n emitChange(fakeEvent, \"\", true);\n onClear?.();\n // \uD074\uB9AC\uC5B4 \uD6C4 \uD3EC\uCEE4\uC2A4\n internalInputRef.current?.focus();\n };\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <TextField\n {...props}\n ref={ref}\n inputRef={internalInputRef}\n size={size}\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n autoComplete=\"off\"\n spellCheck={spellCheck}\n sx={{\n backgroundColor: \"#fff\",\n \"& .MuiOutlinedInput-root\": {\n backgroundColor: \"#fff\",\n },\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n ...props.sx,\n }}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n readOnly: readonly,\n startAdornment: searchIcon ? (\n <InputAdornment\n position=\"start\"\n sx={{ m: \"0 !important\", mr: \"8px !important\" }}\n >\n <SearchIcon\n sx={{\n color: searchIconColor,\n fontSize: iconSize,\n }}\n />\n </InputAdornment>\n ) : undefined,\n endAdornment:\n clearIcon && !readonly ? (\n <InputAdornment\n position=\"end\"\n sx={{\n visibility: internalValue\n ? \"visible\"\n : \"hidden\",\n mr: 0,\n }}\n >\n {loading ? (\n <CircularProgress\n size={size === \"small\" ? 14 : 16}\n />\n ) : (\n <IconButton\n size=\"small\"\n onClick={\n readonly\n ? undefined\n : handleClear\n }\n edge=\"end\"\n tabIndex={-1}\n disabled={readonly}\n sx={{\n padding:\n size === \"small\"\n ? \"2px\"\n : \"4px\",\n color: clearIconColor,\n \"&:hover\": {\n color: \"#333\",\n backgroundColor:\n \"rgba(0, 0, 0, 0.04)\",\n },\n }}\n >\n <ClearIcon\n sx={{ fontSize: iconSize - 4 }}\n />\n </IconButton>\n )}\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n );\n },\n);\n\nconst SearchTextFieldWithForm = forwardRef<\n HTMLDivElement,\n SearchTextFieldProps\n>(function SearchTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"SearchTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"SearchTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <SearchTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const SearchTextField = forwardRef<HTMLDivElement, SearchTextFieldProps>(\n function SearchTextField(props, ref) {\n if (props.form) {\n return <SearchTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <SearchTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * useTextFieldBase.ts\n *\n * TextField \uCEF4\uD3EC\uB10C\uD2B8\uB4E4\uC758 \uACF5\uD1B5 \uB85C\uC9C1\uC744 \uB2F4\uB2F9\uD558\uB294 \uD6C5\n * - \uB514\uBC14\uC6B4\uC2A4 \uCC98\uB9AC\n * - \uB0B4\uBD80 \uC0C1\uD0DC \uAD00\uB9AC\n * - blur \uC2DC flush\n * - \uC678\uBD80 value \uB3D9\uAE30\uD654\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { useState, useRef, useEffect, useCallback, ChangeEvent } from \"react\";\n\nexport interface UseTextFieldBaseOptions {\n value: string; // \uC678\uBD80\uC5D0\uC11C \uC804\uB2EC\uBC1B\uC740 value\n name?: string; // \uD544\uB4DC \uC774\uB984 (name \uC18D\uC131)\n debounce?: number; // \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC2DC\uAC04 (ms). undefined\uBA74 \uB514\uBC14\uC6B4\uC2A4 \uC5C6\uC74C\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void; // \uAC12 \uBCC0\uACBD \uC2DC \uD638\uCD9C\uB418\uB294 \uCF5C\uBC31\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void; // blur \uC774\uBCA4\uD2B8 \uCF5C\uBC31\n // \uB0B4\uBD80 \uAC12\uC744 \uBCC0\uD658\uD558\uB294 \uD568\uC218 (\uC608: \uC804\uD654\uBC88\uD638 \uD3EC\uB9F7\uD305, \uC22B\uC790 \uD3EC\uB9F7\uD305 \uB4F1)\n transformValue?: (\n inputValue: string,\n currentDisplayValue: string,\n ) => {\n displayValue: string;\n emitValue: string;\n };\n}\n\nexport interface UseTextFieldBaseReturn {\n internalValue: string; // \uD654\uBA74\uC5D0 \uD45C\uC2DC\uD560 \uB0B4\uBD80 \uAC12\n setInternalValue: (value: string) => void; // \uB0B4\uBD80 \uAC12\uC744 \uC9C1\uC811 \uC124\uC815\n handleChange: (e: ChangeEvent<HTMLInputElement>) => void; // TextField onChange \uD578\uB4E4\uB7EC\n handleBlur: (e: React.FocusEvent<HTMLInputElement>) => void; // TextField onBlur \uD578\uB4E4\uB7EC\n emitChange: (\n // \uD2B9\uC815 \uAC12\uC73C\uB85C \uBCC0\uACBD\uC744 emit (immediate=true\uBA74 \uB514\uBC14\uC6B4\uC2A4 \uBB34\uC2DC)\n e: ChangeEvent<HTMLInputElement> | React.FocusEvent<HTMLInputElement>,\n newValue: string,\n immediate?: boolean,\n ) => void;\n lastEmittedValue: React.MutableRefObject<string>; // \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uB41C \uAC12\n debounceTimer: React.MutableRefObject<ReturnType<typeof setTimeout> | null>; // \uB514\uBC14\uC6B4\uC2A4 \uD0C0\uC774\uBA38 ref\n}\n\nexport function useTextFieldBase({\n value,\n name = \"\",\n debounce,\n onChange,\n onBlur,\n transformValue,\n}: UseTextFieldBaseOptions): UseTextFieldBaseReturn {\n // \uD654\uBA74\uC5D0 \uD45C\uC2DC\uB418\uB294 \uB0B4\uBD80 \uAC12\n const [internalValue, setInternalValue] = useState<string>(value ?? \"\");\n\n // \uB9C8\uC9C0\uB9C9\uC73C\uB85C onChange\uAC00 \uD638\uCD9C\uB41C \uAC12 (\uC911\uBCF5 \uD638\uCD9C \uBC29\uC9C0)\n const lastEmittedValue = useRef<string>(value ?? \"\");\n\n // \uB514\uBC14\uC6B4\uC2A4 \uD0C0\uC774\uBA38\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // \uC774\uC804 \uC678\uBD80 value (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC83\uC778\uC9C0 \uAC10\uC9C0)\n const prevExternalValue = useRef<string>(value ?? \"\");\n\n // \uCEF4\uD3EC\uB10C\uD2B8 \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uD0C0\uC774\uBA38 \uC815\uB9AC\n useEffect(() => {\n return () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n };\n }, []);\n\n // \uC678\uBD80 value prop \uBCC0\uACBD \uC2DC \uB0B4\uBD80 \uC0C1\uD0DC \uB3D9\uAE30\uD654\n useEffect(() => {\n const newValue = value ?? \"\";\n // \uC678\uBD80\uC5D0\uC11C \uAC12\uC774 \uBCC0\uACBD\uB418\uC5C8\uACE0, \uADF8 \uAC12\uC774 \uC6B0\uB9AC\uAC00 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB974\uBA74 \uB3D9\uAE30\uD654\n if (\n newValue !== prevExternalValue.current &&\n newValue !== lastEmittedValue.current\n ) {\n setInternalValue(newValue);\n lastEmittedValue.current = newValue;\n }\n prevExternalValue.current = newValue;\n }, [value]);\n\n // onChange\uB97C emit\uD558\uB294 \uD568\uC218\n const emitChange = useCallback(\n (\n e:\n | ChangeEvent<HTMLInputElement>\n | React.FocusEvent<HTMLInputElement>,\n newValue: string,\n immediate = false,\n ) => {\n // \uAC19\uC740 \uAC12\uC774\uBA74 \uD638\uCD9C\uD558\uC9C0 \uC54A\uC74C\n if (newValue === lastEmittedValue.current) {\n return;\n }\n\n const doEmit = () => {\n if (newValue !== lastEmittedValue.current) {\n lastEmittedValue.current = newValue;\n if (onChange) {\n const syntheticEvent = {\n ...e,\n target: {\n ...e.target,\n name: name,\n value: newValue,\n },\n } as ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n }\n };\n\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n if (immediate || debounce === undefined || debounce === 0) {\n doEmit();\n } else {\n debounceTimer.current = setTimeout(doEmit, debounce);\n }\n },\n [onChange, debounce, name],\n );\n\n // TextField onChange \uD578\uB4E4\uB7EC\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n\n if (transformValue) {\n // \uBCC0\uD658 \uD568\uC218\uAC00 \uC788\uC73C\uBA74 \uC0AC\uC6A9\n const { displayValue, emitValue } = transformValue(\n inputValue,\n internalValue,\n );\n setInternalValue(displayValue);\n emitChange(e, emitValue);\n } else {\n // \uBCC0\uD658 \uC5C6\uC774 \uADF8\uB300\uB85C \uC0AC\uC6A9\n setInternalValue(inputValue);\n emitChange(e, inputValue);\n }\n },\n [transformValue, internalValue, emitChange],\n );\n\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n debounceTimer.current = null;\n\n // \uD604\uC7AC \uB0B4\uBD80 \uAC12\uC73C\uB85C \uC989\uC2DC emit\n if (internalValue !== lastEmittedValue.current) {\n lastEmittedValue.current = internalValue;\n if (onChange) {\n const syntheticEvent = {\n ...e,\n target: {\n ...e.target,\n name: name,\n value: internalValue,\n },\n } as ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n }\n }\n\n // \uC6D0\uB798 onBlur \uD638\uCD9C\n if (onBlur) {\n onBlur(e);\n }\n },\n [internalValue, onChange, onBlur, name],\n );\n\n return {\n internalValue,\n setInternalValue,\n handleChange,\n handleBlur,\n emitChange,\n lastEmittedValue,\n debounceTimer,\n };\n}\n\n// \uB514\uBC14\uC6B4\uC2A4\uB41C onChange emit\uB9CC \uB2F4\uB2F9\uD558\uB294 \uAC04\uB2E8\uD55C \uD6C5 (\uBCF5\uC7A1\uD55C \uD3EC\uB9F7\uD305 \uB85C\uC9C1\uC774 \uC788\uB294 \uCEF4\uD3EC\uB10C\uD2B8\uC5D0\uC11C \uC0AC\uC6A9)\nexport interface UseDebouncedEmitOptions {\n name?: string; // \uD544\uB4DC \uC774\uB984 (name \uC18D\uC131)\n debounce?: number; // \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC2DC\uAC04 (ms). undefined\uBA74 \uB514\uBC14\uC6B4\uC2A4 \uC5C6\uC74C\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void; // \uAC12 \uBCC0\uACBD \uC2DC \uD638\uCD9C\uB418\uB294 \uCF5C\uBC31\n}\n\nexport interface UseDebouncedEmitReturn {\n emitChange: (\n // \uB514\uBC14\uC6B4\uC2A4\uB41C onChange emit\n e:\n | ChangeEvent<HTMLInputElement>\n | React.FocusEvent<HTMLInputElement>\n | null,\n newValue: string,\n immediate?: boolean,\n ) => void;\n flushOnBlur: (\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 flush\n e: React.FocusEvent<HTMLInputElement>,\n currentValue: string,\n ) => void;\n lastEmittedValue: React.MutableRefObject<string>; // \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uB41C \uAC12\n debounceTimer: React.MutableRefObject<ReturnType<typeof setTimeout> | null>; // \uB514\uBC14\uC6B4\uC2A4 \uD0C0\uC774\uBA38 ref\n}\n\nexport function useDebouncedEmit({\n name = \"\",\n debounce,\n onChange,\n}: UseDebouncedEmitOptions): UseDebouncedEmitReturn {\n // \uB9C8\uC9C0\uB9C9\uC73C\uB85C onChange\uAC00 \uD638\uCD9C\uB41C \uAC12 (\uC911\uBCF5 \uD638\uCD9C \uBC29\uC9C0)\n const lastEmittedValue = useRef<string>(\"\");\n\n // \uB514\uBC14\uC6B4\uC2A4 \uD0C0\uC774\uBA38\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // \uCEF4\uD3EC\uB10C\uD2B8 \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uD0C0\uC774\uBA38 \uC815\uB9AC\n useEffect(() => {\n return () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n };\n }, []);\n\n // onChange\uB97C emit\uD558\uB294 \uD568\uC218\n const emitChange = useCallback(\n (\n e:\n | ChangeEvent<HTMLInputElement>\n | React.FocusEvent<HTMLInputElement>\n | null,\n newValue: string,\n immediate = false,\n ) => {\n // \uAC19\uC740 \uAC12\uC774\uBA74 \uD638\uCD9C\uD558\uC9C0 \uC54A\uC74C\n if (newValue === lastEmittedValue.current) {\n return;\n }\n\n const doEmit = () => {\n if (newValue !== lastEmittedValue.current) {\n lastEmittedValue.current = newValue;\n if (onChange) {\n const syntheticEvent = {\n ...(e || {}),\n target: {\n ...(e?.target || {}),\n name: name,\n value: newValue,\n },\n } as ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n }\n };\n\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n if (immediate || debounce === undefined || debounce === 0) {\n doEmit();\n } else {\n debounceTimer.current = setTimeout(doEmit, debounce);\n }\n },\n [onChange, debounce, name],\n );\n\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 flush\n const flushOnBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>, currentValue: string) => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n debounceTimer.current = null;\n\n if (currentValue !== lastEmittedValue.current) {\n lastEmittedValue.current = currentValue;\n if (onChange) {\n const syntheticEvent = {\n ...e,\n target: {\n ...e.target,\n name: name,\n value: currentValue,\n },\n } as ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n }\n }\n },\n [onChange, name],\n );\n\n return {\n emitChange,\n flushOnBlur,\n lastEmittedValue,\n debounceTimer,\n };\n}\n", "/**\n * useKoreanHolidays.ts\n *\n * \uD55C\uAD6D\uCC9C\uBB38\uC5F0\uAD6C\uC6D0 \uD2B9\uC77C \uC815\uBCF4 API\uB97C \uC774\uC6A9\uD558\uC5EC \uACF5\uD734\uC77C\uC744 \uC870\uD68C\uD558\uB294 \uCEE4\uC2A4\uD140 \uD6C5\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n// \uB85C\uCEEC\uC2A4\uD1A0\uB9AC\uC9C0 \uD0A4 prefix\nconst STORAGE_KEY_PREFIX = \"korean-holidays-\";\n\n// API \uC751\uB2F5 \uD0C0\uC785\ninterface HolidayItem {\n dateKind: string;\n dateName: string;\n isHoliday: string;\n locdate: number;\n seq: number;\n}\n\ninterface ApiResponse {\n response: {\n header: {\n resultCode: string;\n resultMsg: string;\n };\n body: {\n items: {\n item: HolidayItem | HolidayItem[];\n };\n numOfRows: number;\n pageNo: number;\n totalCount: number;\n };\n };\n}\n\n// \uCE90\uC2DC\uB41C \uACF5\uD734\uC77C \uB370\uC774\uD130 \uD0C0\uC785\ninterface CachedHolidays {\n year: number;\n holidays: string[]; // YYYYMMDD \uD615\uC2DD\n fetchedAt: number; // timestamp\n}\n\n/**\n * \uD55C\uAD6D \uACF5\uD734\uC77C\uC744 \uC870\uD68C\uD558\uB294 \uCEE4\uC2A4\uD140 \uD6C5\n *\n * @param apiKey - \uACF5\uACF5\uB370\uC774\uD130\uD3EC\uD138 API \uC778\uC99D\uD0A4 (Encoding)\n * @param year - \uC870\uD68C\uD560 \uC5F0\uB3C4 (\uAE30\uBCF8\uAC12: \uD604\uC7AC \uC5F0\uB3C4)\n * @returns { holidays: Date[], loading: boolean, error: string | null }\n */\nexport function useKoreanHolidays(apiKey?: string, year?: number) {\n const targetYear = year ?? new Date().getFullYear();\n const [holidays, setHolidays] = useState<Date[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // \uB85C\uCEEC\uC2A4\uD1A0\uB9AC\uC9C0\uC5D0\uC11C \uCE90\uC2DC\uB41C \uB370\uC774\uD130 \uAC00\uC838\uC624\uAE30\n const getCachedHolidays = useCallback((year: number): Date[] | null => {\n try {\n const cached = localStorage.getItem(`${STORAGE_KEY_PREFIX}${year}`);\n if (!cached) return null;\n\n const data: CachedHolidays = JSON.parse(cached);\n\n // 1\uB144 \uC774\uC0C1 \uB41C \uCE90\uC2DC\uB294 \uBB34\uD6A8\uD654 (\uB2E4\uC74C \uD574\uC5D0 \uB2E4\uC2DC \uC870\uD68C)\n const oneYearMs = 365 * 24 * 60 * 60 * 1000;\n if (Date.now() - data.fetchedAt > oneYearMs) {\n localStorage.removeItem(`${STORAGE_KEY_PREFIX}${year}`);\n return null;\n }\n\n // YYYYMMDD \uBB38\uC790\uC5F4\uC744 Date \uAC1D\uCCB4\uB85C \uBCC0\uD658\n return data.holidays.map((dateStr) => {\n const y = parseInt(dateStr.slice(0, 4), 10);\n const m = parseInt(dateStr.slice(4, 6), 10) - 1;\n const d = parseInt(dateStr.slice(6, 8), 10);\n return new Date(y, m, d);\n });\n } catch {\n return null;\n }\n }, []);\n\n // \uB85C\uCEEC\uC2A4\uD1A0\uB9AC\uC9C0\uC5D0 \uCE90\uC2DC \uC800\uC7A5\n const setCachedHolidays = useCallback(\n (year: number, holidays: string[]) => {\n try {\n const data: CachedHolidays = {\n year,\n holidays,\n fetchedAt: Date.now(),\n };\n localStorage.setItem(\n `${STORAGE_KEY_PREFIX}${year}`,\n JSON.stringify(data)\n );\n } catch {\n // \uB85C\uCEEC\uC2A4\uD1A0\uB9AC\uC9C0 \uC6A9\uB7C9 \uCD08\uACFC \uB4F1\uC758 \uC5D0\uB7EC \uBB34\uC2DC\n }\n },\n []\n );\n\n // API\uC5D0\uC11C \uACF5\uD734\uC77C \uC870\uD68C\n const fetchHolidays = useCallback(\n async (year: number): Promise<Date[]> => {\n if (!apiKey) {\n throw new Error(\"API \uD0A4\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.\");\n }\n\n const baseUrl =\n \"https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo\";\n const params = new URLSearchParams({\n serviceKey: apiKey,\n solYear: String(year),\n numOfRows: \"100\",\n _type: \"json\",\n });\n\n const response = await fetch(`${baseUrl}?${params.toString()}`);\n\n if (!response.ok) {\n throw new Error(`API \uC694\uCCAD \uC2E4\uD328: ${response.status}`);\n }\n\n const data: ApiResponse = await response.json();\n\n if (data.response.header.resultCode !== \"00\") {\n throw new Error(`API \uC5D0\uB7EC: ${data.response.header.resultMsg}`);\n }\n\n const items = data.response.body.items?.item;\n if (!items) {\n return [];\n }\n\n // \uB2E8\uC77C \uD56D\uBAA9\uC77C \uACBD\uC6B0 \uBC30\uC5F4\uB85C \uBCC0\uD658\n const itemArray = Array.isArray(items) ? items : [items];\n\n // isHoliday\uAC00 \"Y\"\uC778 \uD56D\uBAA9\uB9CC \uD544\uD130\uB9C1\n const holidayDates = itemArray\n .filter((item) => item.isHoliday === \"Y\")\n .map((item) => {\n const dateStr = String(item.locdate);\n const y = parseInt(dateStr.slice(0, 4), 10);\n const m = parseInt(dateStr.slice(4, 6), 10) - 1;\n const d = parseInt(dateStr.slice(6, 8), 10);\n return new Date(y, m, d);\n });\n\n // \uCE90\uC2DC\uC5D0 \uC800\uC7A5 (YYYYMMDD \uD615\uC2DD\uC73C\uB85C)\n const holidayStrings = itemArray\n .filter((item) => item.isHoliday === \"Y\")\n .map((item) => String(item.locdate));\n setCachedHolidays(year, holidayStrings);\n\n return holidayDates;\n },\n [apiKey, setCachedHolidays]\n );\n\n useEffect(() => {\n if (!apiKey) {\n setHolidays([]);\n return;\n }\n\n // \uCE90\uC2DC\uB41C \uB370\uC774\uD130 \uD655\uC778\n const cached = getCachedHolidays(targetYear);\n if (cached) {\n setHolidays(cached);\n return;\n }\n\n // API \uD638\uCD9C\n setLoading(true);\n setError(null);\n\n fetchHolidays(targetYear)\n .then((dates) => {\n setHolidays(dates);\n })\n .catch((err) => {\n setError(err.message);\n setHolidays([]);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [apiKey, targetYear, getCachedHolidays, fetchHolidays]);\n\n return { holidays, loading, error };\n}\n\n/**\n * \uC5EC\uB7EC \uC5F0\uB3C4\uC758 \uACF5\uD734\uC77C\uC744 \uD55C\uBC88\uC5D0 \uC870\uD68C\uD558\uB294 \uD6C5\n */\nexport function useKoreanHolidaysRange(\n apiKey?: string,\n startYear?: number,\n endYear?: number\n) {\n const currentYear = new Date().getFullYear();\n const start = startYear ?? currentYear;\n const end = endYear ?? currentYear;\n\n const [holidays, setHolidays] = useState<Date[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!apiKey) {\n setHolidays([]);\n return;\n }\n\n const years: number[] = [];\n for (let y = start; y <= end; y++) {\n years.push(y);\n }\n\n setLoading(true);\n setError(null);\n\n // \uAC01 \uC5F0\uB3C4\uBCC4\uB85C \uCE90\uC2DC \uD655\uC778 \uB610\uB294 API \uD638\uCD9C\n Promise.all(\n years.map(async (year) => {\n const storageKey = `${STORAGE_KEY_PREFIX}${year}`;\n const cached = localStorage.getItem(storageKey);\n\n if (cached) {\n try {\n const data: CachedHolidays = JSON.parse(cached);\n return data.holidays.map((dateStr) => {\n const y = parseInt(dateStr.slice(0, 4), 10);\n const m = parseInt(dateStr.slice(4, 6), 10) - 1;\n const d = parseInt(dateStr.slice(6, 8), 10);\n return new Date(y, m, d);\n });\n } catch {\n // \uD30C\uC2F1 \uC2E4\uD328 \uC2DC API \uD638\uCD9C\n }\n }\n\n // API \uD638\uCD9C\n const baseUrl =\n \"https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo\";\n const params = new URLSearchParams({\n serviceKey: apiKey,\n solYear: String(year),\n numOfRows: \"100\",\n _type: \"json\",\n });\n\n const response = await fetch(`${baseUrl}?${params.toString()}`);\n if (!response.ok) {\n throw new Error(`API \uC694\uCCAD \uC2E4\uD328: ${response.status}`);\n }\n\n const data: ApiResponse = await response.json();\n if (data.response.header.resultCode !== \"00\") {\n throw new Error(data.response.header.resultMsg);\n }\n\n const items = data.response.body.items?.item;\n if (!items) return [];\n\n const itemArray = Array.isArray(items) ? items : [items];\n const holidayStrings = itemArray\n .filter((item) => item.isHoliday === \"Y\")\n .map((item) => String(item.locdate));\n\n // \uCE90\uC2DC \uC800\uC7A5\n const cacheData: CachedHolidays = {\n year,\n holidays: holidayStrings,\n fetchedAt: Date.now(),\n };\n localStorage.setItem(storageKey, JSON.stringify(cacheData));\n\n return holidayStrings.map((dateStr) => {\n const y = parseInt(dateStr.slice(0, 4), 10);\n const m = parseInt(dateStr.slice(4, 6), 10) - 1;\n const d = parseInt(dateStr.slice(6, 8), 10);\n return new Date(y, m, d);\n });\n })\n )\n .then((results) => {\n const allHolidays = results.flat();\n setHolidays(allHolidays);\n })\n .catch((err) => {\n setError(err.message);\n setHolidays([]);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [apiKey, start, end]);\n\n return { holidays, loading, error };\n}\n", "/**\n * useGroupedInput.ts\n *\n * \uADF8\uB8F9\uD654\uB41C \uC785\uB825 \uD544\uB4DC(\uC8FC\uBBFC\uBC88\uD638, \uC0AC\uC5C5\uC790\uBC88\uD638, \uC2DC\uAC04 \uB4F1)\uC5D0\uC11C \uACF5\uD1B5\uC73C\uB85C \uC0AC\uC6A9\uD558\uB294\n * \uCEE4\uC11C \uAD00\uB9AC, \uD3EC\uCEE4\uC2A4 \uAD00\uB9AC, \uD0A4\uBCF4\uB4DC \uD578\uB4E4\uB9C1 \uB85C\uC9C1\uC744 \uC81C\uACF5\uD558\uB294 \uD6C5\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { useRef, useState, useCallback, useMemo, RefObject } from \"react\";\n\nexport interface GroupConfig {\n maxLength: number;\n ref: RefObject<HTMLInputElement | null>;\n value: string;\n setValue: (value: string) => void;\n}\n\nexport interface UseGroupedInputOptions {\n groups: GroupConfig[];\n fontFamily?: string;\n fontSize: number;\n onComplete?: () => void;\n disabled?: boolean;\n readonly?: boolean;\n}\n\nexport interface UseGroupedInputReturn {\n focusedGroup: number | null;\n setFocusedGroup: (group: number | null) => void;\n cursorVisible: boolean;\n setCursorVisible: (visible: boolean) => void;\n cursorPosRef: RefObject<number>;\n isClickFocusRef: RefObject<boolean>;\n inputComplete: boolean;\n setInputComplete: (complete: boolean) => void;\n renderTrigger: number;\n measureTextWidth: (text: string) => number;\n getCursorLeft: (groupIndex: number) => number;\n createMouseDownHandler: (\n groupIndex: number\n ) => (e: React.MouseEvent) => void;\n createClickHandler: (groupIndex: number) => (e: React.MouseEvent) => void;\n createContainerClickHandler: () => (e: React.MouseEvent) => void;\n createFocusHandler: (groupIndex: number) => () => void;\n createBlurHandler: () => () => void;\n createKeyDownHandler: (\n groupIndex: number,\n onValueChange?: (newValue: string, groupIndex: number) => void\n ) => (e: React.KeyboardEvent<HTMLInputElement>) => void;\n createChangeHandler: (\n groupIndex: number,\n onAfterChange?: (\n newValue: string,\n groupIndex: number,\n isComplete: boolean\n ) => void\n ) => (e: React.ChangeEvent<HTMLInputElement>) => void;\n getCursorPosFromClick: (\n e: React.MouseEvent,\n value: string,\n inputRef: RefObject<HTMLInputElement | null>\n ) => number;\n forceRender: () => void;\n}\n\nexport function useGroupedInput({\n groups,\n fontFamily,\n fontSize,\n onComplete,\n disabled = false,\n readonly = false,\n}: UseGroupedInputOptions): UseGroupedInputReturn {\n const [focusedGroup, setFocusedGroup] = useState<number | null>(null);\n const [cursorVisible, setCursorVisible] = useState(false);\n const [inputComplete, setInputComplete] = useState(false);\n const [renderTrigger, setRenderTrigger] = useState(0);\n\n const cursorPosRef = useRef(0);\n const isClickFocusRef = useRef(false);\n const isArrowFocusRef = useRef(false);\n const arrowTargetPosRef = useRef(0);\n\n // \uD14D\uC2A4\uD2B8 \uB108\uBE44 \uCE21\uC815\n const measureTextWidth = useCallback(\n (text: string): number => {\n if (typeof document === \"undefined\")\n return text.length * fontSize * 0.6;\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return text.length * fontSize * 0.6;\n ctx.font = `${fontSize}px ${fontFamily || \"Roboto, sans-serif\"}`;\n return ctx.measureText(text).width;\n },\n [fontSize, fontFamily]\n );\n\n // \uD074\uB9AD \uC704\uCE58\uC5D0\uC11C \uCEE4\uC11C \uC704\uCE58 \uACC4\uC0B0\n const getCursorPosFromClick = useCallback(\n (\n e: React.MouseEvent,\n value: string,\n inputRef: RefObject<HTMLInputElement | null>\n ): number => {\n const input = inputRef.current;\n if (!input) return value.length;\n\n const rect = input.getBoundingClientRect();\n const clickX = e.clientX - rect.left - 4; // padding \uBCF4\uC815\n\n let newPos = value.length;\n for (let i = 0; i <= value.length; i++) {\n const textWidth = measureTextWidth(value.slice(0, i));\n if (clickX < textWidth + measureTextWidth(\"0\") / 2) {\n newPos = i;\n break;\n }\n }\n return newPos;\n },\n [measureTextWidth]\n );\n\n // \uCEE4\uC11C \uC704\uCE58 \uACC4\uC0B0 (\uB80C\uB354\uB9C1\uC6A9)\n const getCursorLeft = useCallback(\n (groupIndex: number): number => {\n if (focusedGroup !== groupIndex) return 0;\n const group = groups[groupIndex];\n if (!group) return 0;\n const textBeforeCursor = group.value.slice(0, cursorPosRef.current);\n return measureTextWidth(textBeforeCursor);\n },\n [focusedGroup, groups, measureTextWidth]\n );\n\n // \uAC15\uC81C \uB9AC\uB80C\uB354\uB9C1\n const forceRender = useCallback(() => {\n setRenderTrigger((prev) => prev + 1);\n }, []);\n\n // MouseDown \uD578\uB4E4\uB7EC \uC0DD\uC131\n const createMouseDownHandler = useCallback(\n (groupIndex: number) => {\n return (e: React.MouseEvent) => {\n if (disabled || readonly) return;\n isClickFocusRef.current = true;\n const group = groups[groupIndex];\n const newPos = getCursorPosFromClick(e, group.value, group.ref);\n cursorPosRef.current = newPos;\n };\n },\n [disabled, readonly, groups, getCursorPosFromClick]\n );\n\n // Click \uD578\uB4E4\uB7EC \uC0DD\uC131 - \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD\n const createClickHandler = useCallback(\n (groupIndex: number) => {\n return (e: React.MouseEvent) => {\n if (disabled || readonly) return;\n e.stopPropagation();\n\n const group = groups[groupIndex];\n const input = group.ref.current;\n\n // \uAC12\uC774 \uC788\uC73C\uBA74 \uC804\uCCB4 \uC120\uD0DD\n if (input && group.value.length > 0) {\n setTimeout(() => {\n input.setSelectionRange(0, group.value.length);\n }, 0);\n setCursorVisible(false); // \uC804\uCCB4 \uC120\uD0DD \uC2DC \uCEE4\uC11C \uC228\uAE40\n } else {\n // \uAC12\uC774 \uC5C6\uC73C\uBA74 \uCEE4\uC11C \uD45C\uC2DC\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n\n setInputComplete(false);\n setFocusedGroup(groupIndex);\n setRenderTrigger((prev) => prev + 1);\n };\n },\n [disabled, readonly, groups]\n );\n\n // \uCEE8\uD14C\uC774\uB108 \uD074\uB9AD \uD578\uB4E4\uB7EC \uC0DD\uC131 - \uC678\uACFD \uD074\uB9AD \uC2DC \uCCAB \uBC88\uC9F8 \uBE48 \uCE78 \uB610\uB294 \uB9C8\uC9C0\uB9C9 \uCE78\uC73C\uB85C \uC774\uB3D9\n const createContainerClickHandler = useCallback(() => {\n return (e: React.MouseEvent) => {\n if (disabled || readonly) return;\n\n // \uC774\uBBF8 input\uC5D0\uC11C \uCC98\uB9AC\uB41C \uD074\uB9AD\uC774\uBA74 \uBB34\uC2DC\n const target = e.target as HTMLElement;\n if (target.tagName === \"INPUT\") return;\n\n // \uCCAB \uBC88\uC9F8 \uBE48 \uCE78 \uCC3E\uAE30\n let targetIndex = -1;\n for (let i = 0; i < groups.length; i++) {\n if (groups[i].value.length === 0) {\n targetIndex = i;\n break;\n }\n }\n\n // \uBE48 \uCE78\uC774 \uC5C6\uC73C\uBA74 \uB9C8\uC9C0\uB9C9 \uCE78 \uC120\uD0DD\n if (targetIndex === -1) {\n targetIndex = groups.length - 1;\n }\n\n const targetGroup = groups[targetIndex];\n const input = targetGroup.ref.current;\n\n if (targetGroup.value.length > 0) {\n // \uAC12\uC774 \uC788\uC73C\uBA74 \uC804\uCCB4 \uC120\uD0DD\n input?.focus();\n setTimeout(() => {\n input?.setSelectionRange(0, targetGroup.value.length);\n }, 0);\n setCursorVisible(false);\n } else {\n // \uAC12\uC774 \uC5C6\uC73C\uBA74 \uCEE4\uC11C \uD45C\uC2DC\n cursorPosRef.current = 0;\n setCursorVisible(true);\n input?.focus();\n }\n\n setFocusedGroup(targetIndex);\n setInputComplete(false);\n setRenderTrigger((prev) => prev + 1);\n };\n }, [disabled, readonly, groups]);\n\n // Focus \uD578\uB4E4\uB7EC \uC0DD\uC131\n const createFocusHandler = useCallback(\n (groupIndex: number) => {\n return () => {\n const group = groups[groupIndex];\n\n // \uD074\uB9AD\uC73C\uB85C \uC778\uD55C \uD3EC\uCEE4\uC2A4\uBA74 \uD074\uB9AD \uD578\uB4E4\uB7EC\uC5D0\uC11C \uCC98\uB9AC \uC644\uB8CC\uB428\n if (isClickFocusRef.current) {\n isClickFocusRef.current = false;\n // \uD074\uB9AD \uD578\uB4E4\uB7EC\uC5D0\uC11C \uC804\uCCB4 \uC120\uD0DD \uCC98\uB9AC\uD588\uC73C\uBBC0\uB85C \uC5EC\uAE30\uC11C\uB294 \uC0C1\uD0DC\uB9CC \uC124\uC815\n setFocusedGroup(groupIndex);\n return;\n }\n\n // \uBC29\uD5A5\uD0A4\uB85C \uC778\uD55C \uD3EC\uCEE4\uC2A4\uBA74 \uC9C0\uC815\uB41C \uC704\uCE58\uB85C\n if (isArrowFocusRef.current) {\n isArrowFocusRef.current = false;\n cursorPosRef.current = arrowTargetPosRef.current;\n setCursorVisible(true);\n setFocusedGroup(groupIndex);\n setRenderTrigger((prev) => prev + 1);\n return;\n }\n\n // \uC77C\uBC18 \uD3EC\uCEE4\uC2A4 (\uD0ED \uB4F1) - \uC804\uCCB4 \uC120\uD0DD\n const input = group.ref.current;\n if (input && group.value.length > 0) {\n setTimeout(() => {\n input.setSelectionRange(0, group.value.length);\n }, 0);\n setCursorVisible(false);\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n setFocusedGroup(groupIndex);\n };\n },\n [groups]\n );\n\n // Blur \uD578\uB4E4\uB7EC \uC0DD\uC131\n const createBlurHandler = useCallback(() => {\n return () => {\n setTimeout(() => {\n const activeElement = document.activeElement;\n const isStillFocused = groups.some(\n (group) => group.ref.current === activeElement\n );\n if (!isStillFocused) {\n setCursorVisible(false);\n setFocusedGroup(null);\n }\n }, 0);\n };\n }, [groups]);\n\n // KeyDown \uD578\uB4E4\uB7EC \uC0DD\uC131\n const createKeyDownHandler = useCallback(\n (\n groupIndex: number,\n onValueChange?: (newValue: string, groupIndex: number) => void\n ) => {\n return (e: React.KeyboardEvent<HTMLInputElement>) => {\n const group = groups[groupIndex];\n const input = group.ref.current;\n const selectionStart = input?.selectionStart ?? 0;\n const selectionEnd = input?.selectionEnd ?? 0;\n const hasSelection = selectionEnd > selectionStart;\n\n if (e.key === \"ArrowLeft\") {\n // 3-2. \uD604\uC7AC\uCE78 \uCCAB\uBC88\uC9F8\uC5D0\uC11C \uC67C\uCABD\uD0A4 \u2192 \uC774\uC804\uCE78 \uB9C8\uC9C0\uB9C9 \uBB38\uC790\uB85C\n if (selectionStart === 0 && groupIndex > 0) {\n e.preventDefault();\n const prevGroup = groups[groupIndex - 1];\n // \uB9C8\uC9C0\uB9C9 \uBB38\uC790 \uC704\uCE58 (length - 1), \uBE48 \uACBD\uC6B0 0\n const newPos =\n prevGroup.value.length > 0\n ? prevGroup.value.length - 1\n : 0;\n isArrowFocusRef.current = true;\n arrowTargetPosRef.current = newPos;\n prevGroup.ref.current?.focus();\n prevGroup.ref.current?.setSelectionRange(\n newPos,\n newPos\n );\n } else if (selectionStart > 0) {\n e.preventDefault();\n const newPos = selectionStart - 1;\n input?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setCursorVisible(true);\n setRenderTrigger((prev) => prev + 1);\n }\n } else if (e.key === \"ArrowRight\") {\n // 3-1. \uD604\uC7AC\uCE78 \uB9C8\uC9C0\uB9C9 \uBB38\uC790\uC5D0\uC11C \uC624\uB978\uCABD\uD0A4 \u2192 \uB2E4\uC74C\uCE78 \uCCAB\uBC88\uC9F8\uB85C\n if (\n selectionEnd >= group.value.length - 1 &&\n group.value.length > 0 &&\n groupIndex < groups.length - 1\n ) {\n e.preventDefault();\n const nextGroup = groups[groupIndex + 1];\n isArrowFocusRef.current = true;\n arrowTargetPosRef.current = 0;\n nextGroup.ref.current?.focus();\n nextGroup.ref.current?.setSelectionRange(0, 0);\n } else if (selectionEnd < group.value.length - 1) {\n // \uB9C8\uC9C0\uB9C9 \uBB38\uC790 \uC804\uAE4C\uC9C0\uB9CC \uC624\uB978\uCABD \uC774\uB3D9\n e.preventDefault();\n const newPos = selectionEnd + 1;\n input?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setCursorVisible(true);\n setRenderTrigger((prev) => prev + 1);\n }\n } else if (e.key === \"Backspace\") {\n // \uC804\uCCB4 \uC120\uD0DD \uC0C1\uD0DC\uC5D0\uC11C\uB294 \uC804\uCCB4 \uC0AD\uC81C\n if (hasSelection) {\n e.preventDefault();\n const newValue =\n group.value.slice(0, selectionStart) +\n group.value.slice(selectionEnd);\n group.setValue(newValue);\n cursorPosRef.current = selectionStart;\n setCursorVisible(true);\n setInputComplete(false);\n setRenderTrigger((prev) => prev + 1);\n setTimeout(() => {\n input?.setSelectionRange(\n selectionStart,\n selectionStart\n );\n }, 0);\n onValueChange?.(newValue, groupIndex);\n } else if (selectionStart > 0) {\n // 1-3. \uD604\uC7AC\uCEE4\uC11C \uC55E\uC790\uB9AC \uC0AD\uC81C\n e.preventDefault();\n const newValue =\n group.value.slice(0, selectionStart - 1) +\n group.value.slice(selectionStart);\n group.setValue(newValue);\n const newPos = selectionStart - 1;\n cursorPosRef.current = newPos;\n setCursorVisible(true);\n setInputComplete(false);\n setRenderTrigger((prev) => prev + 1);\n setTimeout(() => {\n input?.setSelectionRange(newPos, newPos);\n }, 0);\n onValueChange?.(newValue, groupIndex);\n } else if (groupIndex > 0) {\n // 1-4. \uD604\uC7AC\uCE78 \uC81C\uC77C \uC55E\uC5D0\uC11C \u2192 \uC774\uC804\uCE78 \uB9C8\uC9C0\uB9C9 \uC790\uB9AC\uAC12 \uC0AD\uC81C \uB610\uB294 \uCEE4\uC11C \uC774\uB3D9\n e.preventDefault();\n const prevGroup = groups[groupIndex - 1];\n const prevLen = prevGroup.value.length;\n\n if (prevLen > 0) {\n // \uC774\uC804 \uCE78\uC5D0 \uAC12\uC774 \uC788\uC73C\uBA74 \uB9C8\uC9C0\uB9C9 \uAC12 \uC0AD\uC81C\n const newPrevValue = prevGroup.value.slice(0, -1);\n prevGroup.setValue(newPrevValue);\n cursorPosRef.current = newPrevValue.length;\n setInputComplete(false);\n onValueChange?.(newPrevValue, groupIndex - 1);\n } else {\n // \uC774\uC804 \uCE78\uC774 \uBE44\uC5B4\uC788\uC73C\uBA74 \uCEE4\uC11C\uB9CC \uC774\uB3D9\n cursorPosRef.current = 0;\n }\n\n setCursorVisible(true);\n setFocusedGroup(groupIndex - 1);\n setRenderTrigger((prev) => prev + 1);\n prevGroup.ref.current?.focus();\n const finalPos = prevLen > 0 ? prevLen - 1 : 0;\n prevGroup.ref.current?.setSelectionRange(\n finalPos,\n finalPos\n );\n }\n } else if (e.key === \"Delete\") {\n // \uC804\uCCB4 \uC120\uD0DD \uC0C1\uD0DC\uC5D0\uC11C\uB294 \uC804\uCCB4 \uC0AD\uC81C\n if (hasSelection) {\n e.preventDefault();\n const newValue =\n group.value.slice(0, selectionStart) +\n group.value.slice(selectionEnd);\n group.setValue(newValue);\n cursorPosRef.current = selectionStart;\n setCursorVisible(true);\n setInputComplete(false);\n setRenderTrigger((prev) => prev + 1);\n setTimeout(() => {\n input?.setSelectionRange(\n selectionStart,\n selectionStart\n );\n }, 0);\n onValueChange?.(newValue, groupIndex);\n } else if (selectionStart < group.value.length) {\n // 1-5. del \uD0A4\uB85C \uD604\uC7AC \uCEE4\uC11C \uC704\uCE58 \uAC12 \uC0AD\uC81C\n e.preventDefault();\n const newValue =\n group.value.slice(0, selectionStart) +\n group.value.slice(selectionStart + 1);\n group.setValue(newValue);\n cursorPosRef.current = selectionStart;\n setCursorVisible(true);\n setInputComplete(false);\n setRenderTrigger((prev) => prev + 1);\n setTimeout(() => {\n input?.setSelectionRange(\n selectionStart,\n selectionStart\n );\n }, 0);\n onValueChange?.(newValue, groupIndex);\n }\n }\n };\n },\n [groups]\n );\n\n // Change \uD578\uB4E4\uB7EC \uC0DD\uC131\n const createChangeHandler = useCallback(\n (\n groupIndex: number,\n onAfterChange?: (\n newValue: string,\n groupIndex: number,\n isComplete: boolean\n ) => void\n ) => {\n return (e: React.ChangeEvent<HTMLInputElement>) => {\n const group = groups[groupIndex];\n const numbers = e.target.value\n .replace(/\\D/g, \"\")\n .slice(0, group.maxLength);\n group.setValue(numbers);\n cursorPosRef.current = numbers.length;\n setCursorVisible(true); // \uC785\uB825 \uC2DC \uCEE4\uC11C \uD45C\uC2DC\n\n // \uCD5C\uB300 \uAE38\uC774 \uC785\uB825 \uC2DC \uB2E4\uC74C \uADF8\uB8F9\uC73C\uB85C \uC774\uB3D9\n const isGroupComplete = numbers.length === group.maxLength;\n if (isGroupComplete && groupIndex < groups.length - 1) {\n setTimeout(() => {\n const nextGroup = groups[groupIndex + 1];\n nextGroup.ref.current?.focus();\n nextGroup.ref.current?.setSelectionRange(0, 0);\n cursorPosRef.current = 0;\n }, 0);\n }\n\n // \uC804\uCCB4 \uC644\uB8CC \uCCB4\uD06C\n const allComplete =\n isGroupComplete &&\n groupIndex === groups.length - 1 &&\n groups\n .slice(0, -1)\n .every((g) => g.value.length === g.maxLength);\n\n if (allComplete) {\n setInputComplete(true);\n onComplete?.();\n } else {\n setInputComplete(false);\n }\n\n setRenderTrigger((prev) => prev + 1);\n onAfterChange?.(numbers, groupIndex, allComplete);\n };\n },\n [groups, onComplete]\n );\n\n return {\n focusedGroup,\n setFocusedGroup,\n cursorVisible,\n setCursorVisible,\n cursorPosRef,\n isClickFocusRef,\n inputComplete,\n setInputComplete,\n renderTrigger,\n measureTextWidth,\n getCursorLeft,\n createMouseDownHandler,\n createClickHandler,\n createContainerClickHandler,\n createFocusHandler,\n createBlurHandler,\n createKeyDownHandler,\n createChangeHandler,\n getCursorPosFromClick,\n forceRender,\n };\n}\n", "/**\n * ClearTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useRef,\n useImperativeHandle,\n useState,\n} from \"react\";\nimport { TextField, IconButton, InputAdornment } from \"@mui/material\";\nimport ClearIcon from \"@mui/icons-material/Clear\";\nimport type { ClearTextFieldProps } from \"./types\";\nimport { useTextFieldBase } from \"./hooks\";\n\nconst ClearTextFieldBase = forwardRef<HTMLDivElement, ClearTextFieldProps>(\n function ClearTextFieldBase(\n {\n value,\n clearIcon = true,\n debounce = 0,\n readonly,\n spellCheck = false,\n onChange,\n onBlur,\n onFocus,\n onClear,\n slotProps,\n size,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n ) {\n const {\n internalValue,\n setInternalValue,\n handleChange,\n handleBlur,\n emitChange,\n } = useTextFieldBase({\n value: (value as string) ?? \"\",\n name: props.name,\n debounce,\n onChange,\n onBlur,\n });\n\n const [isFocused, setIsFocused] = useState(false);\n\n // input ref for focus after clear\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n // size\uC5D0 \uB530\uB978 \uC544\uC774\uCF58 \uD06C\uAE30\n const iconSize = size === \"small\" ? 20 : 24;\n\n // \uD074\uB9AC\uC5B4 \uBC84\uD2BC \uD578\uB4E4\uB7EC\n const handleClear = () => {\n setInternalValue(\"\");\n // \uC989\uC2DC emit\uC744 \uC704\uD574 fake \uC774\uBCA4\uD2B8 \uC0DD\uC131\n const eventTarget = {\n name: props.name || \"\",\n value: \"\",\n } as HTMLInputElement;\n const fakeEvent = {\n target: eventTarget,\n currentTarget: eventTarget,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n emitChange(fakeEvent, \"\", true);\n onClear?.();\n // \uD074\uB9AC\uC5B4 \uD6C4 \uD3EC\uCEE4\uC2A4\n internalInputRef.current?.focus();\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(event);\n };\n\n const handleBlurWithFocus = (\n event: React.FocusEvent<HTMLInputElement>,\n ) => {\n setIsFocused(false);\n handleBlur(event);\n };\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <TextField\n {...props}\n ref={ref}\n inputRef={internalInputRef}\n size={size}\n value={internalValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlurWithFocus}\n autoComplete=\"off\"\n spellCheck={spellCheck}\n sx={{\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n }}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n readOnly: readonly,\n endAdornment:\n clearIcon && !readonly ? (\n <InputAdornment\n position=\"end\"\n sx={{\n visibility: internalValue\n ? isFocused\n ? \"visible\"\n : \"hidden\"\n : \"hidden\",\n mr: 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={\n readonly ? undefined : handleClear\n }\n edge=\"end\"\n tabIndex={-1}\n disabled={readonly}\n sx={{\n padding:\n size === \"small\"\n ? \"2px\"\n : \"4px\",\n color: \"#666\",\n \"&:hover\": {\n color: \"#333\",\n backgroundColor:\n \"rgba(0, 0, 0, 0.04)\",\n },\n }}\n >\n <ClearIcon\n sx={{ fontSize: iconSize - 4 }}\n />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n );\n },\n);\n\nconst ClearTextFieldWithForm = forwardRef<HTMLDivElement, ClearTextFieldProps>(\n function ClearTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"ClearTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"ClearTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <ClearTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const ClearTextField = forwardRef<HTMLDivElement, ClearTextFieldProps>(\n function ClearTextField(props, ref) {\n if (props.form) {\n return <ClearTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <ClearTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * PasswordTextField.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n forwardRef,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, IconButton, InputAdornment } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport Visibility from \"@mui/icons-material/Visibility\";\nimport VisibilityOff from \"@mui/icons-material/VisibilityOff\";\nimport type { PasswordTextFieldProps } from \"./types\";\nimport { useTextFieldBase } from \"./hooks\";\nimport {\n DEFAULT_PASSWORD_VALIDATION_RULES as DEFAULT_VALIDATION_RULES,\n validatePassword,\n} from \"./utils\";\n\nconst PasswordTextFieldBase = forwardRef<\n HTMLDivElement,\n PasswordTextFieldProps\n>(function PasswordTextFieldBase(\n {\n showToggle = true,\n label,\n validationRules,\n onValidationChange,\n invalidBorderColor,\n debounce,\n readonly,\n slotProps,\n sx,\n size,\n value,\n onChange,\n onBlur,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n) {\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n const [showPassword, setShowPassword] = useState(false);\n const [isInvalid, setIsInvalid] = useState(false);\n\n // useTextFieldBase \uD6C5 \uC0AC\uC6A9\n const { internalValue, handleChange, handleBlur } = useTextFieldBase({\n value: (value as string) ?? \"\",\n name: props.name,\n debounce,\n onChange,\n onBlur,\n });\n\n // size\uC5D0 \uB530\uB978 \uC544\uC774\uCF58 \uD06C\uAE30\n const iconSize = size === \"small\" ? 20 : 24;\n\n const handleTogglePassword = () => {\n setShowPassword((prev) => !prev);\n };\n const performValidation = useCallback(\n (inputValue: string) => {\n const rules = validationRules || {};\n const mergedRules = { ...DEFAULT_VALIDATION_RULES, ...rules };\n const result = validatePassword(inputValue, mergedRules);\n // \uCD5C\uC18C\uAE38\uC774 \uC774\uC0C1 \uC785\uB825\uB418\uC5C8\uC744 \uB54C\uB9CC invalid \uC0C1\uD0DC \uC801\uC6A9\n const minLength = mergedRules.minLength || 8;\n setIsInvalid(\n !result.isValid &&\n inputValue.length >= minLength &&\n inputValue.length > 0,\n );\n if (onValidationChange) {\n onValidationChange(result);\n }\n },\n [validationRules, onValidationChange],\n );\n\n // internalValue \uBCC0\uACBD \uC2DC \uC720\uD6A8\uC131 \uAC80\uC0AC\n useEffect(() => {\n performValidation(internalValue);\n }, [internalValue, performValidation]);\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uC2E4\uD328 \uC2DC \uD14C\uB450\uB9AC \uC2A4\uD0C0\uC77C (invalidBorderColor\uAC00 \uC124\uC815\uB41C \uACBD\uC6B0\uC5D0\uB9CC)\n const invalidStyles: SxProps<Theme> =\n isInvalid && invalidBorderColor\n ? {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": {\n borderColor: invalidBorderColor,\n },\n \"&:hover fieldset\": {\n borderColor: invalidBorderColor,\n },\n \"&.Mui-focused fieldset\": {\n borderColor: invalidBorderColor,\n },\n },\n \"& .MuiFilledInput-root\": {\n \"&:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:hover:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:after\": {\n borderBottomColor: invalidBorderColor,\n },\n },\n \"& .MuiInput-root\": {\n \"&:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:hover:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:after\": {\n borderBottomColor: invalidBorderColor,\n },\n },\n }\n : {};\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <TextField\n {...props}\n ref={ref}\n inputRef={internalInputRef}\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n label={label}\n size={size}\n type={showPassword ? \"text\" : \"password\"}\n autoComplete=\"off\"\n spellCheck=\"false\"\n sx={{\n ...invalidStyles,\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n ...sx,\n }}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n readOnly: readonly,\n endAdornment:\n showToggle && !readonly ? (\n <InputAdornment\n position=\"end\"\n sx={{ ml: 1, mr: size === \"small\" ? -0.5 : 1 }}\n >\n <IconButton\n onClick={handleTogglePassword}\n edge=\"end\"\n tabIndex={-1}\n size={size}\n sx={{\n color: \"#666\",\n \"&:hover\": {\n color: \"#333\",\n backgroundColor:\n \"rgba(0, 0, 0, 0.04)\",\n },\n }}\n >\n {showPassword ? (\n <VisibilityOff\n sx={{ fontSize: iconSize }}\n />\n ) : (\n <Visibility\n sx={{ fontSize: iconSize }}\n />\n )}\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n );\n});\n\nconst PasswordTextFieldWithForm = forwardRef<\n HTMLDivElement,\n PasswordTextFieldProps\n>(function PasswordTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"PasswordTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"PasswordTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as string | undefined;\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <PasswordTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const PasswordTextField = forwardRef<\n HTMLDivElement,\n PasswordTextFieldProps\n>(function PasswordTextField(props, ref) {\n if (props.form) {\n return <PasswordTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <PasswordTextFieldBase {...props} ref={ref} />;\n});\n", "/**\n * date.ts - \uB0A0\uC9DC \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport type { DateFormat, DateTimeFormat } from \"../types\";\n\n/**\n * \uC724\uB144 \uCCB4\uD06C\n */\nexport function isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n/**\n * \uD574\uB2F9 \uC6D4\uC758 \uB9D0\uC77C \uACC4\uC0B0\n */\nexport function getDaysInMonth(year: number, month: number): number {\n if (month === 2) {\n return isLeapYear(year) ? 29 : 28;\n }\n if ([4, 6, 9, 11].includes(month)) {\n return 30;\n }\n return 31;\n}\n\n/**\n * \uB0A0\uC9DC \uD3EC\uB9F7\uC5D0 \uB530\uB978 \uAD6C\uBD84\uC790 \uAC00\uC838\uC624\uAE30\n */\nexport function getSeparator(format: DateFormat): string {\n if (format.includes(\".\")) return \".\";\n if (format.includes(\"/\")) return \"/\";\n return \"-\";\n}\n\n/**\n * \uB0A0\uC9DC \uC790\uB3D9 \uD3EC\uB9F7\uD305 \uD568\uC218\n */\nexport function formatDate(value: string, format: DateFormat): string {\n const rawNumbers = value.replace(/\\D/g, \"\");\n const separator = getSeparator(format);\n\n if (rawNumbers.length === 0) return \"\";\n\n // \uC785\uB825\uB41C \uC22B\uC790\uB97C \uC720\uD6A8\uD55C \uBC94\uC704\uB85C \uBCF4\uC815\n const numbers = constrainDateNumbers(rawNumbers, format);\n\n // YYYY-MM-DD, YYYY.MM.DD, YYYY/MM/DD (\uAE30\uBCF8)\n if (format.startsWith(\"YYYY\")) {\n if (numbers.length < 4) return numbers;\n if (numbers.length === 4) return `${numbers}${separator}`;\n if (numbers.length < 6)\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(4)}`;\n if (numbers.length === 6)\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(\n 4\n )}${separator}`;\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(\n 4,\n 6\n )}${separator}${numbers.slice(6, 8)}`;\n }\n\n // MM-DD-YYYY, MM.DD.YYYY, MM/DD/YYYY (\uBBF8\uAD6D\uC2DD)\n if (\n format.startsWith(\"MM\") &&\n format.includes(\"DD\") &&\n format.endsWith(\"YYYY\")\n ) {\n if (numbers.length < 2) return numbers;\n if (numbers.length === 2) return `${numbers}${separator}`;\n if (numbers.length < 4)\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(2)}`;\n if (numbers.length === 4)\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(\n 2\n )}${separator}`;\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(\n 2,\n 4\n )}${separator}${numbers.slice(4, 8)}`;\n }\n\n // MM-DD, MM.DD, MM/DD (\uC6D4\uC77C\uB9CC)\n if (\n format.startsWith(\"MM\") &&\n format.includes(\"DD\") &&\n !format.includes(\"YYYY\")\n ) {\n if (numbers.length < 2) return numbers;\n if (numbers.length === 2) return `${numbers}${separator}`;\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(2, 4)}`;\n }\n\n // DD-MM-YYYY, DD.MM.YYYY, DD/MM/YYYY (\uC720\uB7FD\uC2DD)\n if (format.startsWith(\"DD\") && format.endsWith(\"YYYY\")) {\n if (numbers.length < 2) return numbers;\n if (numbers.length === 2) return `${numbers}${separator}`;\n if (numbers.length < 4)\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(2)}`;\n if (numbers.length === 4)\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(\n 2\n )}${separator}`;\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(\n 2,\n 4\n )}${separator}${numbers.slice(4, 8)}`;\n }\n\n // DD-MM, DD.MM, DD/MM (\uC77C\uC6D4\uB9CC)\n if (\n format.startsWith(\"DD\") &&\n format.includes(\"MM\") &&\n !format.includes(\"YYYY\")\n ) {\n if (numbers.length < 2) return numbers;\n if (numbers.length === 2) return `${numbers}${separator}`;\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(2, 4)}`;\n }\n\n // YY-MM-DD, YY.MM.DD (2\uC790\uB9AC \uC5F0\uB3C4)\n if (format.startsWith(\"YY\") && !format.startsWith(\"YYYY\")) {\n if (numbers.length < 2) return numbers;\n if (numbers.length === 2) return `${numbers}${separator}`;\n if (numbers.length < 4)\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(2)}`;\n if (numbers.length === 4)\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(\n 2\n )}${separator}`;\n return `${numbers.slice(0, 2)}${separator}${numbers.slice(\n 2,\n 4\n )}${separator}${numbers.slice(4, 6)}`;\n }\n\n // \uAE30\uBCF8: YYYY-MM-DD\n if (numbers.length < 4) return numbers;\n if (numbers.length === 4) return `${numbers}${separator}`;\n if (numbers.length < 6)\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(4)}`;\n if (numbers.length === 6)\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(\n 4\n )}${separator}`;\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(\n 4,\n 6\n )}${separator}${numbers.slice(6, 8)}`;\n}\n\n/**\n * \uD3EC\uB9F7\uC5D0 \uB530\uB978 \uCD5C\uB300 \uAE38\uC774 \uACC4\uC0B0\n */\nexport function getMaxLength(format: DateFormat): number {\n if (format === \"MM-DD\" || format === \"MM.DD\" || format === \"MM/DD\")\n return 5;\n if (format === \"DD-MM\" || format === \"DD.MM\" || format === \"DD/MM\")\n return 5;\n if (format === \"YY-MM\" || format === \"YY.MM\" || format === \"YY/MM\")\n return 5;\n if (format === \"YYYY-MM\" || format === \"YYYY.MM\" || format === \"YYYY/MM\")\n return 7;\n if (format.startsWith(\"YY\") && !format.startsWith(\"YYYY\")) return 8;\n return 10;\n}\n\n/**\n * \uD3EC\uB9F7\uC5D0 \uB530\uB978 \uC644\uC131 \uC22B\uC790 \uAE38\uC774\n */\nexport function getCompleteLength(format: DateFormat): number {\n if (format === \"MM-DD\" || format === \"MM.DD\" || format === \"MM/DD\")\n return 4;\n if (format === \"DD-MM\" || format === \"DD.MM\" || format === \"DD/MM\")\n return 4;\n if (format === \"YY-MM\" || format === \"YY.MM\" || format === \"YY/MM\")\n return 4;\n if (format === \"YYYY-MM\" || format === \"YYYY.MM\" || format === \"YYYY/MM\")\n return 6;\n if (format.startsWith(\"YY\") && !format.startsWith(\"YYYY\")) return 6;\n return 8;\n}\n\n/**\n * \uB0A0\uC9DC \uBB38\uC790\uC5F4\uC5D0\uC11C \uC5F0/\uC6D4/\uC77C \uCD94\uCD9C\n */\nexport function parseDateParts(\n value: string,\n format: DateFormat\n): { year: number; month: number; day: number } | null {\n const numbers = value.replace(/\\D/g, \"\");\n const completeLength = getCompleteLength(format);\n\n if (numbers.length !== completeLength) return null;\n\n let year: number, month: number, day: number;\n\n if (format === \"YYYY-MM\" || format === \"YYYY.MM\" || format === \"YYYY/MM\") {\n year = parseInt(numbers.slice(0, 4), 10);\n month = parseInt(numbers.slice(4, 6), 10);\n day = 1;\n } else if (format === \"YY-MM\" || format === \"YY.MM\" || format === \"YY/MM\") {\n const yy = parseInt(numbers.slice(0, 2), 10);\n year = yy >= 50 ? 1900 + yy : 2000 + yy;\n month = parseInt(numbers.slice(2, 4), 10);\n day = 1;\n } else if (format === \"MM-DD\" || format === \"MM.DD\" || format === \"MM/DD\") {\n month = parseInt(numbers.slice(0, 2), 10);\n day = parseInt(numbers.slice(2, 4), 10);\n year = new Date().getFullYear();\n } else if (format === \"DD-MM\" || format === \"DD.MM\" || format === \"DD/MM\") {\n day = parseInt(numbers.slice(0, 2), 10);\n month = parseInt(numbers.slice(2, 4), 10);\n year = new Date().getFullYear();\n } else if (format.startsWith(\"YYYY\")) {\n year = parseInt(numbers.slice(0, 4), 10);\n month = parseInt(numbers.slice(4, 6), 10);\n day = parseInt(numbers.slice(6, 8), 10);\n } else if (format.startsWith(\"MM\") && format.endsWith(\"YYYY\")) {\n month = parseInt(numbers.slice(0, 2), 10);\n day = parseInt(numbers.slice(2, 4), 10);\n year = parseInt(numbers.slice(4, 8), 10);\n } else if (format.startsWith(\"DD\") && format.endsWith(\"YYYY\")) {\n day = parseInt(numbers.slice(0, 2), 10);\n month = parseInt(numbers.slice(2, 4), 10);\n year = parseInt(numbers.slice(4, 8), 10);\n } else if (format.startsWith(\"YY\") && !format.startsWith(\"YYYY\")) {\n const yy = parseInt(numbers.slice(0, 2), 10);\n year = yy >= 50 ? 1900 + yy : 2000 + yy;\n month = parseInt(numbers.slice(2, 4), 10);\n day = parseInt(numbers.slice(4, 6), 10);\n } else {\n year = parseInt(numbers.slice(0, 4), 10);\n month = parseInt(numbers.slice(4, 6), 10);\n day = parseInt(numbers.slice(6, 8), 10);\n }\n\n return { year, month, day };\n}\n\n/**\n * \uB0A0\uC9DC \uC720\uD6A8\uC131 \uAC80\uC0AC\n */\nexport function validateDate(\n value: string,\n format: DateFormat,\n minDate?: Date,\n maxDate?: Date\n): boolean {\n const parts = parseDateParts(value, format);\n if (!parts) return false;\n\n const { year, month, day } = parts;\n\n if (month < 1 || month > 12) return false;\n if (day < 1 || day > 31) return false;\n\n const daysInMonth = new Date(year, month, 0).getDate();\n if (day > daysInMonth) return false;\n\n const date = new Date(year, month - 1, day);\n\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n\n return true;\n}\n\n/**\n * \uB0A0\uC9DC \uBB38\uC790\uC5F4\uC744 Date \uAC1D\uCCB4\uB85C \uBCC0\uD658\n */\nexport function parseToDate(value: string, format: DateFormat): Date | null {\n const parts = parseDateParts(value, format);\n if (!parts) return null;\n\n const { year, month, day } = parts;\n\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n\n return new Date(year, month - 1, day);\n}\n\n/**\n * \uB0A0\uC9DC \uAC12 \uC81C\uD55C (\uB144/\uC6D4/\uC77C)\n */\nexport function clampDateValue(\n value: string,\n type: \"year\" | \"month\" | \"day\",\n yearValue?: string,\n monthValue?: string\n): string {\n if (value.length === 0) return value;\n\n if (type === \"year\") {\n if (value.length === 1) {\n const digit = parseInt(value, 10);\n if (digit !== 1 && digit !== 2) return \"2\";\n }\n return value;\n }\n\n if (type === \"month\") {\n if (value.length === 1) {\n const digit = parseInt(value, 10);\n if (digit > 1) return \"0\" + value;\n }\n if (value.length === 2) {\n const num = parseInt(value, 10);\n if (num > 12) return \"12\";\n if (num < 1) return \"01\";\n }\n return value;\n }\n\n if (type === \"day\") {\n if (value.length === 1) {\n const digit = parseInt(value, 10);\n if (digit > 3) return \"0\" + value;\n }\n if (value.length === 2) {\n const num = parseInt(value, 10);\n const year = yearValue ? parseInt(yearValue, 10) : 0;\n const month = monthValue ? parseInt(monthValue, 10) : 0;\n const maxDay = year && month ? getDaysInMonth(year, month) : 31;\n if (num > maxDay) return String(maxDay).padStart(2, \"0\");\n if (num < 1) return \"01\";\n }\n return value;\n }\n\n return value;\n}\n\n/**\n * DateTimeFormat\uC5D0\uC11C DateFormat \uBD80\uBD84 \uCD94\uCD9C\n */\nexport function extractDateFormat(format: DateTimeFormat): DateFormat {\n const datePart = format.split(\" \")[0];\n return datePart as DateFormat;\n}\n\n/**\n * \uCD08 \uD544\uB4DC\uAC00 \uC788\uB294\uC9C0 \uD655\uC778\n */\nexport function hasSecondField(format: DateTimeFormat): boolean {\n return format.includes(\":ss\");\n}\n\n/**\n * \uC785\uB825\uB41C \uC22B\uC790\uB97C \uC720\uD6A8\uD55C \uBC94\uC704\uB85C \uBCF4\uC815 (\uB0A0\uC9DC\uC6A9)\n */\nexport function constrainDateNumbers(\n numbers: string,\n format: DateFormat\n): string {\n if (numbers.length === 0) return \"\";\n\n let result = \"\";\n let year = 0;\n let month = 0;\n\n // YYYY-MM-DD, YYYY.MM.DD, YYYY/MM/DD\n if (format.startsWith(\"YYYY\")) {\n if (numbers.length >= 1) {\n const firstDigit = numbers[0];\n if (firstDigit !== \"1\" && firstDigit !== \"2\") {\n result += \"2\";\n } else {\n result += firstDigit;\n }\n }\n if (numbers.length >= 2) result += numbers[1];\n if (numbers.length >= 3) result += numbers[2];\n if (numbers.length >= 4) {\n result += numbers[3];\n year = parseInt(result, 10);\n }\n\n if (numbers.length >= 5) {\n let monthStr = numbers.slice(4, 6);\n if (monthStr.length === 1) {\n if (parseInt(monthStr, 10) > 1) {\n monthStr = \"0\" + monthStr;\n } else {\n result += monthStr;\n return result;\n }\n }\n month = parseInt(monthStr, 10);\n if (month > 12) month = 12;\n if (month < 1 && monthStr.length === 2) month = 1;\n result += month.toString().padStart(2, \"0\");\n }\n\n if (numbers.length >= 7) {\n let dayStr = numbers.slice(6, 8);\n if (dayStr.length === 1) {\n if (parseInt(dayStr, 10) > 3) {\n dayStr = \"0\" + dayStr;\n } else {\n result += dayStr;\n return result;\n }\n }\n let day = parseInt(dayStr, 10);\n const maxDay =\n year > 0 && month > 0 ? getDaysInMonth(year, month) : 31;\n if (day > maxDay) day = maxDay;\n if (day < 1 && dayStr.length === 2) day = 1;\n result += day.toString().padStart(2, \"0\");\n }\n\n return result;\n }\n\n // MM-DD, MM.DD, MM/DD (\uC6D4\uC77C\uB9CC)\n if (\n format.startsWith(\"MM\") &&\n format.includes(\"DD\") &&\n !format.includes(\"YYYY\") &&\n !format.includes(\"YY\")\n ) {\n // \uC6D4 \uCC98\uB9AC\n if (numbers.length >= 1) {\n let monthStr = numbers.slice(0, 2);\n if (monthStr.length === 1) {\n if (parseInt(monthStr, 10) > 1) {\n monthStr = \"0\" + monthStr;\n } else {\n result += monthStr;\n return result;\n }\n }\n month = parseInt(monthStr, 10);\n if (month > 12) month = 12;\n if (month < 1 && monthStr.length === 2) month = 1;\n result += month.toString().padStart(2, \"0\");\n }\n\n // \uC77C \uCC98\uB9AC\n if (numbers.length >= 3) {\n let dayStr = numbers.slice(2, 4);\n if (dayStr.length === 1) {\n if (parseInt(dayStr, 10) > 3) {\n dayStr = \"0\" + dayStr;\n } else {\n result += dayStr;\n return result;\n }\n }\n let day = parseInt(dayStr, 10);\n const maxDay =\n month > 0\n ? getDaysInMonth(new Date().getFullYear(), month)\n : 31;\n if (day > maxDay) day = maxDay;\n if (day < 1 && dayStr.length === 2) day = 1;\n result += day.toString().padStart(2, \"0\");\n }\n\n return result;\n }\n\n // DD-MM, DD.MM, DD/MM (\uC77C\uC6D4\uB9CC)\n if (\n format.startsWith(\"DD\") &&\n format.includes(\"MM\") &&\n !format.includes(\"YYYY\") &&\n !format.includes(\"YY\")\n ) {\n // \uC77C \uCC98\uB9AC (\uC6D4\uC744 \uBAA8\uB974\uBBC0\uB85C \uCD5C\uB300 31\uAE4C\uC9C0)\n if (numbers.length >= 1) {\n let dayStr = numbers.slice(0, 2);\n if (dayStr.length === 1) {\n if (parseInt(dayStr, 10) > 3) {\n dayStr = \"0\" + dayStr;\n } else {\n result += dayStr;\n return result;\n }\n }\n let day = parseInt(dayStr, 10);\n if (day > 31) day = 31;\n if (day < 1 && dayStr.length === 2) day = 1;\n result += day.toString().padStart(2, \"0\");\n }\n\n // \uC6D4 \uCC98\uB9AC\n if (numbers.length >= 3) {\n let monthStr = numbers.slice(2, 4);\n if (monthStr.length === 1) {\n if (parseInt(monthStr, 10) > 1) {\n monthStr = \"0\" + monthStr;\n } else {\n result += monthStr;\n return result;\n }\n }\n month = parseInt(monthStr, 10);\n if (month > 12) month = 12;\n if (month < 1 && monthStr.length === 2) month = 1;\n result += month.toString().padStart(2, \"0\");\n }\n\n return result;\n }\n\n // MM-DD-YYYY, MM.DD.YYYY (\uBBF8\uAD6D\uC2DD)\n if (\n format.startsWith(\"MM\") &&\n format.includes(\"DD\") &&\n format.endsWith(\"YYYY\")\n ) {\n // \uC6D4 \uCC98\uB9AC\n if (numbers.length >= 1) {\n let monthStr = numbers.slice(0, 2);\n if (monthStr.length === 1) {\n if (parseInt(monthStr, 10) > 1) {\n monthStr = \"0\" + monthStr;\n } else {\n result += monthStr;\n return result;\n }\n }\n month = parseInt(monthStr, 10);\n if (month > 12) month = 12;\n if (month < 1 && monthStr.length === 2) month = 1;\n result += month.toString().padStart(2, \"0\");\n }\n\n // \uC77C \uCC98\uB9AC\n if (numbers.length >= 3) {\n let dayStr = numbers.slice(2, 4);\n if (dayStr.length === 1) {\n if (parseInt(dayStr, 10) > 3) {\n dayStr = \"0\" + dayStr;\n } else {\n result += dayStr;\n return result;\n }\n }\n let day = parseInt(dayStr, 10);\n if (day > 31) day = 31;\n if (day < 1 && dayStr.length === 2) day = 1;\n result += day.toString().padStart(2, \"0\");\n }\n\n // \uC5F0\uB3C4 \uCC98\uB9AC\n if (numbers.length >= 5) {\n const yearStr = numbers.slice(4, 8);\n if (yearStr.length >= 1) {\n const firstDigit = yearStr[0];\n if (firstDigit !== \"1\" && firstDigit !== \"2\") {\n result += \"2\";\n } else {\n result += firstDigit;\n }\n }\n if (yearStr.length >= 2) result += yearStr[1];\n if (yearStr.length >= 3) result += yearStr[2];\n if (yearStr.length >= 4) result += yearStr[3];\n }\n\n return result;\n }\n\n // DD-MM-YYYY, DD.MM.YYYY (\uC720\uB7FD\uC2DD)\n if (format.startsWith(\"DD\") && format.endsWith(\"YYYY\")) {\n // \uC77C \uCC98\uB9AC\n if (numbers.length >= 1) {\n let dayStr = numbers.slice(0, 2);\n if (dayStr.length === 1) {\n if (parseInt(dayStr, 10) > 3) {\n dayStr = \"0\" + dayStr;\n } else {\n result += dayStr;\n return result;\n }\n }\n let day = parseInt(dayStr, 10);\n if (day > 31) day = 31;\n if (day < 1 && dayStr.length === 2) day = 1;\n result += day.toString().padStart(2, \"0\");\n }\n\n // \uC6D4 \uCC98\uB9AC\n if (numbers.length >= 3) {\n let monthStr = numbers.slice(2, 4);\n if (monthStr.length === 1) {\n if (parseInt(monthStr, 10) > 1) {\n monthStr = \"0\" + monthStr;\n } else {\n result += monthStr;\n return result;\n }\n }\n month = parseInt(monthStr, 10);\n if (month > 12) month = 12;\n if (month < 1 && monthStr.length === 2) month = 1;\n result += month.toString().padStart(2, \"0\");\n }\n\n // \uC5F0\uB3C4 \uCC98\uB9AC\n if (numbers.length >= 5) {\n const yearStr = numbers.slice(4, 8);\n if (yearStr.length >= 1) {\n const firstDigit = yearStr[0];\n if (firstDigit !== \"1\" && firstDigit !== \"2\") {\n result += \"2\";\n } else {\n result += firstDigit;\n }\n }\n if (yearStr.length >= 2) result += yearStr[1];\n if (yearStr.length >= 3) result += yearStr[2];\n if (yearStr.length >= 4) result += yearStr[3];\n }\n\n return result;\n }\n\n // YY-MM-DD (2\uC790\uB9AC \uC5F0\uB3C4)\n if (format.startsWith(\"YY\") && !format.startsWith(\"YYYY\")) {\n // \uC5F0\uB3C4 \uCC98\uB9AC (2\uC790\uB9AC)\n if (numbers.length >= 1) result += numbers[0];\n if (numbers.length >= 2) result += numbers[1];\n\n // \uC6D4 \uCC98\uB9AC\n if (numbers.length >= 3) {\n let monthStr = numbers.slice(2, 4);\n if (monthStr.length === 1) {\n if (parseInt(monthStr, 10) > 1) {\n monthStr = \"0\" + monthStr;\n } else {\n result += monthStr;\n return result;\n }\n }\n month = parseInt(monthStr, 10);\n if (month > 12) month = 12;\n if (month < 1 && monthStr.length === 2) month = 1;\n result += month.toString().padStart(2, \"0\");\n }\n\n // \uC77C \uCC98\uB9AC\n if (numbers.length >= 5) {\n let dayStr = numbers.slice(4, 6);\n if (dayStr.length === 1) {\n if (parseInt(dayStr, 10) > 3) {\n dayStr = \"0\" + dayStr;\n } else {\n result += dayStr;\n return result;\n }\n }\n let day = parseInt(dayStr, 10);\n const maxDay =\n month > 0\n ? getDaysInMonth(new Date().getFullYear(), month)\n : 31;\n if (day > maxDay) day = maxDay;\n if (day < 1 && dayStr.length === 2) day = 1;\n result += day.toString().padStart(2, \"0\");\n }\n\n return result;\n }\n\n return numbers;\n}\n\n/**\n * \uB0A0\uC9DC \uC790\uB3D9 \uD3EC\uB9F7\uD305 \uD568\uC218 (DateTimeTextField\uC6A9)\n */\nexport function formatDateValue(value: string, format: DateFormat): string {\n const rawNumbers = value.replace(/\\D/g, \"\");\n const separator = getSeparator(format);\n\n if (rawNumbers.length === 0) return \"\";\n\n const numbers = constrainDateNumbers(rawNumbers, format);\n\n if (format.startsWith(\"YYYY\")) {\n if (numbers.length <= 4) return numbers;\n if (numbers.length === 4) return `${numbers}${separator}`;\n if (numbers.length <= 6)\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(4)}`;\n if (numbers.length === 6)\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(\n 4\n )}${separator}`;\n return `${numbers.slice(0, 4)}${separator}${numbers.slice(\n 4,\n 6\n )}${separator}${numbers.slice(6, 8)}`;\n }\n\n return numbers;\n}\n\n/**\n * \uB0A0\uC9DC \uD3EC\uB9F7\uC744 \uBC11\uC904 placeholder\uB85C \uBCC0\uD658\n */\nexport function formatToPlaceholder(format: DateFormat): string {\n return format\n .replace(/YYYY/g, \"Y___\")\n .replace(/YY/g, \"__\")\n .replace(/MM/g, \"__\")\n .replace(/DD/g, \"__\");\n}\n\n/**\n * \uD074\uB9AD \uC704\uCE58\uC5D0 \uB530\uB77C \uC120\uD0DD\uD560 \uC601\uC5ED\uC758 \uC2DC\uC791/\uB05D \uC778\uB371\uC2A4 \uBC18\uD658\n */\nexport function getSegmentRange(\n cursorPos: number,\n format: DateFormat\n): { start: number; end: number } {\n if (format === \"MM-DD\" || format === \"MM.DD\" || format === \"MM/DD\") {\n if (cursorPos <= 2) return { start: 0, end: 2 };\n return { start: 3, end: 5 };\n }\n\n if (format === \"DD-MM\" || format === \"DD.MM\" || format === \"DD/MM\") {\n if (cursorPos <= 2) return { start: 0, end: 2 };\n return { start: 3, end: 5 };\n }\n\n if (format === \"YYYY-MM\" || format === \"YYYY.MM\" || format === \"YYYY/MM\") {\n if (cursorPos <= 4) return { start: 0, end: 4 };\n return { start: 5, end: 7 };\n }\n\n if (format === \"YY-MM\" || format === \"YY.MM\" || format === \"YY/MM\") {\n if (cursorPos <= 2) return { start: 0, end: 2 };\n return { start: 3, end: 5 };\n }\n\n if (format.startsWith(\"YY\") && !format.startsWith(\"YYYY\")) {\n if (cursorPos <= 2) return { start: 0, end: 2 };\n if (cursorPos <= 5) return { start: 3, end: 5 };\n return { start: 6, end: 8 };\n }\n\n if (\n format.startsWith(\"MM\") &&\n format.includes(\"DD\") &&\n format.endsWith(\"YYYY\")\n ) {\n if (cursorPos <= 2) return { start: 0, end: 2 };\n if (cursorPos <= 5) return { start: 3, end: 5 };\n return { start: 6, end: 10 };\n }\n\n if (format.startsWith(\"DD\") && format.endsWith(\"YYYY\")) {\n if (cursorPos <= 2) return { start: 0, end: 2 };\n if (cursorPos <= 5) return { start: 3, end: 5 };\n return { start: 6, end: 10 };\n }\n\n if (cursorPos <= 4) return { start: 0, end: 4 };\n if (cursorPos <= 7) return { start: 5, end: 7 };\n return { start: 8, end: 10 };\n}\n\n/**\n * \uD3EC\uB9F7\uC5D0 \uC5F0\uB3C4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\n * - YYYY \uB610\uB294 YY\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC73C\uBA74 \uC5F0\uB3C4\uAC00 \uC788\uB294 \uD3EC\uB9F7\n */\nexport function hasYearInFormat(format: DateFormat): boolean {\n return format.includes(\"YYYY\") || format.includes(\"YY\");\n}\n\n/**\n * \uD3EC\uB9F7\uC774 2\uC790\uB9AC \uC5F0\uB3C4(YY)\uB97C \uC0AC\uC6A9\uD558\uB294\uC9C0 \uD655\uC778\n */\nexport function has2DigitYear(format: DateFormat): boolean {\n return format.includes(\"YY\") && !format.includes(\"YYYY\");\n}\n\n/**\n * 2\uC790\uB9AC \uC5F0\uB3C4\uB97C 4\uC790\uB9AC \uC5F0\uB3C4\uB85C \uBCC0\uD658\n * - 50 \uC774\uC0C1\uC774\uBA74 1900\uB144\uB300, 50 \uBBF8\uB9CC\uC774\uBA74 2000\uB144\uB300\n */\nexport function convertYY2YYYY(yy: number): number {\n return yy >= 50 ? 1900 + yy : 2000 + yy;\n}\n\n/**\n * \uD3EC\uB9F7\uC5D0\uC11C \uB0A0\uC9DC \uD30C\uC2F1 (\uC5F0\uB3C4 \uC5C6\uB294 \uD3EC\uB9F7 \uC9C0\uC6D0, internalYear \uD65C\uC6A9)\n */\nexport function parseDateWithInternalYear(\n formattedValue: string,\n format: DateFormat,\n internalYear?: number | null\n): { year: number; month: number; day: number } | null {\n const numbers = formattedValue.replace(/\\D/g, \"\");\n const completeLength = getCompleteLength(format);\n\n if (numbers.length !== completeLength) return null;\n\n let year: number, month: number, day: number;\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\n if (!hasYearInFormat(format)) {\n year = internalYear || new Date().getFullYear();\n if (format.startsWith(\"MM\")) {\n month = parseInt(numbers.slice(0, 2), 10);\n day = parseInt(numbers.slice(2, 4), 10);\n } else {\n day = parseInt(numbers.slice(0, 2), 10);\n month = parseInt(numbers.slice(2, 4), 10);\n }\n } else if (has2DigitYear(format)) {\n // 2\uC790\uB9AC \uC5F0\uB3C4 \uD3EC\uB9F7\n const yy = parseInt(numbers.slice(0, 2), 10);\n year = convertYY2YYYY(yy);\n month = parseInt(numbers.slice(2, 4), 10);\n day = numbers.length >= 6 ? parseInt(numbers.slice(4, 6), 10) : 1;\n } else if (format.startsWith(\"YYYY\")) {\n year = parseInt(numbers.slice(0, 4), 10);\n month = parseInt(numbers.slice(4, 6), 10);\n day = numbers.length >= 8 ? parseInt(numbers.slice(6, 8), 10) : 1;\n } else if (format.startsWith(\"MM\") && format.endsWith(\"YYYY\")) {\n month = parseInt(numbers.slice(0, 2), 10);\n day = parseInt(numbers.slice(2, 4), 10);\n year = parseInt(numbers.slice(4, 8), 10);\n } else if (format.startsWith(\"DD\") && format.endsWith(\"YYYY\")) {\n day = parseInt(numbers.slice(0, 2), 10);\n month = parseInt(numbers.slice(2, 4), 10);\n year = parseInt(numbers.slice(4, 8), 10);\n } else {\n // \uAE30\uBCF8: YYYY-MM-DD\n year = parseInt(numbers.slice(0, 4), 10);\n month = parseInt(numbers.slice(4, 6), 10);\n day = numbers.length >= 8 ? parseInt(numbers.slice(6, 8), 10) : 1;\n }\n\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n\n return { year, month, day };\n}\n\n/**\n * \uB2EC\uB825 \uC120\uD0DD \uB610\uB294 \uC785\uB825\uAC12\uC744 \uCD9C\uB825\uC6A9 \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 (\uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC774\uC5B4\uB3C4 \uC5F0\uB3C4 \uD3EC\uD568)\n * @param formattedValue - \uD3EC\uB9F7\uB41C \uB0A0\uC9DC \uBB38\uC790\uC5F4 (\uC608: \"12-25\")\n * @param format - \uB0A0\uC9DC \uD3EC\uB9F7\n * @param separator - \uCD9C\uB825 \uAD6C\uBD84\uC790\n * @param internalYear - \uB0B4\uBD80\uC801\uC73C\uB85C \uAD00\uB9AC\uD558\uB294 \uC5F0\uB3C4 (\uC5F0\uB3C4 \uC5C6\uB294 \uD3EC\uB9F7\uC6A9)\n * @returns \uCD9C\uB825\uC6A9 \uB0A0\uC9DC \uBB38\uC790\uC5F4 (\uD56D\uC0C1 \uC5F0\uB3C4 \uD3EC\uD568, \uC608: \"2024-12-25\")\n */\nexport function buildDateOutputValue(\n formattedValue: string,\n format: DateFormat,\n separator: string,\n internalYear?: number | null\n): string {\n const formatSeparator = getSeparator(format);\n\n // \uC5F0\uB3C4\uAC00 \uC788\uB294 \uD3EC\uB9F7: \uAD6C\uBD84\uC790\uB9CC \uBCC0\uD658\n if (hasYearInFormat(format)) {\n return formattedValue.replace(\n new RegExp(`\\\\${formatSeparator}`, \"g\"),\n separator\n );\n }\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7: \uC5F0\uB3C4 \uCD94\uAC00\uD558\uC5EC YYYY-MM-DD \uD615\uC2DD\uC73C\uB85C \uCD9C\uB825\n const numbers = formattedValue.replace(/\\D/g, \"\");\n const completeLength = getCompleteLength(format);\n\n if (numbers.length !== completeLength) {\n // \uC644\uC131\uB418\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uAD6C\uBD84\uC790\uB9CC \uBCC0\uD658\n return formattedValue.replace(\n new RegExp(`\\\\${formatSeparator}`, \"g\"),\n separator\n );\n }\n\n const yearToUse = internalYear || new Date().getFullYear();\n let month: string, day: string;\n\n if (format.startsWith(\"MM\")) {\n month = numbers.slice(0, 2);\n day = numbers.slice(2, 4);\n } else {\n day = numbers.slice(0, 2);\n month = numbers.slice(2, 4);\n }\n\n return `${yearToUse}${separator}${month}${separator}${day}`;\n}\n\n/**\n * Date \uAC1D\uCCB4\uC5D0\uC11C \uD3EC\uB9F7\uC5D0 \uB9DE\uB294 \uC22B\uC790 \uBB38\uC790\uC5F4 \uC0DD\uC131\n */\nexport function dateToNumbers(date: Date, format: DateFormat): string {\n const year = String(date.getFullYear());\n const year2 = year.slice(-2);\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\n if (!hasYearInFormat(format)) {\n return format.startsWith(\"MM\") ? `${month}${day}` : `${day}${month}`;\n }\n\n // YYYY-MM, YY-MM (\uB144\uC6D4\uB9CC)\n if (!format.includes(\"DD\")) {\n return has2DigitYear(format) ? `${year2}${month}` : `${year}${month}`;\n }\n\n // 2\uC790\uB9AC \uC5F0\uB3C4\n if (has2DigitYear(format)) {\n return `${year2}${month}${day}`;\n }\n\n // DD-MM-YYYY (\uC720\uB7FD\uC2DD)\n if (format.startsWith(\"DD\") && format.endsWith(\"YYYY\")) {\n return `${day}${month}${year}`;\n }\n\n // MM-DD-YYYY (\uBBF8\uAD6D\uC2DD)\n if (\n format.startsWith(\"MM\") &&\n format.includes(\"DD\") &&\n format.endsWith(\"YYYY\")\n ) {\n return `${month}${day}${year}`;\n }\n\n // \uAE30\uBCF8: YYYY-MM-DD\n return `${year}${month}${day}`;\n}\n", "/**\n * time.ts - \uC2DC\uAC04 \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport type { TimeFormat } from \"../types\";\n\n/**\n * \uD3EC\uB9F7\uC5D0 \uB530\uB978 \uD544\uB4DC \uAC1C\uC218 (2: \uC2DC:\uBD84, 3: \uC2DC:\uBD84:\uCD08)\n */\nexport function getTimeFieldCount(format: TimeFormat): number {\n if (format === \"HH:mm:ss\" || format === \"hh:mm:ss\") {\n return 3;\n }\n return 2;\n}\n\n/**\n * 12\uC2DC\uAC04 \uD615\uC2DD\uC778\uC9C0 \uD655\uC778\n */\nexport function is12HourFormat(format: string): boolean {\n return format.includes(\"hh:\");\n}\n\n/**\n * \uC2DC\uAC04 \uC720\uD6A8\uC131 \uAC80\uC0AC\n * @param formatOrIs12Hour - TimeFormat \uBB38\uC790\uC5F4 \uB610\uB294 12\uC2DC\uAC04\uC81C \uC5EC\uBD80 boolean\n */\nexport function validateTime(\n hour: string,\n minute: string,\n second: string,\n formatOrIs12Hour: TimeFormat | boolean,\n minTime?: string,\n maxTime?: string\n): boolean {\n const is12Hour = typeof formatOrIs12Hour === \"boolean\" ? formatOrIs12Hour : is12HourFormat(formatOrIs12Hour);\n const h = parseInt(hour, 10);\n const m = parseInt(minute, 10);\n const s = second ? parseInt(second, 10) : 0;\n\n if (isNaN(h) || isNaN(m) || (second && isNaN(s))) return false;\n\n if (is12Hour) {\n if (h < 0 || h > 12) return false;\n } else {\n if (h < 0 || h > 23) return false;\n }\n\n if (m < 0 || m > 59) return false;\n if (s < 0 || s > 59) return false;\n\n if (minTime || maxTime) {\n const timeValue = h * 3600 + m * 60 + s;\n\n if (minTime) {\n const minParts = minTime.split(\":\");\n const minH = parseInt(minParts[0], 10) || 0;\n const minM = parseInt(minParts[1], 10) || 0;\n const minS = parseInt(minParts[2], 10) || 0;\n const minValue = minH * 3600 + minM * 60 + minS;\n if (timeValue < minValue) return false;\n }\n\n if (maxTime) {\n const maxParts = maxTime.split(\":\");\n const maxH = parseInt(maxParts[0], 10) || 0;\n const maxM = parseInt(maxParts[1], 10) || 0;\n const maxS = parseInt(maxParts[2], 10) || 0;\n const maxValue = maxH * 3600 + maxM * 60 + maxS;\n if (timeValue > maxValue) return false;\n }\n }\n\n return true;\n}\n\n/**\n * \uC2DC\uAC04 \uAC12 \uC81C\uD55C (\uC2DC/\uBD84/\uCD08)\n * - 24\uC2DC\uAC04 \uD615\uC2DD\uC5D0\uC11C 24 \uC774\uC0C1\uC744 \uC785\uB825\uD558\uBA74 24\uB97C \uBE7C\uC11C \uBCC0\uD658 (24\u219200, 25\u219201, 26\u219202, ...)\n * - \uCCAB \uC790\uB9AC\uAC00 \uBC94\uC704 \uCD08\uACFC \uC2DC \uC55E\uC5D0 0\uC744 \uBD99\uC5EC\uC11C \uB450 \uC790\uB9AC\uB85C \uBCC0\uD658\n */\nexport function clampTimeValue(value: string, type: \"hour\" | \"minute\" | \"second\", is12Hour: boolean = false): string {\n if (value.length === 0) return value;\n\n if (value.length === 1) {\n const digit = parseInt(value, 10);\n if (type === \"hour\") {\n const maxFirstDigit = is12Hour ? 1 : 2;\n // \uCCAB \uC790\uB9AC\uAC00 \uBC94\uC704 \uCD08\uACFC\uD558\uBA74 \uC55E\uC5D0 0\uC744 \uBD99\uC5EC\uC11C \uB450 \uC790\uB9AC\uB85C \uB9CC\uB4E6\n if (digit > maxFirstDigit) return `0${digit}`;\n } else {\n // \uBD84/\uCD08: \uCCAB \uC790\uB9AC\uAC00 6-9\uBA74 \uC55E\uC5D0 0 \uBD99\uC784\n if (digit > 5) return `0${digit}`;\n }\n return value;\n }\n\n const num = parseInt(value, 10);\n if (isNaN(num)) return value;\n\n if (type === \"hour\") {\n // 24\uC2DC\uAC04 \uD615\uC2DD\uC5D0\uC11C 24 \uC774\uC0C1\uC744 \uC785\uB825\uD558\uBA74 24\uB97C \uBE7C\uC11C \uBCC0\uD658\n if (!is12Hour && num >= 24) {\n return String(num - 24).padStart(2, \"0\");\n }\n const maxHour = is12Hour ? 12 : 23;\n if (num > maxHour) return String(maxHour).padStart(2, \"0\");\n } else {\n if (num > 59) return \"59\";\n }\n return value;\n}\n", "/**\n * number.ts - \uC22B\uC790 \uD3EC\uB9F7\uD305 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\n/**\n * \uC22B\uC790 \uD3EC\uB9F7\uD305 \uD568\uC218\n */\nexport function formatNumber(value: string, thousandSeparator: boolean, decimalLength?: number): string {\n if (!value) return \"\";\n\n // \uB9C8\uC774\uB108\uC2A4\uB9CC \uC788\uB294 \uACBD\uC6B0 \uADF8\uB300\uB85C \uBC18\uD658\n if (value === \"-\") return \"-\";\n\n // \uC22B\uC790, \uC18C\uC218\uC810, \uB9C8\uC774\uB108\uC2A4\uB9CC \uD5C8\uC6A9\n let cleaned = value.replace(/[^\\d.-]/g, \"\");\n\n // \uB9C8\uC774\uB108\uC2A4\uB294 \uB9E8 \uC55E\uC5D0\uB9CC \uD5C8\uC6A9\n const isNegative = cleaned.startsWith(\"-\");\n cleaned = cleaned.replace(/-/g, \"\");\n\n // \uC18C\uC218\uC810 \uCC98\uB9AC\n const parts = cleaned.split(\".\");\n let integerPart = parts[0] || \"\";\n let decimalPart = parts.length > 1 ? parts[1] : \"\";\n\n // \uC18C\uC218\uC810 \uAE38\uC774 \uC81C\uD55C\n if (decimalLength !== undefined && decimalPart.length > decimalLength) {\n decimalPart = decimalPart.slice(0, decimalLength);\n }\n\n // \uCC9C \uB2E8\uC704 \uAD6C\uBD84\uC790 \uCD94\uAC00\n if (thousandSeparator && integerPart) {\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n }\n\n // \uACB0\uACFC \uC870\uD569\n let result = integerPart;\n if (parts.length > 1 || value.endsWith(\".\")) {\n result += \".\" + decimalPart;\n }\n if (isNegative && result) {\n result = \"-\" + result;\n }\n\n return result;\n}\n\n/**\n * \uD45C\uC2DC \uAC12\uC5D0\uC11C \uC2E4\uC81C \uC22B\uC790 \uAC12 \uCD94\uCD9C\n */\nexport function parseNumber(displayValue: string): string {\n return displayValue.replace(/,/g, \"\");\n}\n", "/**\n * email.ts - \uC774\uBA54\uC77C \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\n/**\n * \uAE30\uBCF8 \uB3C4\uBA54\uC778 \uC81C\uC548 \uBAA9\uB85D\n */\nexport const DEFAULT_EMAIL_DOMAINS = [\n \"gmail.com\",\n \"naver.com\",\n \"daum.net\",\n \"hanmail.net\",\n \"kakao.com\",\n \"nate.com\",\n \"hotmail.com\",\n \"outlook.com\",\n \"yahoo.com\",\n \"icloud.com\",\n];\n\n/**\n * \uC774\uBA54\uC77C \uC720\uD6A8\uC131 \uAC80\uC0AC\n */\nexport function validateEmail(email: string): boolean {\n if (!email) return false;\n // RFC 5322 \uAE30\uBC18 \uAC04\uC18C\uD654\uB41C \uC774\uBA54\uC77C \uC815\uADDC\uC2DD\n const emailRegex =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n return emailRegex.test(email);\n}\n", "/**\n * phone.ts - \uC804\uD654\uBC88\uD638 \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport type { PhoneFormat } from \"../types\";\n\n/**\n * \uC804\uD654\uBC88\uD638 \uC790\uB3D9 \uD3EC\uB9F7\uD305 \uD568\uC218\n * \uC785\uB825\uB41C \uBC88\uD638\uB97C \uBCF4\uACE0 \uC790\uB3D9\uC73C\uB85C \uD3EC\uB9F7 \uD310\uB2E8\n */\nexport function formatPhoneNumber(value: string, customFormat?: PhoneFormat): string {\n const numbers = value.replace(/\\D/g, \"\");\n\n if (numbers.length === 0) return \"\";\n\n // prefix\uC640 \uD568\uAED8 \uC0AC\uC6A9\uB418\uB294 \uCEE4\uC2A4\uD140 \uD3EC\uB9F7 (010-000-0000: 3-3-4)\n if (customFormat === \"010-000-0000\") {\n if (numbers.length < 3) return numbers;\n if (numbers.length === 3) return `${numbers}-`;\n if (numbers.length < 6) return `${numbers.slice(0, 3)}-${numbers.slice(3)}`;\n if (numbers.length === 6) return `${numbers.slice(0, 3)}-${numbers.slice(3, 6)}-`;\n return `${numbers.slice(0, 3)}-${numbers.slice(3, 6)}-${numbers.slice(6, 10)}`;\n }\n\n // prefix\uC640 \uD568\uAED8 \uC0AC\uC6A9\uB418\uB294 \uCEE4\uC2A4\uD140 \uD3EC\uB9F7 (010-0000-0000: 3-4-4)\n if (customFormat === \"010-0000-0000\") {\n if (numbers.length < 3) return numbers;\n if (numbers.length === 3) return `${numbers}-`;\n if (numbers.length < 7) return `${numbers.slice(0, 3)}-${numbers.slice(3)}`;\n if (numbers.length === 7) return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-`;\n return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-${numbers.slice(7, 11)}`;\n }\n\n // \uC804\uAD6D\uB300\uD45C\uBC88\uD638 (1588, 1577, 1544, 1600, 1800 \uB4F1)\n if (/^1[0-9]{3}/.test(numbers)) {\n if (numbers.length <= 4) return numbers;\n if (numbers.length === 4) return `${numbers}-`;\n return `${numbers.slice(0, 4)}-${numbers.slice(4, 8)}`;\n }\n\n // \uC11C\uC6B8 \uC9C0\uC5ED\uBC88\uD638 (02)\n if (numbers.startsWith(\"02\")) {\n if (numbers.length < 2) return numbers;\n if (numbers.length === 2) return `${numbers}-`;\n // 9\uC790\uB9AC \uC774\uD558: 02-000-0000 (2-3-4)\n if (numbers.length <= 9) {\n if (numbers.length < 5) return `${numbers.slice(0, 2)}-${numbers.slice(2)}`;\n if (numbers.length === 5) return `${numbers.slice(0, 2)}-${numbers.slice(2, 5)}-`;\n return `${numbers.slice(0, 2)}-${numbers.slice(2, 5)}-${numbers.slice(5, 9)}`;\n }\n // 10\uC790\uB9AC: 02-0000-0000 (2-4-4)\n return `${numbers.slice(0, 2)}-${numbers.slice(2, 6)}-${numbers.slice(6, 10)}`;\n }\n\n // \uD734\uB300\uD3F0 (010, 011, 016, 017, 018, 019) \uB610\uB294 \uC9C0\uC5ED\uBC88\uD638 (031, 032, 033 \uB4F1)\n if (numbers.length < 3) return numbers;\n if (numbers.length === 3) return `${numbers}-`;\n\n // 10\uC790\uB9AC: 000-000-0000 (3-3-4)\n if (numbers.length <= 10) {\n if (numbers.length < 6) return `${numbers.slice(0, 3)}-${numbers.slice(3)}`;\n if (numbers.length === 6) return `${numbers.slice(0, 3)}-${numbers.slice(3, 6)}-`;\n return `${numbers.slice(0, 3)}-${numbers.slice(3, 6)}-${numbers.slice(6, 10)}`;\n }\n\n // 11\uC790\uB9AC: 000-0000-0000 (3-4-4)\n return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-${numbers.slice(7, 11)}`;\n}\n\n/**\n * \uC785\uB825\uB41C \uBC88\uD638\uC5D0 \uB530\uB978 \uCD5C\uB300 \uAE38\uC774 \uACC4\uC0B0\n */\nexport function getPhoneMaxLength(numbers: string): number {\n // \uC804\uAD6D\uB300\uD45C\uBC88\uD638\n if (/^1[0-9]{0,3}/.test(numbers)) {\n return 9; // 1588-1234\n }\n // \uC11C\uC6B8\n if (numbers.startsWith(\"02\")) {\n return 12; // 02-1234-5678\n }\n // \uD734\uB300\uD3F0/\uC9C0\uC5ED\uBC88\uD638\n return 13; // 010-1234-5678\n}\n", "/**\n * password.ts - \uBE44\uBC00\uBC88\uD638 \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport type { PasswordValidationRules, PasswordValidationResult } from \"../types\";\n\nexport const DEFAULT_SPECIAL_CHARS = \"!@#$%^&*()_+-=[]{}|;:,.<>?\";\n\n/**\n * \uAE30\uBCF8 \uC720\uD6A8\uC131 \uAC80\uC0AC \uADDC\uCE59\n */\nexport const DEFAULT_PASSWORD_VALIDATION_RULES: PasswordValidationRules = {\n minLength: 8,\n maxLength: 20,\n requireLowercase: true,\n requireNumber: true,\n};\n\n/**\n * \uBE44\uBC00\uBC88\uD638 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD568\uC218\n */\nexport function validatePassword(value: string, rules: PasswordValidationRules): PasswordValidationResult {\n // \uAE30\uBCF8\uAC12\uACFC \uBCD1\uD569\n const mergedRules = { ...DEFAULT_PASSWORD_VALIDATION_RULES, ...rules };\n const errors: PasswordValidationResult[\"errors\"] = {};\n\n if (mergedRules.minLength !== undefined && value.length < mergedRules.minLength) {\n errors.minLength = true;\n }\n\n if (mergedRules.maxLength !== undefined && value.length > mergedRules.maxLength) {\n errors.maxLength = true;\n }\n\n if (mergedRules.requireUppercase && !/[A-Z]/.test(value)) {\n errors.requireUppercase = true;\n }\n\n if (mergedRules.requireLowercase && !/[a-z]/.test(value)) {\n errors.requireLowercase = true;\n }\n\n if (mergedRules.requireNumber && !/[0-9]/.test(value)) {\n errors.requireNumber = true;\n }\n\n if (mergedRules.requireSpecialChar) {\n const specialChars = mergedRules.specialChars || DEFAULT_SPECIAL_CHARS;\n const escapedChars = specialChars.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n const regex = new RegExp(`[${escapedChars}]`);\n if (!regex.test(value)) {\n errors.requireSpecialChar = true;\n }\n }\n\n return {\n isValid: Object.keys(errors).length === 0,\n errors,\n };\n}\n", "/**\n * biznum.ts - \uC0AC\uC5C5\uC790\uBC88\uD638 \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\n/**\n * \uC0AC\uC5C5\uC790\uBC88\uD638 \uC720\uD6A8\uC131 \uAC80\uC0AC (\uAC80\uC99D \uC54C\uACE0\uB9AC\uC998)\n * \uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638\uB294 10\uC790\uB9AC \uC22B\uC790\uC774\uBA70, \uB9C8\uC9C0\uB9C9 \uC790\uB9AC\uAC00 \uAC80\uC99D\uBC88\uD638\uC785\uB2C8\uB2E4.\n */\nexport function validateBusinessNumber(value: string): boolean {\n const numbers = value.replace(/\\D/g, \"\");\n\n if (numbers.length !== 10) {\n return false;\n }\n\n // \uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638 \uAC80\uC99D \uC54C\uACE0\uB9AC\uC998\n const checkKey = [1, 3, 7, 1, 3, 7, 1, 3, 5];\n let sum = 0;\n\n for (let i = 0; i < 9; i++) {\n sum += parseInt(numbers[i], 10) * checkKey[i];\n }\n\n // 8\uBC88\uC9F8 \uC790\uB9AC * 5 \uC758 \uC2ED\uC758 \uC790\uB9AC \uCD94\uAC00\n sum += Math.floor((parseInt(numbers[8], 10) * 5) / 10);\n\n // \uAC80\uC99D\uBC88\uD638 \uACC4\uC0B0\n const checkNum = (10 - (sum % 10)) % 10;\n\n return checkNum === parseInt(numbers[9], 10);\n}\n", "/**\n * card.ts - \uCE74\uB4DC\uBC88\uD638 \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\n/** \uCE74\uB4DC \uBE0C\uB79C\uB4DC \uD0C0\uC785 */\nexport type CardBrand = \"visa\" | \"mastercard\" | \"amex\" | \"jcb\" | \"diners\" | \"discover\" | \"unionpay\" | \"bc\" | null;\n\n/**\n * \uCE74\uB4DC\uBC88\uD638 \uC720\uD6A8\uC131 \uAC80\uC0AC (Luhn \uC54C\uACE0\uB9AC\uC998)\n */\nexport function validateCardNumber(value: string): boolean {\n const numbers = value.replace(/\\D/g, \"\");\n\n if (numbers.length !== 16) {\n return false;\n }\n\n // Luhn \uC54C\uACE0\uB9AC\uC998\n let sum = 0;\n let isEven = false;\n\n for (let i = numbers.length - 1; i >= 0; i--) {\n let digit = parseInt(numbers[i], 10);\n\n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n isEven = !isEven;\n }\n\n return sum % 10 === 0;\n}\n\n/**\n * \uCE74\uB4DC \uBE0C\uB79C\uB4DC \uAC10\uC9C0 (\uAD6D\uC81C \uBE0C\uB79C\uB4DC \uAE30\uC900)\n */\nexport function detectCardBrand(value: string): CardBrand {\n const numbers = value.replace(/\\D/g, \"\");\n\n if (!numbers) return null;\n\n // Visa: 4\uB85C \uC2DC\uC791\n if (/^4/.test(numbers)) return \"visa\";\n\n // Mastercard: 51-55 \uB610\uB294 2221-2720\n if (/^5[1-5]/.test(numbers) || /^2(2[2-9]|[3-6]\\d|7[01]|720)/.test(numbers)) return \"mastercard\";\n\n // AMEX: 34, 37\n if (/^3[47]/.test(numbers)) return \"amex\";\n\n // JCB: 3528-3589\n if (/^35(2[89]|[3-8]\\d)/.test(numbers)) return \"jcb\";\n\n // Diners Club: 36, 38, 300-305, 309\n if (/^3(6|8|0[0-59])/.test(numbers)) return \"diners\";\n\n // Discover: 6011, 622126-622925, 644-649, 65\n if (/^(6011|65|64[4-9]|622(1[2-9][6-9]|[2-8]\\d\\d|9[01]\\d|92[0-5]))/.test(numbers)) return \"discover\";\n\n // UnionPay (\uC911\uAD6D\uC740\uB828): 62\uB85C \uC2DC\uC791 (Discover\uC640 \uACB9\uCE58\uC9C0 \uC54A\uB294 \uBC94\uC704)\n if (/^62(?!(2(1[2-9][6-9]|[2-8]\\d\\d|9[01]\\d|92[0-5])))/.test(numbers)) return \"unionpay\";\n\n // BC\uCE74\uB4DC: 94\uB85C \uC2DC\uC791\n if (/^94/.test(numbers)) return \"bc\";\n\n return null;\n}\n", "/**\n * jumin.ts - \uC8FC\uBBFC\uB4F1\uB85D\uBC88\uD638 \uAD00\uB828 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport type { JuminInfo } from \"../types\";\n\n/**\n * \uC8FC\uBBFC\uBC88\uD638 \uB4B7\uC790\uB9AC 2~3\uBC88\uC9F8 \uC22B\uC790\uB85C \uC9C0\uC5ED \uCD94\uCD9C\n * (2020\uB144 10\uC6D4 \uC774\uD6C4 \uCD9C\uC0DD\uC790\uB294 \uB79C\uB364 \uBD80\uC5EC\uB85C \uC758\uBBF8 \uC5C6\uC74C)\n */\nexport const REGION_MAP: Record<string, string> = {\n \"0\": \"\uC11C\uC6B8\",\n \"1\": \"\uC11C\uC6B8\",\n \"2\": \"\uC11C\uC6B8\",\n \"3\": \"\uC11C\uC6B8\",\n \"4\": \"\uC11C\uC6B8\",\n \"5\": \"\uC11C\uC6B8\",\n \"6\": \"\uC11C\uC6B8\",\n \"7\": \"\uC11C\uC6B8\",\n \"8\": \"\uC11C\uC6B8\",\n \"9\": \"\uBD80\uC0B0\",\n \"10\": \"\uBD80\uC0B0\",\n \"11\": \"\uBD80\uC0B0\",\n \"12\": \"\uBD80\uC0B0\",\n \"13\": \"\uC778\uCC9C\",\n \"14\": \"\uC778\uCC9C\",\n \"15\": \"\uC778\uCC9C\",\n \"16\": \"\uACBD\uAE30\",\n \"17\": \"\uACBD\uAE30\",\n \"18\": \"\uACBD\uAE30\",\n \"19\": \"\uACBD\uAE30\",\n \"20\": \"\uACBD\uAE30\",\n \"21\": \"\uACBD\uAE30\",\n \"22\": \"\uACBD\uAE30\",\n \"23\": \"\uACBD\uAE30\",\n \"24\": \"\uACBD\uAE30\",\n \"25\": \"\uACBD\uAE30\",\n \"26\": \"\uAC15\uC6D0\",\n \"27\": \"\uAC15\uC6D0\",\n \"28\": \"\uAC15\uC6D0\",\n \"29\": \"\uAC15\uC6D0\",\n \"30\": \"\uAC15\uC6D0\",\n \"31\": \"\uAC15\uC6D0\",\n \"32\": \"\uAC15\uC6D0\",\n \"33\": \"\uAC15\uC6D0\",\n \"34\": \"\uAC15\uC6D0\",\n \"35\": \"\uCDA9\uBD81\",\n \"36\": \"\uCDA9\uBD81\",\n \"37\": \"\uCDA9\uBD81\",\n \"38\": \"\uCDA9\uBD81\",\n \"39\": \"\uCDA9\uB0A8\",\n \"40\": \"\uCDA9\uB0A8\",\n \"41\": \"\uB300\uC804\",\n \"42\": \"\uCDA9\uB0A8\",\n \"43\": \"\uCDA9\uB0A8\",\n \"44\": \"\uCDA9\uB0A8\",\n \"45\": \"\uCDA9\uB0A8\",\n \"46\": \"\uCDA9\uB0A8\",\n \"47\": \"\uCDA9\uB0A8\",\n \"48\": \"\uC804\uBD81\",\n \"49\": \"\uC804\uBD81\",\n \"50\": \"\uC804\uBD81\",\n \"51\": \"\uC804\uBD81\",\n \"52\": \"\uC804\uBD81\",\n \"53\": \"\uC804\uBD81\",\n \"54\": \"\uC804\uB0A8\",\n \"55\": \"\uC804\uB0A8\",\n \"56\": \"\uAD11\uC8FC\",\n \"57\": \"\uC804\uB0A8\",\n \"58\": \"\uC804\uB0A8\",\n \"59\": \"\uC804\uB0A8\",\n \"60\": \"\uC804\uB0A8\",\n \"61\": \"\uC804\uB0A8\",\n \"62\": \"\uC804\uB0A8\",\n \"63\": \"\uC804\uB0A8\",\n \"64\": \"\uC804\uB0A8\",\n \"65\": \"\uACBD\uBD81\",\n \"66\": \"\uACBD\uBD81\",\n \"67\": \"\uACBD\uBD81\",\n \"68\": \"\uACBD\uBD81\",\n \"69\": \"\uACBD\uBD81\",\n \"70\": \"\uACBD\uBD81\",\n \"71\": \"\uACBD\uBD81\",\n \"72\": \"\uACBD\uBD81\",\n \"73\": \"\uACBD\uBD81\",\n \"74\": \"\uACBD\uBD81\",\n \"75\": \"\uACBD\uBD81\",\n \"76\": \"\uB300\uAD6C\",\n \"77\": \"\uB300\uAD6C\",\n \"78\": \"\uB300\uAD6C\",\n \"79\": \"\uACBD\uB0A8\",\n \"80\": \"\uACBD\uB0A8\",\n \"81\": \"\uACBD\uB0A8\",\n \"82\": \"\uACBD\uB0A8\",\n \"83\": \"\uC6B8\uC0B0\",\n \"84\": \"\uACBD\uB0A8\",\n \"85\": \"\uACBD\uB0A8\",\n \"86\": \"\uACBD\uB0A8\",\n \"87\": \"\uACBD\uB0A8\",\n \"88\": \"\uACBD\uB0A8\",\n \"89\": \"\uACBD\uB0A8\",\n \"90\": \"\uACBD\uB0A8\",\n \"91\": \"\uC81C\uC8FC\",\n \"92\": \"\uC81C\uC8FC\",\n \"93\": \"\uC138\uC885\",\n};\n\n/**\n * \uC8FC\uBBFC\uBC88\uD638\uC5D0\uC11C \uC815\uBCF4 \uCD94\uCD9C\n */\nexport function extractJuminInfo(value: string): Omit<JuminInfo, \"isValid\"> {\n const numbers = value.replace(/\\D/g, \"\");\n\n const result: Omit<JuminInfo, \"isValid\"> = {\n value: numbers,\n birthDate: null,\n gender: null,\n isForeigner: null,\n region: null,\n };\n\n if (numbers.length < 7) {\n return result;\n }\n\n // \uB4B7\uC790\uB9AC \uCCAB \uBC88\uC9F8 \uC22B\uC790 (\uC131\uBCC4/\uC138\uAE30/\uC678\uAD6D\uC778 \uAD6C\uBD84)\n const genderCode = numbers[6];\n\n // \uC131\uBCC4 \uBC0F \uC678\uAD6D\uC778 \uC5EC\uBD80 \uD310\uB2E8\n // 1, 2: 1900\uB144\uB300 \uB0B4\uAD6D\uC778 (\uB0A8/\uC5EC)\n // 3, 4: 2000\uB144\uB300 \uB0B4\uAD6D\uC778 (\uB0A8/\uC5EC)\n // 5, 6: 1900\uB144\uB300 \uC678\uAD6D\uC778 (\uB0A8/\uC5EC)\n // 7, 8: 2000\uB144\uB300 \uC678\uAD6D\uC778 (\uB0A8/\uC5EC)\n // 9, 0: 1800\uB144\uB300 \uB0B4\uAD6D\uC778 (\uB0A8/\uC5EC)\n switch (genderCode) {\n case \"1\":\n case \"3\":\n case \"5\":\n case \"7\":\n case \"9\":\n result.gender = \"male\";\n break;\n case \"2\":\n case \"4\":\n case \"6\":\n case \"8\":\n case \"0\":\n result.gender = \"female\";\n break;\n }\n\n // \uC678\uAD6D\uC778 \uC5EC\uBD80\n if ([\"5\", \"6\", \"7\", \"8\"].includes(genderCode)) {\n result.isForeigner = true;\n } else if ([\"1\", \"2\", \"3\", \"4\", \"9\", \"0\"].includes(genderCode)) {\n result.isForeigner = false;\n }\n\n // \uC0DD\uB144\uC6D4\uC77C \uCD94\uCD9C\n if (numbers.length >= 6) {\n const yy = numbers.slice(0, 2);\n const mm = numbers.slice(2, 4);\n const dd = numbers.slice(4, 6);\n\n let century = \"19\";\n if ([\"3\", \"4\", \"7\", \"8\"].includes(genderCode)) {\n century = \"20\";\n } else if ([\"9\", \"0\"].includes(genderCode)) {\n century = \"18\";\n }\n\n const year = century + yy;\n result.birthDate = `${year}-${mm}-${dd}`;\n }\n\n // \uC9C0\uC5ED \uCD94\uCD9C (\uB0B4\uAD6D\uC778\uB9CC, \uB4B7\uC790\uB9AC 2~3\uBC88\uC9F8 \uC22B\uC790)\n if (numbers.length >= 9 && result.isForeigner === false) {\n const regionCode = numbers.slice(7, 9);\n const regionNum = parseInt(regionCode, 10);\n result.region = REGION_MAP[String(regionNum)] || null;\n }\n\n return result;\n}\n\n/**\n * \uC8FC\uBBFC\uB4F1\uB85D\uBC88\uD638 \uCCB4\uD06C\uC12C \uAC80\uC99D\n * - 13\uC790\uB9AC \uAC01 \uC22B\uC790\uC5D0 \uAC00\uC911\uCE58 [2,3,4,5,6,7,8,9,2,3,4,5]\uB97C \uACF1\uD558\uC5EC \uD569\uC0B0\n * - (11 - (\uD569\uACC4 % 11)) % 10 === \uB9C8\uC9C0\uB9C9 \uC790\uB9AC\n */\nexport function validateJuminChecksum(numbers: string): boolean {\n if (numbers.length !== 13) return false;\n\n const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];\n let sum = 0;\n\n for (let i = 0; i < 12; i++) {\n sum += parseInt(numbers[i], 10) * weights[i];\n }\n\n const checkDigit = (11 - (sum % 11)) % 10;\n const lastDigit = parseInt(numbers[12], 10);\n\n return checkDigit === lastDigit;\n}\n\n/**\n * \uC8FC\uBBFC\uB4F1\uB85D\uBC88\uD638 \uC0DD\uB144\uC6D4\uC77C \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nexport function validateJuminBirthDate(numbers: string): boolean {\n if (numbers.length < 7) return false;\n\n const yy = parseInt(numbers.slice(0, 2), 10);\n const mm = parseInt(numbers.slice(2, 4), 10);\n const dd = parseInt(numbers.slice(4, 6), 10);\n const genderCode = numbers[6];\n\n // \uC6D4 \uAC80\uC99D (1-12)\n if (mm < 1 || mm > 12) return false;\n\n // \uC138\uAE30 \uACB0\uC815\n let century = 1900;\n if ([\"3\", \"4\", \"7\", \"8\"].includes(genderCode)) {\n century = 2000;\n } else if ([\"9\", \"0\"].includes(genderCode)) {\n century = 1800;\n }\n\n const year = century + yy;\n\n // \uAC01 \uC6D4\uC758 \uC77C\uC218 (\uC724\uB144 \uACE0\uB824)\n const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n const daysInMonth = [31, isLeapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n // \uC77C \uAC80\uC99D\n if (dd < 1 || dd > daysInMonth[mm - 1]) return false;\n\n return true;\n}\n", "/**\n * TextArea.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { Box, FormControl, InputLabel, TextareaAutosize } from \"@mui/material\";\nimport type { TextAreaProps } from \"./types\";\nimport { useTextFieldBase } from \"./hooks\";\n\nconst TextAreaBase = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextAreaBase(\n {\n label,\n value,\n name,\n onChange,\n onBlur,\n onFocus,\n minRows = 3,\n maxRows,\n placeholder,\n disabled,\n readonly,\n fullWidth = true,\n inputRef: externalInputRef,\n sx,\n inputProps,\n debounce,\n form,\n ...rest\n },\n ref,\n ) {\n const internalInputRef = useRef<HTMLTextAreaElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLTextAreaElement>,\n () => internalInputRef.current!,\n [],\n );\n\n const { internalValue, setInternalValue, emitChange, handleBlur } =\n useTextFieldBase({\n value: (value as string) ?? \"\",\n name,\n debounce,\n onChange: onChange as unknown as (\n e: React.ChangeEvent<HTMLInputElement>,\n ) => void,\n onBlur: onBlur as unknown as (\n e: React.FocusEvent<HTMLInputElement>,\n ) => void,\n });\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = event.target.value;\n setInternalValue(newValue);\n emitChange(\n event as unknown as React.ChangeEvent<HTMLInputElement>,\n newValue,\n );\n },\n [emitChange, setInternalValue],\n );\n\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n onFocus?.(event);\n },\n [onFocus],\n );\n\n const handleBlurWithFocus = useCallback(\n (event: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n handleBlur(\n event as unknown as React.FocusEvent<HTMLInputElement>,\n );\n },\n [handleBlur],\n );\n\n return (\n <FormControl\n fullWidth={fullWidth}\n disabled={disabled}\n sx={{ width: fullWidth ? \"100%\" : undefined, ...sx }}\n >\n {label && (\n <InputLabel\n shrink={isFocused || internalValue.length > 0}\n sx={{\n position: \"static\",\n transform: \"none\",\n mb: 1,\n color: readonly\n ? \"rgba(0, 0, 0, 0.6)\"\n : \"text.primary\",\n }}\n >\n {label}\n </InputLabel>\n )}\n <Box\n sx={{\n border: \"1px solid rgba(0, 0, 0, 0.23)\",\n borderRadius: 1,\n px: 1.5,\n py: 1.25,\n transition: \"border-color 0.15s ease\",\n ...(isFocused &&\n !readonly && {\n borderColor: \"primary.main\",\n }),\n ...(readonly && {\n backgroundColor: \"rgba(0, 0, 0, 0.02)\",\n }),\n }}\n >\n <TextareaAutosize\n {...inputProps}\n {...rest}\n ref={(node: HTMLTextAreaElement | null) => {\n internalInputRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (\n ref as React.MutableRefObject<HTMLTextAreaElement | null>\n ).current = node;\n }\n }}\n name={name}\n value={internalValue}\n minRows={minRows}\n maxRows={maxRows}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readonly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlurWithFocus}\n style={{\n width: \"100%\",\n border: \"none\",\n outline: \"none\",\n resize: \"vertical\",\n background: \"transparent\",\n font: \"inherit\",\n color: \"inherit\",\n }}\n />\n </Box>\n </FormControl>\n );\n },\n);\n\nconst TextAreaWithForm = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextAreaWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"TextArea form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"TextArea requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n form.handleFormChange(\n event as unknown as React.ChangeEvent<HTMLInputElement>,\n );\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <TextAreaBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue as string}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(props, ref) {\n if (props.form) {\n return <TextAreaWithForm {...props} ref={ref} />;\n }\n\n return <TextAreaBase {...props} ref={ref} />;\n },\n);\n", "/**\n * Checkbox.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport { Checkbox as MuiCheckbox, FormControlLabel } from \"@mui/material\";\nimport type { CheckboxProps } from \"./types\";\n\nconst CheckboxBase = forwardRef<HTMLButtonElement, CheckboxProps>(\n function CheckboxBase(\n { label, name, checked, onChange, readonly, disabled, form, ...props },\n ref,\n ) {\n return (\n <FormControlLabel\n label={label}\n control={\n <MuiCheckbox\n {...props}\n ref={ref}\n name={name}\n checked={!!checked}\n onChange={onChange}\n disabled={disabled || readonly}\n />\n }\n />\n );\n },\n);\n\nconst CheckboxWithForm = forwardRef<HTMLButtonElement, CheckboxProps>(\n function CheckboxWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"Checkbox form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"Checkbox requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (\n event: React.ChangeEvent<HTMLInputElement>,\n nextChecked: boolean,\n ) => {\n const syntheticEvent = {\n ...event,\n target: {\n ...event.target,\n name,\n value: nextChecked,\n checked: nextChecked,\n },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n form.handleFormChange(syntheticEvent);\n onChange?.(event, nextChecked);\n },\n [form, name, onChange],\n );\n\n return (\n <CheckboxBase\n {...rest}\n ref={ref}\n name={name}\n checked={Boolean(formValue)}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n function Checkbox(props, ref) {\n if (props.form) {\n return <CheckboxWithForm {...props} ref={ref} />;\n }\n\n return <CheckboxBase {...props} ref={ref} />;\n },\n);\n", "/**\n * RadioGroup.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport {\n FormControl,\n FormLabel,\n RadioGroup as MuiRadioGroup,\n FormControlLabel,\n Radio,\n} from \"@mui/material\";\nimport type { RadioGroupProps } from \"./types\";\n\nconst RadioGroupBase = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroupBase(\n { label, name, value, options, onChange, readonly, disabled, ...props },\n ref,\n ) {\n return (\n <FormControl ref={ref} disabled={disabled}>\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...props}\n name={name}\n value={value ?? \"\"}\n onChange={onChange}\n >\n {options.map((option) => (\n <FormControlLabel\n key={option.value}\n value={option.value}\n control={<Radio />}\n label={option.label}\n disabled={disabled || option.disabled || readonly}\n />\n ))}\n </MuiRadioGroup>\n </FormControl>\n );\n },\n);\n\nconst RadioGroupWithForm = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroupWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"RadioGroup form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"RadioGroup requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>, nextValue: string) => {\n const syntheticEvent = {\n ...event,\n target: {\n ...event.target,\n name,\n value: nextValue,\n },\n } as React.ChangeEvent<HTMLInputElement>;\n form.handleFormChange(syntheticEvent);\n onChange?.(event, nextValue);\n },\n [form, name, onChange],\n );\n\n return (\n <RadioGroupBase\n {...rest}\n ref={ref}\n name={name}\n value={(formValue as string) ?? \"\"}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroup(props, ref) {\n if (props.form) {\n return <RadioGroupWithForm {...props} ref={ref} />;\n }\n\n return <RadioGroupBase {...props} ref={ref} />;\n },\n);\n", "/**\n * Switch.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport { Switch as MuiSwitch, FormControlLabel } from \"@mui/material\";\nimport type { SwitchProps } from \"./types\";\n\nconst SwitchBase = forwardRef<HTMLButtonElement, SwitchProps>(\n function SwitchBase(\n { label, name, checked, onChange, readonly, disabled, form, ...props },\n ref,\n ) {\n return (\n <FormControlLabel\n label={label}\n control={\n <MuiSwitch\n {...props}\n ref={ref}\n name={name}\n checked={!!checked}\n onChange={onChange}\n disabled={disabled || readonly}\n />\n }\n />\n );\n },\n);\n\nconst SwitchWithForm = forwardRef<HTMLButtonElement, SwitchProps>(\n function SwitchWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"Switch form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"Switch requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (\n event: React.ChangeEvent<HTMLInputElement>,\n nextChecked: boolean,\n ) => {\n const syntheticEvent = {\n ...event,\n target: {\n ...event.target,\n name,\n value: nextChecked,\n checked: nextChecked,\n },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n form.handleFormChange(syntheticEvent);\n onChange?.(event, nextChecked);\n },\n [form, name, onChange],\n );\n\n return (\n <SwitchBase\n {...rest}\n ref={ref}\n name={name}\n checked={Boolean(formValue)}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n function Switch(props, ref) {\n if (props.form) {\n return <SwitchWithForm {...props} ref={ref} />;\n }\n\n return <SwitchBase {...props} ref={ref} />;\n },\n);\n", "/**\n * DateRange.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\nimport { Box } from \"@mui/material\";\nimport type { DateRangeProps } from \"./types\";\nimport { DateTextField } from \"./DateTextField\";\n\nexport function DateRange({\n form,\n startName,\n endName,\n startLabel = \"\uC2DC\uC791\uC77C\",\n endLabel = \"\uC885\uB8CC\uC77C\",\n startValue,\n endValue,\n onStartChange,\n onEndChange,\n fullWidth = true,\n size,\n readonly,\n gap = 2,\n startProps,\n endProps,\n}: DateRangeProps) {\n if (form) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"DateRange form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!startName || !endName) {\n throw new Error(\n \"DateRange requires startName and endName when form prop is provided.\",\n );\n }\n\n return (\n <Box\n sx={{\n display: \"grid\",\n gap,\n gridTemplateColumns: { xs: \"1fr\", sm: \"1fr 1fr\" },\n }}\n >\n <DateTextField\n {...startProps}\n name={startName}\n label={startLabel}\n form={form}\n fullWidth={fullWidth}\n size={size}\n readonly={readonly}\n />\n <DateTextField\n {...endProps}\n name={endName}\n label={endLabel}\n form={form}\n fullWidth={fullWidth}\n size={size}\n readonly={readonly}\n />\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: \"grid\",\n gap,\n gridTemplateColumns: { xs: \"1fr\", sm: \"1fr 1fr\" },\n }}\n >\n <DateTextField\n {...startProps}\n name={startName}\n label={startLabel}\n value={startValue}\n onChange={onStartChange}\n fullWidth={fullWidth}\n size={size}\n readonly={readonly}\n />\n <DateTextField\n {...endProps}\n name={endName}\n label={endLabel}\n value={endValue}\n onChange={onEndChange}\n fullWidth={fullWidth}\n size={size}\n readonly={readonly}\n />\n </Box>\n );\n}\n", "/**\n * DateTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n ChangeEvent,\n useMemo,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, InputAdornment, IconButton } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { DateTextFieldProps } from \"./types\";\nimport { DatePicker } from \"@ehfuse/mui-datetime-picker\";\nimport { CalendarIcon } from \"./icons\";\nimport { useDebouncedEmit } from \"./hooks\";\nimport {\n getSeparator,\n formatDate,\n getMaxLength,\n getCompleteLength,\n validateDate,\n formatToPlaceholder,\n hasYearInFormat,\n parseDateWithInternalYear,\n buildDateOutputValue,\n dateToNumbers,\n} from \"./utils\";\n\nconst DateTextFieldBase = forwardRef<HTMLDivElement, DateTextFieldProps>(\n function DateTextFieldBase(\n {\n label,\n format = \"YYYY-MM-DD\",\n separator = \"-\",\n minDate,\n maxDate,\n holidays = [],\n holidayColor = \"red\",\n calendarIcon = true,\n selectedColor,\n showToday = true,\n invalidBorderColor,\n debounce,\n slotProps,\n sx,\n value,\n onChange,\n onBlur,\n placeholder,\n onCalendarDismiss,\n onCalendarOpen,\n onCalendarClose,\n name = \"\",\n disabled,\n readonly = false,\n size,\n inputRef: externalInputRef,\n calendarAnchorOrigin,\n calendarTransformOrigin,\n ...props\n },\n ref,\n ) {\n const [isInvalid, setIsInvalid] = useState(false);\n const [displayValue, setDisplayValue] = useState(\"\");\n const [prevNumbers, setPrevNumbers] = useState(\"\");\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarAnchorPos, setCalendarAnchorPos] = useState(\n null as { top: number; left: number } | null,\n );\n const calendarCloseReasonRef = useRef<\"select\" | null>(null);\n const [internalYear, setInternalYear] = useState<number | null>(null); // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC6A9\n\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name,\n debounce,\n onChange,\n });\n\n const maxLength = getMaxLength(format);\n const completeLength = getCompleteLength(format);\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC778\uC9C0 \uD655\uC778 (YYYY, YY\uAC00 \uC5C6\uB294 \uD3EC\uB9F7)\n const isYearlessFormat = !hasYearInFormat(format);\n\n // \uD604\uC7AC \uC120\uD0DD\uB41C \uB0A0\uC9DC \uACC4\uC0B0\n const selectedDate = useMemo((): Date | null => {\n const parsed = parseDateWithInternalYear(\n displayValue,\n format,\n internalYear,\n );\n if (!parsed) return null;\n return new Date(parsed.year, parsed.month - 1, parsed.day);\n }, [displayValue, format, internalYear]);\n\n // \uB2EC\uB825\uC5D0 \uC804\uB2EC\uD560 \uB0A0\uC9DC \uACC4\uC0B0\n const calendarSelectedDate = useMemo((): Date => {\n // \uC120\uD0DD\uB41C \uB0A0\uC9DC\uAC00 \uC788\uC73C\uBA74 \uADF8\uB300\uB85C \uC0AC\uC6A9\n if (selectedDate) return selectedDate;\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC758 \uACBD\uC6B0 internalYear \uB610\uB294 \uD604\uC7AC \uC5F0\uB3C4 \uC0AC\uC6A9\n if (isYearlessFormat) {\n const yearToUse = internalYear || new Date().getFullYear();\n const parsed = parseDateWithInternalYear(\n displayValue,\n format,\n yearToUse,\n );\n if (\n parsed &&\n parsed.month >= 1 &&\n parsed.month <= 12 &&\n parsed.day >= 1 &&\n parsed.day <= 31\n ) {\n return new Date(yearToUse, parsed.month - 1, parsed.day);\n }\n return new Date(\n yearToUse,\n new Date().getMonth(),\n new Date().getDate(),\n );\n }\n\n return new Date();\n }, [\n selectedDate,\n displayValue,\n format,\n isYearlessFormat,\n internalYear,\n ]);\n\n // onChange\uB85C \uC804\uB2EC\uD560 \uAC12 \uC0DD\uC131 (\uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC774\uC5B4\uB3C4 \uC5F0\uB3C4 \uD3EC\uD568)\n const buildOutputValue = useCallback(\n (formattedValue: string): string => {\n return buildDateOutputValue(\n formattedValue,\n format,\n separator,\n internalYear,\n );\n },\n [format, separator, internalYear],\n );\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uC218\uD589\n const performValidation = useCallback(\n (inputValue: string) => {\n const numbers = inputValue.replace(/\\D/g, \"\");\n\n // \uC644\uC131\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uC720\uD6A8\uC131 \uAC80\uC0AC\n if (numbers.length === completeLength) {\n const isValid = validateDate(\n inputValue,\n format,\n minDate,\n maxDate,\n );\n setIsInvalid(!isValid);\n } else {\n setIsInvalid(false);\n }\n },\n [format, minDate, maxDate, completeLength],\n );\n\n // value \uBCC0\uACBD \uC2DC displayValue \uC5C5\uB370\uC774\uD2B8 (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uACBD\uC6B0\uB9CC)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n const formattedValue = formatDate(strValue, format);\n const currentNumbers = formattedValue.replace(/\\D/g, \"\");\n\n // \uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC12\uC774 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB97C \uB54C\uB9CC \uB3D9\uAE30\uD654\n // (\uC0AC\uC6A9\uC790 \uC785\uB825 \uC911 \uB514\uBC14\uC6B4\uC2A4\uB85C \uC778\uD55C \uB418\uB3CC\uB9BC \uBC29\uC9C0)\n if (strValue !== lastEmittedValue.current) {\n setDisplayValue(formattedValue);\n setPrevNumbers(currentNumbers);\n performValidation(formattedValue);\n lastEmittedValue.current = strValue;\n }\n } else {\n if (lastEmittedValue.current !== \"\") {\n setDisplayValue(\"\");\n setPrevNumbers(\"\");\n lastEmittedValue.current = \"\";\n }\n }\n }, [value, format, performValidation, lastEmittedValue]);\n\n // \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const input = e.target;\n const newValue = input.value;\n const newNumbers = newValue.replace(/\\D/g, \"\");\n\n // \uBC31\uC2A4\uD398\uC774\uC2A4 \uAC10\uC9C0\n const isBackspace =\n newNumbers.length <= prevNumbers.length &&\n newValue.length < displayValue.length;\n\n let formattedValue: string;\n\n if (isBackspace && newNumbers.length === prevNumbers.length) {\n // \uAD6C\uBD84\uC790\uB9CC \uC0AD\uC81C\uB41C \uACBD\uC6B0: \uC22B\uC790\uB3C4 \uD558\uB098 \uC0AD\uC81C\n const trimmedNumbers = newNumbers.slice(0, -1);\n formattedValue = formatDate(trimmedNumbers, format);\n } else {\n // \uC22B\uC790\uAC00 completeLength\uB97C \uCD08\uACFC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC81C\uD55C\n const limitedNumbers = newNumbers.slice(0, completeLength);\n formattedValue = formatDate(limitedNumbers, format);\n }\n\n setDisplayValue(formattedValue);\n const currentNumbers = formattedValue.replace(/\\D/g, \"\");\n setPrevNumbers(currentNumbers);\n\n // \uCEE4\uC11C \uC704\uCE58 \uC870\uC815: \uD3EC\uB9F7\uD305\uB41C \uC22B\uC790 \uAC1C\uC218\uC5D0 \uB9DE\uAC8C \uC704\uCE58 \uACB0\uC815\n requestAnimationFrame(() => {\n if (input) {\n const formatSep = getSeparator(format);\n let cursorPos = formattedValue.length; // \uAE30\uBCF8\uAC12: \uB05D\n\n if (!isBackspace) {\n // \uD3EC\uB9F7\uD305\uB41C \uBB38\uC790\uC5F4\uC758 \uC2E4\uC81C \uC22B\uC790 \uAC1C\uC218 \uC0AC\uC6A9 (constrainDateNumbers\uAC00 \uC790\uB3D9\uC73C\uB85C 0\uC744 \uCD94\uAC00\uD560 \uC218 \uC788\uC74C)\n const inputNumberCount = currentNumbers.length;\n\n // \uD3EC\uB9F7\uD305\uB41C \uBB38\uC790\uC5F4\uC5D0\uC11C \uD574\uB2F9 \uC22B\uC790 \uC704\uCE58 \uCC3E\uAE30\n let numberCount = 0;\n\n for (let i = 0; i < formattedValue.length; i++) {\n if (/\\d/.test(formattedValue[i])) {\n numberCount++;\n // \uC785\uB825\uB41C \uC22B\uC790 \uAC1C\uC218\uC640 \uC77C\uCE58\uD558\uB294 \uC704\uCE58 \uCC3E\uAE30\n if (numberCount === inputNumberCount) {\n cursorPos = i + 1;\n // \uB2E4\uC74C \uBB38\uC790\uAC00 \uAD6C\uBD84\uC790\uBA74 \uAC74\uB108\uB6F0\uAE30 (\uC608: \"2024-\"\uC5D0\uC11C \"-\" \uB4A4\uB85C)\n if (\n cursorPos < formattedValue.length &&\n formattedValue[cursorPos] === formatSep\n ) {\n cursorPos++;\n }\n break;\n }\n }\n }\n\n // \uC22B\uC790\uB97C \uCC3E\uC9C0 \uBABB\uD55C \uACBD\uC6B0 (\uC774\uB860\uC801\uC73C\uB85C \uBC1C\uC0DD\uD558\uC9C0 \uC54A\uC544\uC57C \uD568)\n if (numberCount < inputNumberCount) {\n cursorPos = formattedValue.length;\n }\n } else {\n // \uBC31\uC2A4\uD398\uC774\uC2A4\uC778 \uACBD\uC6B0: \uD604\uC7AC \uC22B\uC790 \uAC1C\uC218\uC5D0 \uB9DE\uAC8C \uC704\uCE58 \uACB0\uC815\n const targetNumberCount = currentNumbers.length;\n let numberCount = 0;\n\n for (let i = 0; i < formattedValue.length; i++) {\n if (/\\d/.test(formattedValue[i])) {\n numberCount++;\n if (numberCount === targetNumberCount) {\n cursorPos = i + 1;\n // \uB2E4\uC74C \uBB38\uC790\uAC00 \uAD6C\uBD84\uC790\uBA74 \uAC74\uB108\uB6F0\uAE30\n if (\n cursorPos < formattedValue.length &&\n formattedValue[cursorPos] === formatSep\n ) {\n cursorPos++;\n }\n break;\n }\n }\n }\n }\n\n input.setSelectionRange(cursorPos, cursorPos);\n }\n });\n\n performValidation(formattedValue);\n\n // onChange\uB85C \uC804\uB2EC\uD560 \uAC12\n const outputValue = buildOutputValue(formattedValue);\n\n // \uB514\uBC14\uC6B4\uC2A4 \uC801\uC6A9\n emitChange(e, outputValue);\n };\n\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const outputValue = buildOutputValue(displayValue);\n flushOnBlur(e, outputValue);\n if (onBlur) {\n onBlur(e);\n }\n };\n\n // \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD (\uC785\uB825\uD558\uBA74 \uCC98\uC74C\uBD80\uD130 \uC0C8\uB85C \uC785\uB825)\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (disabled || readonly) return;\n\n const input = e.target as HTMLInputElement;\n\n // \uAC12\uC774 \uC788\uC744 \uB54C \uC804\uCCB4 \uC120\uD0DD\n if (displayValue.length > 0) {\n requestAnimationFrame(() => {\n if (\n input &&\n typeof input.setSelectionRange === \"function\"\n ) {\n input.setSelectionRange(0, displayValue.length);\n }\n });\n }\n },\n [disabled, readonly, displayValue],\n );\n\n // \uD0A4 \uC785\uB825 \uC81C\uD55C \uD578\uB4E4\uB7EC (\uC5F0\uB3C4 \uCCAB \uC790\uB9AC 1, 2\uB9CC \uD5C8\uC6A9)\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n // \uC22B\uC790\uAC00 \uC544\uB2CC \uD0A4\uB294 \uD1B5\uACFC (\uBC31\uC2A4\uD398\uC774\uC2A4, \uD654\uC0B4\uD45C \uB4F1)\n if (!/^\\d$/.test(e.key)) return;\n\n const currentNumbers = displayValue.replace(/\\D/g, \"\");\n const numLen = currentNumbers.length;\n\n // YYYY-MM-DD \uD3EC\uB9F7: \uC5F0\uB3C4 \uCCAB \uC790\uB9AC (\uC22B\uC790 0\uBC88\uC9F8)\uB294 1 \uB610\uB294 2\uB9CC \uD5C8\uC6A9\n if (format.startsWith(\"YYYY\") && numLen === 0) {\n if (e.key !== \"1\" && e.key !== \"2\") {\n e.preventDefault();\n return;\n }\n }\n\n // MM-DD-YYYY \uD3EC\uB9F7: \uC5F0\uB3C4 \uCCAB \uC790\uB9AC (\uC22B\uC790 4\uBC88\uC9F8)\uB294 1 \uB610\uB294 2\uB9CC \uD5C8\uC6A9\n if (\n format.startsWith(\"MM\") &&\n format.endsWith(\"YYYY\") &&\n numLen === 4\n ) {\n if (e.key !== \"1\" && e.key !== \"2\") {\n e.preventDefault();\n return;\n }\n }\n\n // DD-MM-YYYY \uD3EC\uB9F7: \uC5F0\uB3C4 \uCCAB \uC790\uB9AC (\uC22B\uC790 4\uBC88\uC9F8)\uB294 1 \uB610\uB294 2\uB9CC \uD5C8\uC6A9\n if (\n format.startsWith(\"DD\") &&\n format.endsWith(\"YYYY\") &&\n numLen === 4\n ) {\n if (e.key !== \"1\" && e.key !== \"2\") {\n e.preventDefault();\n return;\n }\n }\n },\n [displayValue, format],\n );\n\n // \uB2EC\uB825\uC5D0\uC11C \uB0A0\uC9DC \uC120\uD0DD \uC2DC \uD578\uB4E4\uB7EC\n const handleCalendarSelect = (date: Date) => {\n const year = date.getFullYear();\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC758 \uACBD\uC6B0 internalYear\uC5D0 \uC800\uC7A5\n if (isYearlessFormat) {\n setInternalYear(year);\n }\n\n // \uD3EC\uB9F7\uC5D0 \uB9DE\uAC8C \uC22B\uC790 \uBB38\uC790\uC5F4 \uC0DD\uC131\n const numbers = dateToNumbers(date, format);\n\n // \uD604\uC7AC \uD3EC\uB9F7\uC5D0 \uB9DE\uAC8C \uBCC0\uD658\n const formattedValue = formatDate(numbers, format);\n\n setDisplayValue(formattedValue);\n setPrevNumbers(numbers);\n performValidation(formattedValue);\n\n // onChange \uD638\uCD9C - \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC774\uC5B4\uB3C4 \uC5F0\uB3C4 \uD3EC\uD568\n const outputValue = buildDateOutputValue(\n formattedValue,\n format,\n separator,\n year,\n );\n\n // \uB2EC\uB825 \uC120\uD0DD \uC2DC \uC989\uC2DC emit\n emitChange(null, outputValue, true);\n\n const activeElement = document.activeElement as HTMLElement | null;\n const inputRoot =\n internalInputRef.current?.closest(\".MuiInputBase-root\");\n\n if (activeElement && inputRoot?.contains(activeElement)) {\n activeElement.blur();\n }\n\n calendarCloseReasonRef.current = \"select\";\n };\n\n // \uB2EC\uB825 Popover \uC5F4\uAE30/\uB2EB\uAE30\n const handleOpenCalendar = () => {\n calendarCloseReasonRef.current = null;\n const inputEl = internalInputRef.current;\n if (inputEl) {\n const rect = inputEl.getBoundingClientRect();\n setCalendarAnchorPos({\n top: rect.bottom + window.scrollY,\n left: rect.left + window.scrollX,\n });\n }\n setCalendarOpen(true);\n onCalendarOpen?.();\n setTimeout(() => {\n const popperPaper = document.querySelector(\n '[data-custom-date-picker-popper=\"true\"]',\n ) as HTMLElement | null;\n popperPaper?.focus();\n }, 0);\n };\n\n const handleCloseCalendar = () => {\n const isSelectClose = calendarCloseReasonRef.current === \"select\";\n calendarCloseReasonRef.current = null;\n const activeElement = document.activeElement as HTMLElement | null;\n const inputRoot =\n internalInputRef.current?.closest(\".MuiInputBase-root\");\n\n if (activeElement && inputRoot?.contains(activeElement)) {\n activeElement.blur();\n }\n setCalendarOpen(false);\n onCalendarClose?.();\n if (!isSelectClose) {\n onCalendarDismiss?.();\n }\n };\n\n const isCalendarOpen = calendarOpen;\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uC2E4\uD328 \uC2DC \uD14C\uB450\uB9AC \uC2A4\uD0C0\uC77C\n const invalidStyles: SxProps<Theme> =\n isInvalid && invalidBorderColor\n ? {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": {\n borderColor: invalidBorderColor,\n },\n \"&:hover fieldset\": {\n borderColor: invalidBorderColor,\n },\n \"&.Mui-focused fieldset\": {\n borderColor: invalidBorderColor,\n },\n },\n \"& .MuiFilledInput-root\": {\n \"&:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:hover:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:after\": {\n borderBottomColor: invalidBorderColor,\n },\n },\n \"& .MuiInput-root\": {\n \"&:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:hover:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:after\": {\n borderBottomColor: invalidBorderColor,\n },\n },\n }\n : {};\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <>\n <TextField\n {...props}\n ref={ref}\n size={size}\n disabled={disabled}\n value={displayValue}\n label={label}\n placeholder={placeholder || formatToPlaceholder(format)}\n onChange={handleChange}\n onBlur={handleBlur}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n inputRef={internalInputRef}\n autoComplete=\"off\"\n spellCheck=\"false\"\n sx={{\n ...invalidStyles,\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n ...sx,\n }}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n readOnly: readonly,\n endAdornment:\n calendarIcon && !readonly ? (\n <InputAdornment\n position=\"end\"\n sx={{\n mr: size === \"small\" ? -0.5 : 0,\n }}\n >\n <IconButton\n onMouseDown={(e) => {\n e.preventDefault();\n }}\n onClick={handleOpenCalendar}\n edge=\"end\"\n size=\"small\"\n disabled={disabled}\n sx={{\n color: \"text.secondary\",\n opacity: 0.5,\n transition:\n \"opacity 0.2s, color 0.2s\",\n \"&:hover\": {\n opacity: 1,\n color: \"text.primary\",\n },\n \"&.Mui-disabled\": {\n opacity: 0.5,\n color: \"text.secondary\",\n },\n }}\n >\n <CalendarIcon\n size={\n size === \"small\" ? 16 : 18\n }\n />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n htmlInput: {\n ...slotProps?.htmlInput,\n maxLength: maxLength,\n inputMode: \"numeric\",\n },\n }}\n />\n {/* MUI \uC2A4\uD0C0\uC77C \uB2EC\uB825 */}\n <DatePicker\n open={isCalendarOpen}\n anchorEl={internalInputRef}\n onClose={handleCloseCalendar}\n anchorReference={\n calendarAnchorPos ? \"anchorPosition\" : \"anchorEl\"\n }\n anchorPosition={\n calendarAnchorPos\n ? {\n top: calendarAnchorPos.top,\n left: calendarAnchorPos.left,\n }\n : undefined\n }\n anchorOrigin={\n calendarAnchorOrigin || {\n vertical: \"bottom\",\n horizontal: \"left\",\n }\n }\n transformOrigin={\n calendarTransformOrigin || {\n vertical: \"top\",\n horizontal: \"left\",\n }\n }\n selectedDate={calendarSelectedDate}\n onDateChange={handleCalendarSelect}\n minDate={minDate}\n maxDate={maxDate}\n holidays={holidays}\n styles={{ selectedColor, holidayColor }}\n showToday={showToday}\n autoApply={true}\n showFooter={false}\n />\n </>\n );\n },\n);\n\nconst DateTextFieldWithForm = forwardRef<HTMLDivElement, DateTextFieldProps>(\n function DateTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"DateTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"DateTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <DateTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const DateTextField = forwardRef<HTMLDivElement, DateTextFieldProps>(\n function DateTextField(props, ref) {\n if (props.form) {\n return <DateTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <DateTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * utils/index.ts\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\n/** \uC8FC \uC815\uBCF4 \uD0C0\uC785 */\nexport interface WeekInfo {\n weekOfMonth: number; // \uD574\uB2F9 \uC6D4\uC758 \uBA87 \uBC88\uC9F8 \uC8FC (1-indexed)\n startDate: Date; // \uC8FC\uC758 \uC2DC\uC791\uC77C (\uC77C\uC694\uC77C)\n endDate: Date; // \uC8FC\uC758 \uC885\uB8CC\uC77C (\uD1A0\uC694\uC77C)\n}\n\n/**\n * \uC8FC \uC815\uBCF4 \uACC4\uC0B0 (\uD574\uB2F9 \uC6D4\uC758 \uBA87 \uBC88\uC9F8 \uC8FC, \uC8FC\uC758 \uC2DC\uC791\uC77C, \uC885\uB8CC\uC77C)\n * @param date - \uACC4\uC0B0\uD560 \uB0A0\uC9DC\n * @returns \uC8FC \uC815\uBCF4 \uAC1D\uCCB4\n */\nexport const getWeekInfo = (date: Date): WeekInfo => {\n const dayOfWeek = date.getDay(); // 0(\uC77C) ~ 6(\uD1A0)\n\n // \uD574\uB2F9 \uC8FC\uC758 \uC2DC\uC791\uC77C (\uC77C\uC694\uC77C)\n const startDate = new Date(date);\n startDate.setDate(date.getDate() - dayOfWeek);\n startDate.setHours(0, 0, 0, 0);\n\n // \uD574\uB2F9 \uC8FC\uC758 \uC885\uB8CC\uC77C (\uD1A0\uC694\uC77C)\n const endDate = new Date(date);\n endDate.setDate(date.getDate() + (6 - dayOfWeek));\n endDate.setHours(23, 59, 59, 999);\n\n // \uD574\uB2F9 \uC6D4\uC758 \uBA87 \uBC88\uC9F8 \uC8FC\uC778\uC9C0 \uACC4\uC0B0 (\uD574\uB2F9 \uC6D4 1\uC77C \uAE30\uC900)\n const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1);\n const firstDayOfWeek = firstDayOfMonth.getDay();\n const weekOfMonth = Math.ceil((date.getDate() + firstDayOfWeek) / 7);\n\n return { weekOfMonth, startDate, endDate };\n};\n\n/**\n * \uB450 \uB0A0\uC9DC\uAC00 \uAC19\uC740 \uC8FC\uC778\uC9C0 \uD655\uC778\n * @param date1 - \uCCAB \uBC88\uC9F8 \uB0A0\uC9DC\n * @param date2 - \uB450 \uBC88\uC9F8 \uB0A0\uC9DC\n * @returns \uAC19\uC740 \uC8FC\uC774\uBA74 true\n */\nexport const isSameWeek = (date1: Date, date2: Date): boolean => {\n const week1 = getWeekInfo(date1);\n const week2 = getWeekInfo(date2);\n return week1.startDate.getTime() === week2.startDate.getTime();\n};\n\n/**\n * \uB450 \uB0A0\uC9DC\uAC00 \uAC19\uC740 \uB0A0\uC778\uC9C0 \uD655\uC778\n * @param d1 - \uCCAB \uBC88\uC9F8 \uB0A0\uC9DC\n * @param d2 - \uB450 \uBC88\uC9F8 \uB0A0\uC9DC\n * @returns \uAC19\uC740 \uB0A0\uC774\uBA74 true\n */\nexport const isSameDay = (d1: Date | null, d2: Date | null): boolean => {\n if (!d1 || !d2) return false;\n return (\n d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate()\n );\n};\n", "/**\n * locale.ts\n * \uCE98\uB9B0\uB354 \uB85C\uCF00\uC77C \uC815\uC758\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\n/** \uCE98\uB9B0\uB354 \uB85C\uCF00\uC77C \uD0C0\uC785 (\uD14D\uC2A4\uD2B8 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5) */\nexport interface CalendarLocale {\n weekdays: [string, string, string, string, string, string, string]; // \uC694\uC77C (\uC77C~\uD1A0)\n months: [\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string\n ]; // \uC6D4 (1~12\uC6D4)\n today: string; // \uC624\uB298 \uBC84\uD2BC\n confirm: string; // \uD655\uC778 \uBC84\uD2BC\n cancel: string; // \uCDE8\uC18C \uBC84\uD2BC\n close: string; // \uB2EB\uAE30 \uBC84\uD2BC\n}\n\n/** \uCE98\uB9B0\uB354 \uD14D\uC2A4\uD2B8 \uD0C0\uC785 (\uBD80\uBD84 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC6A9) */\nexport type CalendarTexts = Partial<CalendarLocale>;\n\n/** \uD55C\uAD6D\uC5B4 \uB85C\uCF00\uC77C */\nexport const koLocale: CalendarLocale = {\n weekdays: [\"\uC77C\", \"\uC6D4\", \"\uD654\", \"\uC218\", \"\uBAA9\", \"\uAE08\", \"\uD1A0\"],\n months: [\n \"1\uC6D4\",\n \"2\uC6D4\",\n \"3\uC6D4\",\n \"4\uC6D4\",\n \"5\uC6D4\",\n \"6\uC6D4\",\n \"7\uC6D4\",\n \"8\uC6D4\",\n \"9\uC6D4\",\n \"10\uC6D4\",\n \"11\uC6D4\",\n \"12\uC6D4\",\n ],\n today: \"\uC624\uB298\",\n confirm: \"\uD655\uC778\",\n cancel: \"\uCDE8\uC18C\",\n close: \"\uB2EB\uAE30\",\n};\n\n/** \uC601\uC5B4 \uB85C\uCF00\uC77C */\nexport const enLocale: CalendarLocale = {\n weekdays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n today: \"Today\",\n confirm: \"OK\",\n cancel: \"Cancel\",\n close: \"Close\",\n};\n\n/** \uC77C\uBCF8\uC5B4 \uB85C\uCF00\uC77C */\nexport const jaLocale: CalendarLocale = {\n weekdays: [\"\u65E5\", \"\u6708\", \"\u706B\", \"\u6C34\", \"\u6728\", \"\u91D1\", \"\u571F\"],\n months: [\n \"1\u6708\",\n \"2\u6708\",\n \"3\u6708\",\n \"4\u6708\",\n \"5\u6708\",\n \"6\u6708\",\n \"7\u6708\",\n \"8\u6708\",\n \"9\u6708\",\n \"10\u6708\",\n \"11\u6708\",\n \"12\u6708\",\n ],\n today: \"\u4ECA\u65E5\",\n confirm: \"\u78BA\u8A8D\",\n cancel: \"\u30AD\u30E3\u30F3\u30BB\u30EB\",\n close: \"\u9589\u3058\u308B\",\n};\n\n/** \uC911\uAD6D\uC5B4 \uAC04\uCCB4 \uB85C\uCF00\uC77C */\nexport const zhCNLocale: CalendarLocale = {\n weekdays: [\"\u65E5\", \"\u4E00\", \"\u4E8C\", \"\u4E09\", \"\u56DB\", \"\u4E94\", \"\u516D\"],\n months: [\n \"1\u6708\",\n \"2\u6708\",\n \"3\u6708\",\n \"4\u6708\",\n \"5\u6708\",\n \"6\u6708\",\n \"7\u6708\",\n \"8\u6708\",\n \"9\u6708\",\n \"10\u6708\",\n \"11\u6708\",\n \"12\u6708\",\n ],\n today: \"\u4ECA\u5929\",\n confirm: \"\u786E\u8BA4\",\n cancel: \"\u53D6\u6D88\",\n close: \"\u5173\u95ED\",\n};\n\n/** \uC911\uAD6D\uC5B4 \uBC88\uCCB4 \uB85C\uCF00\uC77C */\nexport const zhTWLocale: CalendarLocale = {\n weekdays: [\"\u65E5\", \"\u4E00\", \"\u4E8C\", \"\u4E09\", \"\u56DB\", \"\u4E94\", \"\u516D\"],\n months: [\n \"1\u6708\",\n \"2\u6708\",\n \"3\u6708\",\n \"4\u6708\",\n \"5\u6708\",\n \"6\u6708\",\n \"7\u6708\",\n \"8\u6708\",\n \"9\u6708\",\n \"10\u6708\",\n \"11\u6708\",\n \"12\u6708\",\n ],\n today: \"\u4ECA\u5929\",\n confirm: \"\u78BA\u8A8D\",\n cancel: \"\u53D6\u6D88\",\n close: \"\u95DC\u9589\",\n};\n\n/** \uC2A4\uD398\uC778\uC5B4 \uB85C\uCF00\uC77C */\nexport const esLocale: CalendarLocale = {\n weekdays: [\"Dom\", \"Lun\", \"Mar\", \"Mi\u00E9\", \"Jue\", \"Vie\", \"S\u00E1b\"],\n months: [\n \"Ene\",\n \"Feb\",\n \"Mar\",\n \"Abr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Ago\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dic\",\n ],\n today: \"Hoy\",\n confirm: \"Aceptar\",\n cancel: \"Cancelar\",\n close: \"Cerrar\",\n};\n\n/** \uD504\uB791\uC2A4\uC5B4 \uB85C\uCF00\uC77C */\nexport const frLocale: CalendarLocale = {\n weekdays: [\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\"],\n months: [\n \"Jan\",\n \"F\u00E9v\",\n \"Mar\",\n \"Avr\",\n \"Mai\",\n \"Juin\",\n \"Juil\",\n \"Ao\u00FB\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"D\u00E9c\",\n ],\n today: \"Aujourd'hui\",\n confirm: \"OK\",\n cancel: \"Annuler\",\n close: \"Fermer\",\n};\n\n/** \uB3C5\uC77C\uC5B4 \uB85C\uCF00\uC77C */\nexport const deLocale: CalendarLocale = {\n weekdays: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n months: [\n \"Jan\",\n \"Feb\",\n \"M\u00E4r\",\n \"Apr\",\n \"Mai\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Okt\",\n \"Nov\",\n \"Dez\",\n ],\n today: \"Heute\",\n confirm: \"OK\",\n cancel: \"Abbrechen\",\n close: \"Schlie\u00DFen\",\n};\n\n/** \uD3EC\uB974\uD22C\uAC08\uC5B4 \uB85C\uCF00\uC77C */\nexport const ptLocale: CalendarLocale = {\n weekdays: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\u00E1b\"],\n months: [\n \"Jan\",\n \"Fev\",\n \"Mar\",\n \"Abr\",\n \"Mai\",\n \"Jun\",\n \"Jul\",\n \"Ago\",\n \"Set\",\n \"Out\",\n \"Nov\",\n \"Dez\",\n ],\n today: \"Hoje\",\n confirm: \"OK\",\n cancel: \"Cancelar\",\n close: \"Fechar\",\n};\n\n/** \uB7EC\uC2DC\uC544\uC5B4 \uB85C\uCF00\uC77C */\nexport const ruLocale: CalendarLocale = {\n weekdays: [\"\u0412\u0441\", \"\u041F\u043D\", \"\u0412\u0442\", \"\u0421\u0440\", \"\u0427\u0442\", \"\u041F\u0442\", \"\u0421\u0431\"],\n months: [\n \"\u042F\u043D\u0432\",\n \"\u0424\u0435\u0432\",\n \"\u041C\u0430\u0440\",\n \"\u0410\u043F\u0440\",\n \"\u041C\u0430\u0439\",\n \"\u0418\u044E\u043D\",\n \"\u0418\u044E\u043B\",\n \"\u0410\u0432\u0433\",\n \"\u0421\u0435\u043D\",\n \"\u041E\u043A\u0442\",\n \"\u041D\u043E\u044F\",\n \"\u0414\u0435\u043A\",\n ],\n today: \"\u0421\u0435\u0433\u043E\u0434\u043D\u044F\",\n confirm: \"\u041E\u041A\",\n cancel: \"\u041E\u0442\u043C\u0435\u043D\u0430\",\n close: \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C\",\n};\n\n/** \uC774\uD0C8\uB9AC\uC544\uC5B4 \uB85C\uCF00\uC77C */\nexport const itLocale: CalendarLocale = {\n weekdays: [\"Dom\", \"Lun\", \"Mar\", \"Mer\", \"Gio\", \"Ven\", \"Sab\"],\n months: [\n \"Gen\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"Mag\",\n \"Giu\",\n \"Lug\",\n \"Ago\",\n \"Set\",\n \"Ott\",\n \"Nov\",\n \"Dic\",\n ],\n today: \"Oggi\",\n confirm: \"OK\",\n cancel: \"Annulla\",\n close: \"Chiudi\",\n};\n\n/** \uC544\uB78D\uC5B4 \uB85C\uCF00\uC77C */\nexport const arLocale: CalendarLocale = {\n weekdays: [\"\u0623\u062D\u062F\", \"\u0625\u062B\u0646\", \"\u062B\u0644\u0627\", \"\u0623\u0631\u0628\", \"\u062E\u0645\u064A\", \"\u062C\u0645\u0639\", \"\u0633\u0628\u062A\"],\n months: [\n \"\u064A\u0646\u0627\u064A\u0631\",\n \"\u0641\u0628\u0631\u0627\u064A\u0631\",\n \"\u0645\u0627\u0631\u0633\",\n \"\u0623\u0628\u0631\u064A\u0644\",\n \"\u0645\u0627\u064A\u0648\",\n \"\u064A\u0648\u0646\u064A\u0648\",\n \"\u064A\u0648\u0644\u064A\u0648\",\n \"\u0623\u063A\u0633\u0637\u0633\",\n \"\u0633\u0628\u062A\u0645\u0628\u0631\",\n \"\u0623\u0643\u062A\u0648\u0628\u0631\",\n \"\u0646\u0648\u0641\u0645\u0628\u0631\",\n \"\u062F\u064A\u0633\u0645\u0628\u0631\",\n ],\n today: \"\u0627\u0644\u064A\u0648\u0645\",\n confirm: \"\u0645\u0648\u0627\u0641\u0642\",\n cancel: \"\u0625\u0644\u063A\u0627\u0621\",\n close: \"\u0625\u063A\u0644\u0627\u0642\",\n};\n\n/** \uD78C\uB514\uC5B4 \uB85C\uCF00\uC77C */\nexport const hiLocale: CalendarLocale = {\n weekdays: [\"\u0930\u0935\u093F\", \"\u0938\u094B\u092E\", \"\u092E\u0902\u0917\u0932\", \"\u092C\u0941\u0927\", \"\u0917\u0941\u0930\u0941\", \"\u0936\u0941\u0915\u094D\u0930\", \"\u0936\u0928\u093F\"],\n months: [\n \"\u091C\u0928\",\n \"\u092B\u0930\",\n \"\u092E\u093E\u0930\u094D\u091A\",\n \"\u0905\u092A\u094D\u0930\u0948\",\n \"\u092E\u0908\",\n \"\u091C\u0942\u0928\",\n \"\u091C\u0941\u0932\u093E\",\n \"\u0905\u0917\",\n \"\u0938\u093F\u0924\",\n \"\u0905\u0915\u094D\u091F\u0942\",\n \"\u0928\u0935\",\n \"\u0926\u093F\u0938\",\n ],\n today: \"\u0906\u091C\",\n confirm: \"\u0920\u0940\u0915\",\n cancel: \"\u0930\u0926\u094D\u0926\",\n close: \"\u092C\u0902\u0926\",\n};\n\n/** \uBCA0\uD2B8\uB0A8\uC5B4 \uB85C\uCF00\uC77C */\nexport const viLocale: CalendarLocale = {\n weekdays: [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"],\n months: [\n \"Th1\",\n \"Th2\",\n \"Th3\",\n \"Th4\",\n \"Th5\",\n \"Th6\",\n \"Th7\",\n \"Th8\",\n \"Th9\",\n \"Th10\",\n \"Th11\",\n \"Th12\",\n ],\n today: \"H\u00F4m nay\",\n confirm: \"OK\",\n cancel: \"H\u1EE7y\",\n close: \"\u0110\u00F3ng\",\n};\n\n/** \uD0DC\uAD6D\uC5B4 \uB85C\uCF00\uC77C */\nexport const thLocale: CalendarLocale = {\n weekdays: [\"\u0E2D\u0E32\", \"\u0E08\", \"\u0E2D\", \"\u0E1E\", \"\u0E1E\u0E24\", \"\u0E28\", \"\u0E2A\"],\n months: [\n \"\u0E21.\u0E04.\",\n \"\u0E01.\u0E1E.\",\n \"\u0E21\u0E35.\u0E04.\",\n \"\u0E40\u0E21.\u0E22.\",\n \"\u0E1E.\u0E04.\",\n \"\u0E21\u0E34.\u0E22.\",\n \"\u0E01.\u0E04.\",\n \"\u0E2A.\u0E04.\",\n \"\u0E01.\u0E22.\",\n \"\u0E15.\u0E04.\",\n \"\u0E1E.\u0E22.\",\n \"\u0E18.\u0E04.\",\n ],\n today: \"\u0E27\u0E31\u0E19\u0E19\u0E35\u0E49\",\n confirm: \"\u0E15\u0E01\u0E25\u0E07\",\n cancel: \"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\",\n close: \"\u0E1B\u0E34\u0E14\",\n};\n\n/** \uC778\uB3C4\uB124\uC2DC\uC544\uC5B4 \uB85C\uCF00\uC77C */\nexport const idLocale: CalendarLocale = {\n weekdays: [\"Min\", \"Sen\", \"Sel\", \"Rab\", \"Kam\", \"Jum\", \"Sab\"],\n months: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"Mei\",\n \"Jun\",\n \"Jul\",\n \"Agu\",\n \"Sep\",\n \"Okt\",\n \"Nov\",\n \"Des\",\n ],\n today: \"Hari ini\",\n confirm: \"OK\",\n cancel: \"Batal\",\n close: \"Tutup\",\n};\n\n/** \uB124\uB35C\uB780\uB4DC\uC5B4 \uB85C\uCF00\uC77C */\nexport const nlLocale: CalendarLocale = {\n weekdays: [\"Zo\", \"Ma\", \"Di\", \"Wo\", \"Do\", \"Vr\", \"Za\"],\n months: [\n \"Jan\",\n \"Feb\",\n \"Mrt\",\n \"Apr\",\n \"Mei\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Okt\",\n \"Nov\",\n \"Dec\",\n ],\n today: \"Vandaag\",\n confirm: \"OK\",\n cancel: \"Annuleren\",\n close: \"Sluiten\",\n};\n\n/** \uD3F4\uB780\uB4DC\uC5B4 \uB85C\uCF00\uC77C */\nexport const plLocale: CalendarLocale = {\n weekdays: [\"Nd\", \"Pn\", \"Wt\", \"\u015Ar\", \"Cz\", \"Pt\", \"So\"],\n months: [\n \"Sty\",\n \"Lut\",\n \"Mar\",\n \"Kwi\",\n \"Maj\",\n \"Cze\",\n \"Lip\",\n \"Sie\",\n \"Wrz\",\n \"Pa\u017A\",\n \"Lis\",\n \"Gru\",\n ],\n today: \"Dzi\u015B\",\n confirm: \"OK\",\n cancel: \"Anuluj\",\n close: \"Zamknij\",\n};\n\n/** \uD130\uD0A4\uC5B4 \uB85C\uCF00\uC77C */\nexport const trLocale: CalendarLocale = {\n weekdays: [\"Paz\", \"Pzt\", \"Sal\", \"\u00C7ar\", \"Per\", \"Cum\", \"Cmt\"],\n months: [\n \"Oca\",\n \"\u015Eub\",\n \"Mar\",\n \"Nis\",\n \"May\",\n \"Haz\",\n \"Tem\",\n \"A\u011Fu\",\n \"Eyl\",\n \"Eki\",\n \"Kas\",\n \"Ara\",\n ],\n today: \"Bug\u00FCn\",\n confirm: \"Tamam\",\n cancel: \"\u0130ptal\",\n close: \"Kapat\",\n};\n\n/** \uAE30\uBCF8 \uB85C\uCF00\uC77C (\uD55C\uAD6D\uC5B4) */\nexport const defaultLocale = koLocale;\n\n/** \uB85C\uCF00\uC77C \uB9F5 */\nexport const locales = {\n ko: koLocale,\n en: enLocale,\n ja: jaLocale,\n zhCN: zhCNLocale,\n zhTW: zhTWLocale,\n es: esLocale,\n fr: frLocale,\n de: deLocale,\n pt: ptLocale,\n ru: ruLocale,\n it: itLocale,\n ar: arLocale,\n hi: hiLocale,\n vi: viLocale,\n th: thLocale,\n id: idLocale,\n nl: nlLocale,\n pl: plLocale,\n tr: trLocale,\n} as const;\n\n/** \uB85C\uCF00\uC77C \uD0A4 \uD0C0\uC785 */\nexport type LocaleKey = keyof typeof locales;\n\n/** \uB85C\uCF00\uC77C \uD504\uB86D \uD0C0\uC785 (\uAC1D\uCCB4 \uB610\uB294 \uBB38\uC790\uC5F4) */\nexport type LocaleProp = CalendarLocale | LocaleKey;\n\n/**\n * \uB85C\uCF00\uC77C \uD504\uB86D\uC744 CalendarLocale \uAC1D\uCCB4\uB85C \uBCC0\uD658\n * @param locale - CalendarLocale \uAC1D\uCCB4 \uB610\uB294 \uB85C\uCF00\uC77C \uD0A4 \uBB38\uC790\uC5F4 (\uC608: 'ko', 'en')\n * @returns CalendarLocale \uAC1D\uCCB4\n */\nexport function resolveLocale(locale: LocaleProp | undefined): CalendarLocale {\n if (!locale) return defaultLocale;\n if (typeof locale === \"string\") {\n return locales[locale] ?? defaultLocale;\n }\n return locale;\n}\n", "/**\n * SimpleCalendar.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useMemo,\n useEffect,\n useRef,\n useCallback,\n} from \"react\";\nimport { Box, Typography, IconButton, Button } from \"@mui/material\";\nimport { ChevronLeft, ChevronRight } from \"./icons\";\nimport { OverlayScrollbar } from \"@ehfuse/overlay-scrollbar\";\nimport type { OverlayScrollbarRef } from \"@ehfuse/overlay-scrollbar\";\nimport { TimeSelector } from \"./TimeSelector\";\nimport type { SimpleCalendarProps, ViewMode } from \"./types\";\nimport { resolveLocale } from \"./locale\";\nimport { getWeekInfo, isSameDay, isSameWeek } from \"./utils\";\n\n// \uC0C1\uC218\nconst HEADER_HEIGHT = 48;\nconst FOOTER_HEIGHT = 48;\n\n/**\n * \uAC04\uB2E8\uD55C MUI \uC2A4\uD0C0\uC77C \uB2EC\uB825 \uCEF4\uD3EC\uB10C\uD2B8\n *\n * \uAD6C\uC870:\n * calendar-root (flex column, 100% height)\n * \u251C\u2500\u2500 calendar-header (\uACF5\uD1B5, \uACE0\uC815 \uB192\uC774 40px)\n * \u2502 - viewMode\uC5D0 \uB530\uB77C \uB0B4\uC6A9 \uBCC0\uACBD\n * \u251C\u2500\u2500 calendar-content (flex: 1)\n * \u2502 - [calendar] \uC694\uC77C \uD5E4\uB354 + \uB0A0\uC9DC \uADF8\uB9AC\uB4DC\n * \u2502 - [year] \uC5F0\uB3C4 \uADF8\uB9AC\uB4DC (OverlayScrollbar)\n * \u2502 - [month] \uC6D4 \uADF8\uB9AC\uB4DC\n * \u2514\u2500\u2500 calendar-footer (\uACF5\uD1B5, \uACE0\uC815 \uB192\uC774 40px)\n * - viewMode\uC5D0 \uB530\uB77C \uBC84\uD2BC \uBCC0\uACBD\n */\nexport function SimpleCalendar({\n selectedDate,\n onSelect,\n minDate,\n maxDate,\n holidays = [],\n styles,\n onClose,\n showToday = true,\n showFooter: showFooterProp = true,\n autoApply = false,\n // \uB144\uC6D4\uB9CC \uC120\uD0DD\n monthOnly = false,\n // \uB144\uB3C4\uB9CC \uC120\uD0DD\n yearOnly = false,\n // \uB144\uC6D4/\uB144\uB3C4 \uBCC0\uACBD \uCF5C\uBC31\n onMonthChange,\n onYearChange,\n onWeekChange,\n // \uC2DC\uAC04 \uC120\uD0DD \uAD00\uB828\n showTimePicker = false,\n timeValue,\n onTimeChange,\n timeFormat = \"HH:mm\",\n minTime,\n maxTime,\n minuteStep = 1,\n secondStep = 1,\n hideDisabledTime = false,\n // \uB85C\uCF00\uC77C \uAD00\uB828\n locale,\n texts,\n}: SimpleCalendarProps) {\n // \uC2A4\uD0C0\uC77C \uC635\uC158 \uCD94\uCD9C (\uAE30\uBCF8\uAC12 \uC801\uC6A9)\n const selectedColor = styles?.selectedColor ?? \"primary.main\";\n const todayBorderColor = styles?.todayBorderColor ?? selectedColor;\n const holidayColor = styles?.holidayColor ?? \"error.main\";\n const saturdayColor = styles?.saturdayColor ?? \"primary.main\";\n\n // \uB85C\uCF00\uC77C \uD574\uC11D \uBC0F \uBCD1\uD569 (texts\uAC00 \uC788\uC73C\uBA74 \uBD80\uBD84 \uB36E\uC5B4\uC4F0\uAE30)\n const resolvedLocale = resolveLocale(locale);\n const mergedLocale = useMemo(\n () => (texts ? { ...resolvedLocale, ...texts } : resolvedLocale),\n [resolvedLocale, texts],\n );\n\n // \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 Date \uD544\uD130\uB9C1\n const validHolidays = useMemo(\n () => holidays.filter((d) => d instanceof Date && !isNaN(d.getTime())),\n [holidays],\n );\n\n const today = new Date();\n const [viewDate, setViewDate] = useState(() => {\n if (selectedDate) return new Date(selectedDate);\n return new Date(today.getFullYear(), today.getMonth(), 1);\n });\n // yearOnly\uC77C \uB54C\uB294 year \uBDF0\uB85C, monthOnly\uC77C \uB54C\uB294 month \uBDF0\uB85C \uC2DC\uC791\n const [viewMode, setViewMode] = useState<ViewMode>(\n yearOnly ? \"year\" : monthOnly ? \"month\" : \"calendar\",\n );\n const [tempYear, setTempYear] = useState<number>(viewDate.getFullYear());\n // monthOnly \uBAA8\uB4DC\uC5D0\uC11C \uC784\uC2DC \uC6D4 \uC0C1\uD0DC (autoApply\uAC00 false\uC77C \uB54C \uC0AC\uC6A9)\n const [tempMonth, setTempMonth] = useState<number | null>(null);\n // yearOnly \uBAA8\uB4DC\uC5D0\uC11C \uC784\uC2DC \uB144\uB3C4 \uC0C1\uD0DC (autoApply\uAC00 false\uC77C \uB54C \uC0AC\uC6A9)\n const [tempSelectedYear, setTempSelectedYear] = useState<number | null>(\n null,\n );\n // \uC784\uC2DC \uC120\uD0DD \uB0A0\uC9DC (\uD655\uC778 \uBC84\uD2BC \uB204\uB974\uAE30 \uC804\uAE4C\uC9C0 \uBCF4\uAD00)\n const [tempSelectedDate, setTempSelectedDate] = useState<Date | null>(\n selectedDate,\n );\n // \uC784\uC2DC \uC2DC\uAC04 (\uD655\uC778 \uBC84\uD2BC \uB204\uB974\uAE30 \uC804\uAE4C\uC9C0 \uBCF4\uAD00)\n const [tempTime, setTempTime] = useState<{\n hour: number;\n minute: number;\n second: number;\n }>(() => {\n const h = timeValue ? parseInt(timeValue.hour, 10) : NaN;\n const m = timeValue ? parseInt(timeValue.minute, 10) : NaN;\n const s = timeValue?.second ? parseInt(timeValue.second, 10) : 0;\n const now = new Date();\n return {\n hour: isNaN(h) ? now.getHours() : h,\n minute: isNaN(m)\n ? Math.floor(now.getMinutes() / minuteStep) * minuteStep\n : m,\n second: isNaN(s)\n ? Math.floor(now.getSeconds() / secondStep) * secondStep\n : s,\n };\n });\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n // refs\n const yearScrollRef = useRef<OverlayScrollbarRef>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // \uB2EC\uB825 \uB0A0\uC9DC \uC0DD\uC131 (\uD56D\uC0C1 42\uCE78 = 6\uC8FC, \uC774\uC804/\uB2E4\uC74C \uB2EC \uD3EC\uD568)\n const calendarDays = useMemo(() => {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const startPadding = firstDay.getDay();\n const daysInMonth = lastDay.getDate();\n\n const days: Date[] = [];\n\n // \uC774\uC804 \uB2EC \uB0A0\uC9DC\n const prevMonth = new Date(year, month, 0); // \uC774\uC804 \uB2EC \uB9C8\uC9C0\uB9C9 \uB0A0\n const prevMonthDays = prevMonth.getDate();\n for (let i = startPadding - 1; i >= 0; i--) {\n days.push(new Date(year, month - 1, prevMonthDays - i));\n }\n\n // \uD604\uC7AC \uB2EC\n for (let d = 1; d <= daysInMonth; d++) {\n days.push(new Date(year, month, d));\n }\n\n // \uB2E4\uC74C \uB2EC \uB0A0\uC9DC (42\uCE78 \uCC44\uC6B0\uAE30)\n let nextDay = 1;\n while (days.length < 42) {\n days.push(new Date(year, month + 1, nextDay++));\n }\n\n return days;\n }, [year, month]);\n\n // \uC5F0\uB3C4 \uBAA9\uB85D \uC0DD\uC131 (\uACFC\uAC70 50\uB144 ~ \uBBF8\uB798 50\uB144)\n const yearList = useMemo(() => {\n const currentYear = today.getFullYear();\n const years: number[] = [];\n for (let y = currentYear - 50; y <= currentYear + 50; y++) {\n years.push(y);\n }\n return years;\n }, [today]);\n\n const isDateDisabled = (date: Date): boolean => {\n const dateOnly = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n );\n\n if (minDate) {\n const min = new Date(\n minDate.getFullYear(),\n minDate.getMonth(),\n minDate.getDate(),\n );\n if (dateOnly.getTime() < min.getTime()) return true;\n }\n if (maxDate) {\n const max = new Date(\n maxDate.getFullYear(),\n maxDate.getMonth(),\n maxDate.getDate(),\n );\n if (dateOnly.getTime() > max.getTime()) return true;\n }\n return false;\n };\n\n // \uC2DC\uAC04\uC774 \uBCC0\uACBD\uB418\uC5C8\uB294\uC9C0 \uD655\uC778\n const isTimeChanged = (\n hour: number,\n minute: number,\n second?: number,\n ): boolean => {\n if (!timeValue) return true;\n const hasSeconds =\n timeFormat === \"HH:mm:ss\" || timeFormat === \"hh:mm:ss\";\n if (\n parseInt(timeValue.hour, 10) !== hour ||\n parseInt(timeValue.minute, 10) !== minute\n )\n return true;\n if (hasSeconds && parseInt(timeValue.second || \"0\", 10) !== second)\n return true;\n return false;\n };\n\n // \uB144\uB3C4\uAC00 \uBCC0\uACBD\uB418\uC5C8\uB294\uC9C0 \uD655\uC778 (selectedDate \uB610\uB294 \uC624\uB298 \uB0A0\uC9DC \uAE30\uC900)\n const isYearChanged = (newYear: number): boolean => {\n const compareDate = selectedDate || today;\n return compareDate.getFullYear() !== newYear;\n };\n\n // \uC6D4\uC774 \uBCC0\uACBD\uB418\uC5C8\uB294\uC9C0 \uD655\uC778 (selectedDate \uB610\uB294 \uC624\uB298 \uB0A0\uC9DC \uAE30\uC900, month\uB294 1-indexed)\n const isMonthChanged = (newYear: number, newMonth: number): boolean => {\n const compareDate = selectedDate || today;\n return (\n compareDate.getFullYear() !== newYear ||\n compareDate.getMonth() + 1 !== newMonth\n );\n };\n\n // \uC8FC\uAC00 \uBCC0\uACBD\uB418\uC5C8\uB294\uC9C0 \uD655\uC778\n const isWeekChanged = (date: Date): boolean => {\n const compareDate = selectedDate || today;\n return !isSameWeek(date, compareDate);\n };\n\n const goToPrevMonth = () => {\n const newDate = new Date(year, month - 1, 1);\n setViewDate(newDate);\n setTempSelectedDate(null);\n // \uC6D4 \uBCC0\uACBD \uCF5C\uBC31 \uD638\uCD9C\n onMonthChange?.(newDate.getFullYear(), newDate.getMonth() + 1);\n };\n\n const goToNextMonth = () => {\n const newDate = new Date(year, month + 1, 1);\n setViewDate(newDate);\n setTempSelectedDate(null);\n // \uC6D4 \uBCC0\uACBD \uCF5C\uBC31 \uD638\uCD9C\n onMonthChange?.(newDate.getFullYear(), newDate.getMonth() + 1);\n };\n\n // \uD720 \uC774\uBCA4\uD2B8\uB85C \uC774\uC804/\uB2E4\uC74C \uB2EC \uC774\uB3D9\n const handleWheel = useCallback(\n (e: React.WheelEvent) => {\n if (viewMode !== \"calendar\") return;\n e.preventDefault();\n if (e.deltaY > 0) {\n goToNextMonth();\n } else if (e.deltaY < 0) {\n goToPrevMonth();\n }\n },\n [viewMode, year, month],\n );\n\n const handleDateClick = (date: Date) => {\n if (!isDateDisabled(date)) {\n if (autoApply) {\n // autoApply\uAC00 true\uBA74 \uBC14\uB85C \uC801\uC6A9 (\uB2EB\uC9C0 \uC54A\uC74C)\n // \uB0A0\uC9DC\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n if (!isSameDay(selectedDate, date)) {\n onSelect(date);\n // \uC8FC \uBCC0\uACBD \uCF5C\uBC31 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (isWeekChanged(date)) {\n const weekInfo = getWeekInfo(date);\n onWeekChange?.(\n weekInfo.weekOfMonth,\n weekInfo.startDate,\n weekInfo.endDate,\n );\n }\n }\n // \uC2DC\uAC04 \uC120\uD0DD\uC774 \uC788\uC73C\uBA74 \uC2DC\uAC04\uB3C4 \uAC19\uC774 \uC801\uC6A9 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (\n showTimePicker &&\n onTimeChange &&\n isTimeChanged(\n tempTime.hour,\n tempTime.minute,\n tempTime.second,\n )\n ) {\n const hasSeconds =\n timeFormat === \"HH:mm:ss\" || timeFormat === \"hh:mm:ss\";\n onTimeChange(\n tempTime.hour,\n tempTime.minute,\n hasSeconds ? tempTime.second : undefined,\n );\n }\n } else {\n setTempSelectedDate(date);\n }\n }\n };\n\n const handleTodayClick = () => {\n if (!isDateDisabled(today)) {\n const todayYear = today.getFullYear();\n const todayMonth = today.getMonth();\n\n if (autoApply) {\n // autoApply\uAC00 true\uBA74 \uBC14\uB85C \uC801\uC6A9 (\uB2EB\uC9C0 \uC54A\uC74C)\n // \uD604\uC7AC viewDate\uC640 \uBE44\uAD50\uD574\uC11C \uB144/\uC6D4 \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n if (year !== todayYear) {\n onYearChange?.(todayYear);\n }\n if (year !== todayYear || month !== todayMonth) {\n onMonthChange?.(todayYear, todayMonth + 1);\n }\n // \uB0A0\uC9DC\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC onSelect \uBC1C\uC0DD\n if (!isSameDay(selectedDate, today)) {\n onSelect(today);\n }\n // \uC2DC\uAC04 \uC120\uD0DD\uC774 \uC788\uC73C\uBA74 \uC2DC\uAC04\uB3C4 \uAC19\uC774 \uC801\uC6A9 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (\n showTimePicker &&\n onTimeChange &&\n isTimeChanged(\n tempTime.hour,\n tempTime.minute,\n tempTime.second,\n )\n ) {\n const hasSeconds =\n timeFormat === \"HH:mm:ss\" || timeFormat === \"hh:mm:ss\";\n onTimeChange(\n tempTime.hour,\n tempTime.minute,\n hasSeconds ? tempTime.second : undefined,\n );\n }\n setViewDate(new Date(todayYear, todayMonth, 1));\n } else {\n setTempSelectedDate(today);\n setViewDate(new Date(todayYear, todayMonth, 1));\n }\n }\n };\n\n const handleConfirm = () => {\n if (tempSelectedDate) {\n // \uB0A0\uC9DC\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n if (!isSameDay(selectedDate, tempSelectedDate)) {\n onSelect(tempSelectedDate);\n // \uC8FC \uBCC0\uACBD \uCF5C\uBC31 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (isWeekChanged(tempSelectedDate)) {\n const weekInfo = getWeekInfo(tempSelectedDate);\n onWeekChange?.(\n weekInfo.weekOfMonth,\n weekInfo.startDate,\n weekInfo.endDate,\n );\n }\n }\n }\n // \uC2DC\uAC04 \uC120\uD0DD\uC774 \uC788\uC73C\uBA74 \uC2DC\uAC04\uB3C4 \uC801\uC6A9 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (\n showTimePicker &&\n onTimeChange &&\n isTimeChanged(tempTime.hour, tempTime.minute, tempTime.second)\n ) {\n const hasSeconds =\n timeFormat === \"HH:mm:ss\" || timeFormat === \"hh:mm:ss\";\n onTimeChange(\n tempTime.hour,\n tempTime.minute,\n hasSeconds ? tempTime.second : undefined,\n );\n }\n onClose();\n };\n\n // \uC784\uC2DC \uC2DC\uAC04 \uBCC0\uACBD \uD578\uB4E4\uB7EC\n const handleTempTimeChange = (\n hour: number,\n minute: number,\n second?: number,\n ) => {\n setTempTime({\n hour,\n minute,\n second: second ?? 0,\n });\n\n // autoApply\uBA74 \uBC14\uB85C \uC801\uC6A9 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (autoApply && onTimeChange && isTimeChanged(hour, minute, second)) {\n const hasSeconds =\n timeFormat === \"HH:mm:ss\" || timeFormat === \"hh:mm:ss\";\n onTimeChange(hour, minute, hasSeconds ? second : undefined);\n }\n };\n\n // \uB144\uC6D4 \uD0C0\uC774\uD2C0 \uD074\uB9AD \u2192 \uC5F0\uB3C4 \uC120\uD0DD \uBAA8\uB4DC\n const handleTitleClick = () => {\n setTempYear(year);\n setViewMode(\"year\");\n };\n\n // \uC5F0\uB3C4 \uC120\uD0DD\n const handleYearSelect = (selectedYear: number) => {\n if (yearOnly) {\n if (autoApply) {\n // autoApply\uAC00 true\uBA74 \uBC14\uB85C \uC801\uC6A9\uD558\uACE0 \uB2EB\uAE30 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (isYearChanged(selectedYear)) {\n onYearChange?.(selectedYear);\n }\n onClose();\n } else {\n // autoApply\uAC00 false\uBA74 \uC784\uC2DC \uC800\uC7A5\uB9CC\n setTempSelectedYear(selectedYear);\n }\n } else if (monthOnly) {\n // monthOnly \uBAA8\uB4DC: \uC6D4\uAE4C\uC9C0 \uC120\uD0DD\uD574\uC57C \uCD5C\uC885\uC774\uBBC0\uB85C \uB144\uB3C4 \uC120\uD0DD \uC2DC\uC5D0\uB294 \uC774\uBCA4\uD2B8 \uBC1C\uC0DD \uC548\uD568\n setTempYear(selectedYear);\n setViewMode(\"month\");\n } else {\n // \uC77C\uBC18 \uCE98\uB9B0\uB354 \uBAA8\uB4DC: \uB144\uB3C4 \uC120\uD0DD \uC2DC onYearChange \uD638\uCD9C (\uD604\uC7AC viewDate \uAE30\uC900)\n if (year !== selectedYear) {\n onYearChange?.(selectedYear);\n }\n setTempYear(selectedYear);\n setViewMode(\"month\");\n }\n };\n\n // yearOnly \uBAA8\uB4DC\uC5D0\uC11C \uD655\uC778 \uBC84\uD2BC \uD074\uB9AD\n const handleYearConfirm = () => {\n if (tempSelectedYear !== null) {\n // \uB144\uB3C4\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n if (isYearChanged(tempSelectedYear)) {\n onYearChange?.(tempSelectedYear);\n }\n }\n onClose();\n };\n\n // \uC6D4 \uC120\uD0DD\n const handleMonthSelect = (selectedMonth: number) => {\n if (monthOnly) {\n if (autoApply) {\n // autoApply\uAC00 true\uBA74 \uBC14\uB85C \uC801\uC6A9\uD558\uACE0 \uB2EB\uAE30 (\uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (isYearChanged(tempYear)) {\n onYearChange?.(tempYear);\n }\n if (isMonthChanged(tempYear, selectedMonth + 1)) {\n onMonthChange?.(tempYear, selectedMonth + 1);\n }\n onClose();\n } else {\n // autoApply\uAC00 false\uBA74 \uC784\uC2DC \uC800\uC7A5\uB9CC\n setTempMonth(selectedMonth);\n }\n } else {\n // \uC77C\uBC18 \uCE98\uB9B0\uB354 \uBAA8\uB4DC: \uB144/\uC6D4 \uC120\uD0DD \uBDF0\uC5D0\uC11C \uC6D4\uC744 \uC120\uD0DD\uD558\uBA74 \uD574\uB2F9 \uC6D4\uB85C \uC774\uB3D9\n const newDate = new Date(tempYear, selectedMonth, 1);\n // \uC6D4 \uBCC0\uACBD \uCF5C\uBC31 \uD638\uCD9C (\uD604\uC7AC viewDate \uAE30\uC900\uC73C\uB85C \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (year !== tempYear || month !== selectedMonth) {\n onMonthChange?.(tempYear, selectedMonth + 1);\n }\n setViewDate(newDate);\n setViewMode(\"calendar\");\n setTempSelectedDate(null);\n }\n };\n\n // monthOnly \uBAA8\uB4DC\uC5D0\uC11C \uD655\uC778 \uBC84\uD2BC \uD074\uB9AD\n const handleMonthConfirm = () => {\n if (tempMonth !== null) {\n // \uB144\uC6D4\uC774 \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n if (isYearChanged(tempYear)) {\n onYearChange?.(tempYear);\n }\n if (isMonthChanged(tempYear, tempMonth + 1)) {\n onMonthChange?.(tempYear, tempMonth + 1);\n }\n }\n onClose();\n };\n\n // \uC5F0\uB3C4 \uC120\uD0DD \uBDF0\uAC00 \uC5F4\uB9B4 \uB54C \uD604\uC7AC\uB144\uB3C4\uB97C \uC911\uC559\uC5D0 \uC704\uCE58\n useEffect(() => {\n if (\n viewMode === \"year\" &&\n yearScrollRef.current &&\n contentRef.current\n ) {\n // DOM\uC774 \uB80C\uB354\uB9C1\uB41C \uD6C4 \uC2E4\uC81C \uB192\uC774\uB97C \uACC4\uC0B0\n requestAnimationFrame(() => {\n if (!yearScrollRef.current || !contentRef.current) return;\n\n const currentYear = today.getFullYear();\n const yearIndex = yearList.findIndex((y) => y === currentYear);\n if (yearIndex < 0) return;\n\n // \uC2E4\uC81C \uADF8\uB9AC\uB4DC \uC694\uC18C \uCC3E\uAE30\n const scrollContainer = contentRef.current.querySelector(\n \".overlay-scrollbar-content\",\n ) as HTMLElement;\n const gridElement = scrollContainer?.querySelector(\n \"[class*='MuiBox-root']\",\n ) as HTMLElement;\n\n if (!gridElement) return;\n\n // \uCCAB \uBC88\uC9F8 \uC5F0\uB3C4 \uC544\uC774\uD15C\uC758 \uC2E4\uC81C \uB192\uC774 \uAC00\uC838\uC624\uAE30\n const firstYearItem = gridElement.children[0] as HTMLElement;\n if (!firstYearItem) return;\n\n const itemHeight = firstYearItem.offsetHeight;\n const gap = 4; // gap: 0.5 = 4px\n const rowHeight = itemHeight + gap;\n\n const rowIndex = Math.floor(yearIndex / 4);\n const containerHeight = contentRef.current.clientHeight;\n const visibleRows = Math.floor(containerHeight / rowHeight);\n const centerRowOffset = Math.floor(visibleRows / 2);\n\n const scrollTop = (rowIndex - centerRowOffset) * rowHeight;\n yearScrollRef.current.scrollTo({\n top: Math.max(0, scrollTop),\n });\n });\n }\n }, [viewMode, yearList, today]);\n\n // \uD5E4\uB354 \uB80C\uB354\uB9C1 (viewMode\uC5D0 \uB530\uB77C \uB2E4\uB984)\n const renderHeader = () => {\n if (viewMode === \"year\") {\n // monthOnly \uB610\uB294 yearOnly \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uB4A4\uB85C \uAC08 \uACF3\uC774 \uC5C6\uC73C\uBBC0\uB85C < \uBC84\uD2BC \uC228\uAE40\n if (monthOnly || yearOnly) {\n return (\n <Typography variant=\"body2\" fontWeight={600}>\n \uC5F0\uB3C4 \uC120\uD0DD\n </Typography>\n );\n }\n // \uC77C\uBC18 \uCE98\uB9B0\uB354\uC5D0\uC11C \uB144\uB3C4 \uC120\uD0DD\uC73C\uB85C \uC654\uC744 \uB54C\uB294 < \uBC84\uD2BC \uD45C\uC2DC\n return (\n <>\n <IconButton\n size=\"small\"\n onClick={() => {\n // \uB4A4\uB85C\uAC00\uAE30 \uC2DC tempYear\uAC00 \uD604\uC7AC viewDate\uC758 year\uC640 \uB2E4\uB974\uBA74 onYearChange \uBC1C\uC0DD\n if (tempYear !== year) {\n onYearChange?.(year);\n }\n setTempYear(year);\n setViewMode(\"calendar\");\n }}\n >\n <ChevronLeft />\n </IconButton>\n <Typography\n variant=\"body2\"\n fontWeight={600}\n sx={{ flex: 1, textAlign: \"center\" }}\n >\n \uC5F0\uB3C4 \uC120\uD0DD\n </Typography>\n <Box sx={{ width: 28 }} />\n </>\n );\n }\n if (viewMode === \"month\") {\n return (\n <>\n <IconButton\n size=\"small\"\n onClick={() => setViewMode(\"year\")}\n >\n <ChevronLeft />\n </IconButton>\n <Typography\n variant=\"body2\"\n fontWeight={600}\n sx={{ flex: 1, textAlign: \"center\" }}\n >\n {tempYear}\uB144 - \uC6D4 \uC120\uD0DD\n </Typography>\n <Box sx={{ width: 28 }} /> {/* \uADE0\uD615\uC744 \uC704\uD55C \uBE48 \uACF5\uAC04 */}\n </>\n );\n }\n // calendar mode\n return (\n <>\n <IconButton size=\"small\" onClick={goToPrevMonth}>\n <ChevronLeft />\n </IconButton>\n <Typography\n variant=\"body2\"\n fontWeight={600}\n onClick={handleTitleClick}\n sx={{\n cursor: \"pointer\",\n px: 1,\n py: 0.5,\n borderRadius: 1,\n \"&:hover\": {\n bgcolor: \"action.hover\",\n },\n transition: \"background-color 0.15s\",\n }}\n >\n {year}\uB144 {mergedLocale.months[month]}\n </Typography>\n <IconButton size=\"small\" onClick={goToNextMonth}>\n <ChevronRight />\n </IconButton>\n </>\n );\n };\n\n // \uCF58\uD150\uCE20 \uB80C\uB354\uB9C1 (viewMode\uC5D0 \uB530\uB77C \uB2E4\uB984)\n const renderContent = () => {\n if (viewMode === \"year\") {\n return (\n <OverlayScrollbar\n ref={yearScrollRef}\n style={{ width: \"100%\", height: \"100%\" }}\n containerStyle={{ padding: \"12px\" }}\n thumb={{ width: 6, color: \"rgba(100, 100, 100, 0.5)\" }}\n track={{ alignment: \"right\", margin: 0 }}\n autoHide={{ enabled: true, delay: 1000 }}\n >\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n gap: 0.5,\n }}\n >\n {yearList.map((y) => {\n // yearOnly \uBAA8\uB4DC\uC5D0\uC11C\uB294 tempSelectedYear\uB97C, \uADF8 \uC678\uC5D0\uB294 tempYear\uB97C \uAE30\uC900\uC73C\uB85C \uC120\uD0DD \uD45C\uC2DC\n const isSelected = yearOnly\n ? tempSelectedYear === y\n : y === tempYear;\n const isCurrent = y === today.getFullYear();\n return (\n <Box\n key={y}\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n }}\n >\n <Box\n onClick={() => handleYearSelect(y)}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n py: 0.75,\n px: 1.5,\n borderRadius: 1,\n cursor: \"pointer\",\n bgcolor: isSelected\n ? selectedColor\n : \"transparent\",\n color: isSelected\n ? \"primary.contrastText\"\n : \"text.primary\",\n border:\n isCurrent && !isSelected\n ? 1\n : 0,\n borderColor: selectedColor,\n fontSize: \"0.8rem\",\n fontWeight:\n isSelected || isCurrent\n ? 600\n : 400,\n \"&:hover\": {\n bgcolor: isSelected\n ? selectedColor\n : \"action.hover\",\n transform: \"scale(1.05)\",\n },\n transition:\n \"background-color 0.15s, transform 0.15s\",\n }}\n >\n {y}\n </Box>\n </Box>\n );\n })}\n </Box>\n </OverlayScrollbar>\n );\n }\n\n if (viewMode === \"month\") {\n return (\n <Box\n className=\"month-grid\"\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gridTemplateRows: \"repeat(4, 1fr)\",\n gap: 1,\n width: \"100%\",\n height: \"100%\",\n p: 2,\n boxSizing: \"border-box\",\n }}\n >\n {mergedLocale.months.map(\n (monthName: string, index: number) => {\n // monthOnly \uBAA8\uB4DC\uC5D0\uC11C\uB294 tempMonth\uB97C, \uADF8 \uC678\uC5D0\uB294 \uD604\uC7AC viewDate\uC758 month\uB97C \uAE30\uC900\uC73C\uB85C \uC120\uD0DD \uD45C\uC2DC\n const isSelected = monthOnly\n ? tempMonth === index\n : tempYear === year && index === month;\n const isCurrent =\n tempYear === today.getFullYear() &&\n index === today.getMonth();\n return (\n <Box\n key={monthName}\n onClick={() => handleMonthSelect(index)}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 1,\n cursor: \"pointer\",\n bgcolor: isSelected\n ? selectedColor\n : \"transparent\",\n color: isSelected\n ? \"primary.contrastText\"\n : \"text.primary\",\n border:\n isCurrent && !isSelected ? 1 : 0,\n borderColor: selectedColor,\n fontSize: \"0.875rem\",\n fontWeight:\n isSelected || isCurrent ? 600 : 400,\n \"&:hover\": {\n bgcolor: isSelected\n ? selectedColor\n : \"action.hover\",\n transform: \"scale(1.05)\",\n },\n transition:\n \"background-color 0.15s, transform 0.15s\",\n }}\n >\n {monthName}\n </Box>\n );\n },\n )}\n </Box>\n );\n }\n\n // calendar mode\n return (\n <Box\n className=\"calendar-grid\"\n onWheel={handleWheel}\n sx={{\n width: \"100%\",\n height: \"100%\",\n px: 2,\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* \uC694\uC77C \uD5E4\uB354 */}\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n gap: 0,\n mb: 0.5,\n }}\n >\n {mergedLocale.weekdays.map((day: string, i: number) => (\n <Box\n key={day}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 22,\n fontSize: \"0.7rem\",\n color:\n i === 0\n ? holidayColor\n : i === 6\n ? saturdayColor\n : \"text.secondary\",\n fontWeight: 500,\n }}\n >\n {day}\n </Box>\n ))}\n </Box>\n\n {/* \uB0A0\uC9DC \uADF8\uB9AC\uB4DC */}\n <Box\n sx={{\n flex: 1,\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n gridTemplateRows: \"repeat(6, 1fr)\",\n gap: 0,\n }}\n >\n {calendarDays.map((date, index) => {\n // autoApply\uC77C \uB54C\uB294 selectedDate\uB9CC, \uC544\uB2D0 \uB54C\uB294 tempSelectedDate \uC6B0\uC120\n const isSelected = autoApply\n ? isSameDay(date, selectedDate)\n : isSameDay(date, tempSelectedDate ?? selectedDate);\n const isToday = isSameDay(date, today);\n const isDisabled = isDateDisabled(date);\n const dayOfWeek = date.getDay();\n const isCurrentMonth = date.getMonth() === month;\n const isHoliday = validHolidays.some((h) =>\n isSameDay(h, date),\n );\n\n return (\n <Box\n key={`${date.toISOString()}-${index}`}\n onClick={() =>\n !isDisabled && handleDateClick(date)\n }\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n mx: \"auto\",\n borderRadius: \"50%\",\n cursor: isDisabled ? \"default\" : \"pointer\",\n bgcolor: isSelected\n ? selectedColor\n : \"transparent\",\n color: isDisabled\n ? \"text.disabled\"\n : isSelected\n ? \"primary.contrastText\"\n : !isCurrentMonth\n ? \"text.disabled\"\n : isHoliday || dayOfWeek === 0\n ? holidayColor\n : dayOfWeek === 6\n ? saturdayColor\n : \"text.primary\",\n opacity: isCurrentMonth ? 1 : 0.4,\n border: isToday ? 1 : 0,\n borderColor: todayBorderColor,\n \"&:hover\": {\n bgcolor: isDisabled\n ? \"transparent\"\n : isSelected\n ? selectedColor\n : \"action.hover\",\n },\n transition: \"background-color 0.15s\",\n fontSize: \"0.75rem\",\n fontWeight:\n isSelected || isToday ? 600 : 400,\n }}\n >\n {date.getDate()}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n };\n\n // \uD478\uD130 \uB80C\uB354\uB9C1 (viewMode\uC5D0 \uB530\uB77C \uB2E4\uB984)\n const renderFooter = () => {\n // yearOnly \uBAA8\uB4DC\uC77C \uB54C\n if (yearOnly) {\n if (autoApply) {\n // autoApply\uAC00 true\uBA74 \uD478\uD130 \uBD88\uD544\uC694\n return null;\n }\n // autoApply\uAC00 false\uBA74 \uD655\uC778/\uCDE8\uC18C \uBC84\uD2BC \uD45C\uC2DC\n return (\n <>\n <Box sx={{ flex: 1 }} />\n <Button size=\"small\" onClick={onClose}>\n {mergedLocale.cancel}\n </Button>\n <Button\n size=\"small\"\n onClick={handleYearConfirm}\n variant=\"contained\"\n disabled={tempSelectedYear === null}\n >\n {mergedLocale.confirm}\n </Button>\n </>\n );\n }\n\n // monthOnly \uBAA8\uB4DC\uC77C \uB54C\n if (monthOnly) {\n if (autoApply) {\n // autoApply\uAC00 true\uBA74 \uD478\uD130 \uBD88\uD544\uC694\n return null;\n }\n // autoApply\uAC00 false\uBA74 \uD655\uC778/\uCDE8\uC18C \uBC84\uD2BC \uD45C\uC2DC\n return (\n <>\n <Box sx={{ flex: 1 }} />\n <Button size=\"small\" onClick={onClose}>\n {mergedLocale.cancel}\n </Button>\n <Button\n size=\"small\"\n onClick={handleMonthConfirm}\n variant=\"contained\"\n disabled={tempMonth === null}\n >\n {mergedLocale.confirm}\n </Button>\n </>\n );\n }\n\n if (viewMode === \"year\") {\n return (\n <Button size=\"small\" onClick={() => setViewMode(\"calendar\")}>\n {mergedLocale.cancel}\n </Button>\n );\n }\n if (viewMode === \"month\") {\n return (\n <Button\n size=\"small\"\n onClick={() => setViewMode(\"calendar\")}\n sx={{ px: 2 }}\n >\n {mergedLocale.cancel}\n </Button>\n );\n }\n // calendar mode - autoApply\uBA74 \uB2EB\uAE30 \uBC84\uD2BC\uB9CC \uD45C\uC2DC\n if (autoApply) {\n return (\n <>\n {showToday && (\n <Button\n size=\"small\"\n onClick={handleTodayClick}\n disabled={isDateDisabled(today)}\n >\n {mergedLocale.today}\n </Button>\n )}\n <Box sx={{ flex: 1 }} />\n <Button size=\"small\" onClick={onClose}>\n {mergedLocale.close}\n </Button>\n </>\n );\n }\n return (\n <>\n {showToday && (\n <Button\n size=\"small\"\n onClick={handleTodayClick}\n disabled={isDateDisabled(today)}\n >\n {mergedLocale.today}\n </Button>\n )}\n <Box sx={{ flex: 1 }} />\n <Button size=\"small\" onClick={onClose}>\n {mergedLocale.cancel}\n </Button>\n <Button\n size=\"small\"\n onClick={handleConfirm}\n variant=\"contained\"\n disabled={tempSelectedDate === null}\n >\n {mergedLocale.confirm}\n </Button>\n </>\n );\n };\n\n // \uD478\uD130 \uD45C\uC2DC \uC5EC\uBD80 \uACB0\uC815 (showFooterProp\uC774 false\uBA74 \uBB34\uC870\uAC74 \uC228\uAE40)\n const showFooter =\n showFooterProp &&\n (yearOnly\n ? !autoApply // yearOnly\uC77C \uB54C\uB294 autoApply\uAC00 false\uBA74 \uD56D\uC0C1 \uD45C\uC2DC\n : monthOnly\n ? !autoApply // monthOnly\uC77C \uB54C\uB294 autoApply\uAC00 false\uBA74 \uD56D\uC0C1 \uD45C\uC2DC (year/month \uBDF0 \uBAA8\uB450)\n : !(autoApply && !showToday) && viewMode === \"calendar\"); // calendar \uBDF0\uC77C \uB54C\uB9CC \uD45C\uC2DC, year/month \uBDF0\uB294 \uD478\uD130 \uC228\uAE40\n\n // \uD1B5\uD569\uB41C \uAD6C\uC870\uB85C \uB80C\uB354\uB9C1\n const calendarContent = (\n <Box\n className={`calendar-root calendar-${viewMode}-view`}\n sx={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n }}\n >\n {/* \uACF5\uD1B5 \uD5E4\uB354 */}\n <Box\n className=\"calendar-header\"\n sx={{\n height: HEADER_HEIGHT,\n minHeight: HEADER_HEIGHT,\n px: 2,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n viewMode === \"calendar\" ? \"space-between\" : \"center\",\n ...(viewMode !== \"calendar\" && {\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n }),\n }}\n >\n {renderHeader()}\n </Box>\n\n {/* \uCF58\uD150\uCE20 \uC601\uC5ED */}\n <Box\n ref={contentRef}\n className=\"calendar-content\"\n sx={{\n flex: \"1 1 0\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n pb: 1,\n }}\n >\n {renderContent()}\n </Box>\n </Box>\n );\n\n // \uACF5\uD1B5 \uD478\uD130 \uCEF4\uD3EC\uB10C\uD2B8\n const footerContent = showFooter ? (\n <Box\n className=\"calendar-footer\"\n sx={{\n height: FOOTER_HEIGHT,\n minHeight: FOOTER_HEIGHT,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n gap: 1,\n px: 1,\n borderTop: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n {renderFooter()}\n </Box>\n ) : null;\n\n // \uC2DC\uAC04 \uC120\uD0DD\uC774 \uC5C6\uC73C\uBA74 \uB2EC\uB825 + \uD478\uD130\n if (!showTimePicker) {\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n userSelect: \"none\",\n }}\n >\n {calendarContent}\n {footerContent}\n </Box>\n );\n }\n\n // \uC2DC\uAC04 \uC120\uD0DD\uC774 \uC788\uC73C\uBA74 \uC804\uCCB4 column: \uC0C1\uB2E8(\uB2EC\uB825+\uC2DC\uAC04 row) + \uD558\uB2E8(footer)\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n userSelect: \"none\",\n }}\n >\n {/* \uC0C1\uB2E8: \uB2EC\uB825 + \uC2DC\uAC04 (row) */}\n <Box\n sx={{\n display: \"flex\",\n flex: 1,\n minHeight: 0,\n overflow: \"hidden\",\n }}\n >\n {/* \uB2EC\uB825 \uC601\uC5ED - \uACE0\uC815 \uB108\uBE44 300px */}\n <Box\n sx={{\n width: 300,\n flex: \"0 0 300px\",\n borderRight: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n {calendarContent}\n </Box>\n\n {/* \uC2DC\uAC04 \uC120\uD0DD \uC601\uC5ED */}\n <Box\n sx={{\n flex: 1,\n minWidth: 0,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n <TimeSelector\n value={{\n hour: String(tempTime.hour).padStart(2, \"0\"),\n minute: String(tempTime.minute).padStart(2, \"0\"),\n second: String(tempTime.second).padStart(2, \"0\"),\n }}\n onChange={handleTempTimeChange}\n format={timeFormat}\n minTime={minTime}\n maxTime={maxTime}\n minuteStep={minuteStep}\n secondStep={secondStep}\n showHeader={true}\n hideDisabledTime={hideDisabledTime}\n />\n </Box>\n </Box>\n\n {/* \uD558\uB2E8: \uD478\uD130 (\uC804\uCCB4 \uB108\uBE44) */}\n {footerContent}\n </Box>\n );\n}\n", "/**\n * icons/index.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface IconProps {\n size?: \"small\" | \"medium\" | \"large\" | number;\n color?: string;\n}\n\nconst getSizeValue = (size: IconProps[\"size\"]) => {\n if (typeof size === \"number\") return size;\n switch (size) {\n case \"small\":\n return 16;\n case \"large\":\n return 28;\n case \"medium\":\n default:\n return 20;\n }\n};\n\nexport const ChevronLeft: React.FC<IconProps> = ({\n size = \"medium\",\n color = \"currentColor\",\n}) => {\n const s = getSizeValue(size);\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n};\n\nexport const ChevronRight: React.FC<IconProps> = ({\n size = \"medium\",\n color = \"currentColor\",\n}) => {\n const s = getSizeValue(size);\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n};\n\nexport const ColonIcon: React.FC<IconProps> = ({\n size = \"medium\",\n color = \"currentColor\",\n}) => {\n const s = getSizeValue(size);\n return (\n <svg width={s} height={s} viewBox=\"0 0 24 24\" fill={color}>\n <circle cx=\"12\" cy=\"8\" r=\"2\" />\n <circle cx=\"12\" cy=\"16\" r=\"2\" />\n </svg>\n );\n};\n", "/**\n * TimeSelector.tsx\n * \uC2DC\uAC04 \uC120\uD0DD UI \uCEF4\uD3EC\uB10C\uD2B8 (\uC7AC\uC0AC\uC6A9 \uAC00\uB2A5)\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Box, Typography } from \"@mui/material\";\nimport { OverlayScrollbar } from \"@ehfuse/overlay-scrollbar\";\nimport type { OverlayScrollbarRef } from \"@ehfuse/overlay-scrollbar\";\nimport { ColonIcon } from \"./icons\";\nimport type { TimeSelectorProps } from \"./types\";\n\nexport function TimeSelector({\n value,\n onChange,\n format,\n minTime,\n maxTime,\n minuteStep = 1,\n secondStep = 1,\n showHeader = true,\n hideDisabledTime = false,\n}: TimeSelectorProps) {\n const [selectedHour, setSelectedHour] = useState<number | null>(() => {\n const h = parseInt(value.hour, 10);\n if (!isNaN(h)) return h;\n return new Date().getHours();\n });\n const [selectedMinute, setSelectedMinute] = useState<number | null>(() => {\n const m = parseInt(value.minute, 10);\n if (!isNaN(m)) return Math.floor(m / minuteStep) * minuteStep;\n return Math.floor(new Date().getMinutes() / minuteStep) * minuteStep;\n });\n const [selectedSecond, setSelectedSecond] = useState<number | null>(() => {\n const s = value.second ? parseInt(value.second, 10) : 0;\n if (!isNaN(s)) return Math.floor(s / secondStep) * secondStep;\n return Math.floor(new Date().getSeconds() / secondStep) * secondStep;\n });\n const initialScrollDone = useRef(false);\n\n const hourRef = useRef<OverlayScrollbarRef>(null);\n const minuteRef = useRef<OverlayScrollbarRef>(null);\n const secondRef = useRef<OverlayScrollbarRef>(null);\n\n const hasSeconds = format === \"HH:mm:ss\" || format === \"hh:mm:ss\";\n const is12Hour = format.startsWith(\"hh\");\n const maxHour = is12Hour ? 12 : 23;\n const minHourValue = is12Hour ? 1 : 0;\n\n // \uC2DC\uAC04 \uBC30\uC5F4 \uC0DD\uC131\n const hours = Array.from(\n { length: maxHour - minHourValue + 1 },\n (_, i) => minHourValue + i,\n );\n const minutes = Array.from(\n { length: Math.ceil(60 / minuteStep) },\n (_, i) => i * minuteStep,\n );\n const seconds = hasSeconds\n ? Array.from(\n { length: Math.ceil(60 / secondStep) },\n (_, i) => i * secondStep,\n )\n : [];\n\n // \uC120\uD0DD\uB41C \uD56D\uBAA9\uC73C\uB85C \uC2A4\uD06C\uB864 (\uC138\uB85C \uC911\uC559\uC5D0 \uC624\uB3C4\uB85D)\n const scrollToCenter = useCallback(\n (\n scrollbarRef: React.RefObject<OverlayScrollbarRef | null>,\n val: number,\n ) => {\n if (!scrollbarRef.current) return;\n\n const scrollContainer = scrollbarRef.current.getScrollContainer();\n if (!scrollContainer) return;\n\n const element = scrollContainer.querySelector(\n `[data-value=\"${val}\"]`,\n ) as HTMLElement;\n if (!element) return;\n\n const containerHeight = scrollbarRef.current.clientHeight;\n const elementTop = element.offsetTop;\n const elementHeight = element.offsetHeight;\n\n const scrollTop =\n elementTop - containerHeight / 2 + elementHeight / 2;\n scrollbarRef.current.scrollTo({ top: Math.max(0, scrollTop) });\n },\n [],\n );\n\n // \uCD08\uAE30 \uC2A4\uD06C\uB864 (\uD55C \uBC88\uB9CC)\n useEffect(() => {\n if (initialScrollDone.current) return;\n if (selectedHour === null || selectedMinute === null) return;\n if (hasSeconds && selectedSecond === null) return;\n\n const timer = setTimeout(() => {\n scrollToCenter(hourRef, selectedHour);\n scrollToCenter(minuteRef, selectedMinute);\n if (hasSeconds && selectedSecond !== null) {\n scrollToCenter(secondRef, selectedSecond);\n }\n initialScrollDone.current = true;\n }, 50);\n return () => clearTimeout(timer);\n }, [\n selectedHour,\n selectedMinute,\n selectedSecond,\n hasSeconds,\n scrollToCenter,\n ]);\n\n // \uC2DC\uAC04 \uBC94\uC704 \uCCB4\uD06C\n const isTimeInRange = (h: number, m: number, s: number = 0): boolean => {\n const timeValue = h * 3600 + m * 60 + s;\n\n if (minTime) {\n const minParts = minTime.split(\":\");\n const minH = parseInt(minParts[0], 10) || 0;\n const minM = parseInt(minParts[1], 10) || 0;\n const minS = parseInt(minParts[2], 10) || 0;\n const minValue = minH * 3600 + minM * 60 + minS;\n if (timeValue < minValue) return false;\n }\n\n if (maxTime) {\n const maxParts = maxTime.split(\":\");\n const maxH = parseInt(maxParts[0], 10) || 0;\n const maxM = parseInt(maxParts[1], 10) || 0;\n const maxS = parseInt(maxParts[2], 10) || 0;\n const maxValue = maxH * 3600 + maxM * 60 + maxS;\n if (timeValue > maxValue) return false;\n }\n\n return true;\n };\n\n // \uC120\uD0DD \uD578\uB4E4\uB7EC - \uC120\uD0DD \uC2DC \uBC14\uB85C onChange \uD638\uCD9C\n const handleHourSelect = (hour: number) => {\n setSelectedHour(hour);\n onChange(\n hour,\n selectedMinute ?? 0,\n hasSeconds ? (selectedSecond ?? 0) : undefined,\n );\n };\n\n const handleMinuteSelect = (minute: number) => {\n setSelectedMinute(minute);\n onChange(\n selectedHour ?? 0,\n minute,\n hasSeconds ? (selectedSecond ?? 0) : undefined,\n );\n };\n\n const handleSecondSelect = (second: number) => {\n setSelectedSecond(second);\n onChange(selectedHour ?? 0, selectedMinute ?? 0, second);\n };\n\n // \uC544\uC774\uD15C \uB80C\uB354\uB9C1\n const renderItem = (\n val: number,\n selected: boolean,\n disabled: boolean,\n onClick: () => void,\n ) => (\n <Box\n key={val}\n data-value={val}\n onClick={disabled ? undefined : onClick}\n sx={{\n py: 0.5,\n px: 1,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n textAlign: \"center\",\n borderRadius: 1,\n backgroundColor: selected ? \"primary.main\" : \"transparent\",\n color: disabled\n ? \"text.disabled\"\n : selected\n ? \"primary.contrastText\"\n : \"text.primary\",\n opacity: disabled ? 0.4 : 1,\n transition: \"background-color 0.15s, color 0.15s\",\n \"&:hover\": {\n backgroundColor: disabled\n ? \"transparent\"\n : selected\n ? \"primary.dark\"\n : \"action.hover\",\n },\n fontVariantNumeric: \"tabular-nums\",\n minWidth: 32,\n }}\n >\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: selected ? 600 : 400 }}\n >\n {String(val).padStart(2, \"0\")}\n </Typography>\n </Box>\n );\n\n // \uC5F4 \uB80C\uB354\uB9C1\n const renderColumn = (\n ref: React.RefObject<OverlayScrollbarRef | null>,\n items: number[],\n selectedValue: number | null,\n onSelect: (val: number) => void,\n checkDisabled: (val: number) => boolean,\n ) => (\n <OverlayScrollbar\n ref={ref as React.RefObject<OverlayScrollbarRef>}\n style={{ height: \"100%\" }}\n thumb={{ width: 4 }}\n track={{ alignment: \"right\" }}\n >\n <div style={{ padding: \"0.25rem\" }}>\n {items.map((item) => {\n const isDisabled = checkDisabled(item);\n // hideDisabledTime\uC774 true\uC774\uACE0 disabled\uBA74 \uB80C\uB354\uB9C1\uD558\uC9C0 \uC54A\uC74C\n if (hideDisabledTime && isDisabled) return null;\n return renderItem(\n item,\n selectedValue === item,\n isDisabled,\n () => onSelect(item),\n );\n })}\n </div>\n </OverlayScrollbar>\n );\n\n // \uC2DC\uAC04 \uBE44\uD65C\uC131\uD654 \uCCB4\uD06C\n const isHourDisabled = (hour: number): boolean => {\n for (const minute of minutes) {\n if (hasSeconds) {\n for (const second of seconds) {\n if (isTimeInRange(hour, minute, second)) return false;\n }\n } else {\n if (isTimeInRange(hour, minute)) return false;\n }\n }\n return true;\n };\n\n const isMinuteDisabled = (minute: number): boolean => {\n if (selectedHour === null) return false;\n if (hasSeconds) {\n for (const second of seconds) {\n if (isTimeInRange(selectedHour, minute, second)) return false;\n }\n return true;\n }\n return !isTimeInRange(selectedHour, minute);\n };\n\n const isSecondDisabled = (second: number): boolean => {\n if (selectedHour === null || selectedMinute === null) return false;\n return !isTimeInRange(selectedHour, selectedMinute, second);\n };\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n userSelect: \"none\",\n }}\n >\n {/* \uD604\uC7AC \uC120\uD0DD\uB41C \uC2DC\uAC04 \uD45C\uC2DC */}\n {showHeader && (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n height: 48,\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n gap: 0.5,\n }}\n >\n <Typography\n variant=\"h6\"\n sx={{\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {selectedHour !== null\n ? String(selectedHour).padStart(2, \"0\")\n : \"--\"}\n </Typography>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ml: \"1px\",\n }}\n >\n <ColonIcon size=\"small\" />\n </Box>\n <Typography\n variant=\"h6\"\n sx={{\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {selectedMinute !== null\n ? String(selectedMinute).padStart(2, \"0\")\n : \"--\"}\n </Typography>\n {hasSeconds && (\n <>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ml: \"1px\",\n }}\n >\n <ColonIcon size=\"small\" />\n </Box>\n <Typography\n variant=\"h6\"\n sx={{\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {selectedSecond !== null\n ? String(selectedSecond).padStart(2, \"0\")\n : \"--\"}\n </Typography>\n </>\n )}\n </Box>\n )}\n\n {/* \uC2DC\uAC04 \uC120\uD0DD \uCEF8\uB7FC */}\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n flex: 1,\n minHeight: 0,\n overflow: \"hidden\",\n }}\n >\n {renderColumn(\n hourRef,\n hours,\n selectedHour,\n handleHourSelect,\n isHourDisabled,\n )}\n\n <Box\n sx={{\n width: \"1px\",\n backgroundColor: \"divider\",\n }}\n />\n\n {renderColumn(\n minuteRef,\n minutes,\n selectedMinute,\n handleMinuteSelect,\n isMinuteDisabled,\n )}\n\n {hasSeconds && (\n <>\n <Box\n sx={{\n width: \"1px\",\n backgroundColor: \"divider\",\n alignSelf: \"stretch\",\n }}\n />\n {renderColumn(\n secondRef,\n seconds,\n selectedSecond,\n handleSecondSelect,\n isSecondDisabled,\n )}\n </>\n )}\n </Box>\n </Box>\n );\n}\n", "/**\n * TimePicker.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { Box, Popover, Button } from \"@mui/material\";\nimport type { PopoverProps } from \"@mui/material/Popover\";\nimport { TimeSelector } from \"./TimeSelector\";\nimport type { TimePickerProps, AnchorElType } from \"./types\";\nimport { resolveLocale } from \"./locale\";\n\n// anchorEl\uC774 RefObject\uC778\uC9C0 \uD655\uC778\uD558\uACE0 \uC2E4\uC81C \uC5D8\uB9AC\uBA3C\uD2B8 \uBC18\uD658\nfunction resolveAnchorEl(\n anchorEl: AnchorElType | undefined,\n): PopoverProps[\"anchorEl\"] {\n if (!anchorEl) return null;\n // RefObject\uC778 \uACBD\uC6B0 current \uBC18\uD658\n if (typeof anchorEl === \"object\" && \"current\" in anchorEl) {\n return anchorEl.current;\n }\n return anchorEl;\n}\n\nexport function TimePicker({\n anchorEl,\n open,\n onClose,\n value,\n onChange,\n format,\n minTime,\n maxTime,\n minuteStep = 1,\n secondStep = 1,\n hideDisabledTime = false,\n autoApply = false,\n // \uB85C\uCF00\uC77C \uAD00\uB828\n locale,\n texts,\n}: TimePickerProps) {\n const hasSeconds = format === \"HH:mm:ss\" || format === \"hh:mm:ss\";\n\n // \uB85C\uCF00\uC77C \uD574\uC11D \uBC0F \uBCD1\uD569 (texts\uAC00 \uC788\uC73C\uBA74 \uBD80\uBD84 \uB36E\uC5B4\uC4F0\uAE30)\n const resolvedLocale = resolveLocale(locale);\n const mergedLocale = useMemo(\n () => (texts ? { ...resolvedLocale, ...texts } : resolvedLocale),\n [resolvedLocale, texts],\n );\n\n // anchorEl \uD574\uC11D\n const resolvedAnchorEl = resolveAnchorEl(anchorEl);\n\n // \uC784\uC2DC \uC120\uD0DD\uAC12 (\uD655\uC778 \uBC84\uD2BC \uB204\uB974\uAE30 \uC804\uAE4C\uC9C0 \uBCF4\uAD00)\n const [tempHour, setTempHour] = useState<number>(0);\n const [tempMinute, setTempMinute] = useState<number>(0);\n const [tempSecond, setTempSecond] = useState<number>(0);\n\n // value prop \uBCC0\uACBD \uC2DC \uC784\uC2DC\uAC12 \uCD08\uAE30\uD654\n useEffect(() => {\n if (open) {\n const h = parseInt(value.hour, 10);\n const m = parseInt(value.minute, 10);\n const s = value.second ? parseInt(value.second, 10) : 0;\n\n const now = new Date();\n setTempHour(isNaN(h) ? now.getHours() : h);\n setTempMinute(\n isNaN(m)\n ? Math.floor(now.getMinutes() / minuteStep) * minuteStep\n : Math.floor(m / minuteStep) * minuteStep,\n );\n if (hasSeconds) {\n setTempSecond(\n isNaN(s)\n ? Math.floor(now.getSeconds() / secondStep) * secondStep\n : Math.floor(s / secondStep) * secondStep,\n );\n }\n }\n }, [open, value, minuteStep, secondStep, hasSeconds]);\n\n // TimeSelector\uC5D0\uC11C \uC120\uD0DD \uBCC0\uACBD \uC2DC\n const handleTimeChange = (\n hour: number,\n minute: number,\n second?: number,\n ) => {\n setTempHour(hour);\n setTempMinute(minute);\n if (second !== undefined) {\n setTempSecond(second);\n }\n\n // autoApply\uAC00 true\uBA74 \uBC14\uB85C \uC801\uC6A9\n if (autoApply) {\n const h = String(hour).padStart(2, \"0\");\n const m = String(minute).padStart(2, \"0\");\n const s = hasSeconds\n ? String(second ?? 0).padStart(2, \"0\")\n : undefined;\n onChange(h, m, s);\n onClose();\n }\n };\n\n // \uD655\uC778 \uBC84\uD2BC \uD074\uB9AD \uC2DC onChange \uD638\uCD9C\n const handleConfirm = () => {\n const h = String(tempHour).padStart(2, \"0\");\n const m = String(tempMinute).padStart(2, \"0\");\n const s = hasSeconds ? String(tempSecond).padStart(2, \"0\") : undefined;\n onChange(h, m, s);\n onClose();\n };\n\n return (\n <Popover\n open={open}\n anchorEl={resolvedAnchorEl}\n onClose={onClose}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n slotProps={{\n paper: {\n sx: {\n mt: 1,\n borderRadius: 2,\n boxShadow: 3,\n minWidth: hasSeconds ? 165 : 110,\n userSelect: \"none\",\n },\n },\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: autoApply ? 288 : 336,\n }}\n >\n <Box sx={{ flex: 1, minHeight: 0, overflow: \"hidden\" }}>\n <TimeSelector\n value={{\n hour: String(tempHour).padStart(2, \"0\"),\n minute: String(tempMinute).padStart(2, \"0\"),\n second: hasSeconds\n ? String(tempSecond).padStart(2, \"0\")\n : undefined,\n }}\n onChange={handleTimeChange}\n format={format}\n minTime={minTime}\n maxTime={maxTime}\n minuteStep={minuteStep}\n secondStep={secondStep}\n showHeader={true}\n hideDisabledTime={hideDisabledTime}\n />\n </Box>\n\n {/* \uD558\uB2E8 \uD655\uC778 \uBC84\uD2BC - autoApply\uAC00 false\uC77C \uB54C\uB9CC \uD45C\uC2DC */}\n {!autoApply && (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n height: 48,\n px: 1.5,\n borderTop: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n <Button size=\"small\" onClick={handleConfirm} fullWidth>\n {mergedLocale.confirm}\n </Button>\n </Box>\n )}\n </Box>\n </Popover>\n );\n}\n", "/**\n * DatePicker.tsx\n * Popover \uAE30\uBC18 \uB0A0\uC9DC \uC120\uD0DD \uCEF4\uD3EC\uB10C\uD2B8\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { useState, useEffect } from \"react\";\nimport { Popover } from \"@mui/material\";\nimport type { PopoverProps } from \"@mui/material/Popover\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { SimpleCalendar } from \"./SimpleCalendar\";\nimport type { DatePickerProps, AnchorElType } from \"./types\";\nimport { defaultLocale } from \"./locale\";\n\n// anchorEl\uC774 RefObject\uC778\uC9C0 \uD655\uC778\uD558\uACE0 \uC2E4\uC81C \uC5D8\uB9AC\uBA3C\uD2B8 \uBC18\uD658\nfunction resolveAnchorEl(\n anchorEl: AnchorElType | undefined,\n): PopoverProps[\"anchorEl\"] {\n if (!anchorEl) return null;\n // RefObject\uC778 \uACBD\uC6B0 current \uBC18\uD658\n if (typeof anchorEl === \"object\" && \"current\" in anchorEl) {\n return anchorEl.current;\n }\n return anchorEl;\n}\n\n/**\n * DatePicker - Popover \uAE30\uBC18 \uB0A0\uC9DC \uC120\uD0DD \uCEF4\uD3EC\uB10C\uD2B8\n *\n * \uB0A0\uC9DC\uB9CC \uC120\uD0DD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * \uC2DC\uAC04 \uC120\uD0DD\uC774 \uD544\uC694\uD558\uBA74 DateTimePicker\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.\n */\nexport function DatePicker({\n open,\n onClose,\n anchorEl,\n selectedDate,\n onDateChange,\n minDate,\n maxDate,\n holidays = [],\n styles,\n showToday = true,\n showFooter = true,\n autoApply = false,\n anchorOrigin = { vertical: \"bottom\", horizontal: \"left\" },\n transformOrigin = { vertical: \"top\", horizontal: \"left\" },\n slotProps,\n // \uB85C\uCF00\uC77C \uAD00\uB828\n locale = defaultLocale,\n texts,\n // \uB144\uC6D4\uB9CC \uC120\uD0DD\n monthOnly = false,\n // \uB144\uB3C4\uB9CC \uC120\uD0DD\n yearOnly = false,\n // \uB144\uC6D4/\uB144\uB3C4 \uBCC0\uACBD \uCF5C\uBC31\n onMonthChange,\n onYearChange,\n onWeekChange,\n ...popoverProps\n}: DatePickerProps) {\n const mergedPaperProps = {\n ...slotProps?.paper,\n \"data-custom-date-picker-popper\": \"true\",\n tabIndex: -1,\n sx: {\n mt: 1,\n borderRadius: 2,\n boxShadow: 3,\n width: 300,\n height: showFooter ? 380 : 332,\n overflow: \"hidden\",\n userSelect: \"none\",\n ...((slotProps?.paper as { sx?: SxProps<Theme> })?.sx ?? {}),\n },\n } as unknown as NonNullable<PopoverProps[\"slotProps\"]>[\"paper\"];\n\n // anchorEl \uD574\uC11D\n const resolvedAnchorEl = resolveAnchorEl(anchorEl);\n\n // \uB0B4\uBD80 \uC784\uC2DC \uB0A0\uC9DC \uC0C1\uD0DC\n const [tempDate, setTempDate] = useState<Date | null>(selectedDate ?? null);\n\n // \uC774\uC804\uC5D0 \uC120\uD0DD\uB41C \uB0A0\uC9DC\uC758 \uB144/\uC6D4 \uCD94\uC801 (\uC774\uBCA4\uD2B8 \uBC1C\uC0DD \uC5EC\uBD80 \uD310\uB2E8\uC6A9)\n const prevYear = selectedDate?.getFullYear();\n const prevMonth = selectedDate?.getMonth();\n\n // open\uB420 \uB54C \uC678\uBD80 \uAC12\uC73C\uB85C \uCD08\uAE30\uD654\n useEffect(() => {\n if (open) {\n setTempDate(selectedDate ?? null);\n }\n }, [open, selectedDate]);\n\n // \uB0A0\uC9DC \uC120\uD0DD \uD578\uB4E4\uB7EC (SimpleCalendar\uC5D0\uC11C \uD638\uCD9C)\n const handleDateSelect = (date: Date) => {\n setTempDate(date);\n onDateChange?.(date);\n\n // monthOnly/yearOnly\uAC00 \uC544\uB2D0 \uB54C\uB9CC \uC5EC\uAE30\uC11C \uB144/\uC6D4 \uBCC0\uACBD \uCF5C\uBC31 \uBC1C\uC0DD\n // monthOnly/yearOnly\uC77C \uB54C\uB294 SimpleCalendar\uC5D0\uC11C \uC774\uBCA4\uD2B8 \uCC98\uB9AC\n if (!monthOnly && !yearOnly) {\n const newYear = date.getFullYear();\n const newMonth = date.getMonth();\n if (prevYear !== newYear) {\n onYearChange?.(newYear);\n }\n if (prevYear !== newYear || prevMonth !== newMonth) {\n onMonthChange?.(newYear, newMonth + 1);\n }\n }\n\n // autoApply\uAC00 true\uBA74 \uB0A0\uC9DC \uC120\uD0DD \uC2DC \uBC14\uB85C \uB2EB\uAE30\n if (autoApply) {\n onClose();\n }\n };\n\n return (\n <Popover\n open={open}\n anchorEl={resolvedAnchorEl}\n onClose={onClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n {...popoverProps}\n slotProps={{\n ...slotProps,\n paper: mergedPaperProps,\n }}\n >\n <SimpleCalendar\n selectedDate={tempDate}\n onSelect={handleDateSelect}\n onClose={onClose}\n minDate={minDate}\n maxDate={maxDate}\n holidays={holidays}\n styles={styles}\n showToday={showToday}\n showFooter={showFooter}\n autoApply={autoApply}\n showTimePicker={false}\n locale={locale}\n texts={texts}\n monthOnly={monthOnly}\n yearOnly={yearOnly}\n // monthOnly/yearOnly \uBAA8\uB4DC\uC77C \uB54C\uB9CC SimpleCalendar\uC758 \uC774\uBCA4\uD2B8\uB97C \uC804\uB2EC\n // \uC77C\uBC18 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uB0A0\uC9DC \uC120\uD0DD \uC2DC\uC5D0\uB9CC \uB144/\uC6D4 \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n onYearChange={monthOnly || yearOnly ? onYearChange : undefined}\n onMonthChange={\n monthOnly || yearOnly ? onMonthChange : undefined\n }\n onWeekChange={onWeekChange}\n />\n </Popover>\n );\n}\n", "/**\n * DateTimePicker.tsx\n * Popover \uAE30\uBC18 \uB0A0\uC9DC + \uC2DC\uAC04 \uC120\uD0DD \uCEF4\uD3EC\uB10C\uD2B8\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { useState, useEffect } from \"react\";\nimport { Popover } from \"@mui/material\";\nimport type { PopoverProps } from \"@mui/material/Popover\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { SimpleCalendar } from \"./SimpleCalendar\";\nimport type { DateTimePickerProps, TimeValue, AnchorElType } from \"./types\";\nimport { defaultLocale } from \"./locale\";\n\n// anchorEl\uC774 RefObject\uC778\uC9C0 \uD655\uC778\uD558\uACE0 \uC2E4\uC81C \uC5D8\uB9AC\uBA3C\uD2B8 \uBC18\uD658\nfunction resolveAnchorEl(\n anchorEl: AnchorElType | undefined,\n): PopoverProps[\"anchorEl\"] {\n if (!anchorEl) return null;\n // RefObject\uC778 \uACBD\uC6B0 current \uBC18\uD658\n if (typeof anchorEl === \"object\" && \"current\" in anchorEl) {\n return anchorEl.current;\n }\n return anchorEl;\n}\n\n/**\n * DateTimePicker - Popover \uAE30\uBC18 \uB0A0\uC9DC + \uC2DC\uAC04 \uC120\uD0DD \uCEF4\uD3EC\uB10C\uD2B8\n *\n * \uB0A0\uC9DC\uC640 \uC2DC\uAC04\uC744 \uD568\uAED8 \uC120\uD0DD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * \uB0A0\uC9DC\uB9CC \uC120\uD0DD\uD558\uB824\uBA74 DatePicker\uB97C, \uC2DC\uAC04\uB9CC \uC120\uD0DD\uD558\uB824\uBA74 TimePicker\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.\n */\nexport function DateTimePicker({\n open,\n onClose,\n anchorEl,\n selectedDate,\n onDateChange,\n timeValue,\n onTimeChange,\n minDate,\n maxDate,\n holidays = [],\n styles,\n showToday = true,\n showFooter = true,\n autoApply = false,\n timeFormat = \"HH:mm\",\n minTime,\n maxTime,\n minuteStep = 1,\n secondStep = 1,\n hideDisabledTime = false,\n anchorOrigin = { vertical: \"bottom\", horizontal: \"left\" },\n transformOrigin = { vertical: \"top\", horizontal: \"left\" },\n slotProps,\n // \uB85C\uCF00\uC77C \uAD00\uB828\n locale = defaultLocale,\n texts,\n // \uB144\uC6D4/\uB144\uB3C4 \uBCC0\uACBD \uCF5C\uBC31\n onMonthChange,\n onYearChange,\n onWeekChange,\n ...popoverProps\n}: DateTimePickerProps) {\n const hasSeconds = timeFormat === \"HH:mm:ss\" || timeFormat === \"hh:mm:ss\";\n\n // anchorEl \uD574\uC11D\n const resolvedAnchorEl = resolveAnchorEl(anchorEl);\n\n // \uB0B4\uBD80 \uC784\uC2DC \uB0A0\uC9DC \uC0C1\uD0DC\n const [tempDate, setTempDate] = useState<Date | null>(selectedDate ?? null);\n\n // \uB0B4\uBD80 \uC784\uC2DC \uC2DC\uAC04 \uC0C1\uD0DC\n const [tempTime, setTempTime] = useState<TimeValue>(() => {\n if (timeValue) return timeValue;\n const now = new Date();\n return {\n hour: String(now.getHours()).padStart(2, \"0\"),\n minute: String(\n Math.floor(now.getMinutes() / minuteStep) * minuteStep,\n ).padStart(2, \"0\"),\n second: hasSeconds\n ? String(\n Math.floor(now.getSeconds() / secondStep) * secondStep,\n ).padStart(2, \"0\")\n : undefined,\n };\n });\n\n // open\uB420 \uB54C \uC678\uBD80 \uAC12\uC73C\uB85C \uCD08\uAE30\uD654\n useEffect(() => {\n if (open) {\n setTempDate(selectedDate ?? null);\n if (timeValue) {\n setTempTime(timeValue);\n } else {\n const now = new Date();\n setTempTime({\n hour: String(now.getHours()).padStart(2, \"0\"),\n minute: String(\n Math.floor(now.getMinutes() / minuteStep) * minuteStep,\n ).padStart(2, \"0\"),\n second: hasSeconds\n ? String(\n Math.floor(now.getSeconds() / secondStep) *\n secondStep,\n ).padStart(2, \"0\")\n : undefined,\n });\n }\n }\n }, [open, selectedDate, timeValue, minuteStep, secondStep, hasSeconds]);\n\n // \uC774\uC804\uC5D0 \uC120\uD0DD\uB41C \uB0A0\uC9DC\uC758 \uB144/\uC6D4 \uCD94\uC801 (\uC774\uBCA4\uD2B8 \uBC1C\uC0DD \uC5EC\uBD80 \uD310\uB2E8\uC6A9)\n const prevYear = selectedDate?.getFullYear();\n const prevMonth = selectedDate?.getMonth();\n\n // \uB0A0\uC9DC \uC120\uD0DD \uD578\uB4E4\uB7EC (SimpleCalendar\uC5D0\uC11C \uD638\uCD9C)\n const handleDateSelect = (date: Date) => {\n setTempDate(date);\n // \uB0A0\uC9DC\uAC00 \uC120\uD0DD\uB418\uBA74 \uD56D\uC0C1 \uCF5C\uBC31 \uD638\uCD9C (\uD655\uC778 \uBC84\uD2BC\uC5D0\uC11C\uB3C4 \uD638\uCD9C\uB428)\n onDateChange?.(date);\n\n // \uB0A0\uC9DC \uC120\uD0DD \uC2DC \uB144/\uC6D4 \uBCC0\uACBD \uCF5C\uBC31 \uBC1C\uC0DD (\uC774\uC804 \uB0A0\uC9DC\uC640 \uBE44\uAD50)\n const newYear = date.getFullYear();\n const newMonth = date.getMonth();\n if (prevYear !== newYear) {\n onYearChange?.(newYear);\n }\n if (prevYear !== newYear || prevMonth !== newMonth) {\n onMonthChange?.(newYear, newMonth + 1);\n }\n };\n\n // SimpleCalendar\uC5D0\uC11C \uC2DC\uAC04 \uBCC0\uACBD\n const handleCalendarTimeChange = (\n hour: number,\n minute: number,\n second?: number,\n ) => {\n const newTime = {\n hour: String(hour).padStart(2, \"0\"),\n minute: String(minute).padStart(2, \"0\"),\n second:\n second !== undefined\n ? String(second).padStart(2, \"0\")\n : undefined,\n };\n setTempTime(newTime);\n\n // \uC2DC\uAC04\uC774 \uBCC0\uACBD\uB418\uBA74 \uD56D\uC0C1 \uCF5C\uBC31 \uD638\uCD9C (\uD655\uC778 \uBC84\uD2BC\uC5D0\uC11C\uB3C4 \uD638\uCD9C\uB428)\n onTimeChange?.(newTime.hour, newTime.minute, newTime.second);\n };\n\n // \uD31D\uC624\uBC84 \uD06C\uAE30 \uACB0\uC815 (datetime \uC804\uC6A9)\n const width = 300 + (hasSeconds ? 165 : 110);\n const height = showFooter ? 380 : 332;\n\n return (\n <Popover\n open={open}\n anchorEl={resolvedAnchorEl}\n onClose={onClose}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n {...popoverProps}\n slotProps={{\n ...slotProps,\n paper: {\n ...slotProps?.paper,\n sx: {\n mt: 1,\n borderRadius: 2,\n boxShadow: 3,\n width,\n height,\n overflow: \"hidden\",\n userSelect: \"none\",\n ...((slotProps?.paper as { sx?: SxProps<Theme> })?.sx ??\n {}),\n },\n },\n }}\n >\n <SimpleCalendar\n selectedDate={tempDate}\n onSelect={handleDateSelect}\n onClose={onClose}\n minDate={minDate}\n maxDate={maxDate}\n holidays={holidays}\n styles={styles}\n showToday={showToday}\n showFooter={showFooter}\n autoApply={autoApply}\n showTimePicker={true}\n timeValue={tempTime}\n onTimeChange={handleCalendarTimeChange}\n timeFormat={timeFormat}\n minTime={minTime}\n maxTime={maxTime}\n minuteStep={minuteStep}\n secondStep={secondStep}\n hideDisabledTime={hideDisabledTime}\n locale={locale}\n texts={texts}\n // DateTimePicker\uB294 \uC77C\uBC18 \uBAA8\uB4DC\uB9CC \uC788\uC73C\uBBC0\uB85C \uB0A0\uC9DC \uC120\uD0DD \uC2DC\uC5D0\uB9CC \uB144/\uC6D4 \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n onWeekChange={onWeekChange}\n />\n </Popover>\n );\n}\n", "/**\n * CalendarIcon.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\nexport const CalendarIcon = ({ size = 20 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n);\n", "/**\n * ChevronLeft.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\nexport const ChevronLeft = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n);\n", "/**\n * ChevronRight.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\nexport const ChevronRight = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8.59 16.59L10 18l6-6-6-6-1.41 1.41L13.17 12z\" />\n </svg>\n);\n", "/**\n * ClockIcon.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface ClockIconProps {\n size?: number;\n color?: string;\n}\n\nexport function ClockIcon({\n size = 22,\n color = \"currentColor\",\n}: ClockIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n", "/**\n * ColonIcon.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface ColonIconProps {\n size?: \"small\" | \"medium\";\n color?: string;\n}\n\nexport function ColonIcon({\n size = \"small\",\n color = \"rgba(0, 0, 0, 0.87)\",\n}: ColonIconProps) {\n const height = size === \"small\" ? 14 : 18;\n const dotRadius = size === \"small\" ? 1.2 : 1.5;\n // width\uB97C dotRadius * 2 + \uC5EC\uC720\uACF5\uAC04\uC73C\uB85C \uC124\uC815\n const width = dotRadius * 2 + 2;\n const centerX = width / 2;\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n fill={color}\n style={{\n display: \"inline-block\",\n visibility: \"visible\",\n opacity: 1,\n width: `${width}px`,\n height: `${height}px`,\n minWidth: `${width}px`,\n minHeight: `${height}px`,\n maxWidth: `${width}px`,\n maxHeight: `${height}px`,\n flexShrink: 0,\n overflow: \"visible\",\n margin: \"0 1px\",\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n verticalAlign: \"middle\",\n pointerEvents: \"none\",\n }}\n >\n <circle\n cx={centerX}\n cy={height * 0.32}\n r={dotRadius}\n style={{\n fill: color,\n stroke: \"none\",\n visibility: \"visible\",\n opacity: 1,\n }}\n />\n <circle\n cx={centerX}\n cy={height * 0.68}\n r={dotRadius}\n style={{\n fill: color,\n stroke: \"none\",\n visibility: \"visible\",\n opacity: 1,\n }}\n />\n </svg>\n );\n}\n", "/**\n * DashIcon.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface DashIconProps {\n size?: \"small\" | \"medium\";\n}\n\nexport function DashIcon({ size = \"small\" }: DashIconProps) {\n const width = size === \"small\" ? 8 : 10;\n const height = size === \"small\" ? 1 : 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n style={{ display: \"block\" }}\n >\n <rect\n x=\"0\"\n y=\"0\"\n width={width}\n height={height}\n rx={height / 2}\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n", "/**\n * CopyIcon.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface CopyIconProps {\n size?: \"small\" | \"medium\";\n}\n\nexport function CopyIcon({ size = \"small\" }: CopyIconProps) {\n const iconSize = size === \"small\" ? 16 : 20;\n\n return (\n <svg\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ display: \"block\" }}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n", "/**\n * card-icons.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface CardIconProps {\n size?: number;\n color?: string;\n}\n\n// \uACF5\uD1B5 \uCE74\uB4DC \uD06C\uAE30 (8:5 \uBE44\uC728, \uC2E4\uC81C \uC2E0\uC6A9\uCE74\uB4DC \uBE44\uC728\uC5D0 \uAC00\uAE4C\uC6C0)\nconst CARD_WIDTH = 36;\nconst CARD_HEIGHT = 25;\n\n// \uAE30\uBCF8 \uCE74\uB4DC \uC544\uC774\uCF58 (\uBE0C\uB79C\uB4DC \uBBF8\uD655\uC778)\nexport function CardIcon({ size = 24, color = \"#9e9e9e\" }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 40 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g transform=\"translate(8, 4)\">\n <rect\n x=\"0\"\n y=\"0\"\n width=\"24\"\n height=\"17\"\n rx=\"2\"\n stroke={color}\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"24\"\n y2=\"5\"\n stroke={color}\n strokeWidth=\"2\"\n />\n <rect\n x=\"2\"\n y=\"10\"\n width=\"5\"\n height=\"2.5\"\n rx=\"0.5\"\n fill={color}\n />\n </g>\n </svg>\n );\n}\n\n// Visa \uB85C\uACE0\nexport function VisaIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 262.3 x 85\n const logoWidth = 262.3;\n const logoHeight = 85;\n // \uB85C\uACE0\uB97C \uCE74\uB4DC \uB0B4\uBD80\uC5D0 \uB9DE\uCD94\uAE30 \uC704\uD55C \uC2A4\uCF00\uC77C (\uC5EC\uC720 \uC788\uAC8C)\n const logoScale = Math.min(\n (CARD_WIDTH * 0.75) / logoWidth,\n (CARD_HEIGHT * 0.6) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n <path\n fill=\"#1434CB\"\n d=\"M170.9,0c-18.6,0-35.3,9.7-35.3,27.5c0,20.5,29.5,21.9,29.5,32.1c0,4.3-5,8.2-13.4,8.2c-12,0-21-5.4-21-5.4l-3.8,18c0,0,10.3,4.6,24.1,4.6c20.4,0,36.4-10.1,36.4-28.3c0-21.6-29.6-23-29.6-32.5c0-3.4,4.1-7.1,12.5-7.1c9.5,0,17.3,3.9,17.3,3.9l3.8-17.4C191.3,3.6,182.8,0,170.9,0L170.9,0z M0.5,1.3L0,3.9c0,0,7.8,1.4,14.9,4.3c9.1,3.3,9.7,5.2,11.3,11.1l16.7,64.3h22.4L99.6,1.3H77.3l-22.1,56l-9-47.5c-0.8-5.4-5-8.5-10.2-8.5C36,1.3,0.5,1.3,0.5,1.3z M108.6,1.3L91.1,83.6h21.3l17.4-82.3L108.6,1.3L108.6,1.3z M227.2,1.3c-5.1,0-7.8,2.7-9.8,7.5l-31.2,74.8h22.3l4.3-12.5H240l2.6,12.5h19.7L245.2,1.3L227.2,1.3L227.2,1.3z M230.1,23.6l6.6,30.9H219L230.1,23.6L230.1,23.6z\"\n />\n </g>\n </svg>\n );\n}\n\n// Mastercard \uB85C\uACE0\nexport function MastercardIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 999.2 x 618 (\uC6D0 2\uAC1C)\n const logoWidth = 999.2;\n const logoHeight = 618;\n const logoScale = Math.min(\n (CARD_WIDTH * 0.75) / logoWidth,\n (CARD_HEIGHT * 0.75) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n <rect\n x=\"364\"\n y=\"66.1\"\n fill=\"#FF5A00\"\n width=\"270.4\"\n height=\"485.8\"\n />\n <path\n fill=\"#EB001B\"\n d=\"M382,309c0-98.7,46.4-186.3,117.6-242.9C447.2,24.9,381.1,0,309,0C138.2,0,0,138.2,0,309s138.2,309,309,309c72.1,0,138.2-24.9,190.6-66.1C428.3,496.1,382,407.7,382,309z\"\n />\n <path\n fill=\"#F79E1B\"\n d=\"M999.2,309c0,170.8-138.2,309-309,309c-72.1,0-138.2-24.9-190.6-66.1c72.1-56.7,117.6-144.2,117.6-242.9S570.8,122.7,499.6,66.1C551.9,24.9,618,0,690.1,0C861,0,999.2,139.1,999.2,309z\"\n />\n </g>\n </svg>\n );\n}\n\n// AMEX \uB85C\uACE0\nexport function AmexIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 48 x 48 (\uC815\uC0AC\uAC01\uD615) - \uCE74\uB4DC \uBC30\uACBD \uD3EC\uD568\n const logoWidth = 48;\n const logoHeight = 48;\n const logoScale = Math.min(\n (CARD_WIDTH * 1.1) / logoWidth,\n (CARD_HEIGHT * 1.15) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n <path\n fill=\"#1976D2\"\n d=\"M45,35c0,2.209-1.791,4-4,4H7c-2.209,0-4-1.791-4-4V13c0-2.209,1.791-4,4-4h34c2.209,0,4,1.791,4,4V35z\"\n />\n <path\n fill=\"#FFF\"\n d=\"M22.255 20l-2.113 4.683L18.039 20h-2.695v6.726L12.341 20h-2.274L7 26.981h1.815l.671-1.558h3.432l.682 1.558h3.465v-5.185l2.299 5.185h1.563l2.351-5.095v5.095H25V20H22.255zM10.135 23.915l1.026-2.44 1.066 2.44H10.135zM37.883 23.413L41 20.018h-2.217l-1.994 2.164L34.86 20H28v6.982h6.635l2.092-2.311L38.767 27h2.21L37.883 23.413zM33.728 25.516h-4.011v-1.381h3.838v-1.323h-3.838v-1.308l4.234.012 1.693 1.897L33.728 25.516z\"\n />\n </g>\n </svg>\n );\n}\n\n// JCB \uB85C\uACE0\nexport function JcbIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 300 x 231.511\n const logoWidth = 300;\n const logoHeight = 231.511;\n const logoScale = Math.min(\n (CARD_WIDTH * 0.85) / logoWidth,\n (CARD_HEIGHT * 0.85) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n <defs>\n <linearGradient\n id=\"jcbGreen1\"\n x1=\"117.3856\"\n y1=\"81.3986\"\n x2=\"157.3299\"\n y2=\"81.3986\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(1.125,0,0,1.125,-11.9755,-13.8615)\"\n >\n <stop offset=\"0\" stopColor=\"#007940\" />\n <stop offset=\"0.2285\" stopColor=\"#00873F\" />\n <stop offset=\"0.7433\" stopColor=\"#40A737\" />\n <stop offset=\"1\" stopColor=\"#5CB531\" />\n </linearGradient>\n <linearGradient\n id=\"jcbGreen2\"\n x1=\"117.3844\"\n y1=\"75.1714\"\n x2=\"157.3318\"\n y2=\"75.1714\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(1.125,0,0,1.125,-11.9755,-13.8615)\"\n >\n <stop offset=\"0\" stopColor=\"#007940\" />\n <stop offset=\"0.2285\" stopColor=\"#00873F\" />\n <stop offset=\"0.7433\" stopColor=\"#40A737\" />\n <stop offset=\"1\" stopColor=\"#5CB531\" />\n </linearGradient>\n <linearGradient\n id=\"jcbGreen3\"\n x1=\"117.3846\"\n y1=\"68.3991\"\n x2=\"157.33051\"\n y2=\"68.3991\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(1.125,0,0,1.125,-11.9755,-13.8615)\"\n >\n <stop offset=\"0\" stopColor=\"#007940\" />\n <stop offset=\"0.2285\" stopColor=\"#00873F\" />\n <stop offset=\"0.7433\" stopColor=\"#40A737\" />\n <stop offset=\"1\" stopColor=\"#5CB531\" />\n </linearGradient>\n <linearGradient\n id=\"jcbBlue\"\n x1=\"27.9594\"\n y1=\"75.1714\"\n x2=\"68.5221\"\n y2=\"75.1714\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(1.125,0,0,1.125,-11.9755,-13.8615)\"\n >\n <stop offset=\"0\" stopColor=\"#1F286F\" />\n <stop offset=\"0.4751\" stopColor=\"#004E94\" />\n <stop offset=\"0.8261\" stopColor=\"#0066B1\" />\n <stop offset=\"1\" stopColor=\"#006FBC\" />\n </linearGradient>\n <linearGradient\n id=\"jcbRed\"\n x1=\"72.4595\"\n y1=\"75.1714\"\n x2=\"111.8553\"\n y2=\"75.1714\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(1.125,0,0,1.125,-11.9755,-13.8615)\"\n >\n <stop offset=\"0\" stopColor=\"#6C2C2F\" />\n <stop offset=\"0.1735\" stopColor=\"#882730\" />\n <stop offset=\"0.5731\" stopColor=\"#BE1833\" />\n <stop offset=\"0.8585\" stopColor=\"#DC0436\" />\n <stop offset=\"1\" stopColor=\"#E60039\" />\n </linearGradient>\n </defs>\n <g transform=\"translate(-9.4,96.811)\">\n <g transform=\"matrix(1.8215159,0,0,1.8215159,-8.5437653,-109.83667)\">\n <path\n fill=\"#ffffff\"\n d=\"m 174,108.3 c 0,14 -11.4,25.4 -25.4,25.4 l -138.2,0 0,-100.6 c 0,-14 11.4,-25.4 25.4,-25.4 l 138.2,0 0,100.6 z\"\n />\n <path\n fill=\"url(#jcbGreen1)\"\n d=\"m 129,82.5 10.5,0 c 0.3,0 1,-0.1 1.3,-0.1 2,-0.4 3.7,-2.2 3.7,-4.7 0,-2.4 -1.7,-4.2 -3.7,-4.7 -0.3,-0.1 -0.9,-0.1 -1.3,-0.1 l -10.5,0 0,9.6 z\"\n />\n <path\n fill=\"url(#jcbGreen2)\"\n d=\"m 138.3,16.2 c -10,0 -18.2,8.1 -18.2,18.2 l 0,18.9 25.7,0 c 0.6,0 1.3,0 1.8,0.1 5.8,0.3 10.1,3.3 10.1,8.5 0,4.1 -2.9,7.6 -8.3,8.3 l 0,0.2 c 5.9,0.4 10.4,3.7 10.4,8.8 0,5.5 -5,9.1 -11.6,9.1 l -28.2,0 0,37 26.7,0 c 10,0 18.2,-8.1 18.2,-18.2 l 0,-90.9 -26.6,0 z\"\n />\n <path\n fill=\"url(#jcbGreen3)\"\n d=\"m 143.2,63.1 c 0,-2.4 -1.7,-4 -3.7,-4.3 -0.2,0 -0.7,-0.1 -1,-0.1 l -9.5,0 0,8.8 9.5,0 c 0.3,0 0.9,0 1,-0.1 2,-0.3 3.7,-1.9 3.7,-4.3 z\"\n />\n <path\n fill=\"url(#jcbBlue)\"\n d=\"m 37.7,16.2 c -10,0 -18.2,8.1 -18.2,18.2 l 0,44.9 c 5.1,2.5 10.4,4.1 15.7,4.1 6.3,0 9.7,-3.8 9.7,-9 l 0,-21.2 15.6,0 0,21.1 c 0,8.2 -5.1,14.9 -22.4,14.9 -10.5,0 -18.7,-2.3 -18.7,-2.3 l 0,38.3 26.7,0 c 10,0 18.2,-8.1 18.2,-18.2 l 0,-90.8 -26.6,0 z\"\n />\n <path\n fill=\"url(#jcbRed)\"\n d=\"m 88,16.2 c -10,0 -18.2,8.1 -18.2,18.2 l 0,23.8 c 4.6,-3.9 12.6,-6.4 25.5,-5.8 6.9,0.3 14.3,2.2 14.3,2.2 l 0,7.7 c -3.7,-1.9 -8.1,-3.6 -13.8,-4 -9.8,-0.7 -15.7,4.1 -15.7,12.5 0,8.5 5.9,13.3 15.7,12.5 5.7,-0.4 10.1,-2.2 13.8,-4 l 0,7.7 c 0,0 -7.3,1.9 -14.3,2.2 -12.9,0.6 -20.9,-1.9 -25.5,-5.8 l 0,42 26.7,0 c 10,0 18.2,-8.1 18.2,-18.2 l 0,-91 -26.7,0 z\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n}\n\n// Diners Club \uB85C\uACE0\nexport function DinersIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 419.87 x 333.3\n const logoWidth = 419.87;\n const logoHeight = 333.3;\n const logoScale = Math.min(\n (CARD_WIDTH * 0.8) / logoWidth,\n (CARD_HEIGHT * 0.8) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n <g transform=\"translate(-180.06, -83.35)\">\n <path\n d=\"m599.93 251.45c0-99.416-82.979-168.13-173.9-168.1h-78.241c-92.003-0.033-167.73 68.705-167.73 168.1 0 90.931 75.729 165.64 167.73 165.2h78.241c90.913 0.437 173.9-74.293 173.9-165.2z\"\n fill=\"#0079BE\"\n />\n <path\n d=\"m348.28 97.432c-84.069 0.026-152.19 68.308-152.22 152.58 0.021 84.258 68.145 152.53 152.22 152.56 84.088-0.025 152.23-68.301 152.24-152.56-0.011-84.274-68.15-152.55-152.24-152.58z\"\n fill=\"#ffffff\"\n />\n <path\n d=\"m252.07 249.6c0.08-41.18 25.747-76.296 61.94-90.25v180.48c-36.193-13.946-61.861-49.044-61.94-90.229zm131 90.275v-180.52c36.208 13.921 61.915 49.057 61.98 90.256-0.066 41.212-25.772 76.322-61.98 90.269z\"\n fill=\"#0079BE\"\n />\n </g>\n </g>\n </svg>\n );\n}\n\n// Discover \uB85C\uACE0\nexport function DiscoverIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // 2\uC904 \uB808\uC774\uC544\uC6C3: Disc + \uB3D9\uADF8\uB77C\uBBF8 / ver\n const logoWidth = 700;\n const logoHeight = 450;\n const logoScale = Math.min(\n (CARD_WIDTH * 0.95) / logoWidth,\n (CARD_HEIGHT * 0.95) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <defs>\n <radialGradient\n id=\"discoverGradient\"\n cx=\"141.25\"\n cy=\"77.588577\"\n r=\"77.916664\"\n fx=\"141.25\"\n fy=\"77.588577\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#f0f0f0\" />\n <stop offset=\"1\" stopColor=\"#ff8330\" />\n </radialGradient>\n </defs>\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n {/* \uCCAB\uBC88\uC9F8 \uC904: Disc + \uC8FC\uD669\uC0C9 \uB3D9\uADF8\uB77C\uBBF8 */}\n <text\n x=\"-9.8425188\"\n y=\"193.30708\"\n fontFamily=\"Verdana, sans-serif\"\n fontWeight=\"700\"\n fontSize=\"220\"\n fill=\"#000000\"\n >\n Disc\n </text>\n <g transform=\"matrix(0.94947156 0 0 0.949483 496.94722 33.627248)\">\n <path\n d=\"m 199.16666,97.588577 a 77.916664,77.916664 0 1 1 -155.833324,0 77.916664,77.916664 0 1 1 155.833324,0 z\"\n transform=\"translate(-25.8333 3.33333)\"\n fill=\"url(#discoverGradient)\"\n />\n </g>\n {/* \uB450\uBC88\uC9F8 \uC904: ver */}\n <text\n x=\"200\"\n y=\"420\"\n fontFamily=\"Verdana, sans-serif\"\n fontWeight=\"700\"\n fontSize=\"220\"\n fill=\"#000000\"\n >\n ver\n </text>\n <text\n x=\"580\"\n y=\"310\"\n fontFamily=\"Bitstream Vera Sans, sans-serif\"\n fontSize=\"40\"\n fill=\"#000000\"\n >\n \u00AE\n </text>\n </g>\n </svg>\n );\n}\n\n// UnionPay \uB85C\uACE0\nexport function UnionPayIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 256 x 160\n const logoWidth = 256;\n const logoHeight = 160;\n const logoScale = Math.min(\n (CARD_WIDTH * 0.8) / logoWidth,\n (CARD_HEIGHT * 0.85) / logoHeight\n );\n const offsetX = (CARD_WIDTH - logoWidth * logoScale) / 2;\n const offsetY = (CARD_HEIGHT - logoHeight * logoScale) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n transform={`translate(${offsetX}, ${offsetY}) scale(${logoScale})`}\n >\n <path\n d=\"M50.041631,0.000667563305 L113.820211,0.000667563305 C122.723127,0.000667563305 128.260438,7.25731345 126.183558,16.1897657 L96.4900715,143.675416 C94.3945365,152.576777 85.480739,159.839641 76.571605,159.839641 L12.7992433,159.839641 C3.908764,159.839641 -1.64098444,152.576777 0.435896208,143.675416 L30.1418186,16.1897657 C32.2186993,7.25731345 41.1278333,0.000667563305 50.041631,0.000667563305\"\n fill=\"#E21836\"\n />\n <path\n d=\"M108.513283,0.000667563305 L181.857018,0.000667563305 C190.758378,0.000667563305 186.744527,7.25731345 184.650546,16.1897657 L154.961724,143.675416 C152.878625,152.576777 153.528427,159.839641 144.608411,159.839641 L71.2646775,159.839641 C62.3446615,159.839641 56.8244495,152.576777 58.919985,143.675416 L88.6072525,16.1897657 C90.715224,7.25731345 99.6057035,0.000667563305 108.513283,0.000667563305\"\n fill=\"#00447C\"\n />\n <path\n d=\"M178.94783,0.000667563305 L242.726409,0.000667563305 C251.641762,0.000667563305 257.179074,7.25731345 255.085093,16.1897657 L225.396271,143.675416 C223.300736,152.576777 214.380719,159.839641 205.466922,159.839641 L141.717879,159.839641 C132.797863,159.839641 127.265215,152.576777 129.354532,143.675416 L159.048017,16.1897657 C161.124899,7.25731345 170.027814,0.000667563305 178.94783,0.000667563305\"\n fill=\"#007B84\"\n />\n <path\n d=\"M66.698338,40.8561434 C60.139686,40.9229891 58.202715,40.8561434 57.5840035,40.7100156 C57.346157,41.8401744 52.920349,62.256098 52.9079125,62.273198 C51.9549725,66.403641 51.261643,69.347961 48.9064975,71.2491775 C47.5695833,72.3544635 46.0088137,72.8876745 44.1993159,72.8876745 C41.2907503,72.8876745 39.5962892,71.4434965 39.3118063,68.704377 L39.2573971,67.7638735 C39.2573971,67.7638735 40.1434913,62.231225 40.1434913,62.200134 C40.1434913,62.200134 44.7884909,43.5952629 45.6201759,41.1359627 C45.6637033,40.9960531 45.6761397,40.9229891 45.6870215,40.8561434 C36.6457507,40.9354255 35.0430082,40.8561434 34.9326351,40.7100156 C34.8720075,40.9105527 34.6481522,42.0640298 34.6481522,42.0640298 L29.9052159,63.0333735 L29.4979234,64.8117805 L28.7097659,70.6289115 C28.7097659,72.3544635 29.0486581,73.762887 29.7233334,74.9536735 C31.8841598,78.729679 38.0479561,79.2955355 41.5348148,79.2955355 C46.0274683,79.2955355 50.241857,78.341041 53.089795,76.598389 C58.0332685,73.677387 59.3266555,69.1116695 60.4801325,65.0542905 L61.014898,62.972746 C61.014898,62.972746 65.7998075,43.6496723 66.6128375,41.1359627 C66.643929,40.9960531 66.656365,40.9229891 66.698338,40.8561434 Z M82.9786885,56.444252 C81.825211,56.444252 79.7172395,56.724071 77.823796,57.6521385 C77.1366845,58.0050215 76.486882,58.412314 75.8013245,58.818052 L76.420036,56.5841615 L76.081144,56.20796 C72.0657375,57.0209905 71.167207,57.129809 67.4580475,57.6521385 L67.147137,57.8588935 C66.7165265,61.4296985 66.3341065,64.1144085 64.7375825,71.133208 C64.129753,73.7199815 63.498605,76.331628 62.8659025,78.912183 L63.036903,79.2401935 C66.8377815,79.0396565 67.9912585,79.0396565 71.29468,79.0940655 L71.562063,78.8033645 C71.981792,76.65342 72.036201,76.1497455 72.965823,71.795447 C73.402652,69.7310025 74.313619,65.1948215 74.7628845,63.579643 C75.588351,63.197223 76.402936,62.8210215 77.1802115,62.8210215 C79.0316825,62.8210215 78.8062725,64.4362005 78.734763,65.079785 C78.655481,66.160198 77.9808055,69.68903 77.2890305,72.7188505 L76.8273285,74.674476 C76.5055365,76.1186545 76.152653,77.522414 75.830861,78.954156 L75.9707705,79.2401935 C79.7172395,79.0396565 80.859835,79.0396565 84.0591015,79.0940655 L84.435303,78.8033645 C85.013596,75.4455335 85.183042,74.547003 86.209046,69.6579385 L86.725157,67.411612 C87.727843,63.0153405 88.2315175,60.786114 87.4728965,58.970398 C86.670748,56.93549 84.7462135,56.444252 82.9786885,56.444252 Z M101.165696,61.047123 C99.1743155,61.429543 97.904247,61.684489 96.6419515,61.8492715 C95.3905375,62.049809 94.1702145,62.2316915 92.24568,62.499074 L92.093334,62.637429 L91.9534245,62.7478025 C91.7528875,64.181099 91.6129775,65.420076 91.3471495,66.876691 C91.1217395,68.383051 90.7750745,70.094612 90.2107725,72.5539125 C89.7739435,74.436474 89.5485335,75.092495 89.299805,75.754734 C89.057295,76.4169725 88.7899125,77.060557 88.298674,78.9120275 L88.413711,79.0830285 L88.510093,79.240038 C90.308709,79.1545375 91.4855045,79.09391 92.6949455,79.0830285 C93.902832,79.039501 95.1542455,79.0830285 97.0912165,79.09391 L97.260663,78.955555 L97.4425455,78.803209 C97.7223645,77.133621 97.7643375,76.6843555 97.935338,75.8697705 C98.104784,74.9961125 98.39704,73.786672 99.113688,70.556314 C99.4525805,69.039072 99.8303365,67.5264935 100.181665,65.97816 C100.546985,64.436045 100.929404,62.9172485 101.293169,61.4000065 L101.23876,61.2165695 L101.165696,61.047123 Z M101.208135,54.841043 C99.3986375,53.7730665 96.222689,54.1119585 94.0851805,55.587228 C91.953891,57.0329605 91.711381,59.0849685 93.5146605,60.166936 C95.293067,61.2053765 98.481452,60.896021 100.600305,59.408315 C102.726932,57.9314915 102.99276,55.898138 101.208135,54.841043 Z M112.151399,79.574733 C115.812368,79.574733 119.565055,78.565829 122.389675,75.571763 C124.562938,73.143554 125.559405,69.5307765 125.904516,68.043071 C127.028457,63.112034 126.153244,60.809743 125.054176,59.407538 C123.384588,57.2700295 120.43405,56.5844725 117.373138,56.5844725 C115.532549,56.5844725 111.148714,56.766355 107.724038,59.923649 C105.264737,62.2010665 104.12836,65.291515 103.442803,68.2544895 C102.751028,71.2734285 101.955097,76.70814 106.95298,78.7306115 C108.495095,79.3928505 110.718104,79.574733 112.151399,79.574733 Z M111.865362,68.4798995 C112.709484,64.7458675 113.705951,61.6118915 116.249197,61.6118915 C118.242132,61.6118915 118.386705,63.943719 117.500611,67.6901875 C117.342047,68.5218725 116.614517,71.6138755 115.630486,72.9305805 C114.943374,73.902175 114.130344,74.49135 113.231813,74.49135 C112.96443,74.49135 111.374124,74.49135 111.349251,72.1299865 C111.336815,70.964073 111.574661,69.7732865 111.865362,68.4798995 Z M135.05616,79.094532 L135.342197,78.803831 C135.747935,76.6538865 135.814781,76.148657 136.713312,71.7959135 C137.162577,69.731469 138.092198,65.195288 138.529028,63.580109 C139.356049,63.196135 140.156643,62.8199335 140.958791,62.8199335 C142.797825,62.8199335 142.57397,64.4351125 142.500907,65.0786965 C142.43406,66.1606645 141.759386,69.6879415 141.055173,72.717762 L140.618345,74.673388 C140.284116,76.1191205 139.920351,77.521326 139.598559,78.9546225 L139.738469,79.24066 C143.497374,79.0401225 144.596441,79.0401225 147.814363,79.094532 L148.203001,78.803831 C148.767303,75.4444455 148.919649,74.5459145 149.976744,69.658405 L150.480419,67.410524 C151.487768,63.0142525 151.99766,60.7865805 151.251476,58.9708645 C150.426009,56.9359565 148.489038,56.4447185 146.746386,56.4447185 C145.591354,56.4447185 143.472501,56.722983 141.589939,57.652605 C140.916819,58.005488 140.242143,58.411226 139.579904,58.8185185 L140.156643,56.584628 L139.847287,56.206872 C135.833436,57.021457 134.91625,57.1302755 131.211754,57.652605 L130.927271,57.85936 C130.478006,61.4301645 130.112686,64.1133205 128.516162,71.1336745 C127.908333,73.720448 127.277185,76.332094 126.646037,78.9126495 L126.815483,79.24066 C130.622579,79.0401225 131.758957,79.0401225 135.05616,79.094532 Z M162.673542,79.2398825 C162.909834,78.0864055 164.313594,71.2494885 164.32603,71.2494885 C164.32603,71.2494885 165.52148,66.232951 165.594545,66.0510685 C165.594545,66.0510685 165.970746,65.5287395 166.346947,65.321984 L166.900367,65.321984 C172.122106,65.321984 178.018519,65.321984 182.6402,61.92218 C185.785058,59.590353 187.935002,56.1470215 188.89416,51.9621695 C189.142889,50.9361655 189.326326,49.7158426 189.326326,48.4955199 C189.326326,46.8927774 189.004534,45.3071349 188.074912,44.0681575 C185.718212,40.770954 181.025022,40.7103265 175.60741,40.6854536 C175.59031,40.6854536 172.93669,40.7103265 172.93669,40.7103265 C166.001837,40.7958268 163.220744,40.770954 162.078149,40.6310444 C161.981767,41.1362735 161.799884,42.0348043 161.799884,42.0348043 C161.799884,42.0348043 159.315711,53.547812 159.315711,53.5664665 C159.315711,53.5664665 153.371107,78.0444325 153.091287,79.1979095 C159.146265,79.124846 161.628884,79.124846 162.673542,79.2398825 Z M167.276569,58.7882045 C167.276569,58.7882045 169.917752,47.2985153 169.905316,47.3420427 L169.990815,46.7528678 L170.028125,46.3036024 L171.083665,46.4124209 C171.083665,46.4124209 176.530813,46.8803409 176.658287,46.8927774 C178.808231,47.7244624 179.694325,49.8681887 179.075614,52.666381 C178.511312,55.223618 176.852606,57.373563 174.721316,58.412003 C172.966227,59.291879 170.816282,59.364943 168.601047,59.364943 L167.167751,59.364943 L167.276569,58.7882045 Z M183.721236,68.692718 C183.023242,71.668129 182.221093,77.102841 187.194103,79.039812 C188.779745,79.714487 190.200605,79.915024 191.644784,79.8419605 C193.169799,79.759569 194.582886,78.99473 195.891818,77.8941075 C195.773673,78.346482 195.655527,78.7988565 195.537381,79.2527855 L195.76279,79.5434865 C199.339813,79.392695 200.449763,79.392695 204.325259,79.4222315 L204.676588,79.1548485 C205.242445,75.8281085 205.775656,72.597751 207.246262,66.2334175 C207.962909,63.184942 208.678003,60.1660035 209.413306,57.1299645 L209.29827,56.795736 C205.296854,57.537257 204.227323,57.6958215 200.378253,58.241469 L200.085998,58.479315 C200.047134,58.788671 200.006716,59.08559 199.969406,59.3825095 C199.370904,58.4155785 198.503465,57.590112 197.164996,57.0755555 C195.453434,56.4024345 191.433365,57.269874 187.977597,60.416286 C185.549388,62.662613 184.383475,65.7406245 183.721236,68.692718 Z M192.12514,68.8746005 C192.981698,65.2074135 193.965729,62.104529 196.515194,62.104529 C198.127263,62.104529 198.976048,63.5922345 198.803493,66.1292625 C198.666693,66.761965 198.51901,67.4288675 198.343345,68.182825 C198.0884,69.2725655 197.811689,70.3529785 197.542752,71.4349465 C197.26915,72.174913 196.950468,72.8729065 196.600694,73.3377175 C195.944673,74.267339 194.383904,74.8440775 193.485373,74.8440775 C193.230426,74.8440775 191.65722,74.8440775 191.602811,72.524687 C191.590374,71.3696555 191.828221,70.1804235 192.12514,68.8746005 Z M236.010903,56.766044 L235.701548,56.413161 C231.742105,57.2153095 231.025456,57.3427825 227.387807,57.834021 L227.120423,58.1014035 C227.107988,58.144931 227.097105,58.211777 227.078451,58.2724045 L227.066014,58.211777 C224.357986,64.459519 224.437268,63.111723 222.232914,68.0303235 C222.220477,67.806468 222.220477,67.6665585 222.208042,67.428712 L221.656175,56.766044 L221.30951,56.413161 C217.161968,57.2153095 217.064031,57.3427825 213.233616,57.834021 L212.935143,58.1014035 C212.893169,58.228877 212.893169,58.3687865 212.868297,58.5211325 L212.893169,58.575542 C213.371971,61.022406 213.256934,60.4767585 213.737291,64.338264 C213.961146,66.233262 214.25962,68.139142 214.483475,70.010822 C214.861232,73.143243 215.072651,74.685358 215.534352,79.4656035 C212.947578,83.7344015 212.335085,85.3495805 209.844694,89.0960495 L209.861794,89.1333585 L208.10826,91.906678 C207.907723,92.198934 207.725841,92.399471 207.470894,92.4849715 C207.191075,92.6233265 206.82731,92.648199 206.32208,92.648199 L205.350486,92.648199 L203.906308,97.451763 L208.860663,97.5372635 C211.769228,97.524827 213.597381,96.1645945 214.581412,94.336442 L217.696733,88.9981125 L217.646987,88.9981125 L217.974998,88.621911 C220.070533,84.110603 236.010903,56.766044 236.010903,56.766044 Z M183.72108,119.853625 L181.619326,119.853625 L189.398302,94.1242455 L191.978857,94.1242455 L192.798105,91.4737355 L192.877387,94.421165 C192.781005,96.243099 194.214302,97.858278 197.979425,97.5908955 L202.333723,97.5908955 L203.832311,92.63654 L202.193814,92.63654 C201.251756,92.63654 200.814927,92.3986935 200.869337,91.888801 L200.790054,88.890071 L192.726596,88.890071 L192.726596,88.9056165 C190.119614,88.960026 182.33442,89.1558995 180.758105,89.5756285 C178.850671,90.0668665 176.840635,91.5125995 176.840635,91.5125995 L177.630347,88.85898 L170.087664,88.85898 L168.516013,94.1242455 L160.632883,120.246927 L159.103204,120.246927 L157.603062,125.165528 L172.626247,125.165528 L172.122572,126.805579 L179.525345,126.805579 L180.016584,125.165528 L182.093465,125.165528 L183.72108,119.853625 Z M177.557284,99.352202 C176.349398,99.6864305 174.101516,100.699998 174.101516,100.699998 L176.100669,94.1242455 L182.093465,94.1242455 L180.647732,98.915373 C180.647732,98.915373 178.796261,99.0241915 177.557284,99.352202 Z M177.672321,108.746356 C177.672321,108.746356 175.789759,108.982648 174.550781,109.262467 C173.330458,109.632451 171.042159,110.798364 171.042159,110.798364 L173.106603,103.955229 L179.13049,103.955229 L177.672321,108.746356 Z M174.31449,119.914253 L168.30304,119.914253 L170.045692,114.139095 L176.038487,114.139095 L174.31449,119.914253 Z M188.791404,103.955229 L197.456474,103.955229 L196.211278,107.987735 L187.431173,107.987735 L186.112912,112.396443 L193.795505,112.396443 L187.978375,120.587374 C187.571082,121.188986 187.205762,121.401959 186.800025,121.571405 C186.392732,121.77816 185.857967,122.02067 185.239255,122.02067 L183.107965,122.02067 L181.643577,126.849107 L187.218198,126.849107 C190.115882,126.849107 191.827443,125.530847 193.091294,123.800631 L197.080273,118.341047 L197.936831,123.884578 C198.118713,124.923017 198.864898,125.530847 199.370127,125.767139 C199.928211,126.046958 200.50495,126.527315 201.319535,126.598824 C202.193192,126.636133 202.82434,126.66567 203.244069,126.66567 L205.983189,126.66567 L207.627904,121.262049 L206.547491,121.262049 C205.927224,121.262049 204.859248,121.157894 204.677366,120.963575 C204.495483,120.727283 204.495483,120.363518 204.397546,119.810098 L203.528552,114.254131 L199.970183,114.254131 L201.530954,112.396443 L210.293959,112.396443 L211.641755,107.987735 L203.528552,107.987735 L204.792402,103.955229 L212.880733,103.955229 L214.380875,98.982219 L190.266674,98.982219 L188.791404,103.955229 Z M115.605924,121.037106 L117.628395,114.309008 L125.940582,114.309008 L127.459378,109.304907 L119.139419,109.304907 L120.409488,105.163582 L128.539791,105.163582 L130.046152,100.318045 L109.703292,100.318045 L108.228023,105.163582 L112.849704,105.163582 L111.616945,109.304907 L106.982827,109.304907 L105.446931,114.394508 L110.067057,114.394508 L107.371465,123.295869 C107.0077,124.474219 107.542466,124.923484 107.881358,125.470686 C108.228023,126.003897 108.579352,126.35678 109.369064,126.557317 C110.183649,126.7392 110.741733,126.848018 111.500354,126.848018 L120.87119,126.848018 L122.540778,121.304488 L118.387016,121.875009 C117.584868,121.875009 115.363414,121.778627 115.605924,121.037106 Z M116.55933,88.8286665 L114.452913,92.635763 C114.002093,93.4674475 113.596355,93.983559 113.231036,94.221405 C112.909244,94.4219425 112.271878,94.505888 111.348474,94.505888 L110.249406,94.505888 L108.780355,99.3762975 L112.430442,99.3762975 C114.18553,99.3762975 115.533326,98.7327135 116.176911,98.410921 C116.868686,98.040938 117.050568,98.252357 117.585334,97.736246 L118.818094,96.668269 L130.216064,96.668269 L131.728643,91.5973225 L123.385365,91.5973225 L124.84198,88.8286665 L116.55933,88.8286665 Z M133.386416,121.134887 C133.192097,120.855067 133.332007,120.362275 133.628926,119.336271 L136.744247,109.024932 L147.826644,109.024932 C149.441823,109.001614 150.607736,108.982959 151.366357,108.92855 C152.180942,108.843049 153.067037,108.552348 154.032413,108.030019 C155.028881,107.482817 155.538773,106.906078 155.969384,106.243839 C156.44974,105.583155 157.220798,104.137422 157.883037,101.908196 L161.798952,88.859291 L150.298381,88.926137 C150.298381,88.926137 146.757113,89.448466 145.197898,90.0252045 C143.624692,90.668789 141.37681,92.4658505 141.37681,92.4658505 L142.415251,88.8888275 L135.31095,88.8888275 L125.364931,121.874854 C125.012048,123.155803 124.775756,124.085425 124.721347,124.643509 C124.702692,125.245121 125.479968,125.840514 125.983643,126.289779 C126.579036,126.739045 127.458911,126.665981 128.303033,126.739045 C129.190682,126.805891 130.452978,126.847863 132.195629,126.847863 L137.655214,126.847863 L139.33102,121.189296 L134.443511,121.650998 C133.921182,121.650998 133.543426,121.371178 133.386416,121.134887 Z M138.754282,102.060541 L150.394763,102.060541 L149.654797,104.379932 C149.550642,104.434341 149.301913,104.264895 148.117345,104.404805 L138.037634,104.404805 L138.754282,102.060541 Z M141.086109,94.2815665 L152.824526,94.2815665 L151.980405,97.075095 C151.980405,97.075095 146.447757,97.020686 145.561663,97.1839135 C141.662847,97.858589 139.38543,99.941688 139.38543,99.941688 L141.086109,94.2815665 Z M149.915339,112.146937 C149.818957,112.493602 149.666611,112.705021 149.453638,112.863585 C149.217345,113.015931 148.834926,113.07034 148.264406,113.07034 L146.605699,113.07034 L146.703636,110.245721 L139.804537,110.245721 L139.524718,124.054801 C139.513836,125.051268 139.610218,125.628007 140.339303,126.089709 C141.068387,126.666447 143.314714,126.739511 146.338316,126.739511 L150.661524,126.739511 L152.222294,121.570628 L148.458724,121.777383 L147.207311,121.850447 C147.03631,121.777383 146.873082,121.710537 146.6912,121.528655 C146.532635,121.371645 146.265253,121.468028 146.30878,120.47156 L146.338316,116.931847 L150.285323,116.768619 C152.416613,116.768619 153.32758,116.075288 154.104855,115.414604 C154.846376,114.781902 155.088886,114.054372 155.368706,113.07034 L156.030945,109.936365 L150.607114,109.936365 L149.915339,112.146937 Z\"\n fill=\"#FEFEFE\"\n />\n </g>\n </svg>\n );\n}\n\n// BC\uCE74\uB4DC \uB85C\uACE0\nexport function BcIcon({ size = 24 }: CardIconProps) {\n const scale = size / 24;\n const width = CARD_WIDTH * scale;\n const height = CARD_HEIGHT * scale;\n // \uC6D0\uBCF8 viewBox: 160.11 x 160.09 (\uC815\uC0AC\uAC01\uD615)\n const logoSize = Math.min(CARD_WIDTH, CARD_HEIGHT) * 0.75;\n const offsetX = (CARD_WIDTH - logoSize) / 2;\n const offsetY = (CARD_HEIGHT - logoSize) / 2;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${CARD_WIDTH} ${CARD_HEIGHT}`}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <svg\n x={offsetX}\n y={offsetY}\n width={logoSize}\n height={logoSize}\n viewBox=\"0 0 160.11065 160.09067\"\n >\n <g transform=\"matrix(1.3333333,0,0,-1.3333333,-218.97066,649.46545)\">\n <g>\n <g>\n <g transform=\"translate(284.311,427.0571)\">\n <path\n d=\"m 0,0 c 0,-33.144 -26.904,-60.026 -60.042,-60.026 -33.158,0 -60.041,26.882 -60.041,60.026 0,33.164 26.883,60.042 60.041,60.042 C -26.904,60.042 0,33.164 0,0\"\n fill=\"#e83e44\"\n />\n </g>\n </g>\n </g>\n <g>\n <g>\n <g transform=\"translate(174.2358,433.7524)\">\n <path\n d=\"M 0,0 C 0,-0.041 0.112,-1.324 0.112,-1.324 0.092,-1.62 0.255,-1.901 0.521,-2.003 0.756,-2.111 1.022,-2.06 1.257,-1.861 3.495,0.02 6.889,1.702 9.618,0.762 11.754,0.02 13.206,-2.183 13.962,-5.796 15.516,-13.37 10.323,-17.02 7.083,-18.506 L 6.971,-18.557 2.82,-20.592 c 0,0 -0.234,-0.101 -0.49,0.021 -0.255,0.133 -0.327,0.297 -0.501,0.746 -2.821,10.411 -3.782,21.348 -2.729,31.559 0.112,0.767 0.46,1.697 1.053,2.454 l 3.485,3.715 0.389,0.424 c 1.891,1.84 3.669,2.76 4.631,2.361 C 9.455,20.351 9.649,19.073 9.659,18.071 9.822,12.644 6.787,7.098 0.429,1.125 0.429,1.125 -0.062,0.726 0,0 m 19.104,7.528 c -1.892,1.13 -4.027,1.451 -6.184,1.139 3.934,4.192 6.072,8.75 6.072,13.35 0,0.419 -0.011,0.838 -0.062,1.268 -0.204,2.861 -1.523,5.008 -3.567,5.734 -2.045,0.766 -5.797,0.378 -11.756,-5.714 L 0.03,19.298 C -0.961,18.092 -4.723,12.399 -5.418,6.47 c -1.165,-10.078 -0.419,-20.136 2.147,-29.054 0.296,-1.042 1.257,-3.558 3.567,-4.489 2.454,-1.001 4.784,0.205 6.849,1.269 l 0.551,0.275 2.126,0.951 2.065,0.91 2.515,1.104 c 1.808,0.736 3.506,1.421 5.161,2.811 2.198,1.876 3.813,4.328 4.641,7.119 0.43,1.441 0.726,3.015 0.879,4.804 0.133,1.39 0.276,4.089 -0.245,6.46 -1.134,5.223 -3.731,7.718 -5.734,8.898\"\n fill=\"#ffffff\"\n />\n </g>\n <g transform=\"translate(240.4609,472.9214)\">\n <path\n d=\"M 0,0 C -1.166,3.996 -3.067,4.834 -3.619,5.019 -8.606,6.613 -13.79,6.94 -18.818,6.062 -26.372,4.671 -32.903,0.706 -37.237,-5.101 c -4.549,-6.107 -6.307,-13.727 -4.958,-21.434 1.37,-7.738 5.275,-14.004 11.346,-18.103 7.114,-4.794 16.579,-6.255 26.699,-4.129 5.979,1.298 10.917,3.623 14.739,6.92 1.707,1.482 2.034,3.368 2.034,4.692 0,0 0.092,1.068 -0.736,4.436 -0.224,0.817 -0.582,1.063 -1.155,1.063 -0.419,0 -0.858,-0.481 -0.94,-0.583 -2.852,-3.302 -7.196,-5.601 -12.624,-6.669 -13.932,-2.678 -24.644,3.827 -27.301,16.584 -1.135,5.525 -0.195,10.824 2.688,14.924 2.893,4.17 7.635,6.93 13.349,7.788 4.354,0.634 8.78,0.098 12.756,-1.564 0,0 1.708,-0.495 1.34,1.176\"\n fill=\"#ffffff\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n </svg>\n );\n}\n", "/**\n * Slider.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport {\n Box,\n FormControl,\n FormLabel,\n Slider as MuiSlider,\n} from \"@mui/material\";\nimport type { SliderProps } from \"./types\";\n\nconst SliderBase = forwardRef<HTMLSpanElement, SliderProps>(function SliderBase(\n { label, name, value, onChange, readonly, disabled, ...props },\n ref,\n) {\n return (\n <FormControl disabled={disabled} sx={{ width: \"100%\" }}>\n {label && <FormLabel>{label}</FormLabel>}\n <Box sx={{ px: 1 }}>\n <MuiSlider\n {...props}\n ref={ref}\n name={name}\n value={value ?? 0}\n onChange={onChange}\n disabled={disabled || readonly}\n />\n </Box>\n </FormControl>\n );\n});\n\nconst SliderWithForm = forwardRef<HTMLSpanElement, SliderProps>(\n function SliderWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"Slider form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"Slider requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const resolvedValue =\n formValue !== undefined && formValue !== null\n ? (formValue as number | number[])\n : (rest.value ?? 0);\n\n const handleFormChange = useCallback(\n (_event: Event, nextValue: number | number[]) => {\n const syntheticEvent = {\n target: {\n name,\n value: nextValue,\n },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n form.handleFormChange(syntheticEvent);\n onChange?.(_event, nextValue);\n },\n [form, name, onChange],\n );\n\n return (\n <SliderBase\n {...rest}\n ref={ref}\n name={name}\n value={resolvedValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const Slider = forwardRef<HTMLSpanElement, SliderProps>(\n function Slider(props, ref) {\n if (props.form) {\n return <SliderWithForm {...props} ref={ref} />;\n }\n\n return <SliderBase {...props} ref={ref} />;\n },\n);\n", "/**\n * Autocomplete.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback } from \"react\";\nimport { Autocomplete as MuiAutocomplete, TextField } from \"@mui/material\";\nimport type { AutocompleteProps, AutocompleteOption } from \"./types\";\n\nconst AutocompleteBase = forwardRef<HTMLDivElement, AutocompleteProps>(\n function AutocompleteBase(\n {\n name,\n label,\n options,\n value,\n onChange,\n fullWidth = true,\n size,\n readonly,\n disabled,\n textFieldProps,\n renderOption,\n ...props\n },\n ref,\n ) {\n const selectedOption =\n value === null || value === undefined\n ? null\n : (options.find((option) => option.value === value) ?? null);\n\n const handleChange = useCallback(\n (\n _event: React.SyntheticEvent,\n option: AutocompleteOption | null,\n ) => {\n onChange?.(option ? option.value : null);\n },\n [onChange],\n );\n\n return (\n <MuiAutocomplete\n {...props}\n ref={ref}\n options={options}\n value={selectedOption}\n onChange={handleChange}\n fullWidth={fullWidth}\n disabled={disabled}\n getOptionLabel={(option) => option.label}\n isOptionEqualToValue={(option, selected) =>\n option.value === selected.value\n }\n renderOption={\n renderOption ??\n ((optionProps, option, state) => {\n const labelText = option.label;\n const query = state.inputValue.trim();\n const lowerLabel = labelText.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerQuery\n ? lowerLabel.indexOf(lowerQuery)\n : -1;\n\n if (matchIndex === -1) {\n return <li {...optionProps}>{labelText}</li>;\n }\n\n const before = labelText.slice(0, matchIndex);\n const match = labelText.slice(\n matchIndex,\n matchIndex + query.length,\n );\n const after = labelText.slice(\n matchIndex + query.length,\n );\n\n return (\n <li {...optionProps}>\n {before}\n <span style={{ color: \"#1976d2\" }}>\n {match}\n </span>\n {after}\n </li>\n );\n })\n }\n renderInput={(params) => (\n <TextField\n {...params}\n {...textFieldProps}\n name={name}\n label={label}\n size={size}\n InputProps={{\n ...params.InputProps,\n ...textFieldProps?.InputProps,\n readOnly: readonly,\n }}\n />\n )}\n />\n );\n },\n);\n\nconst AutocompleteWithForm = forwardRef<HTMLDivElement, AutocompleteProps>(\n function AutocompleteWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"Autocomplete form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"Autocomplete requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as string | number | null;\n const handleFormChange = useCallback(\n (nextValue: string | number | null) => {\n const syntheticEvent = {\n target: {\n name,\n value: nextValue ?? \"\",\n },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n form.handleFormChange(syntheticEvent);\n onChange?.(nextValue);\n },\n [form, name, onChange],\n );\n\n return (\n <AutocompleteBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const Autocomplete = forwardRef<HTMLDivElement, AutocompleteProps>(\n function Autocomplete(props, ref) {\n if (props.form) {\n return <AutocompleteWithForm {...props} ref={ref} />;\n }\n\n return <AutocompleteBase {...props} ref={ref} />;\n },\n);\n", "/**\n * Select.tsx\n *\n * @license MIT\n * @copyright 2025 Kim Young Jin\n * @author Kim Young Jin (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback, useId } from \"react\";\nimport {\n FormControl,\n MenuItem,\n Select as MuiSelect,\n SelectChangeEvent,\n} from \"@mui/material\";\nimport type { SelectProps } from \"./types\";\n\nconst SelectBase = forwardRef<HTMLDivElement, SelectProps>(function SelectBase(\n {\n value = \"\",\n onChange,\n options,\n inputProps,\n enableWheel = false,\n emptyLabel = \"\",\n readOnly = false,\n showEmptyOption = emptyLabel !== \"\",\n fullWidth = true,\n size,\n formControlProps,\n form,\n ...selectProps\n },\n ref,\n) {\n const generatedId = useId();\n const selectId = selectProps.id ?? `select-${generatedId}`;\n\n const hasValue = value !== undefined && value !== null && value !== \"\";\n const safeValue =\n hasValue && options.some((option) => option.value === value)\n ? value\n : \"\";\n\n const handleSelectWheel = useCallback(\n (event: React.WheelEvent) => {\n if (!enableWheel || readOnly) return;\n event.stopPropagation();\n\n const optionValues = [\"\", ...options.map((option) => option.value)];\n const currentIndex = optionValues.indexOf(safeValue);\n if (currentIndex === -1) return;\n\n const nextIndex =\n event.deltaY > 0\n ? Math.min(currentIndex + 1, optionValues.length - 1)\n : Math.max(currentIndex - 1, 0);\n\n if (nextIndex !== currentIndex && onChange) {\n const nextValue = optionValues[nextIndex];\n const syntheticEvent = {\n target: {\n value: nextValue,\n name: selectProps.name ?? \"\",\n },\n } as SelectChangeEvent<string | number>;\n onChange(syntheticEvent);\n }\n },\n [enableWheel, readOnly, options, safeValue, onChange, selectProps],\n );\n\n return (\n <FormControl\n ref={ref}\n fullWidth={fullWidth}\n size={size}\n {...formControlProps}\n sx={{\n minWidth: 0,\n width: fullWidth ? \"100%\" : undefined,\n ...formControlProps?.sx,\n }}\n >\n <MuiSelect\n {...selectProps}\n id={selectId}\n value={safeValue}\n onChange={onChange}\n fullWidth={fullWidth}\n size={size}\n inputProps={{\n ...inputProps,\n readOnly,\n }}\n onWheel={handleSelectWheel}\n displayEmpty={showEmptyOption}\n sx={{\n width: fullWidth ? \"100%\" : undefined,\n minWidth: 0,\n \"& .MuiSelect-select\": {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n ...(readOnly && {\n pointerEvents: \"none\",\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiSelect-icon\": {\n display: \"none\",\n },\n }),\n ...selectProps.sx,\n }}\n renderValue={(selected) => {\n if (selected === \"\") {\n return (\n <span style={{ color: \"#999\" }}>{emptyLabel}</span>\n );\n }\n const option = options.find(\n (opt) => opt.value === selected,\n );\n return (\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {option ? option.label : selected}\n </span>\n );\n }}\n >\n {showEmptyOption && <MenuItem value=\"\">{emptyLabel}</MenuItem>}\n {options.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </MuiSelect>\n </FormControl>\n );\n});\n\nconst SelectWithForm = forwardRef<HTMLDivElement, SelectProps>(\n function SelectWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"Select form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"Select requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as\n | string\n | number\n | undefined;\n const handleFormChange = useCallback(\n (event: SelectChangeEvent<string | number>) => {\n form.handleFormChange(\n event as React.ChangeEvent<HTMLInputElement>,\n );\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <SelectBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n function Select(props, ref) {\n if (props.form) {\n return <SelectWithForm {...props} ref={ref} />;\n }\n\n return <SelectBase {...props} ref={ref} />;\n },\n);\n", "/**\n * LabelSelect.tsx\n *\n * @license MIT\n * @copyright 2025 Kim Young Jin\n * @author Kim Young Jin (ehfuse@gmail.com)\n */\n\nimport React, { forwardRef, useCallback, useId, useState } from \"react\";\nimport {\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n SelectChangeEvent,\n} from \"@mui/material\";\nimport type { LabelSelectProps } from \"./types\";\n\nconst LabelSelectBase = forwardRef<HTMLDivElement, LabelSelectProps>(\n function LabelSelectBase(\n {\n label,\n value = \"\",\n onChange,\n options,\n inputProps,\n enableWheel = false,\n showLabel = true,\n emptyLabel = \"\uC120\uD0DD\uC548\uD568\",\n readOnly = false,\n showEmptyOption = true,\n fullWidth = true,\n size,\n formControlProps,\n form,\n ...selectProps\n },\n ref,\n ) {\n const generatedId = useId();\n const selectId = selectProps.id ?? `label-select-${generatedId}`;\n const labelId = showLabel ? `${selectId}-label` : undefined;\n\n const hasValue = value !== undefined && value !== null && value !== \"\";\n const safeValue =\n hasValue && options.some((option) => option.value === value)\n ? value\n : \"\";\n const [isFocused, setIsFocused] = useState(false);\n const shouldNotch = showLabel && (safeValue !== \"\" || isFocused);\n const displayEmptyValue = showEmptyOption && !showLabel;\n\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n selectProps.onFocus?.(event);\n },\n [selectProps],\n );\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n selectProps.onBlur?.(event);\n },\n [selectProps],\n );\n\n const handleSelectWheel = useCallback(\n (event: React.WheelEvent) => {\n if (!enableWheel || readOnly) return;\n event.stopPropagation();\n\n const optionValues = [\n \"\",\n ...options.map((option) => option.value),\n ];\n const currentIndex = optionValues.indexOf(safeValue);\n if (currentIndex === -1) return;\n\n const nextIndex =\n event.deltaY > 0\n ? Math.min(currentIndex + 1, optionValues.length - 1)\n : Math.max(currentIndex - 1, 0);\n\n if (nextIndex !== currentIndex && onChange) {\n const nextValue = optionValues[nextIndex];\n const syntheticEvent = {\n target: {\n value: nextValue,\n name: selectProps.name ?? \"\",\n },\n } as SelectChangeEvent<string | number>;\n onChange(syntheticEvent);\n }\n },\n [enableWheel, readOnly, options, safeValue, onChange, selectProps],\n );\n\n return (\n <FormControl\n ref={ref}\n fullWidth={fullWidth}\n size={size}\n {...formControlProps}\n sx={{\n minWidth: 0,\n width: fullWidth ? \"100%\" : undefined,\n ...formControlProps?.sx,\n }}\n >\n {showLabel && (\n <InputLabel id={labelId} size={size}>\n {label}\n </InputLabel>\n )}\n <Select\n {...selectProps}\n id={selectId}\n labelId={labelId}\n value={safeValue}\n onChange={onChange}\n fullWidth={fullWidth}\n size={size}\n label={showLabel ? label : undefined}\n notched={shouldNotch}\n inputProps={{\n ...inputProps,\n readOnly,\n }}\n onWheel={handleSelectWheel}\n onFocus={handleFocus}\n onBlur={handleBlur}\n displayEmpty={displayEmptyValue}\n sx={{\n width: fullWidth ? \"100%\" : undefined,\n minWidth: 0,\n \"& .MuiSelect-select\": {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n ...(readOnly && {\n pointerEvents: \"none\",\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiSelect-icon\": {\n display: \"none\",\n },\n }),\n ...selectProps.sx,\n }}\n renderValue={(selected) => {\n if (selected === \"\") {\n return \"\";\n }\n const option = options.find(\n (opt) => opt.value === selected,\n );\n return (\n <span\n style={{\n display: \"block\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {option ? option.label : selected}\n </span>\n );\n }}\n >\n {showEmptyOption && (\n <MenuItem value=\"\">{emptyLabel}</MenuItem>\n )}\n {options.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n },\n);\n\nconst LabelSelectWithForm = forwardRef<HTMLDivElement, LabelSelectProps>(\n function LabelSelectWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"LabelSelect form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"LabelSelect requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as\n | string\n | number\n | undefined;\n const handleFormChange = useCallback(\n (event: SelectChangeEvent<string | number>) => {\n form.handleFormChange(\n event as React.ChangeEvent<HTMLInputElement>,\n );\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <LabelSelectBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const LabelSelect = forwardRef<HTMLDivElement, LabelSelectProps>(\n function LabelSelect(props, ref) {\n if (props.form) {\n return <LabelSelectWithForm {...props} ref={ref} />;\n }\n\n return <LabelSelectBase {...props} ref={ref} />;\n },\n);\n", "/**\n * PhoneTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n ChangeEvent,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { PhoneTextFieldProps } from \"./types\";\nimport { useDebouncedEmit } from \"./hooks\";\nimport { formatPhoneNumber, getPhoneMaxLength } from \"./utils\";\n\nconst PhoneTextFieldBase = forwardRef<HTMLDivElement, PhoneTextFieldProps>(\n function PhoneTextFieldBase(\n {\n label,\n autoFormat = true,\n includeDash = false,\n prefix,\n format,\n onValidationChange,\n invalidBorderColor,\n debounce,\n readonly,\n slotProps,\n sx,\n value,\n onChange,\n onBlur,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n ) {\n const [isInvalid, setIsInvalid] = useState(false);\n const [displayValue, setDisplayValue] = useState(\"\");\n const [prevNumbers, setPrevNumbers] = useState(\"\");\n const [currentMaxLength, setCurrentMaxLength] = useState(13);\n const internalInputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef<number | null>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name: props.name,\n debounce,\n onChange,\n });\n\n // prefix \uD3EC\uB9F7\uD305 (\uC608: \"010\" -> \"010-\")\n const prefixFormatted = prefix ? `${prefix}-` : \"\";\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uC218\uD589\n const performValidation = useCallback(\n (inputValue: string) => {\n const numbers = inputValue.replace(/\\D/g, \"\");\n // \uCD5C\uC18C \uAE38\uC774 \uD310\uB2E8\n let minLength = 10;\n if (/^1[0-9]{3}/.test(numbers)) {\n minLength = 8; // \uC804\uAD6D\uB300\uD45C\uBC88\uD638\n } else if (numbers.startsWith(\"02\")) {\n minLength = 9; // \uC11C\uC6B8\n }\n\n const isComplete = numbers.length >= minLength;\n setIsInvalid(isComplete && numbers.length < minLength);\n\n if (onValidationChange) {\n onValidationChange(isComplete);\n }\n },\n [onValidationChange],\n );\n\n // value \uBCC0\uACBD \uC2DC \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC0F displayValue \uC5C5\uB370\uC774\uD2B8 (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uACBD\uC6B0\uB9CC)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n\n if (prefix && strValue === \"\") {\n if (lastEmittedValue.current !== prefix) {\n setDisplayValue(prefixFormatted);\n setPrevNumbers(prefix);\n lastEmittedValue.current = prefix;\n setCurrentMaxLength(getPhoneMaxLength(prefix));\n performValidation(prefixFormatted);\n }\n return;\n }\n\n // \uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC12\uC774 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB97C \uB54C\uB9CC \uB3D9\uAE30\uD654\n if (strValue === lastEmittedValue.current) {\n return;\n }\n\n // format\uC774 \uC9C0\uC815\uB418\uC5B4 \uC788\uC73C\uBA74 \uD574\uB2F9 format \uC0AC\uC6A9\n let formattedValue = autoFormat\n ? formatPhoneNumber(strValue, format)\n : strValue;\n\n // prefix\uAC00 \uC788\uACE0 \uAC12\uC774 \uBE44\uC5B4\uC788\uC73C\uBA74 prefix\uB85C \uCD08\uAE30\uD654\n if (prefix && !formattedValue) {\n formattedValue = prefixFormatted;\n }\n // prefix\uAC00 \uC788\uC73C\uBA74 \uD56D\uC0C1 prefix\uB85C \uC2DC\uC791\uD558\uB3C4\uB85D\n if (\n prefix &&\n formattedValue &&\n !formattedValue.startsWith(prefixFormatted)\n ) {\n formattedValue =\n prefixFormatted +\n formattedValue.replace(/^\\d{3}-?/, \"\");\n }\n\n setDisplayValue(formattedValue);\n setPrevNumbers(strValue.replace(/\\D/g, \"\"));\n lastEmittedValue.current = strValue;\n\n // maxLength \uC5C5\uB370\uC774\uD2B8\n const numbers = strValue.replace(/\\D/g, \"\");\n setCurrentMaxLength(getPhoneMaxLength(numbers));\n\n performValidation(formattedValue);\n } else if (prefix) {\n // value\uAC00 \uC5C6\uC73C\uBA74 prefix\uB85C \uCD08\uAE30\uD654\n if (lastEmittedValue.current !== prefix) {\n setDisplayValue(prefixFormatted);\n setPrevNumbers(prefix);\n lastEmittedValue.current = prefix;\n }\n } else {\n if (lastEmittedValue.current !== \"\") {\n setDisplayValue(\"\");\n setPrevNumbers(\"\");\n lastEmittedValue.current = \"\";\n }\n }\n }, [\n value,\n autoFormat,\n prefix,\n prefixFormatted,\n performValidation,\n format,\n lastEmittedValue,\n ]);\n\n // \uCEE4\uC11C \uC704\uCE58 \uBCF5\uC6D0 effect\n useEffect(() => {\n if (\n cursorPositionRef.current !== null &&\n internalInputRef.current\n ) {\n const pos = cursorPositionRef.current;\n internalInputRef.current.setSelectionRange(pos, pos);\n cursorPositionRef.current = null;\n }\n }, [displayValue]);\n\n // \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n const newNumbers = newValue.replace(/\\D/g, \"\");\n const cursorPos = e.target.selectionStart ?? newValue.length;\n\n // prefix\uAC00 \uC788\uC744 \uB54C prefix \uC0AD\uC81C \uBC29\uC9C0\n if (prefix) {\n const prefixNumbers = prefix.replace(/\\D/g, \"\");\n // prefix\uBCF4\uB2E4 \uC9E7\uC544\uC9C0\uB824\uACE0 \uD558\uBA74 \uBB34\uC2DC (prefix \uC22B\uC790\uB97C \uC9C0\uC6B0\uB824\uACE0 \uD560 \uB54C)\n if (newNumbers.length < prefixNumbers.length) {\n // \uCEE4\uC11C \uC704\uCE58 \uC720\uC9C0 - \uBC31\uC2A4\uD398\uC774\uC2A4 \uC804 \uC704\uCE58\uB85C \uBCF5\uC6D0\n requestAnimationFrame(() => {\n const originalPos = cursorPos + 1;\n internalInputRef.current?.setSelectionRange(\n originalPos,\n originalPos,\n );\n });\n return;\n }\n // prefix\uAC00 \uC544\uB2CC \uB2E4\uB978 \uBC88\uD638\uB85C \uC2DC\uC791\uD558\uBA74 prefix \uC720\uC9C0\n if (!newNumbers.startsWith(prefixNumbers)) {\n // \uCEE4\uC11C \uC704\uCE58 \uC720\uC9C0 - \uBC31\uC2A4\uD398\uC774\uC2A4 \uC804 \uC704\uCE58\uB85C \uBCF5\uC6D0\n requestAnimationFrame(() => {\n const originalPos = cursorPos + 1;\n internalInputRef.current?.setSelectionRange(\n originalPos,\n originalPos,\n );\n });\n return;\n }\n // prefix + dash \uC0AD\uC81C \uBC29\uC9C0: \"010-\" \uC0C1\uD0DC\uC5D0\uC11C \uBC31\uC2A4\uD398\uC774\uC2A4 \uC2DC \uBB34\uC2DC\n if (\n newNumbers.length === prefixNumbers.length &&\n !newValue.endsWith(\"-\")\n ) {\n // dash\uAC00 \uC9C0\uC6CC\uC84C\uC73C\uBA74 \uB2E4\uC2DC \uCD94\uAC00, \uCEE4\uC11C\uB294 \uBC31\uC2A4\uD398\uC774\uC2A4 \uC804 \uC704\uCE58 (dash \uB4A4 = prefixFormatted.length)\n setDisplayValue(prefixFormatted);\n requestAnimationFrame(() => {\n const originalPos = prefixFormatted.length;\n internalInputRef.current?.setSelectionRange(\n originalPos,\n originalPos,\n );\n });\n return;\n }\n }\n\n // \uBC31\uC2A4\uD398\uC774\uC2A4 \uAC10\uC9C0\n const isBackspace =\n newNumbers.length <= prevNumbers.length &&\n newValue.length < displayValue.length;\n\n let formattedValue: string;\n let deletedDigitIndex = -1;\n let prefixProtected = false; // prefix \uC601\uC5ED \uBCF4\uD638 \uC5EC\uBD80\n\n if (autoFormat) {\n if (isBackspace && newNumbers.length === prevNumbers.length) {\n // dash\uB9CC \uC0AD\uC81C\uB41C \uACBD\uC6B0: \uC22B\uC790\uB3C4 \uD558\uB098 \uC0AD\uC81C\n // \uCEE4\uC11C \uC704\uCE58 \uAE30\uC900\uC73C\uB85C \uC0AD\uC81C\uD560 \uC22B\uC790 \uC704\uCE58 \uACC4\uC0B0\n const numbersBeforeCursor = newValue\n .slice(0, cursorPos)\n .replace(/\\D/g, \"\").length;\n deletedDigitIndex =\n numbersBeforeCursor > 0 ? numbersBeforeCursor - 1 : 0;\n\n let trimmedNumbers: string;\n if (prefix) {\n const prefixNumbers = prefix.replace(/\\D/g, \"\");\n if (deletedDigitIndex < prefixNumbers.length) {\n // prefix \uC601\uC5ED\uC774\uBA74 \uC0AD\uC81C\uD558\uC9C0 \uC54A\uC74C\n trimmedNumbers = newNumbers;\n prefixProtected = true; // prefix \uBCF4\uD638\uB428\n } else {\n // \uD574\uB2F9 \uC704\uCE58\uC758 \uC22B\uC790 \uC0AD\uC81C\n trimmedNumbers =\n newNumbers.slice(0, deletedDigitIndex) +\n newNumbers.slice(deletedDigitIndex + 1);\n if (trimmedNumbers.length < prefixNumbers.length) {\n trimmedNumbers = prefix;\n }\n }\n } else {\n // prefix \uC5C6\uB294 \uACBD\uC6B0\n trimmedNumbers =\n newNumbers.slice(0, deletedDigitIndex) +\n newNumbers.slice(deletedDigitIndex + 1);\n }\n formattedValue = formatPhoneNumber(trimmedNumbers, format);\n } else {\n formattedValue = formatPhoneNumber(newValue, format);\n }\n } else {\n formattedValue = newValue;\n }\n\n // \uCEE4\uC11C \uC704\uCE58 \uACC4\uC0B0\n if (prefixProtected) {\n // prefix \uC601\uC5ED\uC774 \uBCF4\uD638\uB41C \uACBD\uC6B0: \uCEE4\uC11C\uB97C prefix \uBC14\uB85C \uB4A4\uB85C (dash \uB4A4)\n // formattedValue\uAC00 displayValue\uC640 \uAC19\uC73C\uBA74 useEffect\uAC00 \uD2B8\uB9AC\uAC70\uB418\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC9C1\uC811 \uC124\uC815\n if (formattedValue === displayValue) {\n requestAnimationFrame(() => {\n internalInputRef.current?.setSelectionRange(\n prefixFormatted.length,\n prefixFormatted.length,\n );\n });\n } else {\n cursorPositionRef.current = prefixFormatted.length;\n }\n } else if (isBackspace) {\n // \uBC31\uC2A4\uD398\uC774\uC2A4\uC778 \uACBD\uC6B0: \uC0AD\uC81C\uB41C \uC22B\uC790 \uC704\uCE58 \uAE30\uC900\uC73C\uB85C \uCEE4\uC11C \uC704\uCE58 \uACC4\uC0B0\n if (deletedDigitIndex >= 0) {\n // \uC0AD\uC81C\uB41C \uC22B\uC790 \uC55E\uC758 \uC22B\uC790 \uAC1C\uC218\uB97C \uAE30\uC900\uC73C\uB85C \uD3EC\uB9F7\uB41C \uBB38\uC790\uC5F4\uC5D0\uC11C \uC704\uCE58 \uCC3E\uAE30\n let targetPos = 0;\n let digitCount = 0;\n for (let i = 0; i < formattedValue.length; i++) {\n if (digitCount === deletedDigitIndex) {\n targetPos = i;\n break;\n }\n if (/\\d/.test(formattedValue[i])) {\n digitCount++;\n }\n targetPos = i + 1;\n }\n cursorPositionRef.current = targetPos;\n } else {\n // \uC77C\uBC18 \uBC31\uC2A4\uD398\uC774\uC2A4: \uCEE4\uC11C \uC704\uCE58 \uAE30\uC900\uC73C\uB85C \uACC4\uC0B0\n const numbersBeforeCursor = newValue\n .slice(0, cursorPos)\n .replace(/\\D/g, \"\").length;\n let targetPos = 0;\n let digitCount = 0;\n for (\n let i = 0;\n i < formattedValue.length &&\n digitCount < numbersBeforeCursor;\n i++\n ) {\n if (/\\d/.test(formattedValue[i])) {\n digitCount++;\n }\n targetPos = i + 1;\n }\n cursorPositionRef.current = targetPos;\n }\n } else {\n // \uC785\uB825\uC778 \uACBD\uC6B0: \uCEE4\uC11C \uC704\uCE58 \uC55E\uC758 \uC22B\uC790 \uAC1C\uC218 \uAE30\uC900\uC73C\uB85C \uACC4\uC0B0\n const numbersBeforeCursor = newValue\n .slice(0, cursorPos)\n .replace(/\\D/g, \"\").length;\n let targetPos = 0;\n let digitCount = 0;\n for (let i = 0; i < formattedValue.length; i++) {\n if (/\\d/.test(formattedValue[i])) {\n digitCount++;\n }\n if (digitCount === numbersBeforeCursor) {\n targetPos = i + 1;\n break;\n }\n }\n cursorPositionRef.current = targetPos;\n }\n\n setDisplayValue(formattedValue);\n const currentNumbers = formattedValue.replace(/\\D/g, \"\");\n setPrevNumbers(currentNumbers);\n\n // maxLength \uB3D9\uC801 \uC5C5\uB370\uC774\uD2B8\n setCurrentMaxLength(getPhoneMaxLength(currentNumbers));\n\n // onChange\uB85C \uC804\uB2EC\uD560 \uAC12\n const outputValue = includeDash\n ? formattedValue\n : formattedValue.replace(/-/g, \"\");\n\n // \uB514\uBC14\uC6B4\uC2A4 \uC801\uC6A9\n emitChange(e, outputValue);\n };\n\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const outputValue = includeDash\n ? displayValue\n : displayValue.replace(/-/g, \"\");\n flushOnBlur(e, outputValue);\n if (onBlur) {\n onBlur(e);\n }\n };\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uC2E4\uD328 \uC2DC \uD14C\uB450\uB9AC \uC2A4\uD0C0\uC77C (invalidBorderColor\uAC00 \uC124\uC815\uB41C \uACBD\uC6B0\uC5D0\uB9CC)\n const invalidStyles: SxProps<Theme> =\n isInvalid && invalidBorderColor\n ? {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": {\n borderColor: invalidBorderColor,\n },\n \"&:hover fieldset\": {\n borderColor: invalidBorderColor,\n },\n \"&.Mui-focused fieldset\": {\n borderColor: invalidBorderColor,\n },\n },\n \"& .MuiFilledInput-root\": {\n \"&:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:hover:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:after\": {\n borderBottomColor: invalidBorderColor,\n },\n },\n \"& .MuiInput-root\": {\n \"&:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:hover:before\": {\n borderBottomColor: invalidBorderColor,\n },\n \"&:after\": {\n borderBottomColor: invalidBorderColor,\n },\n },\n }\n : {};\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <TextField\n {...props}\n ref={ref}\n inputRef={internalInputRef}\n value={displayValue}\n label={label}\n type=\"tel\"\n onChange={handleChange}\n onBlur={handleBlur}\n autoComplete=\"off\"\n spellCheck=\"false\"\n sx={{\n ...invalidStyles,\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n ...sx,\n }}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n readOnly: readonly,\n },\n htmlInput: {\n ...slotProps?.htmlInput,\n maxLength: currentMaxLength,\n },\n }}\n />\n );\n },\n);\n\nconst PhoneTextFieldWithForm = forwardRef<HTMLDivElement, PhoneTextFieldProps>(\n function PhoneTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"PhoneTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"PhoneTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <PhoneTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const PhoneTextField = forwardRef<HTMLDivElement, PhoneTextFieldProps>(\n function PhoneTextField(props, ref) {\n if (props.form) {\n return <PhoneTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <PhoneTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * AddressTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport {\n IconButton,\n InputAdornment,\n TextField,\n Dialog,\n DialogContent,\n DialogTitle,\n} from \"@mui/material\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport {\n useState,\n useEffect,\n type ChangeEvent,\n useCallback,\n forwardRef,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport DaumPostcode from \"react-daum-postcode\";\nimport type { AddressTextFieldProps, DaumPostcodeData } from \"./types\";\nimport { useDebouncedEmit } from \"./hooks\";\n\nconst AddressTextFieldBase = forwardRef<HTMLDivElement, AddressTextFieldProps>(\n function AddressTextFieldBase(\n {\n value,\n onChange,\n readonly,\n debounce,\n onBlur,\n size,\n spellCheck = false,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n ) {\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n const [address, setAddress] = useState<string>(\n typeof value === \"string\" ? value : \"\",\n );\n const [isPostcodeOpen, setIsPostcodeOpen] = useState(false);\n\n // size\uC5D0 \uB530\uB978 \uC544\uC774\uCF58 \uD06C\uAE30\n const iconSize = size === \"small\" ? 20 : 24;\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name: props.name,\n debounce,\n onChange,\n });\n\n // value prop\uC774 \uBCC0\uACBD\uB420 \uB54C \uB0B4\uBD80 state \uC5C5\uB370\uC774\uD2B8 (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uACBD\uC6B0\uB9CC)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n // \uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC12\uC774 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB97C \uB54C\uB9CC \uB3D9\uAE30\uD654\n if (strValue !== lastEmittedValue.current) {\n setAddress(strValue);\n lastEmittedValue.current = strValue;\n }\n } else if (lastEmittedValue.current !== \"\") {\n setAddress(\"\");\n lastEmittedValue.current = \"\";\n }\n }, [value, lastEmittedValue]);\n\n const handlePostcodeComplete = (data: DaumPostcodeData) => {\n let fullAddress = data.address;\n let extraAddress = \"\";\n\n // \uC0AC\uC6A9\uC790\uAC00 \uC120\uD0DD\uD55C \uC8FC\uC18C \uD0C0\uC785\uC5D0 \uB530\uB77C \uD574\uB2F9 \uC8FC\uC18C \uAC12\uC744 \uAC00\uC838\uC628\uB2E4.\n if (data.addressType === \"R\") {\n // \uB3C4\uB85C\uBA85 \uC8FC\uC18C\uB97C \uC120\uD0DD\uD588\uC744 \uACBD\uC6B0\n if (data.bname !== \"\" && /[\uB3D9|\uB85C|\uAC00]$/g.test(data.bname)) {\n extraAddress += data.bname;\n }\n if (data.buildingName !== \"\" && data.apartment === \"Y\") {\n extraAddress +=\n extraAddress !== \"\"\n ? \", \" + data.buildingName\n : data.buildingName;\n }\n if (extraAddress !== \"\") {\n extraAddress = \" (\" + extraAddress + \")\";\n }\n fullAddress += extraAddress;\n }\n\n // \uC8FC\uC18C \uC124\uC815\n setAddress(fullAddress);\n\n // \uC8FC\uC18C \uBCC0\uACBD \uC774\uBCA4\uD2B8 \uBC1C\uC0DD (\uD31D\uC5C5 \uC120\uD0DD\uC740 \uC989\uC2DC \uD638\uCD9C)\n emitChange(null, fullAddress, true);\n\n // \uD31D\uC5C5 \uB2EB\uAE30\n setIsPostcodeOpen(false);\n };\n\n const handleSearchButtonClick = () => {\n setIsPostcodeOpen(true);\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLInputElement>,\n ) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleSearchButtonClick();\n }\n };\n\n const handlePostcodeClose = () => {\n setIsPostcodeOpen(false);\n };\n\n const onClose = () => {\n setIsPostcodeOpen(false);\n emitChange(null, address as string, true);\n };\n\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n flushOnBlur(e, address as string);\n if (onBlur) {\n onBlur(e);\n }\n };\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <>\n <TextField\n {...props}\n ref={ref}\n inputRef={internalInputRef}\n size={size}\n value={address}\n onChange={\n readonly\n ? undefined\n : (e) => {\n const newValue = e.target.value;\n setAddress(newValue);\n emitChange(\n e as ChangeEvent<HTMLInputElement>,\n newValue,\n );\n }\n }\n autoComplete=\"off\"\n spellCheck={spellCheck}\n onKeyDown={readonly ? undefined : handleKeyDown}\n onBlur={readonly ? undefined : handleBlur}\n sx={{\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n }}\n slotProps={{\n ...props.slotProps,\n input: {\n ...props.slotProps?.input,\n readOnly: readonly,\n endAdornment: readonly ? undefined : (\n <InputAdornment\n position=\"end\"\n sx={{ mr: size === \"small\" ? -0.5 : 0.5 }}\n >\n <IconButton\n onClick={handleSearchButtonClick}\n edge=\"end\"\n aria-label=\"\uC8FC\uC18C \uCC3E\uAE30\"\n size={size}\n >\n <SearchIcon\n sx={{ fontSize: iconSize }}\n />\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n />\n\n <Dialog\n open={isPostcodeOpen}\n onClose={handlePostcodeClose}\n maxWidth=\"sm\"\n fullWidth\n slotProps={{\n paper: {\n sx: { height: \"550px\" },\n },\n }}\n >\n <DialogTitle\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n pr: 2,\n }}\n >\n \uC8FC\uC18C \uAC80\uC0C9\n <IconButton onClick={onClose} size=\"small\">\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent style={{ padding: 0 }} dividers>\n <DaumPostcode\n onComplete={handlePostcodeComplete}\n onClose={handlePostcodeClose}\n defaultQuery={address as string}\n style={{\n width: \"100%\",\n height: \"100%\",\n }}\n />\n </DialogContent>\n </Dialog>\n </>\n );\n },\n);\n\nconst AddressTextFieldWithForm = forwardRef<\n HTMLDivElement,\n AddressTextFieldProps\n>(function AddressTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"AddressTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"AddressTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <AddressTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const AddressTextField = forwardRef<\n HTMLDivElement,\n AddressTextFieldProps\n>(function AddressTextField(props, ref) {\n if (props.form) {\n return <AddressTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <AddressTextFieldBase {...props} ref={ref} />;\n});\n", "/**\n * NumberTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n ChangeEvent,\n forwardRef,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, InputAdornment } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { NumberTextFieldProps } from \"./types\";\nimport { useDebouncedEmit } from \"./hooks\";\nimport { formatNumber, parseNumber } from \"./utils\";\n\nconst NumberTextFieldBase = forwardRef<HTMLDivElement, NumberTextFieldProps>(\n function NumberTextFieldBase(\n {\n label,\n thousandSeparator = true,\n decimalLength,\n decimalFixed = false,\n textAlign = \"right\",\n min = -2000000000,\n max = 2000000000,\n negative = false,\n negativeStyles,\n prefix,\n suffix,\n showSuffix = \"always\",\n selectOnFocus = true,\n debounce,\n readonly,\n slotProps,\n sx,\n value,\n onChange,\n onBlur,\n onFocus,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n ) {\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n const [displayValue, setDisplayValue] = useState(\"\");\n const [isNegative, setIsNegative] = useState(false);\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name: props.name,\n debounce,\n onChange,\n });\n\n // value \uBCC0\uACBD \uC2DC displayValue \uC5C5\uB370\uC774\uD2B8 (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uACBD\uC6B0\uB9CC)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n\n // \uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC12\uC774 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB97C \uB54C\uB9CC \uB3D9\uAE30\uD654\n if (strValue === lastEmittedValue.current) {\n return;\n }\n\n const formattedValue = formatNumber(\n strValue,\n thousandSeparator,\n decimalLength,\n );\n setDisplayValue(formattedValue);\n setIsNegative(\n strValue.startsWith(\"-\") || formattedValue.startsWith(\"-\"),\n );\n lastEmittedValue.current = strValue;\n } else {\n if (lastEmittedValue.current !== \"\") {\n setDisplayValue(\"\");\n setIsNegative(false);\n lastEmittedValue.current = \"\";\n }\n }\n }, [value, thousandSeparator, decimalLength, lastEmittedValue]);\n\n // \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n let newValue = e.target.value;\n\n // \uC74C\uC218 \uD5C8\uC6A9 \uC5EC\uBD80\n if (!negative) {\n newValue = newValue.replace(/-/g, \"\");\n }\n\n // \uCF64\uB9C8 \uC81C\uAC70 \uD6C4 \uC22B\uC790, \uC18C\uC218\uC810, \uB9C8\uC774\uB108\uC2A4\uB9CC \uD5C8\uC6A9\n const withoutComma = newValue.replace(/,/g, \"\");\n if (!/^-?\\d*\\.?\\d*$/.test(withoutComma)) {\n return; // \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uBB38\uC790\uAC00 \uD3EC\uD568\uB41C \uACBD\uC6B0 \uBB34\uC2DC\n }\n\n // \uC810\uC73C\uB85C \uC2DC\uC791\uD558\uBA74 0. \uC73C\uB85C \uBCC0\uD658\n if (withoutComma === \".\") {\n newValue = \"0.\";\n } else if (withoutComma === \"-.\") {\n newValue = \"-0.\";\n } else if (withoutComma.startsWith(\".\")) {\n newValue = \"0\" + withoutComma;\n } else if (withoutComma.startsWith(\"-.\")) {\n newValue = \"-0\" + withoutComma.slice(1);\n }\n\n // max \uCD08\uACFC \uAC80\uC99D (\uC785\uB825 \uC911) - max\uB85C \uBCC0\uD658\n const numValue = parseFloat(withoutComma);\n if (!isNaN(numValue) && max !== undefined && numValue > max) {\n const maxFormatted = formatNumber(\n String(max),\n thousandSeparator,\n decimalLength,\n );\n setDisplayValue(maxFormatted);\n setIsNegative(false);\n\n const emitValue = String(max);\n emitChange(e, emitValue);\n return;\n }\n\n // min \uBBF8\uB9CC \uAC80\uC99D (\uC785\uB825 \uC911, \uC74C\uC218 \uD5C8\uC6A9 \uC2DC) - min\uC73C\uB85C \uBCC0\uD658\n if (!isNaN(numValue) && min !== undefined && numValue < min) {\n const minFormatted = formatNumber(\n String(min),\n thousandSeparator,\n decimalLength,\n );\n setDisplayValue(minFormatted);\n setIsNegative(min < 0);\n\n const emitValue = String(min);\n emitChange(e, emitValue);\n return;\n }\n\n const formattedValue = formatNumber(\n newValue,\n thousandSeparator,\n decimalLength,\n );\n setDisplayValue(formattedValue);\n setIsNegative(formattedValue.startsWith(\"-\"));\n\n // onChange\uB85C \uC804\uB2EC\uD560 \uAC12\uC740 \uCF64\uB9C8 \uC81C\uAC70\uB41C \uC2E4\uC81C \uC22B\uC790\n const numericValue = parseNumber(formattedValue);\n\n emitChange(e, numericValue);\n },\n [thousandSeparator, decimalLength, negative, max, min, emitChange],\n );\n\n // blur \uC2DC min/max \uAC80\uC99D \uBC0F decimalFixed \uC801\uC6A9\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n // \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n const numericValue = parseNumber(displayValue);\n flushOnBlur(e, numericValue);\n\n let num = parseFloat(numericValue);\n\n // \uAC12\uC774 \uC5C6\uC73C\uBA74 decimalFixed \uC801\uC6A9 \uC548\uD568\n if (displayValue === \"\" || displayValue === \"-\") {\n if (onBlur) {\n onBlur(e);\n }\n return;\n }\n\n if (!isNaN(num)) {\n // min/max \uAC80\uC99D\n if (min !== undefined && num < min) {\n num = min;\n }\n if (max !== undefined && num > max) {\n num = max;\n }\n\n // \uC18C\uC218\uC810 \uAE38\uC774 \uB9DE\uCD94\uAE30 (decimalFixed \uB610\uB294 decimalLength)\n let finalValue: string;\n if (decimalFixed && decimalLength !== undefined) {\n finalValue = num.toFixed(decimalLength);\n } else if (decimalLength !== undefined) {\n // decimalLength\uB9CC \uC788\uC744 \uB54C\uB294 \uCD08\uACFC\uBD84\uB9CC \uC790\uB974\uACE0 \uACE0\uC815\uD558\uC9C0 \uC54A\uC74C\n finalValue = String(num);\n } else {\n finalValue = String(num);\n }\n\n const formattedValue = formatNumber(\n finalValue,\n thousandSeparator,\n decimalLength,\n );\n setDisplayValue(formattedValue);\n\n // onChange \uD638\uCD9C (\uAC12\uC774 \uBCC0\uACBD\uB418\uC5C8\uC744 \uB54C\uB9CC)\n if (finalValue !== lastEmittedValue.current) {\n emitChange(e, finalValue, true);\n }\n }\n\n if (onBlur) {\n onBlur(e);\n }\n },\n [\n displayValue,\n min,\n max,\n decimalLength,\n decimalFixed,\n thousandSeparator,\n flushOnBlur,\n emitChange,\n lastEmittedValue,\n onBlur,\n ],\n );\n\n // \uD14D\uC2A4\uD2B8 \uC815\uB82C \uBC0F \uC74C\uC218 \uC2A4\uD0C0\uC77C\n const inputStyles: SxProps<Theme> = {\n \"& .MuiInputBase-input\": {\n textAlign: textAlign,\n ...(isNegative && negativeStyles ? negativeStyles : {}),\n },\n };\n\n // \uD3EC\uCEE4\uC2A4 \uD578\uB4E4\uB7EC (selectOnFocus)\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (selectOnFocus) {\n e.target.select();\n }\n if (onFocus) {\n onFocus(e);\n }\n },\n [selectOnFocus, onFocus],\n );\n\n // readonly\uC77C \uB54C \uD3EC\uCEE4\uC2A4 \uC2A4\uD0C0\uC77C \uC81C\uAC70\n const readonlyStyles = readonly\n ? {\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n return (\n <TextField\n {...props}\n ref={ref}\n inputRef={internalInputRef}\n value={displayValue}\n label={label}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n autoComplete=\"off\"\n spellCheck=\"false\"\n sx={{\n ...inputStyles,\n ...readonlyStyles,\n ...(readonly && { pointerEvents: \"none\" }),\n ...sx,\n }}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n readOnly: readonly,\n startAdornment: prefix ? (\n <InputAdornment position=\"start\">\n {prefix}\n </InputAdornment>\n ) : undefined,\n endAdornment:\n suffix &&\n (showSuffix === \"always\" || displayValue) ? (\n <InputAdornment position=\"end\">\n {suffix}\n </InputAdornment>\n ) : undefined,\n },\n htmlInput: {\n ...slotProps?.htmlInput,\n inputMode: \"decimal\",\n },\n }}\n />\n );\n },\n);\n\nconst NumberTextFieldWithForm = forwardRef<\n HTMLDivElement,\n NumberTextFieldProps\n>(function NumberTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"NumberTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"NumberTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <NumberTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const NumberTextField = forwardRef<HTMLDivElement, NumberTextFieldProps>(\n function NumberTextField(props, ref) {\n if (props.form) {\n return <NumberTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <NumberTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * JuminTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n ChangeEvent,\n KeyboardEvent,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, Box } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { GroupedInputWrapper } from \"./components\";\nimport type { JuminInfo, JuminTextFieldProps } from \"./types\";\nimport { DashIcon } from \"./icons\";\nimport {\n extractJuminInfo,\n validateJuminChecksum,\n validateJuminBirthDate,\n} from \"./utils\";\n\nconst JuminTextFieldBase = forwardRef<HTMLDivElement, JuminTextFieldProps>(\n function JuminTextFieldBase(\n {\n label,\n mask = true,\n maskColor = \"rgba(0, 0, 0, 0.7)\",\n validateChecksum = true,\n fontSize,\n fontColor,\n fontFamily,\n onChange,\n onValidationChange,\n invalidBorderColor,\n debounce,\n readonly,\n sx,\n value,\n size,\n disabled,\n fullWidth = false,\n className,\n id,\n ...props\n },\n ref,\n ) {\n const [frontValue, setFrontValue] = useState(\"\"); // \uC55E 6\uC790\uB9AC\n const [backValue, setBackValue] = useState(\"\"); // \uB4A4 7\uC790\uB9AC (\uC2E4\uC81C \uAC12)\n const [isInvalid, setIsInvalid] = useState(false);\n const [isInternalChange, setIsInternalChange] = useState(false); // \uB0B4\uBD80 \uBCC0\uACBD \uD50C\uB798\uADF8\n const [focusedField, setFocusedField] = useState<\n \"front\" | \"back\" | null\n >(null);\n const [cursorVisible, setCursorVisible] = useState(false); // \uCEE4\uC11C \uD45C\uC2DC \uC5EC\uBD80\n const [renderTrigger, setRenderTrigger] = useState(0); // \uB80C\uB354\uB9C1 \uD2B8\uB9AC\uAC70\n const [backComplete, setBackComplete] = useState(false); // \uB4B7\uC790\uB9AC \uC785\uB825 \uC644\uB8CC (\uCEE4\uC11C \uC228\uAE40\uC6A9)\n\n const frontRef = useRef<HTMLInputElement>(null);\n const backRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const isClickFocusRef = useRef(false); // \uD074\uB9AD\uC73C\uB85C \uC778\uD55C \uD3EC\uCEE4\uC2A4\uC778\uC9C0 \uAD6C\uBD84\n const cursorPosRef = useRef(0); // \uCEE4\uC11C \uC704\uCE58 (ref\uB85C \uC989\uC2DC \uBC18\uC601)\n\n // \uC678\uBD80 ref\uC640 \uB0B4\uBD80 containerRef \uBCD1\uD569\n useImperativeHandle(ref, () => containerRef.current!, []);\n\n // \uB514\uBC14\uC6B4\uC2A4 \uD0C0\uC774\uBA38\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n // \uD0C0\uC774\uBA38 \uC815\uB9AC\n useEffect(() => {\n return () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n };\n }, []);\n\n // value prop \uBCC0\uACBD \uC2DC \uB0B4\uBD80 \uC0C1\uD0DC \uB3D9\uAE30\uD654 (\uC678\uBD80 \uBCC0\uACBD\uC77C \uB54C\uB9CC)\n useEffect(() => {\n // \uB0B4\uBD80 \uBCC0\uACBD\uC774\uBA74 \uB3D9\uAE30\uD654 \uC2A4\uD0B5\n if (isInternalChange) {\n setIsInternalChange(false);\n return;\n }\n\n if (value !== undefined && value !== null) {\n const numbers = String(value).replace(/\\D/g, \"\");\n setFrontValue(numbers.slice(0, 6));\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uB4B7\uC790\uB9AC 1\uAE00\uC790\uB9CC \uC800\uC7A5\n if (mask) {\n setBackValue(numbers.slice(6, 7));\n } else {\n setBackValue(numbers.slice(6, 13));\n }\n } else {\n setFrontValue(\"\");\n setBackValue(\"\");\n }\n }, [value, mask]);\n\n // \uB9C8\uC2A4\uD0B9\uB41C \uB4B7\uC790\uB9AC \uD45C\uC2DC\uAC12\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: 1\uAE00\uC790\uB9CC \uD45C\uC2DC\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uC804\uCCB4 \uD45C\uC2DC\n const displayBackValue = mask ? backValue.slice(0, 1) : backValue;\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC0F onChange \uD638\uCD9C\n const emitChange = useCallback(\n (front: string, back: string) => {\n const fullValue = front + back;\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: 7\uC790\uB9AC(6+1) \uC644\uC131, \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: 13\uC790\uB9AC \uC644\uC131\n const completeLength = mask ? 7 : 13;\n const isLengthComplete = fullValue.length === completeLength;\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC:\n // - \uC0DD\uB144\uC6D4\uC77C \uC720\uD6A8\uC131\uC740 \uD56D\uC0C1 \uAC80\uC0AC\n // - \uCCB4\uD06C\uC12C \uAC80\uC99D\uC740 \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC + validateChecksum=true\uC77C \uB54C\uB9CC\n let isValid = false;\n if (mask) {\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: 7\uC790\uB9AC \uC644\uC131 + \uC0DD\uB144\uC6D4\uC77C \uC720\uD6A8\uC131\n isValid =\n isLengthComplete && validateJuminBirthDate(fullValue);\n } else {\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: 13\uC790\uB9AC \uC644\uC131 + \uC0DD\uB144\uC6D4\uC77C \uC720\uD6A8\uC131 + (\uC635\uC158) \uCCB4\uD06C\uC12C \uAC80\uC99D\n isValid =\n isLengthComplete &&\n validateJuminBirthDate(fullValue) &&\n (validateChecksum\n ? validateJuminChecksum(fullValue)\n : true);\n }\n\n setIsInvalid(fullValue.length > 0 && !isValid);\n\n if (onValidationChange) {\n onValidationChange(isValid);\n }\n\n const doEmit = () => {\n if (onChange) {\n setIsInternalChange(true); // \uB0B4\uBD80 \uBCC0\uACBD \uD50C\uB798\uADF8 \uC124\uC815\n const info = extractJuminInfo(fullValue);\n onChange({ ...info, isValid });\n }\n };\n\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n if (debounce === undefined || debounce === 0) {\n doEmit();\n } else {\n debounceTimer.current = setTimeout(doEmit, debounce);\n }\n },\n [onChange, onValidationChange, mask, validateChecksum, debounce],\n );\n\n // \uC55E\uC790\uB9AC \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleFrontChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const numbers = e.target.value.replace(/\\D/g, \"\").slice(0, 6);\n setFrontValue(numbers);\n cursorPosRef.current = numbers.length;\n setCursorVisible(true); // \uC785\uB825 \uC2DC \uCEE4\uC11C \uD45C\uC2DC\n setRenderTrigger((r) => r + 1);\n\n // 6\uC790\uB9AC \uC785\uB825 \uC644\uB8CC \uC2DC \uB4B7\uC790\uB9AC\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9\n if (numbers.length === 6) {\n setTimeout(() => {\n const input = backRef.current;\n if (input) {\n input.focus();\n const len = mask ? 0 : input.value.length;\n input.setSelectionRange(len, len);\n cursorPosRef.current = len;\n setFocusedField(\"back\");\n setCursorVisible(true);\n }\n }, 0);\n }\n\n emitChange(numbers, backValue);\n },\n [backValue, emitChange, mask],\n );\n\n // \uC55E\uC790\uB9AC \uD3EC\uCEE4\uC2A4 \uD578\uB4E4\uB7EC\n const handleFrontFocus = useCallback(() => {\n // \uD074\uB9AD\uC73C\uB85C \uC778\uD55C \uD3EC\uCEE4\uC2A4\uBA74 \uD074\uB9AD \uD578\uB4E4\uB7EC\uC5D0\uC11C \uC804\uCCB4 \uC120\uD0DD \uCC98\uB9AC\n if (isClickFocusRef.current) {\n isClickFocusRef.current = false;\n setFocusedField(\"front\");\n // \uAC12\uC774 \uC788\uC73C\uBA74 \uC804\uCCB4 \uC120\uD0DD\n if (frontRef.current && frontValue.length > 0) {\n setTimeout(() => {\n frontRef.current?.setSelectionRange(\n 0,\n frontValue.length,\n );\n }, 0);\n setCursorVisible(false);\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n return;\n }\n // \uD0ED \uB4F1 \uC77C\uBC18 \uD3EC\uCEE4\uC2A4\uB3C4 \uC804\uCCB4 \uC120\uD0DD\n setFocusedField(\"front\");\n if (frontRef.current && frontValue.length > 0) {\n setTimeout(() => {\n frontRef.current?.setSelectionRange(0, frontValue.length);\n }, 0);\n setCursorVisible(false);\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n }, [frontValue.length]);\n\n // \uC55E\uC790\uB9AC \uBE14\uB7EC \uD578\uB4E4\uB7EC\n const handleFrontBlur = useCallback(() => {\n setCursorVisible(false);\n setTimeout(() => {\n const activeElement = document.activeElement;\n if (\n activeElement !== frontRef.current &&\n activeElement !== backRef.current\n ) {\n setFocusedField(null);\n }\n }, 0);\n }, []);\n\n // \uC55E\uC790\uB9AC \uD0A4\uBCF4\uB4DC \uD578\uB4E4\uB7EC\n const handleFrontKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n const input = frontRef.current;\n const pos = input?.selectionStart ?? 0;\n\n if (e.key === \"ArrowLeft\") {\n if (pos > 0) {\n e.preventDefault();\n const newPos = pos - 1;\n input?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n }\n } else if (e.key === \"ArrowRight\") {\n // 6\uC790\uB9AC \uC644\uC131 \uD6C4 \uB9C8\uC9C0\uB9C9 \uAE00\uC790\uC5D0\uC11C \uC624\uB978\uCABD \uB204\uB974\uBA74 \uBC14\uB85C \uB4B7\uC790\uB9AC\uB85C \uC774\uB3D9\n if (\n frontValue.length === 6 &&\n pos >= frontValue.length - 1\n ) {\n e.preventDefault();\n cursorPosRef.current = 0;\n setFocusedField(\"back\");\n backRef.current?.focus();\n backRef.current?.setSelectionRange(0, 0);\n } else if (pos < frontValue.length) {\n e.preventDefault();\n const newPos = pos + 1;\n input?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n }\n } else if (e.key === \"Backspace\") {\n if (pos > 0) {\n e.preventDefault();\n // \uD604\uC7AC \uC704\uCE58 \uC55E\uC758 \uBB38\uC790\uB97C \uC0AD\uC81C\n const newValue =\n frontValue.slice(0, pos - 1) +\n frontValue.slice(pos);\n setFrontValue(newValue);\n const newPos = pos - 1;\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n setTimeout(() => {\n input?.setSelectionRange(newPos, newPos);\n }, 0);\n emitChange(newValue, backValue);\n }\n }\n },\n [frontValue, backValue, emitChange],\n );\n\n // \uB4B7\uC790\uB9AC \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleBackChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (mask) {\n const inputVal = e.target.value.replace(/[\u25CF]/g, \"\");\n const numbers = inputVal.replace(/\\D/g, \"\").slice(0, 1);\n setBackValue(numbers);\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: 1\uAE00\uC790 \uC785\uB825 \uC644\uB8CC \uC2DC \uCEE4\uC11C\uB97C \uC67C\uCABD(0)\uC5D0 \uC704\uCE58\uD558\uACE0 \uCEE4\uC11C \uC228\uAE40\n cursorPosRef.current = 0;\n if (numbers.length === 1) {\n setBackComplete(true); // \uC785\uB825 \uC644\uB8CC \uC2DC \uCEE4\uC11C \uC228\uAE40\n } else {\n setCursorVisible(true); // \uC785\uB825 \uC911 \uCEE4\uC11C \uD45C\uC2DC\n }\n setTimeout(() => {\n backRef.current?.setSelectionRange(0, 0);\n }, 0);\n emitChange(frontValue, numbers);\n } else {\n const numbers = e.target.value\n .replace(/\\D/g, \"\")\n .slice(0, 7);\n setBackValue(numbers);\n cursorPosRef.current = numbers.length;\n setCursorVisible(true); // \uC785\uB825 \uC2DC \uCEE4\uC11C \uD45C\uC2DC\n if (numbers.length === 7) {\n setBackComplete(true); // 7\uC790\uB9AC \uC644\uB8CC \uC2DC \uCEE4\uC11C \uC228\uAE40\n } else {\n setBackComplete(false);\n }\n setRenderTrigger((r) => r + 1);\n emitChange(frontValue, numbers);\n }\n },\n [frontValue, emitChange, mask],\n );\n\n // \uB4B7\uC790\uB9AC \uD0A4\uBCF4\uB4DC \uD578\uB4E4\uB7EC\n const handleBackKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n const input = backRef.current;\n const pos = input?.selectionStart ?? 0;\n const valLen = mask\n ? displayBackValue.length\n : backValue.length;\n\n if (e.key === \"ArrowLeft\") {\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uBC14\uB85C \uC55E\uC790\uB9AC\uB85C \uC774\uB3D9\n if (mask || pos === 0) {\n e.preventDefault();\n frontRef.current?.focus();\n // \uC55E\uC790\uB9AC \uB9C8\uC9C0\uB9C9 \uAE00\uC790 '\uC544\uB798'\uB85C \uCEE4\uC11C \uC704\uCE58 (len - 1)\n const len = frontValue.length;\n const newPos = len > 0 ? len - 1 : 0;\n frontRef.current?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n } else if (pos > 0) {\n e.preventDefault();\n const newPos = pos - 1;\n input?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n }\n } else if (e.key === \"ArrowRight\") {\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C\uB294 1\uAE00\uC790 \uC774\uC0C1 \uC624\uB978\uCABD\uC73C\uB85C \uAC00\uBA74 \uC548 \uB428\n if (pos < valLen) {\n e.preventDefault();\n const newPos = pos + 1;\n input?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n }\n // pos >= valLen\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uC548 \uD568 (\uB354 \uC774\uC0C1 \uC624\uB978\uCABD\uC73C\uB85C \uAC08 \uC218 \uC5C6\uC74C)\n } else if (e.key === \"Backspace\") {\n if (mask) {\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uB4B7\uC790\uB9AC \uAC12\uC774 \uC788\uC73C\uBA74 \uC0AD\uC81C, \uC5C6\uC73C\uBA74 \uC55E\uC790\uB9AC\uB85C \uC774\uB3D9\n e.preventDefault();\n if (backValue.length > 0) {\n setBackValue(\"\");\n setBackComplete(false);\n cursorPosRef.current = 0;\n setRenderTrigger((r) => r + 1);\n emitChange(frontValue, \"\");\n } else if (frontValue.length > 0) {\n const newFrontValue = frontValue.slice(0, -1);\n setFrontValue(newFrontValue);\n cursorPosRef.current = newFrontValue.length;\n setRenderTrigger((r) => r + 1);\n emitChange(newFrontValue, \"\");\n frontRef.current?.focus();\n setTimeout(() => {\n const len = frontRef.current?.value.length || 0;\n frontRef.current?.setSelectionRange(len, len);\n }, 0);\n }\n } else if (pos === 0 && backValue === \"\") {\n e.preventDefault();\n if (frontValue.length > 0) {\n const newFrontValue = frontValue.slice(0, -1);\n setFrontValue(newFrontValue);\n cursorPosRef.current = newFrontValue.length;\n emitChange(newFrontValue, backValue);\n }\n frontRef.current?.focus();\n setTimeout(() => {\n const len = frontRef.current?.value.length || 0;\n frontRef.current?.setSelectionRange(len, len);\n cursorPosRef.current = len;\n setRenderTrigger((r) => r + 1);\n }, 0);\n } else if (!mask && pos > 0) {\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uC911\uAC04\uC5D0\uC11C Backspace \uCC98\uB9AC\n e.preventDefault();\n const newBackValue =\n backValue.slice(0, pos - 1) + backValue.slice(pos);\n setBackValue(newBackValue);\n const newPos = pos - 1;\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n emitChange(frontValue, newBackValue);\n setTimeout(() => {\n input?.setSelectionRange(newPos, newPos);\n }, 0);\n } else if (!mask && pos === 0 && backValue.length > 0) {\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uB9E8 \uC55E\uC5D0\uC11C Backspace - \uC55E\uC790\uB9AC\uB85C \uC774\uB3D9\n e.preventDefault();\n frontRef.current?.focus();\n const len = frontValue.length;\n const newPos = len > 0 ? len - 1 : 0;\n frontRef.current?.setSelectionRange(newPos, newPos);\n cursorPosRef.current = newPos;\n setRenderTrigger((r) => r + 1);\n }\n }\n },\n [backValue, frontValue, displayBackValue, mask, emitChange],\n );\n\n // \uB4B7\uC790\uB9AC \uD3EC\uCEE4\uC2A4 \uD578\uB4E4\uB7EC\n const handleBackFocus = useCallback(() => {\n // \uD074\uB9AD \uB610\uB294 \uD0ED\uC73C\uB85C \uD3EC\uCEE4\uC2A4 - \uC804\uCCB4 \uC120\uD0DD\n isClickFocusRef.current = false;\n setFocusedField(\"back\");\n setCursorVisible(false); // \uC804\uCCB4 \uC120\uD0DD \uC2DC \uCEE4\uC11C \uC228\uAE40\n\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uAC12\uC774 \uC788\uC73C\uBA74 \uC804\uCCB4 \uC120\uD0DD\n if (mask) {\n if (backValue.length > 0) {\n // \uC0C1\uD0DC \uBCC0\uACBD \uD6C4 \uB9AC\uB80C\uB354\uB9C1\uC774 \uC644\uB8CC\uB41C \uB2E4\uC74C\uC5D0 \uC120\uD0DD \uC801\uC6A9\n requestAnimationFrame(() => {\n backRef.current?.setSelectionRange(0, 1);\n });\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n } else {\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uAC12\uC774 \uC788\uC73C\uBA74 \uC804\uCCB4 \uC120\uD0DD\n if (backValue.length > 0) {\n requestAnimationFrame(() => {\n backRef.current?.setSelectionRange(0, backValue.length);\n });\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n }\n }, [backValue.length, mask]);\n\n // \uB4B7\uC790\uB9AC \uBE14\uB7EC \uD578\uB4E4\uB7EC\n const handleBackBlur = useCallback(() => {\n setCursorVisible(false);\n setTimeout(() => {\n const activeElement = document.activeElement;\n if (\n activeElement !== frontRef.current &&\n activeElement !== backRef.current\n ) {\n setFocusedField(null);\n }\n }, 0);\n }, []);\n\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C placeholder \uB3D9\uADF8\uB77C\uBBF8 \uAC1C\uC218 (\uCCAB\uBC88\uC9F8 \uC785\uB825\uCE78 + 6\uAC1C = 7\uAC1C \uACE0\uC815)\n const placeholderDots = mask ? 7 : 0;\n\n // \uD3F0\uD2B8 \uD06C\uAE30 \uACC4\uC0B0 (\uAE30\uBCF8\uAC12: small=16px, medium=18px)\n const defaultFontSize = size === \"small\" ? 16 : 18;\n const computedFontSize = fontSize\n ? typeof fontSize === \"number\"\n ? fontSize\n : parseFloat(fontSize) *\n (fontSize.toString().includes(\"rem\") ? 16 : 1)\n : defaultFontSize;\n\n // \uD14D\uC2A4\uD2B8 \uB108\uBE44 \uCE21\uC815 \uD568\uC218\n const measureTextWidth = useCallback(\n (text: string): number => {\n if (typeof document === \"undefined\")\n return text.length * computedFontSize * 0.6;\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return text.length * computedFontSize * 0.6;\n ctx.font = `${computedFontSize}px ${\n fontFamily || \"Roboto, sans-serif\"\n }`;\n return ctx.measureText(text).width;\n },\n [computedFontSize, fontFamily],\n );\n\n // \uB3D9\uADF8\uB77C\uBBF8 \uD06C\uAE30: \uD3F0\uD2B8 \uD06C\uAE30\uC5D0 \uBE44\uB840\n const dotSize = Math.round(computedFontSize * 0.5); // \uCCAB \uBC88\uC9F8 \uB3D9\uADF8\uB77C\uBBF8 (\uC785\uB825 \uC704\uCE58)\n const smallDotSize = Math.round(computedFontSize * 0.35); // \uB4A4 6\uAC1C \uB3D9\uADF8\uB77C\uBBF8\n\n // \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C \uD06C\uAE30\n const cursorHeight = \"1px\";\n\n // \uCEE4\uC11C \uC704\uCE58 \uACC4\uC0B0 \uACF5\uC6A9 \uD568\uC218\n const getCursorLeft = useCallback(\n (field: \"front\" | \"back\") => {\n if (field === \"front\") {\n const textBeforeCursor = frontValue.slice(\n 0,\n cursorPosRef.current,\n );\n return measureTextWidth(textBeforeCursor);\n } else {\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C \uAC12\uC774 \uC5C6\uC744 \uB54C\uB294 \uCCAB \uBC88\uC9F8 \uB3D9\uADF8\uB77C\uBBF8 \uC544\uB798\uC5D0 \uCEE4\uC11C \uC704\uCE58\n if (mask && displayBackValue.length === 0) {\n return dotSize / 2 - (computedFontSize * 0.55) / 2;\n }\n const textBeforeCursor = displayBackValue.slice(\n 0,\n cursorPosRef.current,\n );\n return measureTextWidth(textBeforeCursor);\n }\n },\n [\n frontValue,\n displayBackValue,\n mask,\n dotSize,\n computedFontSize,\n measureTextWidth,\n ],\n );\n\n // \uCEE4\uC11C \uC704\uCE58 (\uB80C\uB354\uB9C1 \uC2DC\uC810\uC5D0 \uACC4\uC0B0)\n const cursorLeft = useMemo(() => {\n if (!focusedField) return 0;\n return getCursorLeft(focusedField);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusedField, cursorVisible, renderTrigger, getCursorLeft]);\n\n // \uD544\uB4DC \uB108\uBE44: ch \uB2E8\uC704 \uC0AC\uC6A9 (\uD3F0\uD2B8 \uD06C\uAE30\uC5D0 \uC790\uB3D9 \uBE44\uB840)\n const frontFieldCh = \"6.2ch\"; // 6\uC790\uB9AC + \uCD5C\uC18C \uC5EC\uC720\n const backFieldCh = mask ? \"8.5ch\" : \"7.5ch\"; // \uB9C8\uC2A4\uD0B9: \uC801\uC808\uD55C \uAC04\uACA9, \uBE44\uB9C8\uC2A4\uD0B9: 7\uC790\uB9AC\n\n // \uAC1C\uBCC4 TextField\uC5D0\uC11C border \uC81C\uAC70\uD558\uB294 \uC2A4\uD0C0\uC77C\n const noBorderStyle: SxProps<Theme> = {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": {\n border: \"none\",\n },\n \"&:hover fieldset\": {\n border: \"none\",\n },\n \"&.Mui-focused fieldset\": {\n border: \"none\",\n },\n },\n };\n\n // \uC804\uCCB4 \uC8FC\uBBFC\uBC88\uD638 \uAC12 \uAC00\uC838\uC624\uAE30\n const getFullNumber = () => frontValue + backValue;\n\n // \uADF8\uB8F9 \uC785\uB825 \uB0B4\uBD80 \uCEF4\uD3EC\uB10C\uD2B8 \uB80C\uB354\uB9C1\n const renderGroupedInput = () => (\n <>\n <Box\n onClick={() => {\n if (disabled || readonly) return;\n isClickFocusRef.current = true;\n setBackComplete(false);\n\n // \uCCAB \uBC88\uC9F8 \uBE48 \uCE78 \uCC3E\uAE30, \uC5C6\uC73C\uBA74 \uB9C8\uC9C0\uB9C9 \uCE78 \uC120\uD0DD\n const hasFrontValue = frontValue.length > 0;\n const hasBackValue = backValue.length > 0;\n\n if (!hasFrontValue) {\n // \uC55E\uCE78\uC774 \uBE44\uC5B4\uC788\uC73C\uBA74 \uC55E\uCE78 \uD3EC\uCEE4\uC2A4\n setFocusedField(\"front\");\n frontRef.current?.focus();\n cursorPosRef.current = 0;\n setCursorVisible(true);\n } else if (!hasBackValue) {\n // \uC55E\uCE78\uC740 \uC788\uACE0 \uB4B7\uCE78\uC774 \uBE44\uC5B4\uC788\uC73C\uBA74 \uB4B7\uCE78 \uD3EC\uCEE4\uC2A4\n setFocusedField(\"back\");\n backRef.current?.focus();\n cursorPosRef.current = 0;\n setCursorVisible(true);\n } else {\n // \uB458 \uB2E4 \uAC12\uC774 \uC788\uC73C\uBA74 \uB4B7\uCE78 \uC804\uCCB4 \uC120\uD0DD\n setFocusedField(\"back\");\n backRef.current?.focus();\n if (mask) {\n setCursorVisible(false);\n setTimeout(() => {\n backRef.current?.setSelectionRange(0, 1);\n }, 0);\n } else {\n setCursorVisible(false);\n setTimeout(() => {\n backRef.current?.setSelectionRange(\n 0,\n backValue.length,\n );\n }, 0);\n }\n }\n }}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.2,\n width: \"100%\",\n height: \"100%\",\n cursor: disabled ? \"default\" : \"text\",\n }}\n >\n <Box\n onClick={(e) => {\n e.stopPropagation();\n if (disabled || readonly) return;\n // \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD\n isClickFocusRef.current = true;\n setFocusedField(\"front\");\n frontRef.current?.focus();\n if (frontValue.length > 0) {\n setCursorVisible(false);\n setTimeout(() => {\n frontRef.current?.setSelectionRange(\n 0,\n frontValue.length,\n );\n }, 0);\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n }}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <TextField\n {...props}\n inputRef={frontRef}\n value={frontValue}\n onChange={handleFrontChange}\n onKeyDown={handleFrontKeyDown}\n onFocus={handleFrontFocus}\n onBlur={handleFrontBlur}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder=\"000000\"\n variant=\"outlined\"\n sx={{\n width: \"auto\",\n minWidth: 0,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": {\n width: \"auto\",\n },\n \"& .MuiInputBase-input\": {\n width: frontFieldCh,\n caretColor: \"transparent\",\n ...(fontSize && { fontSize }),\n ...(fontColor && { color: fontColor }),\n ...(fontFamily && { fontFamily }),\n },\n \"& .MuiInputBase-input::placeholder\": {\n color: \"rgba(0, 0, 0, 0.2)\",\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n readOnly: readonly,\n },\n htmlInput: {\n maxLength: 6,\n inputMode: \"numeric\",\n style: {\n textAlign: \"left\",\n padding: \"0 4px\",\n },\n },\n }}\n />\n {/* \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C - \uC55E\uC790\uB9AC */}\n {cursorVisible && focusedField === \"front\" && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 1 : 3,\n left: `calc(4px + ${cursorLeft}px)`,\n width: `${computedFontSize * 0.55}px`,\n height: cursorHeight,\n backgroundColor:\n fontColor || \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n }}\n />\n )}\n </Box>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"text.secondary\",\n mx: size === \"small\" ? 0.5 : 0.75,\n userSelect: \"none\",\n height: \"100%\",\n flexShrink: 0,\n }}\n >\n <DashIcon size={size} />\n </Box>\n <Box\n onClick={(e) => {\n e.stopPropagation();\n if (disabled || readonly) return;\n // \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD\n isClickFocusRef.current = true;\n setFocusedField(\"back\");\n setBackComplete(false);\n backRef.current?.focus();\n const len = mask\n ? backValue.length > 0\n ? 1\n : 0\n : backValue.length;\n if (len > 0) {\n setCursorVisible(false);\n setTimeout(() => {\n backRef.current?.setSelectionRange(0, len);\n }, 0);\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n }}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <TextField\n {...props}\n inputRef={backRef}\n value={displayBackValue}\n onChange={handleBackChange}\n onKeyDown={handleBackKeyDown}\n onFocus={handleBackFocus}\n onBlur={handleBackBlur}\n onClick={(e) => {\n if (disabled || readonly) return;\n e.stopPropagation();\n\n // \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD\n if (mask) {\n setFocusedField(\"back\");\n setBackComplete(false);\n if (backValue.length > 0) {\n setCursorVisible(false);\n requestAnimationFrame(() => {\n backRef.current?.setSelectionRange(\n 0,\n 1,\n );\n });\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n return;\n }\n\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uB4DC\uB798\uADF8 \uC120\uD0DD \uD655\uC778\n const input = backRef.current;\n const selStart = input?.selectionStart ?? 0;\n const selEnd = input?.selectionEnd ?? 0;\n\n // \uC120\uD0DD \uBC94\uC704\uAC00 \uC788\uC73C\uBA74 \uADF8\uB300\uB85C \uC720\uC9C0\n if (selStart !== selEnd) {\n setCursorVisible(false);\n setFocusedField(\"back\");\n return;\n }\n\n // \uBE44\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC: \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD\n setFocusedField(\"back\");\n setBackComplete(false);\n if (backValue.length > 0) {\n setCursorVisible(false);\n requestAnimationFrame(() => {\n backRef.current?.setSelectionRange(\n 0,\n backValue.length,\n );\n });\n } else {\n cursorPosRef.current = 0;\n setCursorVisible(true);\n }\n }}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder={mask ? \"\" : \"0000000\"}\n variant=\"outlined\"\n sx={{\n width: \"auto\",\n minWidth: 0,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": {\n width: \"auto\",\n },\n \"& .MuiInputBase-input\": {\n width: backFieldCh,\n caretColor: \"transparent\",\n ...(fontSize && { fontSize }),\n ...(fontColor && { color: fontColor }),\n ...(fontFamily && { fontFamily }),\n background: \"transparent\",\n position: \"relative\",\n zIndex: 1,\n },\n \"& .MuiInputBase-input::placeholder\": {\n color: \"rgba(0, 0, 0, 0.2)\",\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n readOnly: readonly,\n },\n htmlInput: {\n maxLength: mask ? 1 : 7,\n inputMode: \"numeric\",\n style: {\n textAlign: \"left\",\n padding: \"0 4px\",\n },\n },\n }}\n />\n {/* \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C - \uB4B7\uC790\uB9AC (\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C \uC785\uB825 \uC644\uB8CC \uC2DC \uC228\uAE40) */}\n {/* \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C - \uB4B7\uC790\uB9AC (\uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC5D0\uC11C \uC785\uB825 \uC644\uB8CC \uD6C4 \uC790\uB3D9 \uC228\uAE40, \uD074\uB9AD \uC2DC \uB2E4\uC2DC \uBCF4\uC784) */}\n {cursorVisible &&\n focusedField === \"back\" &&\n !backComplete && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 1 : 3,\n left: `calc(4px + ${cursorLeft}px)`,\n width: `${computedFontSize * 0.55}px`,\n height: cursorHeight,\n backgroundColor:\n fontColor || \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n zIndex: 2,\n }}\n />\n )}\n {/* \uB9C8\uC2A4\uD0B9 \uBAA8\uB4DC\uC77C \uB54C \uB4B7\uC790\uB9AC placeholder \u25CF \uD45C\uC2DC */}\n {mask && placeholderDots > 0 && (\n <Box\n sx={{\n position: \"absolute\",\n left: 0,\n width: backFieldCh,\n display: \"flex\",\n alignItems: \"center\",\n pointerEvents: \"none\",\n fontSize:\n fontSize ||\n (size === \"small\" ? \"16px\" : \"18px\"),\n fontFamily: fontFamily || \"inherit\",\n }}\n >\n {/* \uCCAB \uBC88\uC9F8 \uB3D9\uADF8\uB77C\uBBF8 (\uC785\uB825 \uC704\uCE58) */}\n <span\n style={{\n width: `${dotSize}px`,\n height: `${dotSize}px`,\n borderRadius: \"50%\",\n backgroundColor:\n displayBackValue.length > 0\n ? \"transparent\"\n : maskColor,\n opacity: 0.2,\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n {/* \uB4A4 6\uAC1C \uB3D9\uADF8\uB77C\uBBF8 (7ch \uAC04\uACA9) */}\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n width: \"7ch\",\n marginLeft: \"auto\",\n }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <span\n key={i}\n style={{\n width: `${smallDotSize}px`,\n height: `${smallDotSize}px`,\n borderRadius: \"50%\",\n backgroundColor: maskColor,\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n </>\n );\n\n // \uD074\uB9AD \uC2DC \uD3EC\uCEE4\uC2A4\uD560 ref \uACB0\uC815\n const getTargetRefOnClick = useCallback(() => {\n if (frontValue.length === 0) {\n return { ref: frontRef, groupIndex: 0 };\n } else if (backValue.length === 0) {\n return { ref: backRef, groupIndex: 1 };\n }\n return { ref: backRef, groupIndex: 1 };\n }, [frontValue.length, backValue.length]);\n\n // focusedGroup\uC744 focusedField\uB85C \uB9E4\uD551 (GroupedInputWrapper \uD638\uD658)\n const focusedGroup =\n focusedField === \"front\" ? 0 : focusedField === \"back\" ? 1 : null;\n const setFocusedGroupWrapper = useCallback((group: number | null) => {\n if (group === null) {\n setFocusedField(null);\n setCursorVisible(false);\n } else if (group === 0) {\n setFocusedField(\"front\");\n setCursorVisible(true);\n } else if (group === 1) {\n setFocusedField(\"back\");\n setCursorVisible(true);\n }\n }, []);\n\n return (\n <GroupedInputWrapper\n label={label}\n size={size}\n disabled={disabled}\n readonly={readonly}\n focusedGroup={focusedGroup}\n setFocusedGroup={setFocusedGroupWrapper}\n hasValue={getFullNumber().length > 0}\n isInvalid={isInvalid}\n invalidBorderColor={invalidBorderColor}\n inputRefs={[frontRef, backRef]}\n getTargetRefOnClick={getTargetRefOnClick}\n fullWidth={fullWidth}\n sx={sx}\n className={className}\n id={id}\n >\n {renderGroupedInput()}\n </GroupedInputWrapper>\n );\n },\n);\n\nconst JuminTextFieldWithForm = forwardRef<HTMLDivElement, JuminTextFieldProps>(\n function JuminTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"JuminTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"JuminTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as string | undefined;\n const handleFormChange = useCallback(\n (info: JuminInfo) => {\n const syntheticEvent = {\n target: { name, value: info.value },\n currentTarget: { name, value: info.value },\n } as React.ChangeEvent<HTMLInputElement>;\n form.handleFormChange(syntheticEvent);\n onChange?.(info);\n },\n [form, name, onChange],\n );\n\n return (\n <JuminTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const JuminTextField = forwardRef<HTMLDivElement, JuminTextFieldProps>(\n function JuminTextField(props, ref) {\n if (props.form) {\n return <JuminTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <JuminTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * GroupedInputWrapper.tsx\n *\n * \uADF8\uB8F9\uD654\uB41C \uC785\uB825 \uCEF4\uD3EC\uB10C\uD2B8(\uC0AC\uC5C5\uC790\uBC88\uD638, \uC8FC\uBBFC\uBC88\uD638, \uCE74\uB4DC\uBC88\uD638, \uC2DC\uAC04 \uB4F1)\uB97C \uC704\uD55C\n * FormControl + OutlinedInput \uB798\uD37C \uCEF4\uD3EC\uB10C\uD2B8\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useCallback,\n useRef,\n useEffect,\n RefObject,\n forwardRef,\n} from \"react\";\nimport { FormControl, InputLabel, OutlinedInput, Box } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\n\nexport interface GroupedInputWrapperProps {\n label?: React.ReactNode; // \uB77C\uBCA8\n size?: \"small\" | \"medium\"; // \uC0AC\uC774\uC988\n disabled?: boolean; // \uBE44\uD65C\uC131\uD654\n readonly?: boolean; // \uC77D\uAE30 \uC804\uC6A9\n focusedGroup: number | null; // \uD3EC\uCEE4\uC2A4\uB41C \uADF8\uB8F9 \uC778\uB371\uC2A4 (null\uC774\uBA74 \uD3EC\uCEE4\uC2A4 \uC5C6\uC74C)\n setFocusedGroup: (group: number | null) => void; // \uD3EC\uCEE4\uC2A4 \uADF8\uB8F9 \uC124\uC815 \uD568\uC218\n hasValue: boolean; // \uAC12\uC774 \uC788\uB294\uC9C0 \uC5EC\uBD80\n isInvalid?: boolean; // \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\n invalidBorderColor?: string; // \uC720\uD6A8\uD558\uC9C0 \uC54A\uC744 \uB54C \uD14C\uB450\uB9AC \uC0C9\uC0C1\n inputRefs: RefObject<HTMLInputElement | null>[]; // \uB0B4\uBD80 \uC785\uB825 \uD544\uB4DC\uB4E4\uC758 ref \uBC30\uC5F4\n getTargetRefOnClick: () => {\n ref: RefObject<HTMLInputElement | null>;\n groupIndex: number;\n }; // \uD074\uB9AD \uC2DC \uD3EC\uCEE4\uC2A4\uD560 ref\uC640 \uADF8\uB8F9 \uC778\uB371\uC2A4 \uACB0\uC815 \uD568\uC218\n sx?: SxProps<Theme>; // \uCEE8\uD14C\uC774\uB108 sx\n className?: string; // className\n id?: string; // id\n fullWidth?: boolean; // \uC804\uCCB4 \uB108\uBE44 \uC0AC\uC6A9 \uC5EC\uBD80\n children: React.ReactNode; // \uB0B4\uBD80 \uCEE8\uD150\uCE20 \uB80C\uB354\uB9C1\n contentSx?: SxProps<Theme>; // \uB0B4\uBD80 Box\uC758 \uCD94\uAC00 sx\n endAdornment?: React.ReactNode; // \uC624\uB978\uCABD \uB05D\uC5D0 \uD56D\uC0C1 \uBCF4\uC774\uB294 \uC694\uC18C (\uC544\uC774\uCF58 \uB4F1)\n}\n\n// inputComponent\uB97C \uCEF4\uD3EC\uB10C\uD2B8 \uC678\uBD80\uC5D0\uC11C \uC815\uC758\uD558\uC5EC \uB9AC\uB80C\uB354\uB9C1 \uBC29\uC9C0\ninterface CustomInputProps {\n showContent: boolean;\n inputSize: \"small\" | \"medium\";\n contentSx?: SxProps<Theme>;\n children: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nconst CustomInput = forwardRef<HTMLDivElement, CustomInputProps>(\n function CustomInput(\n { showContent, inputSize, contentSx, children, endAdornment },\n ref,\n ) {\n return (\n <Box\n ref={ref}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n height: \"100%\",\n px: inputSize === \"small\" ? 1 : 1.25,\n ...contentSx,\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n flex: 1,\n visibility: showContent ? \"visible\" : \"hidden\",\n }}\n >\n {children}\n </Box>\n {endAdornment}\n </Box>\n );\n },\n);\n\nexport function GroupedInputWrapper({\n label,\n size = \"medium\",\n disabled,\n readonly,\n focusedGroup,\n setFocusedGroup,\n hasValue,\n isInvalid,\n invalidBorderColor,\n inputRefs,\n getTargetRefOnClick,\n sx,\n className,\n id,\n fullWidth = false,\n children,\n contentSx,\n endAdornment,\n}: GroupedInputWrapperProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // label\uC774 \uC788\uACE0 focus/\uAC12\uC774 \uC5C6\uC744 \uB54C \uB0B4\uBD80 \uC785\uB825 \uC694\uC18C \uC228\uAE40\n const showContent = !label || focusedGroup !== null || hasValue;\n const isLabelShrunk = focusedGroup !== null || hasValue;\n\n // \uD074\uB9AD \uD578\uB4E4\uB7EC - onMouseDown\uC5D0\uC11C \uCC98\uB9AC\uD558\uC5EC OutlinedInput\uC758 \uAE30\uBCF8 \uD3EC\uCEE4\uC2A4 \uB3D9\uC791 \uBC29\uC9C0\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (disabled || readonly) {\n return;\n }\n\n // \uC774\uBBF8 input\uC5D0\uC11C \uCC98\uB9AC\uB41C \uD074\uB9AD\uC774\uBA74 \uBB34\uC2DC\n const target = e.target as HTMLElement;\n if (target.tagName === \"INPUT\") {\n return;\n }\n\n // \uAE30\uBCF8 \uD3EC\uCEE4\uC2A4 \uB3D9\uC791 \uBC29\uC9C0\n e.preventDefault();\n\n const { ref: targetRef, groupIndex } = getTargetRefOnClick();\n const inputEl = targetRef.current;\n\n if (inputEl) {\n // \uBA3C\uC800 focusedGroup\uC744 \uC124\uC815\uD558\uC5EC visibility\uB97C visible\uB85C \uBCC0\uACBD\n setFocusedGroup(groupIndex);\n\n // \uB2E4\uC74C \uB80C\uB354 \uC0AC\uC774\uD074\uC5D0\uC11C \uD3EC\uCEE4\uC2A4 \uBC0F \uC804\uCCB4 \uC120\uD0DD (visibility\uAC00 visible\uC774 \uB41C \uD6C4)\n setTimeout(() => {\n inputEl.focus();\n inputEl.select(); // \uC804\uCCB4 \uC120\uD0DD\n }, 0);\n }\n },\n [disabled, readonly, getTargetRefOnClick, setFocusedGroup],\n );\n\n // blur \uD578\uB4E4\uB7EC - \uC678\uBD80 \uD074\uB9AD \uAC10\uC9C0\n useEffect(() => {\n if (focusedGroup === null) return;\n\n const handleDocumentClick = (e: MouseEvent) => {\n const target = e.target as Node;\n\n // \uCEE8\uD14C\uC774\uB108 \uB0B4\uBD80 \uD074\uB9AD\uC774\uBA74 \uBB34\uC2DC\n if (containerRef.current?.contains(target)) {\n return;\n }\n\n // \uB0B4\uBD80 input \uC911 \uD558\uB098\uAC00 \uD3EC\uCEE4\uC2A4\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\n const isAnyInputFocused = inputRefs.some(\n (ref) => ref.current === document.activeElement,\n );\n\n if (!isAnyInputFocused) {\n setFocusedGroup(null);\n }\n };\n\n // mousedown\uC73C\uB85C \uCC98\uB9AC (click\uBCF4\uB2E4 \uBA3C\uC800 \uBC1C\uC0DD)\n document.addEventListener(\"mousedown\", handleDocumentClick);\n return () => {\n document.removeEventListener(\"mousedown\", handleDocumentClick);\n };\n }, [focusedGroup, inputRefs, setFocusedGroup]);\n\n // \uB0B4\uBD80 input blur \uC2DC \uCC98\uB9AC\n const handleBlur = useCallback(() => {\n // setTimeout\uC73C\uB85C \uB2E4\uB978 \uB0B4\uBD80 input\uC73C\uB85C \uC774\uB3D9\uD588\uB294\uC9C0 \uD655\uC778\n setTimeout(() => {\n const activeEl = document.activeElement;\n const isStillFocused = inputRefs.some(\n (ref) => ref.current === activeEl,\n );\n if (!isStillFocused) {\n setFocusedGroup(null);\n }\n }, 0);\n }, [inputRefs, setFocusedGroup]);\n\n return (\n <FormControl\n ref={containerRef}\n size={size}\n disabled={disabled}\n error={isInvalid}\n focused={readonly ? false : focusedGroup !== null}\n sx={{\n ...(fullWidth && {\n width: \"100%\",\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n }),\n ...(readonly && { pointerEvents: \"none\" }),\n ...sx,\n }}\n className={className}\n >\n {label && (\n <InputLabel\n shrink={isLabelShrunk}\n sx={{\n ...(isInvalid &&\n invalidBorderColor && {\n color: invalidBorderColor,\n \"&.Mui-focused\": { color: invalidBorderColor },\n }),\n }}\n >\n {label}\n </InputLabel>\n )}\n <OutlinedInput\n id={id}\n label={label}\n notched={isLabelShrunk}\n onMouseDown={handleMouseDown}\n onBlur={handleBlur}\n sx={{\n height: size === \"small\" ? 40 : 56,\n cursor: disabled ? \"default\" : \"text\",\n ...(isInvalid &&\n invalidBorderColor && {\n \"& .MuiOutlinedInput-notchedOutline\": {\n borderColor: invalidBorderColor,\n },\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: invalidBorderColor,\n },\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: invalidBorderColor,\n },\n }),\n ...(readonly && {\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n }),\n }}\n slots={{ input: CustomInput }}\n slotProps={{\n input: {\n showContent,\n inputSize: size,\n contentSx,\n children,\n endAdornment,\n } as CustomInputProps,\n }}\n />\n </FormControl>\n );\n}\n", "/**\n * ColonBox.tsx - \uC2DC\uAC04 \uD544\uB4DC \uC0AC\uC774\uC758 \uCF5C\uB860 \uC544\uC774\uCF58 \uCEF4\uD3EC\uB10C\uD2B8\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport { Box } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { ColonIcon as ColonSvg } from \"../icons\";\n\nexport interface ColonBoxProps {\n /** \uD06C\uAE30 (small | medium) */\n size?: \"small\" | \"medium\";\n /** \uAC00\uB85C \uB9C8\uC9C4 */\n mx?: number;\n /** \uCF5C\uB860 \uD45C\uC2DC \uC5EC\uBD80 */\n visible?: boolean;\n /** \uCD94\uAC00 \uC2A4\uD0C0\uC77C */\n sx?: SxProps<Theme>;\n}\n\n/**\n * \uCF5C\uB860 \uC544\uC774\uCF58\uC744 \uAC10\uC2F8\uB294 \uBC15\uC2A4 \uCEF4\uD3EC\uB10C\uD2B8\n * TimeTextField\uC640 DateTimeTextField\uC5D0\uC11C \uACF5\uD1B5\uC73C\uB85C \uC0AC\uC6A9\n */\nexport function ColonBox({ size, mx, visible = true, sx }: ColonBoxProps) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n userSelect: \"none\",\n minWidth: \"6px\",\n padding: 0,\n flexShrink: 0,\n position: \"relative\",\n zIndex: 1,\n opacity: visible ? 0.8 : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n mx,\n ...sx,\n }}\n >\n <ColonSvg size={size} />\n </Box>\n );\n}\n", "/**\n * VerificationCodeTextField.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n ChangeEvent,\n KeyboardEvent,\n ClipboardEvent,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { Box, FormControl, InputLabel, OutlinedInput } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { VerificationCodeTextFieldProps } from \"./types\";\nimport { useDebouncedEmit } from \"./hooks\";\n\nconst VerificationCodeTextFieldBase = forwardRef<\n HTMLDivElement,\n VerificationCodeTextFieldProps\n>(function VerificationCodeTextFieldBase(\n {\n label,\n length = 6,\n type = \"numeric\",\n value,\n onChange,\n onComplete,\n debounce,\n readonly,\n disabled,\n size,\n name = \"\",\n fontSize: fontSizeProp,\n fontColor = \"text.primary\",\n fontFamily = \"monospace\",\n dotSize: dotSizeProp,\n caretColor = \"text.primary\",\n sx,\n invalidBorderColor,\n inputRef: externalInputRef,\n ...restProps\n },\n ref,\n) {\n const [internalValue, setInternalValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [isAllSelected, setIsAllSelected] = useState(false);\n const internalInputRef = useRef<HTMLInputElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name,\n debounce,\n onChange,\n });\n\n // value prop \uB3D9\uAE30\uD654 (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uACBD\uC6B0\uB9CC)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value).slice(0, length);\n // \uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC12\uC774 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB97C \uB54C\uB9CC \uB3D9\uAE30\uD654\n if (strValue !== lastEmittedValue.current) {\n setInternalValue(strValue);\n lastEmittedValue.current = strValue;\n }\n } else if (lastEmittedValue.current !== \"\") {\n setInternalValue(\"\");\n lastEmittedValue.current = \"\";\n }\n }, [value, length, lastEmittedValue]);\n\n // \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC\n const isValidChar = useCallback(\n (char: string): boolean => {\n if (type === \"numeric\") {\n return /^\\d$/.test(char);\n } else if (type === \"alpha\") {\n return /^[a-zA-Z]$/.test(char);\n } else {\n // alphanumeric\n return /^[a-zA-Z0-9]$/.test(char);\n }\n },\n [type],\n );\n\n // \uBB38\uC790\uC5F4 \uD544\uD130\uB9C1\n const filterValue = useCallback(\n (val: string): string => {\n let filtered = \"\";\n for (const char of val) {\n if (isValidChar(char)) {\n filtered += type === \"alpha\" ? char.toUpperCase() : char;\n }\n }\n return filtered.slice(0, length);\n },\n [isValidChar, length, type],\n );\n\n // \uBCC0\uACBD \uD578\uB4E4\uB7EC\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const filtered = filterValue(e.target.value);\n setInternalValue(filtered);\n setIsAllSelected(false); // \uC785\uB825 \uC2DC \uC804\uCCB4 \uC120\uD0DD \uD574\uC81C\n\n // \uB514\uBC14\uC6B4\uC2A4 \uC801\uC6A9\n emitChange(e, filtered);\n\n // \uC644\uB8CC \uC2DC \uCF5C\uBC31\n if (filtered.length === length && onComplete) {\n onComplete(filtered);\n }\n },\n [filterValue, length, onComplete, emitChange],\n );\n\n // \uBD99\uC5EC\uB123\uAE30 \uCC98\uB9AC\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedText = e.clipboardData.getData(\"text\");\n const filtered = filterValue(pastedText);\n setInternalValue(filtered);\n\n // \uBD99\uC5EC\uB123\uAE30 \uC2DC \uC989\uC2DC emit\n emitChange(null, filtered, true);\n\n if (filtered.length === length && onComplete) {\n onComplete(filtered);\n }\n },\n [filterValue, length, onComplete, emitChange],\n );\n\n // \uD0A4 \uC785\uB825 \uCC98\uB9AC (\uBC31\uC2A4\uD398\uC774\uC2A4 \uB4F1)\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n // \uD2B9\uC218 \uD0A4\uB294 \uD5C8\uC6A9\n if (\n [\n \"Backspace\",\n \"Delete\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Tab\",\n \"Home\",\n \"End\",\n ].includes(e.key)\n ) {\n return;\n }\n\n // Ctrl+A, Ctrl+C, Ctrl+V \uB4F1 \uD5C8\uC6A9\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n }, []);\n\n // \uD074\uB9AD \uC2DC \uC804\uCCB4 \uC120\uD0DD\n const handleFocus = useCallback(() => {\n setIsFocused(true);\n setTimeout(() => {\n const input = internalInputRef.current;\n if (input && input.value.length > 0) {\n input.setSelectionRange(0, input.value.length);\n setIsAllSelected(true);\n }\n }, 0);\n }, []);\n\n // \uC774\uBBF8 \uD3EC\uCEE4\uC2A4\uB41C \uC0C1\uD0DC\uC5D0\uC11C \uD074\uB9AD\uD574\uB3C4 \uC804\uCCB4 \uC120\uD0DD\n const handleClick = useCallback(() => {\n const input = internalInputRef.current;\n if (input && input.value.length > 0) {\n input.setSelectionRange(0, input.value.length);\n setIsAllSelected(true);\n }\n }, []);\n\n // \uD3EC\uCEE4\uC2A4 \uD574\uC81C\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n setIsAllSelected(false);\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n flushOnBlur(e, internalValue);\n },\n [internalValue, flushOnBlur],\n );\n\n // \uC0AC\uC774\uC988\uBCC4 \uC124\uC815\n const defaultFontSize = size === \"small\" ? 18 : 24;\n const defaultDotSize = size === \"small\" ? 10 : 14;\n const fontSize = fontSizeProp ?? defaultFontSize;\n const dotSize = dotSizeProp ?? defaultDotSize;\n const charWidth = Math.max(fontSize, size === \"small\" ? 18 : 22); // \uAE00\uC790 \uD558\uB098\uC758 \uB108\uBE44\n const gap = size === \"small\" ? 6 : 8; // \uAE00\uC790/dot \uAC04 \uAC04\uACA9\n const totalContentWidth = length * charWidth + (length - 1) * gap;\n const containerHeight = Math.max(size === \"small\" ? 40 : 56, fontSize + 16);\n const containerPadding = size === \"small\" ? 16 : 20;\n\n // inputMode \uC124\uC815\n const inputMode = type === \"numeric\" ? \"numeric\" : \"text\";\n\n // sx\uC5D0\uC11C width\uAC00 \uC9C0\uC815\uB418\uC5C8\uB294\uC9C0 \uD655\uC778\n const hasCustomWidth =\n sx &&\n typeof sx === \"object\" &&\n !Array.isArray(sx) &&\n (\"width\" in sx || \"minWidth\" in sx || \"maxWidth\" in sx);\n\n // showContent: label\uC774 \uC5C6\uAC70\uB098, \uD3EC\uCEE4\uC2A4/\uAC12\uC774 \uC788\uC744 \uB54C\n const showContent = !label || isFocused || internalValue.length > 0;\n\n // FormControl sx \uACC4\uC0B0\n const formControlWidth = hasCustomWidth\n ? ((sx as Record<string, unknown>)?.width as\n | string\n | number\n | undefined) ||\n ((sx as Record<string, unknown>)?.minWidth as\n | string\n | number\n | undefined) ||\n ((sx as Record<string, unknown>)?.maxWidth as\n | string\n | number\n | undefined)\n : totalContentWidth + containerPadding * 2;\n\n const formControlSx: SxProps<Theme> = {\n display: \"inline-flex\",\n width: formControlWidth,\n ...(readonly && { pointerEvents: \"none\" }),\n ...(sx as Record<string, unknown>),\n };\n\n return (\n <FormControl\n ref={ref}\n variant=\"outlined\"\n size={size}\n disabled={disabled}\n focused={readonly ? false : isFocused}\n sx={formControlSx}\n >\n {label && (\n <InputLabel\n shrink={isFocused || internalValue.length > 0}\n sx={{\n backgroundColor: \"background.paper\",\n px: 0.5,\n ...(readonly && {\n \"&.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }),\n }}\n >\n {label}\n </InputLabel>\n )}\n <OutlinedInput\n label={label}\n notched={\n label ? isFocused || internalValue.length > 0 : undefined\n }\n readOnly={readonly}\n onMouseDown={(e) => {\n e.preventDefault();\n internalInputRef.current?.focus();\n }}\n sx={{\n height: containerHeight,\n cursor: disabled ? \"default\" : \"text\",\n \"& .MuiOutlinedInput-notchedOutline\": {\n borderColor: invalidBorderColor || undefined,\n },\n \"& .MuiOutlinedInput-input\": {\n padding: 0,\n height: \"100%\",\n },\n ...(readonly && {\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n }),\n }}\n inputProps={{\n style: { display: \"none\" },\n }}\n />\n {/* \uCEE4\uC2A4\uD140 \uB0B4\uC6A9\uBB3C \uB80C\uB354\uB9C1 */}\n <Box\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n height: \"100%\",\n px: 1.75,\n pointerEvents: \"none\",\n }}\n >\n {/* \uB0B4\uC6A9\uBB3C \uCEE8\uD14C\uC774\uB108 */}\n <Box\n sx={{\n width: hasCustomWidth ? \"100%\" : totalContentWidth,\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n visibility: showContent ? \"visible\" : \"hidden\",\n }}\n >\n {/* Placeholder dots + \uC785\uB825\uB41C \uAE00\uC790 \uD45C\uC2DC */}\n <Box\n sx={{\n display: \"flex\",\n gap: hasCustomWidth ? 0 : `${gap}px`,\n width: hasCustomWidth ? \"100%\" : undefined,\n }}\n >\n {Array.from({ length }).map((_, i) => (\n <Box\n key={i}\n sx={{\n flex: hasCustomWidth ? 1 : undefined,\n width: hasCustomWidth\n ? undefined\n : charWidth,\n minWidth: charWidth,\n height: charWidth,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n position: \"relative\",\n borderRadius: 0.5,\n backgroundColor:\n isAllSelected &&\n i < internalValue.length\n ? \"primary.main\"\n : \"transparent\",\n transition: \"background-color 0.1s\",\n }}\n >\n {i < internalValue.length ? (\n <Box\n component=\"span\"\n sx={{\n fontSize,\n fontFamily,\n fontWeight: 600,\n lineHeight: 1,\n color: isAllSelected\n ? \"white\"\n : fontColor,\n transition: \"color 0.1s\",\n }}\n >\n {internalValue[i]}\n </Box>\n ) : (\n <Box\n sx={{\n width: dotSize,\n height: dotSize,\n borderRadius: \"50%\",\n backgroundColor:\n \"rgba(0, 0, 0, 0.08)\",\n }}\n />\n )}\n {/* \uAE5C\uBE61\uC774\uB294 \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C */}\n {isFocused &&\n i === internalValue.length &&\n internalValue.length < length && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: -2,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"0.6em\",\n height: \"1px\",\n backgroundColor: caretColor,\n animation:\n \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": {\n opacity: 1,\n },\n \"50%\": { opacity: 0 },\n },\n }}\n />\n )}\n </Box>\n ))}\n </Box>\n </Box>\n </Box>\n {/* \uC228\uACA8\uC9C4 \uC785\uB825 \uD544\uB4DC */}\n <input\n ref={internalInputRef}\n value={internalValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onClick={handleClick}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readonly}\n autoComplete=\"one-time-code\"\n spellCheck={false}\n maxLength={length}\n inputMode={inputMode}\n style={{\n position: \"absolute\",\n opacity: 0,\n width: 1,\n height: 1,\n pointerEvents: \"none\",\n textTransform:\n type === \"alpha\" || type === \"alphanumeric\"\n ? \"uppercase\"\n : \"none\",\n }}\n />\n </FormControl>\n );\n});\n\nconst VerificationCodeTextFieldWithForm = forwardRef<\n HTMLDivElement,\n VerificationCodeTextFieldProps\n>(function VerificationCodeTextFieldWithForm(\n { form, name, onChange, ...rest },\n ref,\n) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"VerificationCodeTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"VerificationCodeTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <VerificationCodeTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const VerificationCodeTextField = forwardRef<\n HTMLDivElement,\n VerificationCodeTextFieldProps\n>(function VerificationCodeTextField(props, ref) {\n if (props.form) {\n return <VerificationCodeTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <VerificationCodeTextFieldBase {...props} ref={ref} />;\n});\n", "/**\n * EmailTextField.tsx\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n ChangeEvent,\n KeyboardEvent,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n TextField,\n Box,\n Popper,\n Paper,\n List,\n ListItemButton,\n ListItemText,\n ListItemIcon,\n ClickAwayListener,\n} from \"@mui/material\";\nimport type { EmailTextFieldProps, CustomDomain } from \"./types\";\nimport { getEmailIcon } from \"./icons/email-icons\";\nimport { useDebouncedEmit } from \"./hooks\";\nimport { DEFAULT_EMAIL_DOMAINS, validateEmail } from \"./utils\";\n\nconst EmailTextFieldBase = forwardRef<HTMLDivElement, EmailTextFieldProps>(\n function EmailTextFieldBase(\n {\n value,\n onChange,\n onValidationChange,\n domains = DEFAULT_EMAIL_DOMAINS,\n extraDomains,\n suggestions = true,\n showLogos = true,\n invalidBorderColor,\n debounce,\n readonly,\n sx,\n size,\n disabled,\n name = \"\",\n onBlur,\n fullWidth,\n inputRef: externalInputRef,\n ...props\n },\n ref,\n ) {\n // extraDomains\uAC00 \uC788\uC73C\uBA74 \uC55E\uC5D0 \uCD94\uAC00, \uC911\uBCF5 \uC81C\uAC70\n // customIcons: \uCEE4\uC2A4\uD140 \uC544\uC774\uCF58 \uB9E4\uD551 (domain -> ReactNode)\n const { allDomains, customIcons } = React.useMemo(() => {\n const icons: Record<string, React.ReactNode> = {};\n\n // extraDomains \uCC98\uB9AC (\uBB38\uC790\uC5F4 \uB610\uB294 CustomDomain \uAC1D\uCCB4)\n const extraDomainStrings: string[] = [];\n if (extraDomains && extraDomains.length > 0) {\n extraDomains.forEach((item) => {\n if (typeof item === \"string\") {\n extraDomainStrings.push(item);\n } else {\n // CustomDomain \uAC1D\uCCB4\n extraDomainStrings.push(item.domain);\n if (item.icon) {\n icons[item.domain.toLowerCase()] = item.icon;\n }\n }\n });\n }\n\n const combined = [...extraDomainStrings, ...domains];\n // \uC911\uBCF5 \uC81C\uAC70 (\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC)\n const seen = new Set<string>();\n const uniqueDomains = combined.filter((domain) => {\n const lower = domain.toLowerCase();\n if (seen.has(lower)) return false;\n seen.add(lower);\n return true;\n });\n\n return { allDomains: uniqueDomains, customIcons: icons };\n }, [domains, extraDomains]);\n\n // \uB3C4\uBA54\uC778\uC5D0 \uD574\uB2F9\uD558\uB294 \uC544\uC774\uCF58 \uAC00\uC838\uC624\uAE30 (\uCEE4\uC2A4\uD140 \uC544\uC774\uCF58 \uC6B0\uC120)\n const getDomainIcon = useCallback(\n (domain: string, size: number): React.ReactNode => {\n const lowerDomain = domain.toLowerCase();\n if (customIcons[lowerDomain]) {\n return customIcons[lowerDomain];\n }\n return getEmailIcon(domain, size);\n },\n [customIcons],\n );\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isInvalid, setIsInvalid] = useState(false);\n const [localSuggestions, setLocalSuggestions] = useState<string[]>([]);\n const [showPopper, setShowPopper] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const internalInputRef = useRef<HTMLInputElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n // \uC678\uBD80 inputRef\uC640 \uB0B4\uBD80 inputRef \uBCD1\uD569\n useImperativeHandle(\n externalInputRef as React.Ref<HTMLInputElement>,\n () => internalInputRef.current!,\n [],\n );\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name,\n debounce,\n onChange,\n });\n\n // value prop \uB3D9\uAE30\uD654 (\uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uACBD\uC6B0\uB9CC)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n // \uC678\uBD80\uC5D0\uC11C \uBCC0\uACBD\uB41C \uAC12\uC774 \uB9C8\uC9C0\uB9C9\uC73C\uB85C emit\uD55C \uAC12\uACFC \uB2E4\uB97C \uB54C\uB9CC \uB3D9\uAE30\uD654\n if (strValue !== lastEmittedValue.current) {\n setInputValue(strValue);\n lastEmittedValue.current = strValue;\n }\n } else if (lastEmittedValue.current !== \"\") {\n setInputValue(\"\");\n lastEmittedValue.current = \"\";\n }\n }, [value, lastEmittedValue]);\n\n // \uB3C4\uBA54\uC778 \uC81C\uC548 \uC0DD\uC131\n const generateSuggestions = useCallback(\n (input: string) => {\n if (!suggestions || !input || disabled || readonly) {\n setLocalSuggestions([]);\n return;\n }\n\n const atIndex = input.indexOf(\"@\");\n if (atIndex === -1) {\n // @ \uC5C6\uC73C\uBA74 \uC81C\uC548 \uC548 \uD568\n setLocalSuggestions([]);\n return;\n }\n\n const localPart = input.slice(0, atIndex);\n const domainPart = input.slice(atIndex + 1).toLowerCase();\n\n if (!localPart) {\n setLocalSuggestions([]);\n return;\n }\n\n // \uB3C4\uBA54\uC778 \uBD80\uBD84\uC774 \uBE44\uC5B4\uC788\uAC70\uB098 \uBD80\uBD84 \uC785\uB825\uB41C \uACBD\uC6B0\n const filteredDomains = allDomains.filter((domain) =>\n domain.toLowerCase().startsWith(domainPart),\n );\n\n // \uC774\uBBF8 \uC644\uC804\uD788 \uC77C\uCE58\uD558\uB294 \uB3C4\uBA54\uC778\uC774 \uC788\uC73C\uBA74 \uC81C\uC548 \uC548 \uD568\n if (\n filteredDomains.length === 1 &&\n filteredDomains[0].toLowerCase() === domainPart\n ) {\n setLocalSuggestions([]);\n return;\n }\n\n const newSuggestions = filteredDomains\n .slice(0, 10)\n .map((domain) => `${localPart}@${domain}`);\n\n setLocalSuggestions(newSuggestions);\n setShowPopper(newSuggestions.length > 0);\n // \uCCAB \uBC88\uC9F8 \uD56D\uBAA9 \uC790\uB3D9 \uC120\uD0DD\n setSelectedIndex(newSuggestions.length > 0 ? 0 : -1);\n },\n [allDomains, suggestions, disabled],\n );\n\n // \uC785\uB825 \uBCC0\uACBD \uD578\uB4E4\uB7EC\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n generateSuggestions(newValue);\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC\n const isValid = validateEmail(newValue);\n const hasContent = newValue.length > 0;\n setIsInvalid(hasContent && !isValid);\n\n if (onValidationChange) {\n onValidationChange(isValid);\n }\n\n // \uB514\uBC14\uC6B4\uC2A4 \uC801\uC6A9\n emitChange(e, newValue);\n },\n [onValidationChange, generateSuggestions, emitChange],\n );\n\n // \uC81C\uC548 \uC120\uD0DD \uD578\uB4E4\uB7EC\n const handleSelectSuggestion = useCallback(\n (suggestion: string) => {\n setInputValue(suggestion);\n setLocalSuggestions([]);\n setShowPopper(false);\n setSelectedIndex(-1);\n\n const isValid = validateEmail(suggestion);\n setIsInvalid(!isValid);\n\n if (onValidationChange) {\n onValidationChange(isValid);\n }\n\n // \uC81C\uC548 \uC120\uD0DD \uC2DC \uC989\uC2DC emit\n emitChange(null, suggestion, true);\n\n // \uD3EC\uCEE4\uC2A4 \uC720\uC9C0\n internalInputRef.current?.focus();\n },\n [onValidationChange, emitChange],\n );\n\n // \uD0A4\uBCF4\uB4DC \uB124\uBE44\uAC8C\uC774\uC158\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (!showPopper || localSuggestions.length === 0) return;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev) =>\n prev < localSuggestions.length - 1 ? prev + 1 : 0,\n );\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev) =>\n prev > 0 ? prev - 1 : localSuggestions.length - 1,\n );\n break;\n case \"Enter\":\n // \uC120\uD0DD\uB41C \uD56D\uBAA9\uC774 \uC788\uC73C\uBA74 \uD574\uB2F9 \uD56D\uBAA9, \uC5C6\uC73C\uBA74 \uCCAB \uBC88\uC9F8 \uD56D\uBAA9 \uC120\uD0DD\n e.preventDefault();\n if (selectedIndex >= 0) {\n handleSelectSuggestion(\n localSuggestions[selectedIndex],\n );\n } else if (localSuggestions.length > 0) {\n handleSelectSuggestion(localSuggestions[0]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n setShowPopper(false);\n setSelectedIndex(-1);\n break;\n case \"Tab\":\n if (selectedIndex >= 0) {\n e.preventDefault();\n handleSelectSuggestion(\n localSuggestions[selectedIndex],\n );\n } else if (localSuggestions.length > 0) {\n e.preventDefault();\n handleSelectSuggestion(localSuggestions[0]);\n }\n break;\n }\n },\n [\n showPopper,\n localSuggestions,\n selectedIndex,\n handleSelectSuggestion,\n ],\n );\n\n // \uD074\uB9AD \uC678\uBD80 \uCC98\uB9AC\n const handleClickAway = useCallback(() => {\n setShowPopper(false);\n setSelectedIndex(-1);\n }, []);\n\n // blur \uC2DC \uB300\uAE30 \uC911\uC778 \uB514\uBC14\uC6B4\uC2A4 \uC989\uC2DC \uC2E4\uD589\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n flushOnBlur(e, inputValue);\n if (onBlur) {\n onBlur(e);\n }\n },\n [inputValue, flushOnBlur, onBlur],\n );\n\n // \uD3EC\uCEE4\uC2A4 \uC2DC \uC81C\uC548 \uB2E4\uC2DC \uD45C\uC2DC\n const handleFocus = useCallback(() => {\n if (localSuggestions.length > 0) {\n setShowPopper(true);\n } else {\n generateSuggestions(inputValue);\n }\n }, [localSuggestions, inputValue, generateSuggestions]);\n\n // \uD14C\uB450\uB9AC \uC0C9\uC0C1\n const borderColor =\n isInvalid && invalidBorderColor ? invalidBorderColor : undefined;\n\n // anchorRef\uC640 \uC678\uBD80 ref\uB97C \uB3D9\uAE30\uD654\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n anchorRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (\n ref as React.MutableRefObject<HTMLDivElement | null>\n ).current = node;\n }\n },\n [ref],\n );\n\n return (\n <ClickAwayListener onClickAway={handleClickAway}>\n <Box\n ref={setRefs}\n sx={{\n position: \"relative\",\n ...(fullWidth && { width: \"100%\" }),\n ...sx,\n }}\n >\n <TextField\n {...props}\n inputRef={internalInputRef}\n name={name}\n value={inputValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled}\n size={size}\n fullWidth={fullWidth}\n type=\"email\"\n autoComplete=\"email\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n sx={{\n width: \"100%\",\n ...(borderColor && {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": {\n borderColor: borderColor,\n },\n \"&:hover fieldset\": {\n borderColor: borderColor,\n },\n \"&.Mui-focused fieldset\": {\n borderColor: borderColor,\n },\n },\n }),\n ...(readonly && {\n pointerEvents: \"none\",\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }),\n }}\n slotProps={{\n ...props.slotProps,\n input: {\n ...props.slotProps?.input,\n readOnly: readonly,\n },\n htmlInput: {\n ...props.slotProps?.htmlInput,\n inputMode: \"email\",\n },\n }}\n />\n <Popper\n open={showPopper && localSuggestions.length > 0}\n anchorEl={anchorRef.current}\n placement=\"bottom-start\"\n style={{\n zIndex: 1300,\n width: anchorRef.current?.offsetWidth,\n }}\n >\n <Paper elevation={3} sx={{ mt: 0.5 }}>\n <List dense disablePadding>\n {localSuggestions.map((suggestion, index) => {\n const domain = suggestion.split(\"@\")[1];\n const iconSize = size === \"small\" ? 16 : 20;\n return (\n <ListItemButton\n key={suggestion}\n selected={index === selectedIndex}\n onClick={() =>\n handleSelectSuggestion(\n suggestion,\n )\n }\n sx={{\n py: 0.5,\n \"&.Mui-selected\": {\n backgroundColor:\n \"action.selected\",\n },\n }}\n >\n {showLogos && (\n <ListItemIcon\n sx={{ minWidth: 32 }}\n >\n {getDomainIcon(\n domain,\n iconSize,\n )}\n </ListItemIcon>\n )}\n <ListItemText\n primary={suggestion}\n primaryTypographyProps={{\n fontSize:\n size === \"small\"\n ? 14\n : 16,\n }}\n />\n </ListItemButton>\n );\n })}\n </List>\n </Paper>\n </Popper>\n </Box>\n </ClickAwayListener>\n );\n },\n);\n\nconst EmailTextFieldWithForm = forwardRef<HTMLDivElement, EmailTextFieldProps>(\n function EmailTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"EmailTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"EmailTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <EmailTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const EmailTextField = forwardRef<HTMLDivElement, EmailTextFieldProps>(\n function EmailTextField(props, ref) {\n if (props.form) {\n return <EmailTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <EmailTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * email-icons.tsx\n *\n * \uC774\uBA54\uC77C \uB3C4\uBA54\uC778 \uC544\uC774\uCF58 \uCEF4\uD3EC\uB10C\uD2B8\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React from \"react\";\n\ninterface IconProps {\n size?: number;\n}\n\n// Gmail - \uACF5\uC2DD Gmail \uB85C\uACE0\nexport const GmailIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"52 42 88 66\" fill=\"none\">\n <path fill=\"#4285f4\" d=\"M58 108h14V74L52 59v43c0 3.32 2.69 6 6 6\" />\n <path fill=\"#34a853\" d=\"M120 108h14c3.32 0 6-2.69 6-6V59l-20 15\" />\n <path\n fill=\"#fbbc04\"\n d=\"M120 48v26l20-15v-8c0-7.42-8.47-11.65-14.4-7.2\"\n />\n <path fill=\"#ea4335\" d=\"M72 74V48l24 18 24-18v26L96 92\" />\n <path\n fill=\"#c5221f\"\n d=\"M52 51v8l20 15V48l-5.6-4.2c-5.94-4.45-14.4-.22-14.4 7.2\"\n />\n </svg>\n);\n\n// Naver\nexport const NaverIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <rect width=\"24\" height=\"24\" rx=\"4\" fill=\"#03C75A\" />\n <path\n d=\"M14.4 12.6L9.3 5.4H6v13.2h3.6v-7.2l5.1 7.2H18V5.4h-3.6v7.2z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// Daum / Hanmail - \uB2E4\uC74C \uACF5\uC2DD \uB85C\uACE0 (\uBC30\uACBD + \uD770\uC0C9 D)\nexport const DaumIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 52 52\" fill=\"none\">\n {/* \uB124\uC774\uBE44 \uBC30\uACBD */}\n <rect width=\"52\" height=\"52\" rx=\"8\" fill=\"#273552\" />\n {/* \uD770\uC0C9 D \uAE00\uC790 */}\n <path\n d=\"m 25.52,20.36 c 3.1152,0 5.6352,2.712 5.5152,5.8536 -0.1128,2.988 -2.6616,5.4264 -5.652,5.4264 h -3.9456 c -0.264,0 -0.48,-0.216 -0.48,-0.48 V 20.84 c 0,-0.264 0.216,-0.48 0.48,-0.48 h 4.08 M 25.52,14 h -9.6 c -0.7944,0 -1.44,0.6456 -1.44,1.44 v 21.12 c 0,0.7944 0.6456,1.44 1.44,1.44 H 25.52 C 32.1464,38 37.52,32.6264 37.52,26 37.52,19.3736 32.1464,14 25.52,14 Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// Kakao\nexport const KakaoIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <rect width=\"24\" height=\"24\" rx=\"4\" fill=\"#FEE500\" />\n <path\n d=\"M12 5C7.58 5 4 7.79 4 11.15c0 2.13 1.42 4.01 3.58 5.08-.16.57-.57 2.07-.65 2.39-.1.4.15.39.31.28.13-.08 2.04-1.38 2.87-1.94.6.09 1.23.14 1.89.14 4.42 0 8-2.79 8-6.15S16.42 5 12 5z\"\n fill=\"#3C1E1E\"\n />\n </svg>\n);\n\n// Nate\n// Nate - \uB124\uC774\uD2B8 \uB85C\uACE0 (\uBE68\uAC04\uC0C9 \uBC30\uACBD + \uD770\uC0C9 n)\nexport const NateIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* \uBE68\uAC04\uC0C9 \uB465\uADFC \uBC30\uACBD */}\n <rect width=\"24\" height=\"24\" rx=\"4\" fill=\"#FF2F1A\" />\n {/* \uD770\uC0C9 n \uAE00\uC790 */}\n <path\n d=\"M6 8V18H9V13C9 11.5 10 10.5 12 10.5C14 10.5 15 11.5 15 13V18H18V12C18 9 15.5 7 12 7C10 7 8 7.8 6 8Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// Hotmail / Outlook - Microsoft \uB85C\uACE0\nexport const OutlookIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 48 48\" fill=\"none\">\n <path fill=\"#ff5722\" d=\"M6 6H22V22H6z\" transform=\"rotate(-180 14 14)\" />\n <path\n fill=\"#4caf50\"\n d=\"M26 6H42V22H26z\"\n transform=\"rotate(-180 34 14)\"\n />\n <path\n fill=\"#ffc107\"\n d=\"M26 26H42V42H26z\"\n transform=\"rotate(-180 34 34)\"\n />\n <path\n fill=\"#03a9f4\"\n d=\"M6 26H22V42H6z\"\n transform=\"rotate(-180 14 34)\"\n />\n </svg>\n);\n\n// Yahoo - \uACF5\uC2DD \uB85C\uACE0\nexport const YahooIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 48 48\" fill=\"none\">\n <polygon\n fill=\"#5e35b1\"\n points=\"4.209,14.881 11.632,14.881 16.189,26.715 20.966,14.881 28.315,14.881 17.07,42 9.501,42 12.587,34.96\"\n />\n <circle cx=\"29.276\" cy=\"30.522\" r=\"4.697\" fill=\"#5e35b1\" />\n <polygon\n fill=\"#5e35b1\"\n points=\"34.693,6 27.213,24.042 35.444,24.042 42.925,6\"\n />\n </svg>\n);\n\n// iCloud - Apple \uAD6C\uB984 \uB85C\uACE0\nexport const ICloudIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 48 48\" fill=\"none\">\n {/* \uD558\uB298\uC0C9 \uADF8\uB77C\uB370\uC774\uC158 \uAD6C\uB984 - \uD06C\uAC8C, \uC911\uC559 \uC815\uB82C */}\n <path\n d=\"M44 26c0-4.42-3.58-8-8-8-.43 0-.85.04-1.27.1C33.57 11.77 28.03 7 21.5 7 13.49 7 7 13.49 7 21.5c0 .42.01.83.05 1.23-.04 0-.07-.01-.11-.01C3.63 22.72 1 25.35 1 28.66 1 32.16 3.84 35 7.34 35H36c4.42 0 8-3.58 8-8v-1z\"\n fill=\"url(#icloud_gradient)\"\n />\n <defs>\n <linearGradient\n id=\"icloud_gradient\"\n x1=\"24\"\n y1=\"7\"\n x2=\"24\"\n y2=\"35\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#6AC4F7\" />\n <stop offset=\"1\" stopColor=\"#3693F3\" />\n </linearGradient>\n </defs>\n </svg>\n);\n\n// \uAE30\uBCF8 \uC774\uBA54\uC77C \uC544\uC774\uCF58 (\uC54C \uC218 \uC5C6\uB294 \uB3C4\uBA54\uC778\uC6A9) - \uC9C4\uD68C\uC0C9 \uC544\uC6C3\uB77C\uC778\nexport const DefaultEmailIcon: React.FC<IconProps> = ({ size = 16 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* \uBD09\uD22C \uBCF8\uCCB4 */}\n <rect\n x=\"2\"\n y=\"4\"\n width=\"20\"\n height=\"16\"\n rx=\"2\"\n stroke=\"#666666\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n {/* \uBD09\uD22C \uB36E\uAC1C */}\n <path\n d=\"M2 6l10 7 10-7\"\n stroke=\"#666666\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n);\n\n/**\n * \uB3C4\uBA54\uC778\uC5D0 \uD574\uB2F9\uD558\uB294 \uC544\uC774\uCF58 \uCEF4\uD3EC\uB10C\uD2B8 \uBC18\uD658\n */\nexport function getEmailIcon(\n domain: string,\n size: number = 16\n): React.ReactNode {\n const lowerDomain = domain.toLowerCase();\n\n switch (lowerDomain) {\n case \"gmail.com\":\n return <GmailIcon size={size} />;\n case \"naver.com\":\n return <NaverIcon size={size} />;\n case \"daum.net\":\n case \"hanmail.net\":\n return <DaumIcon size={size} />;\n case \"kakao.com\":\n return <KakaoIcon size={size} />;\n case \"nate.com\":\n return <NateIcon size={size} />;\n case \"hotmail.com\":\n case \"outlook.com\":\n return <OutlookIcon size={size} />;\n case \"yahoo.com\":\n return <YahooIcon size={size} />;\n case \"icloud.com\":\n return <ICloudIcon size={size} />;\n default:\n return <DefaultEmailIcon size={size} />;\n }\n}\n", "/**\n * TimeTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n ChangeEvent,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, Box } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { TimeTextFieldProps } from \"./types\";\nimport { ClockIcon } from \"./icons\";\nimport { ColonBox, GroupedInputWrapper } from \"./components\";\nimport { useGroupedInput, GroupConfig } from \"./hooks/useGroupedInput\";\nimport { TimePicker } from \"@ehfuse/mui-datetime-picker\";\nimport { getTimeFieldCount, validateTime } from \"./utils\";\n\nconst TimeTextFieldBase = forwardRef<HTMLDivElement, TimeTextFieldProps>(\n function TimeTextFieldBase(\n {\n label,\n format = \"HH:mm\",\n minTime,\n maxTime,\n clockIcon = true,\n minuteStep = 1,\n secondStep = 1,\n hideDisabledTime = false,\n invalidBorderColor,\n debounce,\n sx,\n value,\n onChange,\n onBlur,\n name = \"\",\n disabled,\n readonly = false,\n size,\n fullWidth = false,\n className,\n id,\n fontSize,\n fontColor,\n fontFamily,\n },\n ref,\n ) {\n const [hourValue, setHourValue] = useState(\"\");\n const [minuteValue, setMinuteValue] = useState(\"\");\n const [secondValue, setSecondValue] = useState(\"\");\n const [isInvalid, setIsInvalid] = useState(false);\n const [isInternalChange, setIsInternalChange] = useState(false);\n const [pickerOpen, setPickerOpen] = useState(false);\n\n const hourRef = useRef<HTMLInputElement>(null);\n const minuteRef = useRef<HTMLInputElement>(null);\n const secondRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // \uC678\uBD80 ref\uC640 \uB0B4\uBD80 containerRef \uBCD1\uD569\n useImperativeHandle(ref, () => containerRef.current!, []);\n\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const fieldCount = getTimeFieldCount(format);\n const hasSecond = fieldCount === 3;\n\n // \uD3F0\uD2B8 \uD06C\uAE30 \uACC4\uC0B0\n const defaultFontSize = size === \"small\" ? 16 : 18;\n const computedFontSize = fontSize\n ? typeof fontSize === \"number\"\n ? fontSize\n : parseFloat(fontSize) *\n (fontSize.toString().includes(\"rem\") ? 16 : 1)\n : defaultFontSize;\n const cursorHeight = \"1px\";\n const cursorWidth = `${computedFontSize * 0.55}px`;\n\n // useGroupedInput \uD6C5 \uC0AC\uC6A9\n const groups: GroupConfig[] = useMemo(\n () =>\n hasSecond\n ? [\n {\n maxLength: 2,\n ref: hourRef,\n value: hourValue,\n setValue: setHourValue,\n },\n {\n maxLength: 2,\n ref: minuteRef,\n value: minuteValue,\n setValue: setMinuteValue,\n },\n {\n maxLength: 2,\n ref: secondRef,\n value: secondValue,\n setValue: setSecondValue,\n },\n ]\n : [\n {\n maxLength: 2,\n ref: hourRef,\n value: hourValue,\n setValue: setHourValue,\n },\n {\n maxLength: 2,\n ref: minuteRef,\n value: minuteValue,\n setValue: setMinuteValue,\n },\n ],\n [hourValue, minuteValue, secondValue, hasSecond],\n );\n\n const {\n focusedGroup,\n setFocusedGroup,\n cursorVisible,\n cursorPosRef,\n inputComplete,\n getCursorLeft,\n createMouseDownHandler,\n createClickHandler,\n createFocusHandler,\n createBlurHandler,\n createKeyDownHandler,\n createChangeHandler: createGroupChangeHandler,\n } = useGroupedInput({\n groups,\n fontSize: computedFontSize,\n disabled,\n readonly,\n });\n\n useEffect(() => {\n return () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n };\n }, []);\n\n // value prop \uBCC0\uACBD \uC2DC \uB0B4\uBD80 \uC0C1\uD0DC \uB3D9\uAE30\uD654\n useEffect(() => {\n if (isInternalChange) {\n setIsInternalChange(false);\n return;\n }\n\n if (value !== undefined && value !== null) {\n const strValue = String(value).replace(/[^\\d:]/g, \"\");\n const parts = strValue.split(\":\");\n\n if (parts.length >= 2) {\n setHourValue(parts[0].slice(0, 2));\n setMinuteValue(parts[1].slice(0, 2));\n if (hasSecond && parts[2]) {\n setSecondValue(parts[2].slice(0, 2));\n }\n } else {\n const numbers = strValue.replace(/\\D/g, \"\");\n setHourValue(numbers.slice(0, 2));\n setMinuteValue(numbers.slice(2, 4));\n if (hasSecond) {\n setSecondValue(numbers.slice(4, 6));\n }\n }\n } else {\n setHourValue(\"\");\n setMinuteValue(\"\");\n setSecondValue(\"\");\n }\n }, [value, hasSecond, isInternalChange]);\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC0F onChange \uD638\uCD9C\n const emitChange = useCallback(\n (hour: string, minute: string, second: string) => {\n const isComplete = hasSecond\n ? hour.length === 2 &&\n minute.length === 2 &&\n second.length === 2\n : hour.length === 2 && minute.length === 2;\n\n const isValid = isComplete\n ? validateTime(\n hour,\n minute,\n second,\n format,\n minTime,\n maxTime,\n )\n : true;\n\n setIsInvalid(isComplete && !isValid);\n\n const doEmit = () => {\n if (onChange) {\n setIsInternalChange(true);\n const timeString = hasSecond\n ? `${hour}:${minute}:${second}`\n : `${hour}:${minute}`;\n\n const event = {\n target: { name, value: timeString },\n } as ChangeEvent<HTMLInputElement>;\n onChange(event);\n }\n };\n\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n if (debounce === undefined || debounce === 0) {\n doEmit();\n } else {\n debounceTimer.current = setTimeout(doEmit, debounce);\n }\n },\n [onChange, name, hasSecond, format, minTime, maxTime, debounce],\n );\n\n // \uC2DC\uAC04 \uAC12 \uC81C\uD55C (\uC2DC: 0-23 \uB610\uB294 0-12, \uBD84/\uCD08: 0-59)\n // 24\uC2DC\uAC04 \uD615\uC2DD\uC5D0\uC11C 24 \uC774\uC0C1\uC744 \uC785\uB825\uD558\uBA74 24\uB97C \uBE7C\uC11C \uBCC0\uD658 (24\u219200, 25\u219201, ...)\n const clampTimeValue = useCallback(\n (value: string, type: \"hour\" | \"minute\" | \"second\"): string => {\n if (value.length === 0) return value;\n\n // \uCCAB \uBC88\uC9F8 \uC790\uB9AC \uC785\uB825 \uC2DC: \uC720\uD6A8 \uBC94\uC704 \uCD08\uACFC\uD558\uBA74 \uC55E\uC5D0 0\uC744 \uBD99\uC5EC\uC11C \uB450 \uC790\uB9AC\uB85C\n if (value.length === 1) {\n const digit = parseInt(value, 10);\n if (type === \"hour\") {\n // \uC2DC: 12\uC2DC\uAC04 \uD615\uC2DD\uC774\uBA74 1\uAE4C\uC9C0, 24\uC2DC\uAC04 \uD615\uC2DD\uC774\uBA74 2\uAE4C\uC9C0\n const maxFirstDigit = format.startsWith(\"hh\") ? 1 : 2;\n // \uCCAB \uC790\uB9AC\uAC00 \uBC94\uC704 \uCD08\uACFC\uD558\uBA74 \uC55E\uC5D0 0\uC744 \uBD99\uC5EC\uC11C \uB450 \uC790\uB9AC\uB85C \uB9CC\uB4E6\n if (digit > maxFirstDigit) return `0${digit}`;\n } else {\n // \uBD84/\uCD08: \uCCAB \uC790\uB9AC\uB294 0-5\uB9CC \uAC00\uB2A5, 6-9\uBA74 \uC55E\uC5D0 0 \uBD99\uC784\n if (digit > 5) return `0${digit}`;\n }\n return value;\n }\n\n // \uB450 \uBC88\uC9F8 \uC790\uB9AC\uAE4C\uC9C0 \uC785\uB825 \uC644\uB8CC \uC2DC \uC81C\uD55C\n const num = parseInt(value, 10);\n if (isNaN(num)) return value;\n\n if (type === \"hour\") {\n const is12Hour = format.startsWith(\"hh\");\n // 24\uC2DC\uAC04 \uD615\uC2DD\uC5D0\uC11C 24 \uC774\uC0C1\uC744 \uC785\uB825\uD558\uBA74 24\uB97C \uBE7C\uC11C \uBCC0\uD658\n if (!is12Hour && num >= 24) {\n return String(num - 24).padStart(2, \"0\");\n }\n const maxHour = is12Hour ? 12 : 23;\n if (num > maxHour) return String(maxHour).padStart(2, \"0\");\n } else {\n // minute or second\n if (num > 59) return \"59\";\n }\n return value;\n },\n [format],\n );\n\n // \uC785\uB825 \uD578\uB4E4\uB7EC (\uD6C5\uC758 \uD578\uB4E4\uB7EC + \uCEE4\uC2A4\uD140 \uB85C\uC9C1)\n const handleChange = (groupIndex: number) => {\n return createGroupChangeHandler(groupIndex, (newValue, idx) => {\n // \uAC12 \uC81C\uD55C \uC801\uC6A9\n let clampedValue = newValue;\n if (idx === 0) {\n clampedValue = clampTimeValue(newValue, \"hour\");\n } else if (idx === 1) {\n clampedValue = clampTimeValue(newValue, \"minute\");\n } else if (idx === 2) {\n clampedValue = clampTimeValue(newValue, \"second\");\n }\n\n // \uAC12\uC774 \uBCC0\uACBD\uB418\uC5C8\uC73C\uBA74 \uC0C1\uD0DC \uC5C5\uB370\uC774\uD2B8\n if (clampedValue !== newValue) {\n groups[idx].setValue(clampedValue);\n\n // clamp\uB85C \uC778\uD574 2\uC790\uB9AC\uAC00 \uB418\uC5C8\uC73C\uBA74 \uB2E4\uC74C \uD544\uB4DC\uB85C \uC774\uB3D9\n if (\n clampedValue.length === 2 &&\n newValue.length === 1 &&\n idx < groups.length - 1\n ) {\n const refs = [hourRef, minuteRef, secondRef];\n setTimeout(() => {\n refs[idx + 1].current?.focus();\n refs[idx + 1].current?.setSelectionRange(0, 0);\n }, 0);\n }\n }\n\n const newValues = [hourValue, minuteValue, secondValue];\n newValues[idx] = clampedValue;\n emitChange(newValues[0], newValues[1], newValues[2] || \"\");\n });\n };\n\n // \uD0A4 \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleKeyDown = (groupIndex: number) => {\n return createKeyDownHandler(groupIndex, (newValue, idx) => {\n const newValues = [hourValue, minuteValue, secondValue];\n newValues[idx] = newValue;\n emitChange(newValues[0], newValues[1], newValues[2] || \"\");\n });\n };\n\n // blur \uD578\uB4E4\uB7EC\n const handleBlur = useCallback(() => {\n const blurHandler = createBlurHandler();\n blurHandler();\n\n // \uC2DC\uAC04 \uADF8\uB8F9 \uB0B4 \uB2E4\uB978 \uD544\uB4DC\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9 \uC2DC \uD328\uB529\uD558\uC9C0 \uC54A\uC74C\n setTimeout(() => {\n const activeElement = document.activeElement;\n const isStillInTimeGroup =\n activeElement === hourRef.current ||\n activeElement === minuteRef.current ||\n activeElement === secondRef.current;\n\n if (!isStillInTimeGroup) {\n // 1\uC790\uB9AC \uC2DC\uAC04 \uAC12\uC744 2\uC790\uB9AC\uB85C \uD328\uB529\n if (hourValue.length === 1) {\n setHourValue(hourValue.padStart(2, \"0\"));\n }\n if (minuteValue.length === 1) {\n setMinuteValue(minuteValue.padStart(2, \"0\"));\n }\n if (secondValue.length === 1) {\n setSecondValue(secondValue.padStart(2, \"0\"));\n }\n }\n }, 0);\n\n if (onBlur) {\n const paddedHour =\n hourValue.length === 1\n ? hourValue.padStart(2, \"0\")\n : hourValue;\n const paddedMinute =\n minuteValue.length === 1\n ? minuteValue.padStart(2, \"0\")\n : minuteValue;\n const paddedSecond =\n secondValue.length === 1\n ? secondValue.padStart(2, \"0\")\n : secondValue;\n const timeString = hasSecond\n ? `${paddedHour}:${paddedMinute}:${paddedSecond}`\n : `${paddedHour}:${paddedMinute}`;\n const event = {\n target: { name, value: timeString },\n } as React.FocusEvent<HTMLInputElement>;\n onBlur(event);\n }\n }, [\n createBlurHandler,\n onBlur,\n hasSecond,\n hourValue,\n minuteValue,\n secondValue,\n name,\n ]);\n\n // \uD074\uB9AD \uC2DC \uD3EC\uCEE4\uC2A4\uD560 ref \uACB0\uC815\n const getTargetRefOnClick = useCallback(() => {\n const values = hasSecond\n ? [hourValue, minuteValue, secondValue]\n : [hourValue, minuteValue];\n const refs = hasSecond\n ? [hourRef, minuteRef, secondRef]\n : [hourRef, minuteRef];\n\n // \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uAC12\uC774 \uC788\uB294 \uADF8\uB8F9 \uCC3E\uAE30\n let lastFilledIndex = -1;\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i].length > 0) {\n lastFilledIndex = i;\n break;\n }\n }\n\n if (lastFilledIndex >= 0) {\n return {\n ref: refs[lastFilledIndex],\n groupIndex: lastFilledIndex,\n };\n }\n // \uBAA8\uB450 \uBE44\uC5B4\uC788\uC73C\uBA74 \uCCAB \uBC88\uC9F8 \uCE78\n return { ref: hourRef, groupIndex: 0 };\n }, [hourValue, minuteValue, secondValue, hasSecond]);\n\n // useGroupedInput \uD6C5\uC5D0\uC11C \uBC18\uD658\uB41C setFocusedGroup \uC0AC\uC6A9\n // (GroupedInputWrapper\uAC00 \uD638\uCD9C\uD560 \uB54C \uD6C5 \uB0B4\uBD80 \uC0C1\uD0DC\uB3C4 \uC5C5\uB370\uC774\uD2B8\uB428)\n\n // \uC2DC\uACC4 \uC544\uC774\uCF58 \uD074\uB9AD \uD578\uB4E4\uB7EC\n const handleClockIconClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n if (disabled || readonly) return;\n\n // \uD604\uC7AC \uD3EC\uCEE4\uC2A4\uB41C \uC694\uC18C blur \uCC98\uB9AC\n const activeElement = document.activeElement as HTMLElement;\n if (activeElement && typeof activeElement.blur === \"function\") {\n activeElement.blur();\n }\n setFocusedGroup(null);\n\n setPickerOpen(true);\n },\n [disabled, readonly, setFocusedGroup],\n );\n\n // TimePicker\uC5D0\uC11C \uC2DC\uAC04 \uC120\uD0DD \uC2DC\n const handlePickerChange = useCallback(\n (hour: string, minute: string, second?: string) => {\n setHourValue(hour);\n setMinuteValue(minute);\n if (hasSecond && second) {\n setSecondValue(second);\n }\n emitChange(hour, minute, second || \"\");\n\n // \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC2DC \uB4E4\uC5B4\uAC00\uC9C0 \uC54A\uB3C4\uB85D\n setFocusedGroup(null);\n },\n [hasSecond, emitChange, setFocusedGroup],\n );\n\n // TimePicker \uB2EB\uAE30\n const handlePickerClose = useCallback(() => {\n setPickerOpen(false);\n }, []);\n\n const noBorderStyle: SxProps<Theme> = {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": { border: \"none\" },\n \"&:hover fieldset\": { border: \"none\" },\n \"&.Mui-focused fieldset\": { border: \"none\" },\n },\n };\n\n // \uCEE4\uC2A4\uD140 \uD3F0\uD2B8 \uD06C\uAE30\uC5D0 \uB530\uB978 fieldWidth \uACC4\uC0B0\n // ch \uB2E8\uC704\uB294 \uD3F0\uD2B8\uB9C8\uB2E4 \uB2E4\uB974\uBBC0\uB85C, fontSize \uAE30\uC900\uC73C\uB85C px \uACC4\uC0B0\n const fieldWidth = fontSize ? `${computedFontSize * 1.25}px` : \"2.5ch\";\n\n // \uADF8\uB8F9 \uB80C\uB354\uB9C1\n const renderGroup = (\n groupIndex: number,\n groupValue: string,\n placeholder: string,\n ) => {\n const isFocused = focusedGroup === groupIndex;\n const showCursor = cursorVisible && isFocused && !inputComplete;\n const refs = [hourRef, minuteRef, secondRef];\n\n return (\n <Box\n onMouseDown={createMouseDownHandler(groupIndex)}\n onClick={createClickHandler(groupIndex)}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <TextField\n inputRef={refs[groupIndex]}\n value={groupValue}\n onChange={handleChange(groupIndex)}\n onKeyDown={handleKeyDown(groupIndex)}\n onFocus={createFocusHandler(groupIndex)}\n onBlur={handleBlur}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder={placeholder}\n variant=\"outlined\"\n sx={{\n width: fieldWidth,\n maxWidth: fieldWidth,\n minWidth: fieldWidth,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": {\n width: fieldWidth,\n maxWidth: fieldWidth,\n minWidth: fieldWidth,\n },\n \"& .MuiInputBase-input\": {\n width: fieldWidth,\n minWidth: fieldWidth,\n maxWidth: fieldWidth,\n textAlign: \"left\",\n caretColor: \"transparent\",\n ...(fontSize && { fontSize }),\n ...(fontColor && { color: fontColor }),\n ...(fontFamily && { fontFamily }),\n },\n \"& .MuiInputBase-input::placeholder\": {\n color: \"rgba(0, 0, 0, 0.3)\",\n opacity: 1,\n },\n }}\n slotProps={{\n input: { readOnly: readonly },\n htmlInput: {\n maxLength: 2,\n inputMode: \"numeric\",\n style: { padding: \"0 2px\", textAlign: \"left\" },\n },\n }}\n />\n {showCursor && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 1 : 3,\n left: `calc(2px + ${getCursorLeft(\n groupIndex,\n )}px)`,\n width: cursorWidth,\n height: cursorHeight,\n backgroundColor: \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n }}\n />\n )}\n </Box>\n );\n };\n\n // \uC804\uCCB4 \uC2DC\uAC04 \uAC12 \uD655\uC778\n const getFullTime = useCallback(() => {\n return hourValue + minuteValue + (hasSecond ? secondValue : \"\");\n }, [hourValue, minuteValue, secondValue, hasSecond]);\n\n // \uCF5C\uB860 \uD45C\uC2DC \uC5EC\uBD80 (\uAC12\uC774 \uC788\uAC70\uB098 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uC744 \uB54C)\n const showColon = getFullTime().length > 0 || focusedGroup !== null;\n\n // \uB0B4\uBD80 \uADF8\uB8F9 \uB80C\uB354\uB9C1\n const renderGroupedInput = () => (\n <>\n {/* \uC2DC\uAC04 \uD544\uB4DC */}\n {renderGroup(0, hourValue, \"00\")}\n\n <ColonBox size={size} visible={showColon} />\n\n {/* \uBD84 \uD544\uB4DC */}\n {renderGroup(1, minuteValue, \"00\")}\n\n {/* \uCD08 \uD544\uB4DC */}\n {hasSecond && (\n <>\n <ColonBox size={size} visible={showColon} />\n\n {renderGroup(2, secondValue, \"00\")}\n </>\n )}\n\n {/* Spacer - flex \uD655\uC7A5\uC744 \uC704\uD55C \uBE48 \uACF5\uAC04 */}\n <Box sx={{ flex: 1 }} />\n </>\n );\n\n // \uC2DC\uACC4 \uC544\uC774\uCF58 (endAdornment)\n const clockIconElement =\n clockIcon && !readonly ? (\n <Box\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n onClick={handleClockIconClick}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n ml: size === \"small\" ? 0.5 : 1,\n mr: size === \"small\" ? -0.5 : 0,\n color: \"text.secondary\",\n opacity: 0.5,\n cursor: disabled ? \"default\" : \"pointer\",\n borderRadius: \"50%\",\n p: 0.5,\n transition:\n \"opacity 0.2s, color 0.2s, background-color 0.2s\",\n \"&:hover\": {\n opacity: disabled ? 0.5 : 1,\n color: disabled ? \"text.secondary\" : \"text.primary\",\n backgroundColor: disabled\n ? \"transparent\"\n : \"action.hover\",\n },\n }}\n >\n <ClockIcon size={size === \"small\" ? 18 : 22} />\n </Box>\n ) : null;\n\n return (\n <Box\n ref={containerRef}\n sx={{\n ...(fullWidth && { width: \"100%\" }),\n ...sx,\n }}\n className={className}\n >\n <GroupedInputWrapper\n label={label}\n size={size}\n disabled={disabled}\n readonly={readonly}\n focusedGroup={focusedGroup}\n setFocusedGroup={setFocusedGroup}\n hasValue={getFullTime().length > 0}\n isInvalid={isInvalid}\n invalidBorderColor={invalidBorderColor}\n inputRefs={\n hasSecond\n ? [hourRef, minuteRef, secondRef]\n : [hourRef, minuteRef]\n }\n getTargetRefOnClick={getTargetRefOnClick}\n fullWidth={fullWidth}\n id={id}\n endAdornment={clockIconElement}\n contentSx={{ pl: 1.75 }}\n >\n {renderGroupedInput()}\n </GroupedInputWrapper>\n\n {/* TimePicker Popover */}\n <TimePicker\n anchorEl={containerRef}\n open={pickerOpen}\n onClose={handlePickerClose}\n value={{\n hour: hourValue,\n minute: minuteValue,\n second: hasSecond ? secondValue : undefined,\n }}\n onChange={handlePickerChange}\n format={format}\n minTime={minTime}\n maxTime={maxTime}\n minuteStep={minuteStep}\n secondStep={secondStep}\n hideDisabledTime={hideDisabledTime}\n />\n </Box>\n );\n },\n);\n\nconst TimeTextFieldWithForm = forwardRef<HTMLDivElement, TimeTextFieldProps>(\n function TimeTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"TimeTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"TimeTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <TimeTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n },\n);\n\nexport const TimeTextField = forwardRef<HTMLDivElement, TimeTextFieldProps>(\n function TimeTextField(props, ref) {\n if (props.form) {\n return <TimeTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <TimeTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * DateTimeTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n ChangeEvent,\n useMemo,\n useRef,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, InputAdornment, IconButton, Box } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { DateTimeTextFieldProps } from \"./types\";\nimport { DateTimePicker } from \"@ehfuse/mui-datetime-picker\";\nimport { ColonBox } from \"./components\";\nimport { CalendarIcon } from \"./icons\";\nimport { useDebouncedEmit, useGroupedInput, GroupConfig } from \"./hooks\";\nimport {\n getSeparator,\n getMaxLength,\n getCompleteLength,\n validateDate,\n validateTime,\n clampTimeValue,\n is12HourFormat,\n extractDateFormat,\n hasSecondField,\n formatDateValue,\n formatToPlaceholder,\n getSegmentRange,\n hasYearInFormat,\n parseDateWithInternalYear,\n buildDateOutputValue,\n dateToNumbers,\n} from \"./utils\";\n\nconst DateTimeTextFieldBase = forwardRef<\n HTMLDivElement,\n DateTimeTextFieldProps\n>(function DateTimeTextFieldBase(\n {\n label,\n format = \"YYYY-MM-DD HH:mm\",\n dateSeparator = \"-\",\n minDateTime,\n maxDateTime,\n minTime,\n maxTime,\n holidays = [],\n holidayColor = \"red\",\n calendarIcon = true,\n selectedColor,\n showToday = true,\n minuteStep = 1,\n secondStep = 1,\n hideDisabledTime = false,\n invalidBorderColor,\n debounce,\n sx,\n value,\n onChange,\n onBlur,\n name = \"\",\n disabled,\n readonly = false,\n size,\n fullWidth = false,\n className,\n id,\n },\n ref,\n) {\n // \uB0A0\uC9DC \uD544\uB4DC \uC0C1\uD0DC\n const [dateDisplayValue, setDateDisplayValue] = useState(\"\");\n const [prevDateNumbers, setPrevDateNumbers] = useState(\"\");\n const [internalYear, setInternalYear] = useState<number | null>(null); // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC6A9\n\n // \uC2DC\uAC04 \uD544\uB4DC \uC0C1\uD0DC\n const [hourValue, setHourValue] = useState(\"\");\n const [minuteValue, setMinuteValue] = useState(\"\");\n const [secondValue, setSecondValue] = useState(\"\");\n\n const [isInvalid, setIsInvalid] = useState(false);\n const [isDateFocused, setIsDateFocused] = useState(false);\n\n // \uD31D\uC624\uBC84 \uC0C1\uD0DC\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n\n // refs\n const dateInputRef = useRef<HTMLInputElement>(null);\n const hourRef = useRef<HTMLInputElement>(null);\n const minuteRef = useRef<HTMLInputElement>(null);\n const secondRef = useRef<HTMLInputElement>(null);\n const selectionRangeRef = useRef<{ start: number; end: number } | null>(\n null,\n );\n const containerRef = useRef<HTMLDivElement>(null);\n\n // \uC678\uBD80 ref\uC640 \uB0B4\uBD80 containerRef \uBCD1\uD569\n useImperativeHandle(ref, () => containerRef.current!, []);\n\n const hasSecond = hasSecondField(format);\n const is12Hour = is12HourFormat(format);\n const dateFormat = extractDateFormat(format);\n const displayDateSeparator = getSeparator(dateFormat);\n const dateMaxLength = getMaxLength(dateFormat);\n const dateCompleteLength = getCompleteLength(dateFormat);\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC778\uC9C0 \uD655\uC778 (YYYY, YY\uAC00 \uC5C6\uB294 \uD3EC\uB9F7)\n const isYearlessFormat = !hasYearInFormat(dateFormat);\n\n // \uD3F0\uD2B8 \uD06C\uAE30 \uACC4\uC0B0 (\uC2DC\uAC04 \uD544\uB4DC\uC6A9)\n const computedFontSize = size === \"small\" ? 16 : 18;\n const cursorHeight = \"1px\";\n const cursorWidth = `${computedFontSize * 0.55}px`;\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur, lastEmittedValue } = useDebouncedEmit({\n name,\n debounce,\n onChange,\n });\n\n // \uC2DC\uAC04 \uADF8\uB8F9 \uC124\uC815\n const timeGroups: GroupConfig[] = useMemo(() => {\n const baseGroups: GroupConfig[] = [\n {\n maxLength: 2,\n ref: hourRef,\n value: hourValue,\n setValue: setHourValue,\n },\n {\n maxLength: 2,\n ref: minuteRef,\n value: minuteValue,\n setValue: setMinuteValue,\n },\n ];\n\n if (hasSecond) {\n baseGroups.push({\n maxLength: 2,\n ref: secondRef,\n value: secondValue,\n setValue: setSecondValue,\n });\n }\n\n return baseGroups;\n }, [hourValue, minuteValue, secondValue, hasSecond]);\n\n const {\n focusedGroup,\n cursorVisible,\n inputComplete,\n getCursorLeft,\n createMouseDownHandler,\n createClickHandler,\n createFocusHandler,\n createBlurHandler,\n createKeyDownHandler,\n createChangeHandler: createGroupChangeHandler,\n } = useGroupedInput({\n groups: timeGroups,\n fontSize: computedFontSize,\n disabled,\n readonly,\n });\n\n // \uC804\uCCB4 \uB0A0\uC9DC\uC2DC\uAC04 \uBB38\uC790\uC5F4 \uC0DD\uC131 (\uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC774\uC5B4\uB3C4 \uC5F0\uB3C4 \uD3EC\uD568)\n const buildDateTimeString = useCallback(\n (\n dateStr: string,\n hour: string,\n minute: string,\n second: string,\n yearOverride?: number,\n ) => {\n // \uB0A0\uC9DC \uBD80\uBD84 \uCD9C\uB825\uAC12 \uC0DD\uC131 (yearless \uD3EC\uB9F7 \uC9C0\uC6D0)\n const outputDateStr = buildDateOutputValue(\n dateStr,\n dateFormat,\n dateSeparator,\n yearOverride ?? internalYear,\n );\n const timeStr = hasSecond\n ? `${hour}:${minute}:${second}`\n : `${hour}:${minute}`;\n return `${outputDateStr} ${timeStr}`;\n },\n [dateFormat, dateSeparator, hasSecond, internalYear],\n );\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC\n const performValidation = useCallback(\n (dateStr: string, hour: string, minute: string, second: string) => {\n const dateNumbers = dateStr.replace(/\\D/g, \"\");\n const dateComplete = dateNumbers.length === dateCompleteLength;\n const timeComplete = hasSecond\n ? hour.length === 2 &&\n minute.length === 2 &&\n second.length === 2\n : hour.length === 2 && minute.length === 2;\n\n if (dateComplete && timeComplete) {\n const dateValid = validateDate(\n dateStr,\n dateFormat,\n minDateTime,\n maxDateTime,\n );\n const timeValid = validateTime(\n hour,\n minute,\n second,\n is12Hour,\n minTime,\n maxTime,\n );\n setIsInvalid(!dateValid || !timeValid);\n } else {\n setIsInvalid(false);\n }\n },\n [\n dateCompleteLength,\n hasSecond,\n dateFormat,\n minDateTime,\n maxDateTime,\n is12Hour,\n minTime,\n maxTime,\n ],\n );\n\n // value prop \uBCC0\uACBD \uC2DC \uB3D9\uAE30\uD654\n useEffect(() => {\n if (value !== undefined && value !== null) {\n const strValue = String(value);\n const [datePart, timePart] = strValue.split(\" \");\n\n if (strValue !== lastEmittedValue.current) {\n if (datePart) {\n const formatted = formatDateValue(datePart, dateFormat);\n setDateDisplayValue(formatted);\n setPrevDateNumbers(formatted.replace(/\\D/g, \"\"));\n }\n\n if (timePart) {\n const timeParts = timePart.split(\":\");\n setHourValue(timeParts[0]?.slice(0, 2) || \"\");\n setMinuteValue(timeParts[1]?.slice(0, 2) || \"\");\n if (hasSecond && timeParts[2]) {\n setSecondValue(timeParts[2].slice(0, 2));\n }\n }\n\n lastEmittedValue.current = strValue;\n }\n } else {\n if (lastEmittedValue.current !== \"\") {\n setDateDisplayValue(\"\");\n setPrevDateNumbers(\"\");\n setHourValue(\"\");\n setMinuteValue(\"\");\n setSecondValue(\"\");\n lastEmittedValue.current = \"\";\n }\n }\n }, [value, hasSecond, dateFormat, lastEmittedValue]);\n\n // \uB0A0\uC9DC \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleDateChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const input = e.target;\n const newValue = input.value;\n const newNumbers = newValue.replace(/\\D/g, \"\");\n const selection = selectionRangeRef.current;\n\n // \uC601\uC5ED \uC120\uD0DD \uC0C1\uD0DC\uC5D0\uC11C \uC785\uB825\uD55C \uACBD\uC6B0\n if (\n selection &&\n selection.start !== selection.end &&\n selection.start >= 0 &&\n selection.end <= dateDisplayValue.length &&\n dateDisplayValue.length > 0 &&\n selection.start < selection.end\n ) {\n const beforeSelection = dateDisplayValue.slice(\n 0,\n selection.start,\n );\n const afterSelection = dateDisplayValue.slice(selection.end);\n const beforeNumbers = beforeSelection.replace(/\\D/g, \"\");\n const afterNumbers = afterSelection.replace(/\\D/g, \"\");\n const inputChar = newValue\n .slice(selection.start, selection.start + 1)\n .replace(/\\D/g, \"\");\n\n if (inputChar) {\n const combinedNumbers =\n beforeNumbers + inputChar + afterNumbers;\n const formattedValue = formatDateValue(\n combinedNumbers,\n dateFormat,\n );\n\n setDateDisplayValue(formattedValue);\n setPrevDateNumbers(formattedValue.replace(/\\D/g, \"\"));\n performValidation(\n formattedValue,\n hourValue,\n minuteValue,\n secondValue,\n );\n\n const newCursorPos = selection.start + 1;\n let adjustedPos = newCursorPos;\n if (formattedValue[adjustedPos] === displayDateSeparator) {\n adjustedPos++;\n }\n\n requestAnimationFrame(() => {\n input.setSelectionRange(adjustedPos, adjustedPos);\n });\n\n const outputValue = buildDateTimeString(\n formattedValue,\n hourValue,\n minuteValue,\n secondValue,\n );\n emitChange(e, outputValue);\n\n selectionRangeRef.current = null;\n return;\n }\n }\n\n selectionRangeRef.current = null;\n\n // \uBC31\uC2A4\uD398\uC774\uC2A4 \uAC10\uC9C0\n const isBackspace =\n newNumbers.length <= prevDateNumbers.length &&\n newValue.length < dateDisplayValue.length;\n\n let formattedValue: string;\n\n if (isBackspace && newNumbers.length === prevDateNumbers.length) {\n const trimmedNumbers = newNumbers.slice(0, -1);\n formattedValue = formatDateValue(trimmedNumbers, dateFormat);\n } else {\n formattedValue = formatDateValue(newValue, dateFormat);\n }\n\n setDateDisplayValue(formattedValue);\n setPrevDateNumbers(formattedValue.replace(/\\D/g, \"\"));\n performValidation(\n formattedValue,\n hourValue,\n minuteValue,\n secondValue,\n );\n\n const outputValue = buildDateTimeString(\n formattedValue,\n hourValue,\n minuteValue,\n secondValue,\n );\n emitChange(e, outputValue);\n\n // \uB0A0\uC9DC \uC785\uB825 \uC644\uB8CC \uC2DC \uC2DC\uAC04 \uD544\uB4DC\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9\n const numbers = formattedValue.replace(/\\D/g, \"\");\n if (numbers.length === dateCompleteLength) {\n setTimeout(() => {\n hourRef.current?.focus();\n }, 0);\n }\n },\n [\n dateDisplayValue,\n prevDateNumbers,\n dateFormat,\n displayDateSeparator,\n dateCompleteLength,\n hourValue,\n minuteValue,\n secondValue,\n performValidation,\n buildDateTimeString,\n emitChange,\n ],\n );\n\n // \uD14D\uC2A4\uD2B8 \uB108\uBE44 \uCE21\uC815\n const measureTextWidth = useCallback(\n (text: string, input: HTMLInputElement): number => {\n const style = window.getComputedStyle(input);\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return text.length * 10;\n ctx.font = `${style.fontSize} ${style.fontFamily}`;\n return ctx.measureText(text).width;\n },\n [],\n );\n\n // \uB0A0\uC9DC \uD074\uB9AD \uD578\uB4E4\uB7EC (\uC601\uC5ED \uC120\uD0DD)\n const handleDateClick = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n if (disabled || readonly) return;\n\n // dateInputRef\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC2E4\uC81C input \uC694\uC18C \uCC38\uC870\n const input = dateInputRef.current;\n if (!input) return;\n\n const cursorPos = input.selectionStart || 0;\n\n if (dateDisplayValue.length > 0) {\n // \uD074\uB9AD\uD55C X \uC88C\uD45C\uAC00 \uD14D\uC2A4\uD2B8 \uB108\uBE44\uBCF4\uB2E4 \uD070\uC9C0 \uD655\uC778 (\uC678\uACFD \uD074\uB9AD)\n const rect = input.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const paddingLeft = parseFloat(\n window.getComputedStyle(input).paddingLeft,\n );\n const textWidth = measureTextWidth(dateDisplayValue, input);\n const isOutsideText = clickX > paddingLeft + textWidth;\n\n // \uC678\uACFD \uD074\uB9AD\uC774\uAC70\uB098 \uCEE4\uC11C\uAC00 \uAC12 \uAE38\uC774 \uB05D\uC774\uBA74 \uC804\uCCB4 \uC120\uD0DD\n if (isOutsideText || cursorPos >= dateDisplayValue.length) {\n selectionRangeRef.current = {\n start: 0,\n end: dateDisplayValue.length,\n };\n requestAnimationFrame(() => {\n input?.setSelectionRange?.(0, dateDisplayValue.length);\n });\n } else {\n // \uB144/\uC6D4/\uC77C \uAC01 \uCE78 \uD074\uB9AD\uC2DC \uD574\uB2F9 \uCE78\uB9CC \uC120\uD0DD\n const { start, end } = getSegmentRange(\n cursorPos,\n dateFormat,\n );\n const actualEnd = Math.min(end, dateDisplayValue.length);\n const actualStart = Math.min(\n start,\n dateDisplayValue.length,\n );\n\n selectionRangeRef.current = {\n start: actualStart,\n end: actualEnd,\n };\n\n requestAnimationFrame(() => {\n input?.setSelectionRange?.(actualStart, actualEnd);\n });\n }\n } else {\n selectionRangeRef.current = null;\n }\n },\n [disabled, readonly, dateDisplayValue, dateFormat, measureTextWidth],\n );\n\n // \uB0A0\uC9DC \uD0A4 \uC785\uB825 \uC81C\uD55C (\uC5F0\uB3C4 \uCCAB \uC790\uB9AC)\n const handleDateKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!/^\\d$/.test(e.key)) return;\n\n const currentNumbers = dateDisplayValue.replace(/\\D/g, \"\");\n const numLen = currentNumbers.length;\n\n if (dateFormat.startsWith(\"YYYY\") && numLen === 0) {\n if (e.key !== \"1\" && e.key !== \"2\") {\n e.preventDefault();\n return;\n }\n }\n },\n [dateDisplayValue, dateFormat],\n );\n\n // \uC2DC\uAC04 \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleTimeChange = (groupIndex: number) => {\n return createGroupChangeHandler(groupIndex, (newValue, idx) => {\n let clampedValue = clampTimeValue(\n newValue,\n idx === 0 ? \"hour\" : idx === 1 ? \"minute\" : \"second\",\n is12Hour,\n );\n\n if (clampedValue !== newValue) {\n timeGroups[idx].setValue(clampedValue);\n\n // clamp\uB85C \uC778\uD574 2\uC790\uB9AC\uAC00 \uB418\uC5C8\uC73C\uBA74 \uB2E4\uC74C \uD544\uB4DC\uB85C \uC774\uB3D9\n if (\n clampedValue.length === 2 &&\n newValue.length === 1 &&\n idx < timeGroups.length - 1\n ) {\n const refs = [hourRef, minuteRef, secondRef];\n setTimeout(() => {\n refs[idx + 1].current?.focus();\n refs[idx + 1].current?.setSelectionRange(0, 0);\n }, 0);\n }\n }\n\n const newHour = idx === 0 ? clampedValue : hourValue;\n const newMinute = idx === 1 ? clampedValue : minuteValue;\n const newSecond = idx === 2 ? clampedValue : secondValue;\n\n performValidation(dateDisplayValue, newHour, newMinute, newSecond);\n\n const outputValue = buildDateTimeString(\n dateDisplayValue,\n newHour,\n newMinute,\n newSecond,\n );\n emitChange(null, outputValue);\n });\n };\n\n // \uC2DC\uAC04 \uD0A4 \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleTimeKeyDown = (groupIndex: number) => {\n return createKeyDownHandler(groupIndex, (newValue, idx) => {\n const newHour = idx === 0 ? newValue : hourValue;\n const newMinute = idx === 1 ? newValue : minuteValue;\n const newSecond = idx === 2 ? newValue : secondValue;\n\n const outputValue = buildDateTimeString(\n dateDisplayValue,\n newHour,\n newMinute,\n newSecond,\n );\n emitChange(null, outputValue);\n });\n };\n\n // blur \uD578\uB4E4\uB7EC\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsDateFocused(false);\n\n // 1\uC790\uB9AC \uC2DC\uAC04 \uAC12\uC744 2\uC790\uB9AC\uB85C \uD328\uB529\n const paddedHour =\n hourValue.length === 1 ? hourValue.padStart(2, \"0\") : hourValue;\n const paddedMinute =\n minuteValue.length === 1\n ? minuteValue.padStart(2, \"0\")\n : minuteValue;\n const paddedSecond =\n secondValue.length === 1\n ? secondValue.padStart(2, \"0\")\n : secondValue;\n\n // \uD328\uB529\uB41C \uAC12\uC73C\uB85C \uC0C1\uD0DC \uC5C5\uB370\uC774\uD2B8\n if (hourValue.length === 1) setHourValue(paddedHour);\n if (minuteValue.length === 1) setMinuteValue(paddedMinute);\n if (secondValue.length === 1) setSecondValue(paddedSecond);\n\n const outputValue = buildDateTimeString(\n dateDisplayValue,\n paddedHour,\n paddedMinute,\n paddedSecond,\n );\n flushOnBlur(e, outputValue);\n if (onBlur) {\n onBlur(e);\n }\n },\n [\n dateDisplayValue,\n hourValue,\n minuteValue,\n secondValue,\n buildDateTimeString,\n flushOnBlur,\n onBlur,\n ],\n );\n\n // \uC2DC\uAC04 \uD544\uB4DC blur \uD578\uB4E4\uB7EC (\uD328\uB529 \uCC98\uB9AC \uD3EC\uD568)\n const handleTimeBlur = useCallback(() => {\n // \uAE30\uC874 createBlurHandler \uB85C\uC9C1 \uC2E4\uD589\n const baseBlurHandler = createBlurHandler();\n baseBlurHandler();\n\n // \uC2DC\uAC04 \uADF8\uB8F9 \uB0B4 \uB2E4\uB978 \uD544\uB4DC\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9 \uC2DC \uD328\uB529\uD558\uC9C0 \uC54A\uC74C\n setTimeout(() => {\n const activeElement = document.activeElement;\n const isStillInTimeGroup =\n activeElement === hourRef.current ||\n activeElement === minuteRef.current ||\n activeElement === secondRef.current;\n\n if (!isStillInTimeGroup) {\n // 1\uC790\uB9AC \uC2DC\uAC04 \uAC12\uC744 2\uC790\uB9AC\uB85C \uD328\uB529\n if (hourValue.length === 1) {\n setHourValue(hourValue.padStart(2, \"0\"));\n }\n if (minuteValue.length === 1) {\n setMinuteValue(minuteValue.padStart(2, \"0\"));\n }\n if (secondValue.length === 1) {\n setSecondValue(secondValue.padStart(2, \"0\"));\n }\n }\n }, 0);\n }, [createBlurHandler, hourValue, minuteValue, secondValue]);\n\n // focus \uD578\uB4E4\uB7EC\n const handleDateFocus = useCallback(() => {\n setIsDateFocused(true);\n }, []);\n\n // \uB2EC\uB825\uC5D0\uC11C \uB0A0\uC9DC \uC120\uD0DD\n const handleCalendarSelect = useCallback(\n (date: Date) => {\n const year = date.getFullYear();\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC758 \uACBD\uC6B0 internalYear\uC5D0 \uC800\uC7A5\n if (isYearlessFormat) {\n setInternalYear(year);\n }\n\n // \uD3EC\uB9F7\uC5D0 \uB9DE\uAC8C \uC22B\uC790 \uBB38\uC790\uC5F4 \uC0DD\uC131\n const numbers = dateToNumbers(date, dateFormat);\n\n const formatted = formatDateValue(numbers, dateFormat);\n\n setDateDisplayValue(formatted);\n setPrevDateNumbers(numbers);\n performValidation(formatted, hourValue, minuteValue, secondValue);\n\n const outputValue = buildDateTimeString(\n formatted,\n hourValue,\n minuteValue,\n secondValue,\n year,\n );\n emitChange(null, outputValue, true);\n setCalendarOpen(false);\n setAnchorEl(null);\n\n // \uD3EC\uCEE4\uC2A4 \uD574\uC81C (blur)\n setTimeout(() => {\n dateInputRef.current?.blur();\n hourRef.current?.blur();\n minuteRef.current?.blur();\n secondRef.current?.blur();\n }, 0);\n },\n [\n dateFormat,\n isYearlessFormat,\n hourValue,\n minuteValue,\n secondValue,\n performValidation,\n buildDateTimeString,\n emitChange,\n ],\n );\n\n // \uB2EC\uB825 \uD31D\uC624\uBC84 \uB0B4 \uC2DC\uAC04 \uC120\uD0DD \uD578\uB4E4\uB7EC\n const handleCalendarTimeChange = useCallback(\n (hour: number, minute: number, second?: number) => {\n const h = String(hour).padStart(2, \"0\");\n const m = String(minute).padStart(2, \"0\");\n const s =\n second !== undefined ? String(second).padStart(2, \"0\") : \"\";\n\n setHourValue(h);\n setMinuteValue(m);\n if (hasSecond && s) {\n setSecondValue(s);\n }\n\n performValidation(dateDisplayValue, h, m, s);\n\n const outputValue = buildDateTimeString(dateDisplayValue, h, m, s);\n emitChange(null, outputValue, true);\n },\n [\n hasSecond,\n dateDisplayValue,\n performValidation,\n buildDateTimeString,\n emitChange,\n ],\n );\n\n // \uC120\uD0DD\uB41C \uB0A0\uC9DC \uACC4\uC0B0 (\uB2EC\uB825\uC6A9)\n const selectedDate = useMemo((): Date | null => {\n const parsed = parseDateWithInternalYear(\n dateDisplayValue,\n dateFormat,\n internalYear,\n );\n if (!parsed) return null;\n return new Date(parsed.year, parsed.month - 1, parsed.day);\n }, [dateDisplayValue, dateFormat, internalYear]);\n\n // \uB2EC\uB825\uC5D0 \uC804\uB2EC\uD560 \uB0A0\uC9DC \uACC4\uC0B0\n const calendarSelectedDate = useMemo((): Date => {\n // \uC120\uD0DD\uB41C \uB0A0\uC9DC\uAC00 \uC788\uC73C\uBA74 \uADF8\uB300\uB85C \uC0AC\uC6A9\n if (selectedDate) return selectedDate;\n\n // \uC5F0\uB3C4\uAC00 \uC5C6\uB294 \uD3EC\uB9F7\uC758 \uACBD\uC6B0 internalYear \uB610\uB294 \uD604\uC7AC \uC5F0\uB3C4 \uC0AC\uC6A9\n if (isYearlessFormat) {\n const yearToUse = internalYear || new Date().getFullYear();\n const parsed = parseDateWithInternalYear(\n dateDisplayValue,\n dateFormat,\n yearToUse,\n );\n if (\n parsed &&\n parsed.month >= 1 &&\n parsed.month <= 12 &&\n parsed.day >= 1 &&\n parsed.day <= 31\n ) {\n return new Date(yearToUse, parsed.month - 1, parsed.day);\n }\n return new Date(\n yearToUse,\n new Date().getMonth(),\n new Date().getDate(),\n );\n }\n\n return new Date();\n }, [\n selectedDate,\n dateDisplayValue,\n dateFormat,\n isYearlessFormat,\n internalYear,\n ]);\n\n // \uC2A4\uD0C0\uC77C\n const invalidStyles: SxProps<Theme> =\n isInvalid && invalidBorderColor\n ? {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": { borderColor: invalidBorderColor },\n \"&:hover fieldset\": { borderColor: invalidBorderColor },\n \"&.Mui-focused fieldset\": {\n borderColor: invalidBorderColor,\n },\n },\n }\n : {};\n\n const readonlyStyles: SxProps<Theme> = readonly\n ? {\n pointerEvents: \"none\",\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\":\n {\n borderColor: \"rgba(0, 0, 0, 0.23)\",\n borderWidth: 1,\n },\n \"& .MuiInputLabel-root.Mui-focused\": {\n color: \"rgba(0, 0, 0, 0.6)\",\n },\n }\n : {};\n\n const noBorderStyle: SxProps<Theme> = {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": { border: \"none\" },\n \"&:hover fieldset\": { border: \"none\" },\n \"&.Mui-focused fieldset\": { border: \"none\" },\n },\n };\n\n // \uB0A0\uC9DC \uD544\uB4DC width \uACC4\uC0B0\n // placeholder '____-__-__' \uC5D0\uC11C \uBC11\uC904\uC740 \uC22B\uC790\uC640 \uBE44\uC2B7\uD55C \uB108\uBE44\n const dateFieldWidth = useMemo(() => {\n // dateMaxLength = 10 (YYYY-MM-DD)\n return `${dateMaxLength}ch`;\n }, [dateMaxLength]);\n\n // \uB0A0\uC9DC placeholder (____-__-__)\n const datePlaceholder = useMemo(() => {\n return formatToPlaceholder(dateFormat);\n }, [dateFormat]);\n\n // \uC2DC\uAC04 \uD544\uB4DC width (TimeTextField\uC640 \uB3D9\uC77C\uD558\uAC8C)\n const timeFieldWidth = \"2.5ch\";\n\n // \uC2DC\uAC04 \uADF8\uB8F9 \uB80C\uB354\uB9C1\n const renderTimeGroup = (\n groupIndex: number,\n groupValue: string,\n placeholder: string,\n ) => {\n const isFocusedGroup = focusedGroup === groupIndex;\n const showCursor = cursorVisible && isFocusedGroup && !inputComplete;\n const refs = [hourRef, minuteRef, secondRef];\n\n return (\n <Box\n key={groupIndex}\n onMouseDown={createMouseDownHandler(groupIndex)}\n onClick={createClickHandler(groupIndex)}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <TextField\n inputRef={refs[groupIndex]}\n value={groupValue}\n onChange={handleTimeChange(groupIndex)}\n onKeyDown={handleTimeKeyDown(groupIndex)}\n onFocus={createFocusHandler(groupIndex)}\n onBlur={handleTimeBlur}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder={placeholder}\n variant=\"outlined\"\n sx={{\n width: timeFieldWidth,\n maxWidth: timeFieldWidth,\n minWidth: timeFieldWidth,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": {\n width: timeFieldWidth,\n maxWidth: timeFieldWidth,\n minWidth: timeFieldWidth,\n },\n \"& .MuiInputBase-input\": {\n width: timeFieldWidth,\n minWidth: timeFieldWidth,\n maxWidth: timeFieldWidth,\n textAlign: \"left\",\n caretColor: \"transparent\",\n },\n \"& .MuiInputBase-input::placeholder\": {\n color: \"rgba(0, 0, 0, 0.3)\",\n opacity: 1,\n },\n }}\n slotProps={{\n input: { readOnly: readonly },\n htmlInput: {\n maxLength: 2,\n inputMode: \"numeric\",\n style: { padding: \"0 2px\", textAlign: \"left\" },\n },\n }}\n />\n {showCursor && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 1 : 3,\n left: `calc(2px + ${getCursorLeft(groupIndex)}px)`,\n width: cursorWidth,\n height: cursorHeight,\n backgroundColor: \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n }}\n />\n )}\n </Box>\n );\n };\n\n // \uC2DC\uAC04 \uD544\uB4DC \uD45C\uC2DC \uC5EC\uBD80 (\uAC12\uC774 \uC788\uAC70\uB098 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uC744 \uB54C\uB9CC)\n const hasAnyValue =\n dateDisplayValue.length > 0 ||\n hourValue.length > 0 ||\n minuteValue.length > 0 ||\n secondValue.length > 0;\n const showTimeFields =\n hasAnyValue || isDateFocused || focusedGroup !== null;\n\n // endAdornment (\uC2DC\uAC04 \uD544\uB4DC + \uC544\uC774\uCF58)\n const endAdornmentElement = (\n <InputAdornment\n position=\"end\"\n sx={{ ml: 0, mr: size === \"small\" ? -0.5 : 0, flexGrow: 1 }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", width: \"100%\" }}>\n {/* \uC2DC\uAC04 \uD544\uB4DC\uB4E4 - \uAC12\uC774 \uC788\uAC70\uB098 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uC744 \uB54C\uB9CC \uD45C\uC2DC */}\n {showTimeFields && (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n flexShrink: 0,\n }}\n >\n {renderTimeGroup(0, hourValue, \"00\")}\n <ColonBox size={size} />\n {renderTimeGroup(1, minuteValue, \"00\")}\n {hasSecond && (\n <>\n <ColonBox size={size} />\n {renderTimeGroup(2, secondValue, \"00\")}\n </>\n )}\n </Box>\n )}\n\n {/* Spacer - \uC544\uC774\uCF58\uC744 \uC624\uB978\uCABD \uB05D\uC73C\uB85C \uBC00\uAE30, \uD074\uB9AD \uC2DC \uB0A0\uC9DC \uD544\uB4DC \uD3EC\uCEE4\uC2A4 */}\n <Box\n sx={{ flexGrow: 1, height: \"100%\", minHeight: 24 }}\n onClick={() => {\n if (!disabled && !readonly) {\n dateInputRef.current?.focus();\n }\n }}\n />\n\n {/* \uC544\uC774\uCF58 \uB610\uB294 \uB3D9\uC77C \uD06C\uAE30 \uBE48 \uACF5\uAC04 */}\n {calendarIcon &&\n (readonly ? (\n // readonly\uC77C \uB54C \uC544\uC774\uCF58\uACFC \uB3D9\uC77C\uD55C \uD06C\uAE30\uC758 \uBE48 \uACF5\uAC04\n <Box\n sx={{\n width: size === \"small\" ? 28 : 32,\n height: size === \"small\" ? 28 : 32,\n ml: 0.5,\n }}\n />\n ) : (\n <IconButton\n onClick={(e) => {\n setAnchorEl(e.currentTarget);\n setCalendarOpen(true);\n }}\n edge=\"end\"\n size=\"small\"\n disabled={disabled}\n sx={{\n ml: 0.5,\n color: \"text.secondary\",\n opacity: 0.5,\n transition: \"opacity 0.2s, color 0.2s\",\n \"&:hover\": {\n opacity: 1,\n color: \"text.primary\",\n },\n }}\n >\n <CalendarIcon size={size === \"small\" ? 16 : 18} />\n </IconButton>\n ))}\n </Box>\n </InputAdornment>\n );\n\n return (\n <>\n <TextField\n inputRef={dateInputRef}\n value={dateDisplayValue}\n onChange={handleDateChange}\n onClick={handleDateClick}\n onKeyDown={handleDateKeyDown}\n onFocus={handleDateFocus}\n onBlur={handleBlur}\n label={label}\n placeholder={datePlaceholder}\n disabled={disabled}\n size={size}\n fullWidth={fullWidth}\n autoComplete=\"off\"\n spellCheck=\"false\"\n className={className}\n id={id}\n sx={{\n ...invalidStyles,\n ...readonlyStyles,\n ...sx,\n \"& .MuiInputBase-input\": {\n width: dateFieldWidth,\n minWidth: dateFieldWidth,\n },\n }}\n slotProps={{\n input: {\n readOnly: readonly,\n endAdornment: endAdornmentElement,\n },\n htmlInput: {\n maxLength: dateMaxLength,\n inputMode: \"numeric\",\n },\n }}\n />\n\n {/* Calendar Popup */}\n <DateTimePicker\n open={calendarOpen}\n anchorEl={anchorEl}\n onClose={() => {\n setCalendarOpen(false);\n setAnchorEl(null);\n }}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n selectedDate={calendarSelectedDate}\n onDateChange={handleCalendarSelect}\n timeValue={{\n hour: hourValue,\n minute: minuteValue,\n second: hasSecond ? secondValue : undefined,\n }}\n onTimeChange={(hour, minute, second) => {\n handleCalendarTimeChange(\n parseInt(hour, 10),\n parseInt(minute, 10),\n second ? parseInt(second, 10) : undefined,\n );\n }}\n minDate={minDateTime}\n maxDate={maxDateTime}\n holidays={holidays}\n styles={{ selectedColor, holidayColor }}\n showToday={showToday}\n timeFormat={\n hasSecond\n ? is12Hour\n ? \"hh:mm:ss\"\n : \"HH:mm:ss\"\n : is12Hour\n ? \"hh:mm\"\n : \"HH:mm\"\n }\n minTime={minTime}\n maxTime={maxTime}\n minuteStep={minuteStep}\n secondStep={secondStep}\n hideDisabledTime={hideDisabledTime}\n />\n </>\n );\n});\n\nconst DateTimeTextFieldWithForm = forwardRef<\n HTMLDivElement,\n DateTimeTextFieldProps\n>(function DateTimeTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"DateTimeTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"DateTimeTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name);\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <DateTimeTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const DateTimeTextField = forwardRef<\n HTMLDivElement,\n DateTimeTextFieldProps\n>(function DateTimeTextField(props, ref) {\n if (props.form) {\n return <DateTimeTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <DateTimeTextFieldBase {...props} ref={ref} />;\n});\n", "/**\n * BizNumTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, Box, IconButton } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { InfoAlert } from \"@ehfuse/alerts\";\nimport type { BizNumTextFieldProps } from \"./types\";\nimport { DashIcon, CopyIcon } from \"./icons\";\nimport { useGroupedInput, GroupConfig } from \"./hooks/useGroupedInput\";\nimport { useDebouncedEmit } from \"./hooks\";\nimport { GroupedInputWrapper } from \"./components\";\nimport { validateBusinessNumber } from \"./utils\";\n\nconst BizNumTextFieldBase = forwardRef<HTMLDivElement, BizNumTextFieldProps>(\n function BizNumTextFieldBase(\n {\n label,\n includeDash = false,\n validate = false,\n copyIcon = true,\n fontSize,\n fontColor,\n fontFamily,\n onValidationChange,\n invalidBorderColor,\n debounce,\n readonly,\n sx,\n value,\n onChange,\n size,\n disabled,\n className,\n id,\n autoFocus,\n name,\n fullWidth = false,\n },\n ref,\n ) {\n // 3\uAC1C \uADF8\uB8F9: 000-00-00000\n const [group1, setGroup1] = useState(\"\"); // 3\uC790\uB9AC\n const [group2, setGroup2] = useState(\"\"); // 2\uC790\uB9AC\n const [group3, setGroup3] = useState(\"\"); // 5\uC790\uB9AC\n const [isInvalid, setIsInvalid] = useState(false);\n const [isInternalChange, setIsInternalChange] = useState(false);\n\n const ref1 = useRef<HTMLInputElement>(null);\n const ref2 = useRef<HTMLInputElement>(null);\n const ref3 = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // \uC678\uBD80 ref\uC640 \uB0B4\uBD80 containerRef \uBCD1\uD569\n useImperativeHandle(ref, () => containerRef.current!, []);\n\n // \uADF8\uB8F9\uBCC4 \uCD5C\uB300 \uAE38\uC774\n const maxLengths = [3, 2, 5];\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange: debouncedEmit, flushOnBlur } = useDebouncedEmit({\n name,\n debounce,\n onChange,\n });\n\n // \uD3F0\uD2B8 \uD06C\uAE30 \uACC4\uC0B0\n const defaultFontSize = size === \"small\" ? 16 : 18;\n const computedFontSize = fontSize\n ? typeof fontSize === \"number\"\n ? fontSize\n : parseFloat(fontSize) *\n (fontSize.toString().includes(\"rem\") ? 16 : 1)\n : defaultFontSize;\n\n // useGroupedInput \uD6C5 \uC0AC\uC6A9\n const groups: GroupConfig[] = useMemo(\n () => [\n { maxLength: 3, ref: ref1, value: group1, setValue: setGroup1 },\n { maxLength: 2, ref: ref2, value: group2, setValue: setGroup2 },\n { maxLength: 5, ref: ref3, value: group3, setValue: setGroup3 },\n ],\n [group1, group2, group3],\n );\n\n const {\n focusedGroup,\n setFocusedGroup,\n cursorVisible,\n inputComplete,\n getCursorLeft,\n createMouseDownHandler,\n createClickHandler,\n createFocusHandler,\n createBlurHandler,\n createKeyDownHandler,\n createChangeHandler: createGroupChangeHandler,\n } = useGroupedInput({\n groups,\n fontFamily,\n fontSize: computedFontSize,\n disabled,\n readonly,\n });\n\n // value prop \uBCC0\uACBD \uC2DC \uB0B4\uBD80 \uC0C1\uD0DC \uB3D9\uAE30\uD654\n useEffect(() => {\n if (isInternalChange) {\n setIsInternalChange(false);\n return;\n }\n\n if (value !== undefined && value !== null) {\n const numbers = String(value).replace(/\\D/g, \"\").slice(0, 10);\n setGroup1(numbers.slice(0, 3));\n setGroup2(numbers.slice(3, 5));\n setGroup3(numbers.slice(5, 10));\n } else {\n setGroup1(\"\");\n setGroup2(\"\");\n setGroup3(\"\");\n }\n }, [value, isInternalChange]);\n\n // \uC804\uCCB4 \uBC88\uD638 \uAC00\uC838\uC624\uAE30\n const getFullNumber = useCallback(() => {\n return group1 + group2 + group3;\n }, [group1, group2, group3]);\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC0F onChange \uD638\uCD9C\n const emitChange = useCallback(\n (g1: string, g2: string, g3: string) => {\n const fullNumber = g1 + g2 + g3;\n const isComplete = fullNumber.length === 10;\n let isValid = isComplete;\n\n if (validate && isComplete) {\n isValid = validateBusinessNumber(fullNumber);\n }\n\n setIsInvalid(isComplete && !isValid);\n\n if (onValidationChange) {\n onValidationChange(isValid);\n }\n\n setIsInternalChange(true);\n const outputValue = includeDash\n ? `${g1}-${g2}-${g3}`\n : fullNumber;\n debouncedEmit(null, outputValue);\n },\n [validate, onValidationChange, includeDash, debouncedEmit],\n );\n\n // \uC785\uB825 \uD578\uB4E4\uB7EC (\uD6C5\uC758 \uD578\uB4E4\uB7EC + \uCEE4\uC2A4\uD140 \uB85C\uC9C1)\n const handleChange = (groupIndex: number) => {\n return createGroupChangeHandler(groupIndex, (newValue, idx) => {\n const newValues = [group1, group2, group3];\n newValues[idx] = newValue;\n emitChange(newValues[0], newValues[1], newValues[2]);\n });\n };\n\n // \uD0A4 \uC785\uB825 \uD578\uB4E4\uB7EC (\uD6C5\uC758 \uD578\uB4E4\uB7EC + \uCEE4\uC2A4\uD140 \uB85C\uC9C1)\n const handleKeyDown = (groupIndex: number) => {\n return createKeyDownHandler(groupIndex, (newValue, idx) => {\n const newValues = [group1, group2, group3];\n newValues[idx] = newValue;\n emitChange(newValues[0], newValues[1], newValues[2]);\n });\n };\n\n // blur \uD578\uB4E4\uB7EC\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const blurHandler = createBlurHandler();\n blurHandler();\n\n const fullNumber = getFullNumber();\n const outputValue = includeDash\n ? `${group1}-${group2}-${group3}`\n : fullNumber;\n setIsInternalChange(true);\n flushOnBlur(e, outputValue);\n },\n [\n createBlurHandler,\n getFullNumber,\n includeDash,\n group1,\n group2,\n group3,\n flushOnBlur,\n ],\n );\n\n // \uBCF5\uC0AC \uD578\uB4E4\uB7EC\n const handleCopy = useCallback(() => {\n const fullNumber = getFullNumber();\n const copyValue = includeDash\n ? `${group1}-${group2}-${group3}`\n : fullNumber;\n navigator.clipboard.writeText(copyValue);\n InfoAlert(\"\uC0AC\uC5C5\uC790\uBC88\uD638\uAC00 \uBCF5\uC0AC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\");\n }, [getFullNumber, includeDash, group1, group2, group3]);\n\n // \uD544\uB4DC \uB108\uBE44\n const fieldWidths = [\"3ch\", \"2ch\", \"5.5ch\"];\n\n // \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C \uD06C\uAE30\n const cursorWidth = \"0.6em\";\n const cursorHeight = \"1px\";\n\n // TextField border \uC81C\uAC70 \uC2A4\uD0C0\uC77C\n const noBorderStyle: SxProps<Theme> = {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": { border: \"none\" },\n \"&:hover fieldset\": { border: \"none\" },\n \"&.Mui-focused fieldset\": { border: \"none\" },\n },\n };\n\n // \uADF8\uB8F9 \uB80C\uB354\uB9C1\n const renderGroup = (\n groupIndex: number,\n groupValue: string,\n placeholder: string,\n ) => {\n const isFocused = focusedGroup === groupIndex;\n const showCursor = cursorVisible && isFocused && !inputComplete;\n const refs = [ref1, ref2, ref3];\n\n return (\n <Box\n onMouseDown={createMouseDownHandler(groupIndex)}\n onClick={createClickHandler(groupIndex)}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <TextField\n inputRef={refs[groupIndex]}\n value={groupValue}\n onChange={handleChange(groupIndex)}\n onKeyDown={handleKeyDown(groupIndex)}\n onFocus={createFocusHandler(groupIndex)}\n onBlur={handleBlur}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder={placeholder}\n variant=\"outlined\"\n autoFocus={groupIndex === 0 && autoFocus}\n sx={{\n width: \"auto\",\n minWidth: 0,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": { width: \"auto\" },\n \"& .MuiInputBase-input\": {\n width: fieldWidths[groupIndex],\n userSelect: \"none\",\n ...(fontSize && { fontSize }),\n ...(fontColor && { color: fontColor }),\n ...(fontFamily && { fontFamily }),\n },\n \"& .MuiInputBase-input::placeholder\": {\n color: \"rgba(0, 0, 0, 0.2)\",\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n readOnly: readonly,\n },\n htmlInput: {\n maxLength: maxLengths[groupIndex],\n inputMode: \"numeric\",\n style: { textAlign: \"left\", padding: \"0 4px\" },\n },\n }}\n />\n {/* \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C */}\n {showCursor && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 0 : -2,\n left: `calc(4px + ${getCursorLeft(\n groupIndex,\n )}px)`,\n width: cursorWidth,\n height: cursorHeight,\n backgroundColor: fontColor || \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n }}\n />\n )}\n </Box>\n );\n };\n\n // Dash \uB798\uD37C \uCEF4\uD3EC\uB10C\uD2B8\n const Dash = () => (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"text.secondary\",\n mx: size === \"small\" ? 0.25 : 0.5,\n userSelect: \"none\",\n }}\n >\n <DashIcon size={size} />\n </Box>\n );\n\n // \uD074\uB9AD \uC2DC \uD3EC\uCEE4\uC2A4\uD560 ref \uACB0\uC815 (\uC678\uACFD \uD074\uB9AD \uC2DC \uCCAB \uBC88\uC9F8 \uCE78\uC73C\uB85C)\n const getTargetRefOnClick = useCallback(() => {\n return { ref: ref1, groupIndex: 0 };\n }, []);\n\n return (\n <Box\n ref={containerRef}\n sx={{\n ...(fullWidth && { width: \"100%\" }),\n ...sx,\n }}\n className={className}\n >\n <GroupedInputWrapper\n label={label}\n size={size}\n disabled={disabled}\n readonly={readonly}\n focusedGroup={focusedGroup}\n setFocusedGroup={setFocusedGroup}\n hasValue={getFullNumber().length > 0}\n isInvalid={isInvalid}\n invalidBorderColor={invalidBorderColor}\n inputRefs={[ref1, ref2, ref3]}\n getTargetRefOnClick={getTargetRefOnClick}\n fullWidth={fullWidth}\n id={id}\n contentSx={{\n pr:\n copyIcon && getFullNumber().length === 10\n ? 0.5\n : 1.5,\n }}\n >\n {renderGroup(0, group1, \"000\")}\n <Dash />\n {renderGroup(1, group2, \"00\")}\n <Dash />\n {renderGroup(2, group3, \"00000\")}\n {copyIcon && getFullNumber().length === 10 && (\n <>\n <Box sx={{ flexGrow: 1 }} />\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n handleCopy();\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n disabled={disabled}\n size={size}\n sx={{\n p: size === \"small\" ? 0.5 : 1,\n mr: 0.5,\n color: \"text.secondary\",\n \"&:hover\": {\n color: \"text.primary\",\n },\n }}\n >\n <CopyIcon size={size} />\n </IconButton>\n </>\n )}\n </GroupedInputWrapper>\n </Box>\n );\n },\n);\n\nconst BizNumTextFieldWithForm = forwardRef<\n HTMLDivElement,\n BizNumTextFieldProps\n>(function BizNumTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"BizNumTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"BizNumTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as string | undefined;\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <BizNumTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const BizNumTextField = forwardRef<HTMLDivElement, BizNumTextFieldProps>(\n function BizNumTextField(props, ref) {\n if (props.form) {\n return <BizNumTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <BizNumTextFieldBase {...props} ref={ref} />;\n },\n);\n", "/**\n * CardNumTextField.tsx\n *\n * @license MIT\n form,\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { TextField, Box } from \"@mui/material\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { CardNumTextFieldProps } from \"./types\";\nimport { useDebouncedEmit } from \"./hooks\";\nimport { useGroupedInput, GroupConfig } from \"./hooks/useGroupedInput\";\nimport { GroupedInputWrapper } from \"./components\";\nimport {\n DashIcon,\n CardIcon,\n VisaIcon,\n MastercardIcon,\n AmexIcon,\n JcbIcon,\n DinersIcon,\n DiscoverIcon,\n UnionPayIcon,\n BcIcon,\n} from \"./icons\";\nimport { CardBrand, validateCardNumber, detectCardBrand } from \"./utils\";\n\nconst CardNumTextFieldBase = forwardRef<HTMLDivElement, CardNumTextFieldProps>(\n function CardNumTextFieldBase(\n {\n label,\n maskColor = \"rgba(0, 0, 0, 0.7)\",\n fontSize,\n fontColor,\n fontFamily,\n onChange,\n onValidationChange,\n onCardBrandChange,\n invalidBorderColor,\n validate = false,\n debounce,\n readonly,\n sx,\n value,\n size,\n disabled,\n logoIcon = true,\n name = \"\",\n className,\n id,\n fullWidth = false,\n },\n ref,\n ) {\n // 4\uAC1C \uADF8\uB8F9 \uAC01\uAC01\uC758 \uAC12\n const [group1, setGroup1] = useState(\"\"); // \uCCAB 4\uC790\uB9AC (\uBCF4\uC784)\n const [group2, setGroup2] = useState(\"\"); // \uB458\uC9F8 4\uC790\uB9AC (\uB9C8\uC2A4\uD0B9)\n const [group3, setGroup3] = useState(\"\"); // \uC14B\uC9F8 4\uC790\uB9AC (\uB9C8\uC2A4\uD0B9)\n const [group4, setGroup4] = useState(\"\"); // \uB137\uC9F8 4\uC790\uB9AC (\uBCF4\uC784)\n const [isInvalid, setIsInvalid] = useState(false);\n const [isInternalChange, setIsInternalChange] = useState(false);\n const [cardBrand, setCardBrand] = useState<CardBrand>(null);\n // \uB9C8\uC9C0\uB9C9 \uC785\uB825\uB41C \uADF8\uB8F9\uACFC \uC778\uB371\uC2A4 \uCD94\uC801 (\uB9C8\uC2A4\uD0B9 \uADF8\uB8F9\uC5D0\uC11C \uB9C8\uC9C0\uB9C9 \uC22B\uC790 \uD45C\uC2DC\uC6A9)\n const [lastInputInfo, setLastInputInfo] = useState<{\n groupIndex: number;\n charIndex: number;\n } | null>(null);\n\n const ref1 = useRef<HTMLInputElement>(null);\n const ref2 = useRef<HTMLInputElement>(null);\n const ref3 = useRef<HTMLInputElement>(null);\n const ref4 = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // \uC678\uBD80 ref\uC640 \uB0B4\uBD80 containerRef \uBCD1\uD569\n useImperativeHandle(ref, () => containerRef.current!, []);\n\n // \uD3F0\uD2B8 \uD06C\uAE30 \uACC4\uC0B0\n const defaultFontSize = size === \"small\" ? 16 : 18;\n const computedFontSize = fontSize\n ? typeof fontSize === \"number\"\n ? fontSize\n : parseFloat(fontSize) *\n (fontSize.toString().includes(\"rem\") ? 16 : 1)\n : defaultFontSize;\n\n // useGroupedInput \uD6C5 \uC0AC\uC6A9\n const groups: GroupConfig[] = useMemo(\n () => [\n { maxLength: 4, ref: ref1, value: group1, setValue: setGroup1 },\n { maxLength: 4, ref: ref2, value: group2, setValue: setGroup2 },\n { maxLength: 4, ref: ref3, value: group3, setValue: setGroup3 },\n { maxLength: 4, ref: ref4, value: group4, setValue: setGroup4 },\n ],\n [group1, group2, group3, group4],\n );\n\n const {\n focusedGroup,\n setFocusedGroup,\n cursorVisible,\n cursorPosRef,\n inputComplete,\n renderTrigger,\n getCursorLeft,\n createMouseDownHandler,\n createClickHandler,\n createFocusHandler,\n createBlurHandler,\n createKeyDownHandler,\n createChangeHandler: createGroupChangeHandler,\n } = useGroupedInput({\n groups,\n fontSize: computedFontSize,\n disabled,\n readonly,\n });\n\n // useDebouncedEmit \uD6C5 \uC0AC\uC6A9\n const { emitChange, flushOnBlur } = useDebouncedEmit({\n name,\n debounce,\n onChange,\n });\n\n // \uC804\uCCB4 \uCE74\uB4DC\uBC88\uD638 \uC870\uD569\n const getFullNumber = useCallback(() => {\n return group1 + group2 + group3 + group4;\n }, [group1, group2, group3, group4]);\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC0F onChange \uD638\uCD9C\n const emitCardChange = useCallback(\n (g1: string, g2: string, g3: string, g4: string) => {\n const fullValue = g1 + g2 + g3 + g4;\n const isComplete = fullValue.length === 16;\n let isValid = isComplete;\n\n // validate\uAC00 true\uC77C \uB54C\uB9CC Luhn \uC54C\uACE0\uB9AC\uC998 \uC801\uC6A9\n if (validate && isComplete) {\n isValid = validateCardNumber(fullValue);\n }\n\n setIsInvalid(isComplete && !isValid);\n\n if (onValidationChange) {\n onValidationChange(isValid);\n }\n\n // \uCE74\uB4DC \uBE0C\uB79C\uB4DC \uAC10\uC9C0\n const brand = detectCardBrand(fullValue);\n setCardBrand(brand);\n if (onCardBrandChange) {\n onCardBrandChange(brand);\n }\n\n setIsInternalChange(true);\n emitChange(null, fullValue, true);\n },\n [validate, onValidationChange, onCardBrandChange, emitChange],\n );\n\n // value prop \uBCC0\uACBD \uC2DC \uB0B4\uBD80 \uC0C1\uD0DC \uB3D9\uAE30\uD654\n useEffect(() => {\n if (isInternalChange) {\n setIsInternalChange(false);\n return;\n }\n\n // uncontrolled \uC0AC\uC6A9 \uC2DC \uB3D9\uAE30\uD654 \uC2A4\uD0B5\n if (value === undefined) {\n return;\n }\n\n if (value !== null) {\n const numbers = String(value).replace(/\\D/g, \"\").slice(0, 16);\n setGroup1(numbers.slice(0, 4));\n setGroup2(numbers.slice(4, 8));\n setGroup3(numbers.slice(8, 12));\n setGroup4(numbers.slice(12, 16));\n } else {\n setGroup1(\"\");\n setGroup2(\"\");\n setGroup3(\"\");\n setGroup4(\"\");\n }\n }, [value, isInternalChange]);\n\n // \uC785\uB825 \uD578\uB4E4\uB7EC (\uD6C5\uC758 \uD578\uB4E4\uB7EC + \uCEE4\uC2A4\uD140 \uB85C\uC9C1)\n const handleChange = (groupIndex: number) => {\n return createGroupChangeHandler(groupIndex, (newValue, idx) => {\n const newValues = [group1, group2, group3, group4];\n newValues[idx] = newValue;\n\n // \uB9C8\uC2A4\uD0B9 \uADF8\uB8F9(1, 2)\uC5D0\uC11C \uC785\uB825 \uC2DC \uB9C8\uC9C0\uB9C9 \uC785\uB825 \uBB38\uC790 \uCD94\uC801\n if ((idx === 1 || idx === 2) && newValue.length > 0) {\n setLastInputInfo({\n groupIndex: idx,\n charIndex: newValue.length - 1,\n });\n // \uC7A0\uC2DC \uD6C4 \uC228\uAE40 (500ms)\n setTimeout(() => {\n setLastInputInfo(null);\n }, 500);\n }\n\n emitCardChange(\n newValues[0],\n newValues[1],\n newValues[2],\n newValues[3],\n );\n });\n };\n\n // \uD0A4 \uC785\uB825 \uD578\uB4E4\uB7EC\n const handleKeyDown = (groupIndex: number) => {\n return createKeyDownHandler(groupIndex, (newValue, idx) => {\n const newValues = [group1, group2, group3, group4];\n newValues[idx] = newValue;\n emitCardChange(\n newValues[0],\n newValues[1],\n newValues[2],\n newValues[3],\n );\n });\n };\n\n // blur \uD578\uB4E4\uB7EC\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const blurHandler = createBlurHandler();\n blurHandler();\n\n const fullValue = getFullNumber();\n flushOnBlur(e, fullValue);\n },\n [createBlurHandler, getFullNumber, flushOnBlur],\n );\n\n // 2-2. \uC678\uACFD \uC601\uC5ED \uD074\uB9AD \uC2DC \uB9C8\uC9C0\uB9C9 \uAC12\uC774 \uC788\uB294 \uCE78\uC758 \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uCEE4\uC11C \uC774\uB3D9\n const handleContainerClick = useCallback(\n (e: React.MouseEvent) => {\n if (disabled || readonly) return;\n\n // \uC774\uBBF8 input\uC5D0\uC11C \uCC98\uB9AC\uB41C \uD074\uB9AD\uC774\uBA74 \uBB34\uC2DC\n const target = e.target as HTMLElement;\n if (target.tagName === \"INPUT\") return;\n\n const values = [group1, group2, group3, group4];\n const refs = [ref1, ref2, ref3, ref4];\n\n // \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uAC12\uC774 \uC788\uB294 \uADF8\uB8F9 \uCC3E\uAE30\n let lastFilledIndex = -1;\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i].length > 0) {\n lastFilledIndex = i;\n break;\n }\n }\n\n if (lastFilledIndex >= 0) {\n // \uB9C8\uC9C0\uB9C9 \uAC12\uC774 \uC788\uB294 \uCE78\uC758 \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uC774\uB3D9\n const targetRef = refs[lastFilledIndex];\n const targetValue = values[lastFilledIndex];\n const newPos = targetValue.length;\n cursorPosRef.current = newPos;\n targetRef.current?.focus();\n targetRef.current?.setSelectionRange(newPos, newPos);\n } else {\n // \uBAA8\uB450 \uBE44\uC5B4\uC788\uC73C\uBA74 \uCCAB \uBC88\uC9F8 \uCE78\uC73C\uB85C\n cursorPosRef.current = 0;\n ref1.current?.focus();\n ref1.current?.setSelectionRange(0, 0);\n }\n },\n [disabled, readonly, group1, group2, group3, group4, cursorPosRef],\n );\n\n // \uB3D9\uADF8\uB77C\uBBF8 \uD06C\uAE30 (\uB9C8\uC2A4\uD0B9\uC6A9)\n const dotSize = Math.round(computedFontSize * 0.5);\n\n // \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C \uD06C\uAE30\n const cursorWidthPx = `${computedFontSize * 0.55}px`;\n const cursorHeightPx = \"1px\";\n\n // \uD544\uB4DC \uB108\uBE44 - \uC77C\uBC18 \uADF8\uB8F9\uC6A9 (\uC22B\uC790 4\uC790\uB9AC)\n const normalFieldWidth = \"4ch\";\n // \uD544\uB4DC \uB108\uBE44 - \uB9C8\uC2A4\uD0B9 \uADF8\uB8F9\uC6A9 (\uB3D9\uADF8\uB77C\uBBF8 \uAC04\uACA9 \uACE0\uB824)\n const maskedFieldWidth = \"5.5ch\";\n\n // \uB9C8\uC2A4\uD0B9 \uADF8\uB8F9\uC758 \uB3D9\uADF8\uB77C\uBBF8 \uAC04\uACA9 \uACC4\uC0B0 (px \uB2E8\uC704)\n // maskedFieldWidth = 5.5ch, padding px: 0.25 * 8 = 2px \uC591\uCABD\n // \uB3D9\uADF8\uB77C\uBBF8 4\uAC1C\uAC00 space-between\uC73C\uB85C \uBC30\uCE58\uB428\n const getMaskedCursorLeft = (cursorPos: number): number => {\n // 5.5ch\uB97C px\uB85C \uBCC0\uD658 (1ch \u2248 0.45em)\n const chToPx = computedFontSize * 0.45;\n const fieldWidthPx = 5.5 * chToPx;\n const paddingPx = 2; // px: 0.25 * 8\n const contentWidth = fieldWidthPx - paddingPx * 2;\n // space-between: \uCCAB \uBC88\uC9F8 \uC694\uC18C\uB294 \uC2DC\uC791, \uB9C8\uC9C0\uB9C9 \uC694\uC18C\uB294 \uB05D, \uB098\uBA38\uC9C0\uB294 \uADE0\uB4F1 \uBD84\uBC30\n // 4\uAC1C \uC694\uC18C\uC758 \uACBD\uC6B0: 0, 1/3, 2/3, 1 \uC704\uCE58\uC5D0 \uBC30\uCE58\n const gap = contentWidth / 3; // 4\uAC1C \uB3D9\uADF8\uB77C\uBBF8 \uC0AC\uC774 3\uAC1C \uAC04\uACA9\n return paddingPx + cursorPos * gap;\n };\n\n // TextField border \uC81C\uAC70 \uC2A4\uD0C0\uC77C\n const noBorderStyle: SxProps<Theme> = {\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": { border: \"none\" },\n \"&:hover fieldset\": { border: \"none\" },\n \"&.Mui-focused fieldset\": { border: \"none\" },\n },\n };\n\n // \uB9C8\uC2A4\uD0B9\uB41C \uADF8\uB8F9 \uB80C\uB354\uB9C1 (2, 3\uBC88\uC9F8 \uADF8\uB8F9)\n // renderTrigger\uB97C \uC758\uC874\uC131\uC73C\uB85C \uC0AC\uC6A9\uD558\uC5EC \uCEE4\uC11C \uC704\uCE58 \uBCC0\uACBD \uC2DC \uB9AC\uB80C\uB354\uB9C1\n const renderMaskedGroup = (groupIndex: number, groupValue: string) => {\n const isFocused = focusedGroup === groupIndex;\n const showCursor = cursorVisible && isFocused && !inputComplete;\n const refs = [ref1, ref2, ref3, ref4];\n // renderTrigger \uBCC0\uACBD \uC2DC \uCEE4\uC11C \uC704\uCE58 \uC5C5\uB370\uC774\uD2B8\uB97C \uC704\uD574 \uCC38\uC870\n void renderTrigger;\n\n return (\n <Box\n onMouseDown={createMouseDownHandler(groupIndex)}\n onClick={createClickHandler(groupIndex)}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n userSelect: \"none\",\n }}\n >\n <TextField\n inputRef={refs[groupIndex]}\n value={groupValue}\n onChange={handleChange(groupIndex)}\n onKeyDown={handleKeyDown(groupIndex)}\n onFocus={createFocusHandler(groupIndex)}\n onBlur={handleBlur}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n variant=\"outlined\"\n sx={{\n width: \"auto\",\n minWidth: 0,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": { width: \"auto\" },\n \"& .MuiInputBase-input\": {\n width: maskedFieldWidth,\n color: \"transparent\",\n caretColor: \"transparent\",\n userSelect: \"none\",\n ...(fontSize && { fontSize }),\n ...(fontFamily && { fontFamily }),\n },\n }}\n slotProps={{\n input: {\n readOnly: readonly,\n },\n htmlInput: {\n maxLength: 4,\n inputMode: \"numeric\",\n style: { textAlign: \"left\", padding: 0 },\n },\n }}\n />\n {/* \uB9C8\uC2A4\uD0B9 \uC624\uBC84\uB808\uC774 - \uB3D9\uADF8\uB77C\uBBF8 + \uB9C8\uC9C0\uB9C9 \uC785\uB825 \uC22B\uC790 */}\n <Box\n sx={{\n position: \"absolute\",\n left: 0,\n width: maskedFieldWidth,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n px: 0.25,\n }}\n >\n {Array.from({ length: 4 }).map((_, i) => {\n const isEntered = i < groupValue.length;\n // \uD3EC\uCEE4\uC2A4 \uC911\uC77C \uB54C \uCEE4\uC11C \uC704\uCE58\uC758 \uBB38\uC790 \uD45C\uC2DC (\uBC29\uD5A5\uD0A4 \uC774\uB3D9 \uC9C0\uC6D0)\n const cursorPos = cursorPosRef.current;\n const isAtCursor =\n isFocused &&\n i === cursorPos &&\n i < groupValue.length;\n\n // \uB9C8\uC9C0\uB9C9 \uC785\uB825\uB41C \uBB38\uC790 \uD45C\uC2DC (\uC785\uB825 \uC9C1\uD6C4 \uC7A0\uAE50)\n const isLastInput =\n lastInputInfo !== null &&\n lastInputInfo.groupIndex === groupIndex &&\n lastInputInfo.charIndex === i;\n\n if (isAtCursor || isLastInput) {\n // \uD3EC\uCEE4\uC2A4 \uC911\uC774\uACE0 \uCEE4\uC11C \uC704\uCE58\uC758 \uBB38\uC790\uAC70\uB098, \uB9C8\uC9C0\uB9C9 \uC785\uB825\uB41C \uBB38\uC790\uBA74 \uC22B\uC790 \uD45C\uC2DC\n return (\n <span\n key={i}\n style={{\n fontSize:\n fontSize ||\n (size === \"small\" ? 16 : 18),\n fontFamily: fontFamily || \"inherit\",\n color: fontColor || \"inherit\",\n display: \"inline-block\",\n width: `${dotSize}px`,\n textAlign: \"center\",\n }}\n >\n {groupValue[i]}\n </span>\n );\n }\n\n // \uB3D9\uADF8\uB77C\uBBF8 \uD45C\uC2DC (\uC785\uB825\uB428: \uC9C4\uD558\uAC8C, \uBBF8\uC785\uB825: \uD750\uB9AC\uAC8C)\n return (\n <span\n key={i}\n style={{\n width: `${dotSize}px`,\n height: `${dotSize}px`,\n borderRadius: \"50%\",\n backgroundColor: maskColor,\n opacity: isEntered ? 1 : 0.15,\n display: \"inline-block\",\n }}\n />\n );\n })}\n </Box>\n {/* \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C */}\n {showCursor && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 1 : 3,\n left: `${getMaskedCursorLeft(\n cursorPosRef.current,\n )}px`,\n width: cursorWidthPx,\n height: cursorHeightPx,\n backgroundColor: fontColor || \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n }}\n />\n )}\n </Box>\n );\n };\n\n // \uC77C\uBC18 \uADF8\uB8F9 \uB80C\uB354\uB9C1 (1, 4\uBC88\uC9F8 \uADF8\uB8F9)\n const renderNormalGroup = (groupIndex: number, groupValue: string) => {\n const isFocused = focusedGroup === groupIndex;\n const showCursor = cursorVisible && isFocused && !inputComplete;\n const refs = [ref1, ref2, ref3, ref4];\n\n return (\n <Box\n onMouseDown={createMouseDownHandler(groupIndex)}\n onClick={createClickHandler(groupIndex)}\n sx={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <TextField\n inputRef={refs[groupIndex]}\n value={groupValue}\n onChange={handleChange(groupIndex)}\n onKeyDown={handleKeyDown(groupIndex)}\n onFocus={createFocusHandler(groupIndex)}\n onBlur={handleBlur}\n disabled={disabled}\n size={size}\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder=\"0000\"\n variant=\"outlined\"\n sx={{\n width: \"auto\",\n minWidth: 0,\n ...noBorderStyle,\n \"& .MuiInputBase-root\": { width: \"auto\" },\n \"& .MuiInputBase-input\": {\n width: normalFieldWidth,\n userSelect: \"none\",\n caretColor: \"transparent\",\n ...(fontSize && { fontSize }),\n ...(fontColor && { color: fontColor }),\n ...(fontFamily && { fontFamily }),\n },\n \"& .MuiInputBase-input::placeholder\": {\n color: \"rgba(0, 0, 0, 0.2)\",\n opacity: 1,\n },\n }}\n slotProps={{\n input: {\n readOnly: readonly,\n },\n htmlInput: {\n maxLength: 4,\n inputMode: \"numeric\",\n style: { textAlign: \"left\", padding: \"0 4px\" },\n },\n }}\n />\n {/* \uC5B8\uB354\uC2A4\uCF54\uC5B4 \uCEE4\uC11C */}\n {showCursor && (\n <Box\n sx={{\n position: \"absolute\",\n bottom: size === \"small\" ? 1 : 3,\n left: `${getCursorLeft(groupIndex) + 4}px`,\n width: cursorWidthPx,\n height: cursorHeightPx,\n backgroundColor: fontColor || \"text.primary\",\n animation: \"blink 1s step-end infinite\",\n \"@keyframes blink\": {\n \"0%, 100%\": { opacity: 1 },\n \"50%\": { opacity: 0 },\n },\n pointerEvents: \"none\",\n }}\n />\n )}\n </Box>\n );\n };\n\n // Dash \uB798\uD37C \uCEF4\uD3EC\uB10C\uD2B8\n const Dash = () => (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"text.secondary\",\n mx: size === \"small\" ? 0.5 : 0.75,\n userSelect: \"none\",\n }}\n >\n <DashIcon size={size} />\n </Box>\n );\n\n // \uCE74\uB4DC \uBE0C\uB79C\uB4DC \uC544\uC774\uCF58 \uB80C\uB354\uB9C1\n const renderCardIcon = () => {\n const iconSize = size === \"small\" ? 22 : 26;\n\n switch (cardBrand) {\n case \"visa\":\n return <VisaIcon size={iconSize} />;\n case \"mastercard\":\n return <MastercardIcon size={iconSize} />;\n case \"amex\":\n return <AmexIcon size={iconSize} />;\n case \"jcb\":\n return <JcbIcon size={iconSize} />;\n case \"diners\":\n return <DinersIcon size={iconSize} />;\n case \"discover\":\n return <DiscoverIcon size={iconSize} />;\n case \"unionpay\":\n return <UnionPayIcon size={iconSize} />;\n case \"bc\":\n return <BcIcon size={iconSize} />;\n default:\n return <CardIcon size={iconSize} />;\n }\n };\n\n // \uADF8\uB8F9 \uC785\uB825 \uB0B4\uBD80 \uCEF4\uD3EC\uB10C\uD2B8 \uB80C\uB354\uB9C1\n const renderGroupedInput = () => (\n <Box\n onClick={handleContainerClick}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n height: \"100%\",\n cursor: disabled ? \"default\" : \"text\",\n ...(logoIcon && { pl: 1 }),\n }}\n >\n {/* \uCE74\uB4DC \uBE0C\uB79C\uB4DC \uC544\uC774\uCF58 */}\n {logoIcon && (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n mr: 0,\n flexShrink: 0,\n }}\n >\n {renderCardIcon()}\n </Box>\n )}\n {/* \uADF8\uB8F9 1: \uC77C\uBC18 */}\n {renderNormalGroup(0, group1)}\n <Dash />\n {/* \uADF8\uB8F9 2: \uB9C8\uC2A4\uD0B9 */}\n {renderMaskedGroup(1, group2)}\n <Dash />\n {/* \uADF8\uB8F9 3: \uB9C8\uC2A4\uD0B9 */}\n {renderMaskedGroup(2, group3)}\n <Dash />\n {/* \uADF8\uB8F9 4: \uC77C\uBC18 */}\n {renderNormalGroup(3, group4)}\n </Box>\n );\n\n // \uD074\uB9AD \uC2DC \uD3EC\uCEE4\uC2A4\uD560 ref \uACB0\uC815\n const getTargetRefOnClick = useCallback(() => {\n const values = [group1, group2, group3, group4];\n const refs = [ref1, ref2, ref3, ref4];\n\n // \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uAC12\uC774 \uC788\uB294 \uADF8\uB8F9 \uCC3E\uAE30\n let lastFilledIndex = -1;\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i].length > 0) {\n lastFilledIndex = i;\n break;\n }\n }\n\n if (lastFilledIndex >= 0) {\n return {\n ref: refs[lastFilledIndex],\n groupIndex: lastFilledIndex,\n };\n }\n // \uBAA8\uB450 \uBE44\uC5B4\uC788\uC73C\uBA74 \uCCAB \uBC88\uC9F8 \uCE78\n return { ref: ref1, groupIndex: 0 };\n }, [group1, group2, group3, group4]);\n\n return (\n <GroupedInputWrapper\n label={label}\n size={size}\n disabled={disabled}\n readonly={readonly}\n focusedGroup={focusedGroup}\n setFocusedGroup={setFocusedGroup}\n hasValue={getFullNumber().length > 0}\n isInvalid={isInvalid}\n invalidBorderColor={invalidBorderColor}\n inputRefs={[ref1, ref2, ref3, ref4]}\n getTargetRefOnClick={getTargetRefOnClick}\n fullWidth={fullWidth}\n sx={sx}\n className={className}\n id={id}\n contentSx={logoIcon ? { pl: 0 } : undefined}\n >\n {renderGroupedInput()}\n </GroupedInputWrapper>\n );\n },\n);\n\nconst CardNumTextFieldWithForm = forwardRef<\n HTMLDivElement,\n CardNumTextFieldProps\n>(function CardNumTextFieldWithForm({ form, name, onChange, ...rest }, ref) {\n if (!form || typeof form.useFormValue !== \"function\") {\n throw new Error(\n \"CardNumTextField form prop is missing. Provide a form from useForm or useGlobalForm.\",\n );\n }\n if (!name) {\n throw new Error(\n \"CardNumTextField requires a name when form prop is provided.\",\n );\n }\n\n const formValue = form.useFormValue(name) as string | undefined;\n const handleFormChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n form.handleFormChange(event);\n onChange?.(event);\n },\n [form, onChange],\n );\n\n return (\n <CardNumTextFieldBase\n {...rest}\n ref={ref}\n name={name}\n value={formValue}\n onChange={handleFormChange}\n />\n );\n});\n\nexport const CardNumTextField = forwardRef<\n HTMLDivElement,\n CardNumTextFieldProps\n>(function CardNumTextField(props, ref) {\n if (props.form) {\n return <CardNumTextFieldWithForm {...props} ref={ref} />;\n }\n\n return <CardNumTextFieldBase {...props} ref={ref} />;\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["forwardRef", "useCallback", "useRef", "useImperativeHandle", "TextField", "IconButton", "InputAdornment", "CircularProgress", "ClearIcon", "SearchIcon", "useState", "useRef", "useEffect", "useCallback", "useTextFieldBase", "value", "name", "debounce", "onChange", "onBlur", "transformValue", "internalValue", "setInternalValue", "lastEmittedValue", "debounceTimer", "prevExternalValue", "newValue", "emitChange", "e", "immediate", "doEmit", "syntheticEvent", "handleChange", "inputValue", "displayValue", "emitValue", "handleBlur", "useDebouncedEmit", "flushOnBlur", "currentValue", "useState", "useEffect", "useCallback", "STORAGE_KEY_PREFIX", "useKoreanHolidays", "apiKey", "year", "targetYear", "holidays", "setHolidays", "loading", "setLoading", "error", "setError", "getCachedHolidays", "cached", "data", "oneYearMs", "dateStr", "y", "m", "d", "setCachedHolidays", "fetchHolidays", "baseUrl", "params", "response", "items", "itemArray", "holidayDates", "item", "holidayStrings", "dates", "err", "useKoreanHolidaysRange", "startYear", "endYear", "currentYear", "start", "end", "years", "storageKey", "cacheData", "results", "allHolidays", "useRef", "useState", "useCallback", "useGroupedInput", "groups", "fontFamily", "fontSize", "onComplete", "disabled", "readonly", "focusedGroup", "setFocusedGroup", "cursorVisible", "setCursorVisible", "inputComplete", "setInputComplete", "renderTrigger", "setRenderTrigger", "cursorPosRef", "isClickFocusRef", "isArrowFocusRef", "arrowTargetPosRef", "measureTextWidth", "text", "ctx", "getCursorPosFromClick", "e", "value", "inputRef", "input", "rect", "clickX", "newPos", "i", "textWidth", "getCursorLeft", "groupIndex", "group", "textBeforeCursor", "forceRender", "prev", "createMouseDownHandler", "createClickHandler", "createContainerClickHandler", "targetIndex", "targetGroup", "createFocusHandler", "createBlurHandler", "activeElement", "createKeyDownHandler", "onValueChange", "selectionStart", "selectionEnd", "hasSelection", "prevGroup", "nextGroup", "newValue", "prevLen", "newPrevValue", "finalPos", "createChangeHandler", "onAfterChange", "numbers", "isGroupComplete", "allComplete", "g", "jsx", "SearchTextFieldBase", "forwardRef", "value", "form", "loading", "searchIcon", "searchIconColor", "clearIcon", "clearIconColor", "debounce", "readonly", "spellCheck", "onChange", "onBlur", "onClear", "slotProps", "size", "externalInputRef", "props", "ref", "internalValue", "setInternalValue", "handleChange", "handleBlur", "emitChange", "useTextFieldBase", "internalInputRef", "useRef", "useImperativeHandle", "iconSize", "handleClear", "fakeEvent", "TextField", "InputAdornment", "SearchIcon", "CircularProgress", "IconButton", "ClearIcon", "SearchTextFieldWithForm", "name", "rest", "formValue", "handleFormChange", "useCallback", "event", "SearchTextField", "forwardRef", "useCallback", "useRef", "useImperativeHandle", "useState", "TextField", "IconButton", "InputAdornment", "ClearIcon", "jsx", "ClearTextFieldBase", "forwardRef", "value", "clearIcon", "debounce", "readonly", "spellCheck", "onChange", "onBlur", "onFocus", "onClear", "slotProps", "size", "externalInputRef", "props", "ref", "internalValue", "setInternalValue", "handleChange", "handleBlur", "emitChange", "useTextFieldBase", "isFocused", "setIsFocused", "useState", "internalInputRef", "useRef", "useImperativeHandle", "iconSize", "handleClear", "eventTarget", "TextField", "event", "InputAdornment", "IconButton", "ClearIcon", "ClearTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "useCallback", "ClearTextField", "useState", "useEffect", "useCallback", "forwardRef", "useRef", "useImperativeHandle", "TextField", "IconButton", "InputAdornment", "Visibility", "VisibilityOff", "isLeapYear", "year", "getDaysInMonth", "month", "getSeparator", "format", "formatDate", "value", "rawNumbers", "separator", "numbers", "constrainDateNumbers", "getMaxLength", "getCompleteLength", "parseDateParts", "completeLength", "day", "yy", "validateDate", "minDate", "maxDate", "parts", "daysInMonth", "date", "extractDateFormat", "format", "hasSecondField", "constrainDateNumbers", "numbers", "result", "year", "month", "firstDigit", "monthStr", "dayStr", "day", "maxDay", "getDaysInMonth", "yearStr", "formatDateValue", "value", "rawNumbers", "separator", "getSeparator", "formatToPlaceholder", "getSegmentRange", "cursorPos", "hasYearInFormat", "has2DigitYear", "convertYY2YYYY", "yy", "parseDateWithInternalYear", "formattedValue", "internalYear", "completeLength", "getCompleteLength", "buildDateOutputValue", "formatSeparator", "yearToUse", "dateToNumbers", "date", "year2", "getTimeFieldCount", "format", "is12HourFormat", "validateTime", "hour", "minute", "second", "formatOrIs12Hour", "minTime", "maxTime", "is12Hour", "h", "m", "s", "timeValue", "minParts", "minH", "minM", "minS", "minValue", "maxParts", "maxH", "maxM", "maxS", "maxValue", "clampTimeValue", "value", "type", "digit", "num", "maxHour", "formatNumber", "value", "thousandSeparator", "decimalLength", "cleaned", "isNegative", "parts", "integerPart", "decimalPart", "result", "parseNumber", "displayValue", "DEFAULT_EMAIL_DOMAINS", "validateEmail", "email", "formatPhoneNumber", "value", "customFormat", "numbers", "getPhoneMaxLength", "DEFAULT_SPECIAL_CHARS", "DEFAULT_PASSWORD_VALIDATION_RULES", "validatePassword", "value", "rules", "mergedRules", "errors", "escapedChars", "validateBusinessNumber", "value", "numbers", "checkKey", "sum", "i", "validateCardNumber", "value", "numbers", "sum", "isEven", "i", "digit", "detectCardBrand", "REGION_MAP", "extractJuminInfo", "value", "numbers", "result", "genderCode", "yy", "mm", "dd", "century", "year", "regionCode", "regionNum", "validateJuminChecksum", "weights", "sum", "i", "checkDigit", "lastDigit", "validateJuminBirthDate", "daysInMonth", "jsx", "PasswordTextFieldBase", "forwardRef", "showToggle", "label", "validationRules", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "slotProps", "sx", "size", "value", "onChange", "onBlur", "externalInputRef", "props", "ref", "internalInputRef", "useRef", "useImperativeHandle", "showPassword", "setShowPassword", "useState", "isInvalid", "setIsInvalid", "internalValue", "handleChange", "handleBlur", "useTextFieldBase", "iconSize", "handleTogglePassword", "prev", "performValidation", "useCallback", "inputValue", "mergedRules", "DEFAULT_PASSWORD_VALIDATION_RULES", "result", "validatePassword", "minLength", "useEffect", "TextField", "InputAdornment", "IconButton", "VisibilityOff", "Visibility", "PasswordTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "event", "PasswordTextField", "forwardRef", "useCallback", "useImperativeHandle", "useRef", "useState", "Box", "FormControl", "InputLabel", "TextareaAutosize", "jsx", "jsxs", "TextAreaBase", "forwardRef", "label", "value", "name", "onChange", "onBlur", "onFocus", "minRows", "maxRows", "placeholder", "disabled", "readonly", "fullWidth", "externalInputRef", "sx", "inputProps", "debounce", "form", "rest", "ref", "internalInputRef", "useRef", "isFocused", "setIsFocused", "useState", "useImperativeHandle", "internalValue", "setInternalValue", "emitChange", "handleBlur", "useTextFieldBase", "handleChange", "useCallback", "event", "newValue", "handleFocus", "handleBlurWithFocus", "FormControl", "InputLabel", "Box", "TextareaAutosize", "node", "TextAreaWithForm", "formValue", "handleFormChange", "TextArea", "props", "forwardRef", "useCallback", "MuiCheckbox", "FormControlLabel", "jsx", "CheckboxBase", "label", "name", "checked", "onChange", "readonly", "disabled", "form", "props", "ref", "CheckboxWithForm", "rest", "formValue", "handleFormChange", "event", "nextChecked", "syntheticEvent", "Checkbox", "forwardRef", "useCallback", "FormControl", "FormLabel", "MuiRadioGroup", "FormControlLabel", "Radio", "jsx", "jsxs", "RadioGroupBase", "label", "name", "value", "options", "onChange", "readonly", "disabled", "props", "ref", "option", "RadioGroupWithForm", "form", "rest", "formValue", "handleFormChange", "event", "nextValue", "syntheticEvent", "RadioGroup", "forwardRef", "useCallback", "MuiSwitch", "FormControlLabel", "jsx", "SwitchBase", "label", "name", "checked", "onChange", "readonly", "disabled", "form", "props", "ref", "SwitchWithForm", "rest", "formValue", "handleFormChange", "event", "nextChecked", "syntheticEvent", "Switch", "Box", "useState", "useEffect", "useCallback", "useMemo", "useRef", "forwardRef", "useImperativeHandle", "TextField", "InputAdornment", "IconButton", "useState", "useMemo", "useEffect", "useRef", "useCallback", "Box", "Typography", "IconButton", "Button", "jsx", "jsxs", "OverlayScrollbar", "Fragment", "Popover", "getWeekInfo", "date", "dayOfWeek", "startDate", "endDate", "firstDayOfWeek", "isSameWeek", "date1", "date2", "week1", "week2", "isSameDay", "d1", "d2", "koLocale", "enLocale", "jaLocale", "zhCNLocale", "zhTWLocale", "esLocale", "frLocale", "deLocale", "ptLocale", "ruLocale", "itLocale", "arLocale", "hiLocale", "viLocale", "thLocale", "idLocale", "nlLocale", "plLocale", "trLocale", "defaultLocale", "locales", "resolveLocale", "locale", "getSizeValue", "size", "ChevronLeft", "color", "s", "ChevronRight", "ColonIcon", "TimeSelector", "value", "onChange", "format", "minTime", "maxTime", "minuteStep", "secondStep", "showHeader", "hideDisabledTime", "selectedHour", "setSelectedHour", "h", "selectedMinute", "setSelectedMinute", "m", "selectedSecond", "setSelectedSecond", "initialScrollDone", "hourRef", "minuteRef", "secondRef", "hasSeconds", "is12Hour", "maxHour", "minHourValue", "hours", "_", "i", "minutes", "seconds", "scrollToCenter", "scrollbarRef", "val", "scrollContainer", "element", "containerHeight", "elementTop", "elementHeight", "scrollTop", "timer", "isTimeInRange", "timeValue", "minParts", "minH", "minM", "minS", "minValue", "maxParts", "maxH", "maxM", "maxS", "maxValue", "handleHourSelect", "hour", "handleMinuteSelect", "minute", "handleSecondSelect", "second", "renderItem", "selected", "disabled", "onClick", "renderColumn", "ref", "items", "selectedValue", "onSelect", "checkDisabled", "item", "isDisabled", "isHourDisabled", "isMinuteDisabled", "isSecondDisabled", "HEADER_HEIGHT", "FOOTER_HEIGHT", "SimpleCalendar", "selectedDate", "minDate", "maxDate", "holidays", "styles", "onClose", "showToday", "showFooterProp", "autoApply", "monthOnly", "yearOnly", "onMonthChange", "onYearChange", "onWeekChange", "showTimePicker", "onTimeChange", "timeFormat", "texts", "selectedColor", "todayBorderColor", "holidayColor", "saturdayColor", "resolvedLocale", "mergedLocale", "validHolidays", "d", "today", "viewDate", "setViewDate", "viewMode", "setViewMode", "tempYear", "setTempYear", "tempMonth", "setTempMonth", "tempSelectedYear", "setTempSelectedYear", "tempSelectedDate", "setTempSelectedDate", "tempTime", "setTempTime", "now", "year", "month", "yearScrollRef", "contentRef", "calendarDays", "firstDay", "lastDay", "startPadding", "daysInMonth", "days", "prevMonthDays", "nextDay", "yearList", "currentYear", "years", "y", "isDateDisabled", "dateOnly", "min", "max", "isTimeChanged", "isYearChanged", "newYear", "isMonthChanged", "newMonth", "compareDate", "isWeekChanged", "goToPrevMonth", "newDate", "goToNextMonth", "handleWheel", "e", "handleDateClick", "weekInfo", "handleTodayClick", "todayYear", "todayMonth", "handleConfirm", "handleTempTimeChange", "handleTitleClick", "handleYearSelect", "selectedYear", "handleYearConfirm", "handleMonthSelect", "selectedMonth", "handleMonthConfirm", "yearIndex", "gridElement", "firstYearItem", "rowHeight", "rowIndex", "visibleRows", "centerRowOffset", "renderHeader", "renderContent", "isSelected", "isCurrent", "monthName", "index", "day", "isToday", "isCurrentMonth", "isHoliday", "renderFooter", "showFooter", "calendarContent", "footerContent", "resolveAnchorEl", "anchorEl", "TimePicker", "open", "resolvedAnchorEl", "tempHour", "setTempHour", "tempMinute", "setTempMinute", "tempSecond", "setTempSecond", "handleTimeChange", "DatePicker", "onDateChange", "anchorOrigin", "transformOrigin", "slotProps", "popoverProps", "mergedPaperProps", "tempDate", "setTempDate", "prevYear", "prevMonth", "handleDateSelect", "DateTimePicker", "handleCalendarTimeChange", "newTime", "width", "height", "jsx", "jsxs", "CalendarIcon", "size", "jsx", "jsx", "jsx", "jsxs", "ClockIcon", "size", "color", "jsx", "jsxs", "ColonIcon", "size", "color", "height", "dotRadius", "width", "centerX", "jsx", "DashIcon", "size", "width", "height", "jsx", "jsxs", "CopyIcon", "size", "iconSize", "jsx", "jsxs", "CARD_WIDTH", "CARD_HEIGHT", "CardIcon", "size", "color", "scale", "width", "height", "VisaIcon", "logoWidth", "logoHeight", "logoScale", "offsetX", "offsetY", "MastercardIcon", "AmexIcon", "JcbIcon", "DinersIcon", "DiscoverIcon", "UnionPayIcon", "BcIcon", "logoSize", "Fragment", "jsx", "jsxs", "DateTextFieldBase", "forwardRef", "label", "format", "separator", "minDate", "maxDate", "holidays", "holidayColor", "calendarIcon", "selectedColor", "showToday", "invalidBorderColor", "debounce", "slotProps", "sx", "value", "onChange", "onBlur", "placeholder", "onCalendarDismiss", "onCalendarOpen", "onCalendarClose", "name", "disabled", "readonly", "size", "externalInputRef", "calendarAnchorOrigin", "calendarTransformOrigin", "props", "ref", "isInvalid", "setIsInvalid", "useState", "displayValue", "setDisplayValue", "prevNumbers", "setPrevNumbers", "calendarOpen", "setCalendarOpen", "calendarAnchorPos", "setCalendarAnchorPos", "calendarCloseReasonRef", "useRef", "internalYear", "setInternalYear", "internalInputRef", "useImperativeHandle", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "maxLength", "getMaxLength", "completeLength", "getCompleteLength", "isYearlessFormat", "hasYearInFormat", "selectedDate", "useMemo", "parsed", "parseDateWithInternalYear", "calendarSelectedDate", "yearToUse", "buildOutputValue", "useCallback", "formattedValue", "buildDateOutputValue", "performValidation", "inputValue", "isValid", "validateDate", "useEffect", "strValue", "formatDate", "currentNumbers", "handleChange", "e", "input", "newValue", "newNumbers", "isBackspace", "trimmedNumbers", "limitedNumbers", "formatSep", "getSeparator", "cursorPos", "targetNumberCount", "numberCount", "i", "inputNumberCount", "outputValue", "handleBlur", "handleClick", "handleKeyDown", "numLen", "handleCalendarSelect", "date", "year", "numbers", "dateToNumbers", "activeElement", "inputRoot", "handleOpenCalendar", "inputEl", "rect", "handleCloseCalendar", "isSelectClose", "isCalendarOpen", "invalidStyles", "readonlyStyles", "TextField", "formatToPlaceholder", "InputAdornment", "IconButton", "CalendarIcon", "yt", "DateTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "DateTextField", "jsx", "jsxs", "DateRange", "form", "startName", "endName", "startLabel", "endLabel", "startValue", "endValue", "onStartChange", "onEndChange", "fullWidth", "size", "readonly", "gap", "startProps", "endProps", "Box", "DateTextField", "forwardRef", "useCallback", "Box", "FormControl", "FormLabel", "MuiSlider", "jsx", "jsxs", "SliderBase", "label", "name", "value", "onChange", "readonly", "disabled", "props", "ref", "SliderWithForm", "form", "rest", "formValue", "resolvedValue", "handleFormChange", "_event", "nextValue", "syntheticEvent", "Slider", "forwardRef", "useCallback", "MuiAutocomplete", "TextField", "jsx", "jsxs", "AutocompleteBase", "name", "label", "options", "value", "onChange", "fullWidth", "size", "readonly", "disabled", "textFieldProps", "renderOption", "props", "ref", "selectedOption", "option", "handleChange", "_event", "selected", "optionProps", "state", "labelText", "query", "lowerLabel", "lowerQuery", "matchIndex", "before", "match", "after", "params", "AutocompleteWithForm", "form", "rest", "formValue", "handleFormChange", "nextValue", "syntheticEvent", "Autocomplete", "forwardRef", "useCallback", "useId", "FormControl", "MenuItem", "MuiSelect", "jsx", "jsxs", "SelectBase", "value", "onChange", "options", "inputProps", "enableWheel", "emptyLabel", "readOnly", "showEmptyOption", "fullWidth", "size", "formControlProps", "form", "selectProps", "ref", "generatedId", "selectId", "safeValue", "option", "handleSelectWheel", "event", "optionValues", "currentIndex", "nextIndex", "syntheticEvent", "selected", "opt", "SelectWithForm", "name", "rest", "formValue", "handleFormChange", "Select", "props", "forwardRef", "useCallback", "useId", "useState", "FormControl", "InputLabel", "MenuItem", "Select", "jsx", "jsxs", "LabelSelectBase", "label", "value", "onChange", "options", "inputProps", "enableWheel", "showLabel", "emptyLabel", "readOnly", "showEmptyOption", "fullWidth", "size", "formControlProps", "form", "selectProps", "ref", "generatedId", "selectId", "labelId", "safeValue", "option", "isFocused", "setIsFocused", "shouldNotch", "displayEmptyValue", "handleFocus", "event", "handleBlur", "handleSelectWheel", "optionValues", "currentIndex", "nextIndex", "syntheticEvent", "selected", "opt", "LabelSelectWithForm", "name", "rest", "formValue", "handleFormChange", "LabelSelect", "props", "useState", "useEffect", "useCallback", "useRef", "forwardRef", "useImperativeHandle", "TextField", "jsx", "PhoneTextFieldBase", "forwardRef", "label", "autoFormat", "includeDash", "prefix", "format", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "slotProps", "sx", "value", "onChange", "onBlur", "externalInputRef", "props", "ref", "isInvalid", "setIsInvalid", "useState", "displayValue", "setDisplayValue", "prevNumbers", "setPrevNumbers", "currentMaxLength", "setCurrentMaxLength", "internalInputRef", "useRef", "cursorPositionRef", "useImperativeHandle", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "prefixFormatted", "performValidation", "useCallback", "inputValue", "numbers", "minLength", "isComplete", "useEffect", "strValue", "getPhoneMaxLength", "formattedValue", "formatPhoneNumber", "pos", "TextField", "e", "newValue", "newNumbers", "cursorPos", "prefixNumbers", "originalPos", "isBackspace", "deletedDigitIndex", "prefixProtected", "numbersBeforeCursor", "trimmedNumbers", "targetPos", "digitCount", "i", "currentNumbers", "outputValue", "PhoneTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "event", "PhoneTextField", "IconButton", "InputAdornment", "TextField", "Dialog", "DialogContent", "DialogTitle", "SearchIcon", "CloseIcon", "useState", "useEffect", "useCallback", "forwardRef", "useRef", "useImperativeHandle", "DaumPostcode", "Fragment", "jsx", "jsxs", "AddressTextFieldBase", "forwardRef", "value", "onChange", "readonly", "debounce", "onBlur", "size", "spellCheck", "externalInputRef", "props", "ref", "internalInputRef", "useRef", "useImperativeHandle", "address", "setAddress", "useState", "isPostcodeOpen", "setIsPostcodeOpen", "iconSize", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "useEffect", "strValue", "handlePostcodeComplete", "data", "fullAddress", "extraAddress", "handleSearchButtonClick", "handleKeyDown", "event", "handlePostcodeClose", "onClose", "TextField", "e", "newValue", "InputAdornment", "IconButton", "SearchIcon", "Dialog", "DialogTitle", "CloseIcon", "DialogContent", "DaumPostcode", "AddressTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "useCallback", "AddressTextField", "useState", "useEffect", "useCallback", "forwardRef", "useRef", "useImperativeHandle", "TextField", "InputAdornment", "jsx", "NumberTextFieldBase", "forwardRef", "label", "thousandSeparator", "decimalLength", "decimalFixed", "textAlign", "min", "max", "negative", "negativeStyles", "prefix", "suffix", "showSuffix", "selectOnFocus", "debounce", "readonly", "slotProps", "sx", "value", "onChange", "onBlur", "onFocus", "externalInputRef", "props", "ref", "internalInputRef", "useRef", "useImperativeHandle", "displayValue", "setDisplayValue", "useState", "isNegative", "setIsNegative", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "useEffect", "strValue", "formattedValue", "formatNumber", "handleChange", "useCallback", "e", "newValue", "withoutComma", "numValue", "maxFormatted", "emitValue", "minFormatted", "numericValue", "parseNumber", "handleBlur", "num", "finalValue", "inputStyles", "handleFocus", "TextField", "InputAdornment", "NumberTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "event", "NumberTextField", "useState", "useEffect", "useCallback", "useRef", "useMemo", "forwardRef", "useImperativeHandle", "TextField", "Box", "useCallback", "useRef", "useEffect", "forwardRef", "FormControl", "InputLabel", "OutlinedInput", "Box", "jsx", "jsxs", "CustomInput", "showContent", "inputSize", "contentSx", "children", "endAdornment", "ref", "GroupedInputWrapper", "label", "size", "disabled", "readonly", "focusedGroup", "setFocusedGroup", "hasValue", "isInvalid", "invalidBorderColor", "inputRefs", "getTargetRefOnClick", "sx", "className", "id", "fullWidth", "containerRef", "isLabelShrunk", "handleMouseDown", "e", "targetRef", "groupIndex", "inputEl", "handleDocumentClick", "target", "handleBlur", "activeEl", "Box", "jsx", "ColonBox", "size", "mx", "visible", "sx", "Box", "ColonIcon", "Fragment", "jsx", "jsxs", "JuminTextFieldBase", "forwardRef", "label", "mask", "maskColor", "validateChecksum", "fontSize", "fontColor", "fontFamily", "onChange", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "sx", "value", "size", "disabled", "fullWidth", "className", "id", "props", "ref", "frontValue", "setFrontValue", "useState", "backValue", "setBackValue", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "focusedField", "setFocusedField", "cursorVisible", "setCursorVisible", "renderTrigger", "setRenderTrigger", "backComplete", "setBackComplete", "frontRef", "useRef", "backRef", "containerRef", "isClickFocusRef", "cursorPosRef", "useImperativeHandle", "debounceTimer", "useEffect", "numbers", "displayBackValue", "emitChange", "useCallback", "front", "back", "fullValue", "completeLength", "isLengthComplete", "isValid", "validateJuminBirthDate", "validateJuminChecksum", "doEmit", "info", "extractJuminInfo", "handleFrontChange", "e", "r", "input", "len", "handleFrontFocus", "handleFrontBlur", "activeElement", "handleFrontKeyDown", "pos", "newPos", "newValue", "handleBackChange", "handleBackKeyDown", "valLen", "newFrontValue", "newBackValue", "handleBackFocus", "handleBackBlur", "placeholderDots", "computedFontSize", "measureTextWidth", "text", "ctx", "dotSize", "smallDotSize", "cursorHeight", "getCursorLeft", "field", "textBeforeCursor", "cursorLeft", "useMemo", "frontFieldCh", "backFieldCh", "noBorderStyle", "getFullNumber", "renderGroupedInput", "Box", "hasFrontValue", "hasBackValue", "TextField", "DashIcon", "selStart", "selEnd", "_", "i", "getTargetRefOnClick", "focusedGroup", "setFocusedGroupWrapper", "group", "GroupedInputWrapper", "JuminTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "syntheticEvent", "JuminTextField", "useState", "useEffect", "useCallback", "useRef", "forwardRef", "useImperativeHandle", "Box", "FormControl", "InputLabel", "OutlinedInput", "jsx", "jsxs", "VerificationCodeTextFieldBase", "forwardRef", "label", "length", "type", "value", "onChange", "onComplete", "debounce", "readonly", "disabled", "size", "name", "fontSizeProp", "fontColor", "fontFamily", "dotSizeProp", "caretColor", "sx", "invalidBorderColor", "externalInputRef", "restProps", "ref", "internalValue", "setInternalValue", "useState", "isFocused", "setIsFocused", "isAllSelected", "setIsAllSelected", "internalInputRef", "useRef", "useImperativeHandle", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "useEffect", "strValue", "isValidChar", "useCallback", "char", "filterValue", "val", "filtered", "handleChange", "e", "handlePaste", "pastedText", "handleKeyDown", "handleFocus", "input", "handleClick", "handleBlur", "defaultFontSize", "defaultDotSize", "fontSize", "dotSize", "charWidth", "gap", "totalContentWidth", "containerHeight", "containerPadding", "inputMode", "hasCustomWidth", "showContent", "formControlSx", "FormControl", "InputLabel", "OutlinedInput", "Box", "_", "i", "VerificationCodeTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "VerificationCodeTextField", "props", "React", "useState", "useEffect", "useCallback", "useRef", "forwardRef", "useImperativeHandle", "TextField", "Box", "Popper", "Paper", "List", "ListItemButton", "ListItemText", "ListItemIcon", "ClickAwayListener", "jsx", "jsxs", "GmailIcon", "size", "NaverIcon", "DaumIcon", "KakaoIcon", "NateIcon", "OutlookIcon", "YahooIcon", "ICloudIcon", "DefaultEmailIcon", "getEmailIcon", "domain", "jsx", "jsxs", "EmailTextFieldBase", "forwardRef", "value", "onChange", "onValidationChange", "domains", "DEFAULT_EMAIL_DOMAINS", "extraDomains", "suggestions", "showLogos", "invalidBorderColor", "debounce", "readonly", "sx", "size", "disabled", "name", "onBlur", "fullWidth", "externalInputRef", "props", "ref", "allDomains", "customIcons", "React", "icons", "extraDomainStrings", "item", "combined", "seen", "domain", "lower", "getDomainIcon", "useCallback", "lowerDomain", "getEmailIcon", "inputValue", "setInputValue", "useState", "isInvalid", "setIsInvalid", "localSuggestions", "setLocalSuggestions", "showPopper", "setShowPopper", "selectedIndex", "setSelectedIndex", "internalInputRef", "useRef", "anchorRef", "useImperativeHandle", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "useEffect", "strValue", "generateSuggestions", "input", "atIndex", "localPart", "domainPart", "filteredDomains", "newSuggestions", "handleChange", "e", "newValue", "isValid", "validateEmail", "hasContent", "handleSelectSuggestion", "suggestion", "handleKeyDown", "prev", "handleClickAway", "handleBlur", "handleFocus", "borderColor", "setRefs", "node", "ClickAwayListener", "Box", "TextField", "Popper", "Paper", "List", "index", "ListItemButton", "ListItemIcon", "ListItemText", "EmailTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "EmailTextField", "useState", "useEffect", "useCallback", "useRef", "useMemo", "forwardRef", "useImperativeHandle", "TextField", "Box", "Fragment", "jsx", "jsxs", "TimeTextFieldBase", "forwardRef", "label", "format", "minTime", "maxTime", "clockIcon", "minuteStep", "secondStep", "hideDisabledTime", "invalidBorderColor", "debounce", "sx", "value", "onChange", "onBlur", "name", "disabled", "readonly", "size", "fullWidth", "className", "id", "fontSize", "fontColor", "fontFamily", "ref", "hourValue", "setHourValue", "useState", "minuteValue", "setMinuteValue", "secondValue", "setSecondValue", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "pickerOpen", "setPickerOpen", "hourRef", "useRef", "minuteRef", "secondRef", "containerRef", "useImperativeHandle", "debounceTimer", "hasSecond", "getTimeFieldCount", "computedFontSize", "cursorHeight", "cursorWidth", "groups", "useMemo", "focusedGroup", "setFocusedGroup", "cursorVisible", "cursorPosRef", "inputComplete", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "useEffect", "strValue", "parts", "numbers", "emitChange", "useCallback", "hour", "minute", "second", "isComplete", "isValid", "validateTime", "doEmit", "timeString", "clampTimeValue", "type", "digit", "maxFirstDigit", "num", "is12Hour", "maxHour", "handleChange", "groupIndex", "newValue", "idx", "clampedValue", "refs", "newValues", "handleKeyDown", "handleBlur", "activeElement", "paddedHour", "paddedMinute", "paddedSecond", "getTargetRefOnClick", "values", "lastFilledIndex", "i", "handleClockIconClick", "e", "handlePickerChange", "handlePickerClose", "noBorderStyle", "fieldWidth", "renderGroup", "groupValue", "placeholder", "showCursor", "Box", "TextField", "getFullTime", "showColon", "renderGroupedInput", "ColonBox", "clockIconElement", "ClockIcon", "GroupedInputWrapper", "Xt", "TimeTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "TimeTextField", "props", "useState", "useEffect", "useCallback", "useMemo", "useRef", "forwardRef", "useImperativeHandle", "TextField", "InputAdornment", "IconButton", "Box", "Fragment", "jsx", "jsxs", "DateTimeTextFieldBase", "forwardRef", "label", "format", "dateSeparator", "minDateTime", "maxDateTime", "minTime", "maxTime", "holidays", "holidayColor", "calendarIcon", "selectedColor", "showToday", "minuteStep", "secondStep", "hideDisabledTime", "invalidBorderColor", "debounce", "sx", "value", "onChange", "onBlur", "name", "disabled", "readonly", "size", "fullWidth", "className", "id", "ref", "dateDisplayValue", "setDateDisplayValue", "useState", "prevDateNumbers", "setPrevDateNumbers", "internalYear", "setInternalYear", "hourValue", "setHourValue", "minuteValue", "setMinuteValue", "secondValue", "setSecondValue", "isInvalid", "setIsInvalid", "isDateFocused", "setIsDateFocused", "calendarOpen", "setCalendarOpen", "anchorEl", "setAnchorEl", "dateInputRef", "useRef", "hourRef", "minuteRef", "secondRef", "selectionRangeRef", "containerRef", "useImperativeHandle", "hasSecond", "hasSecondField", "is12Hour", "is12HourFormat", "dateFormat", "extractDateFormat", "displayDateSeparator", "getSeparator", "dateMaxLength", "getMaxLength", "dateCompleteLength", "getCompleteLength", "isYearlessFormat", "hasYearInFormat", "computedFontSize", "cursorHeight", "cursorWidth", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "timeGroups", "useMemo", "baseGroups", "focusedGroup", "cursorVisible", "inputComplete", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "buildDateTimeString", "useCallback", "dateStr", "hour", "minute", "second", "yearOverride", "outputDateStr", "buildDateOutputValue", "timeStr", "performValidation", "dateComplete", "timeComplete", "dateValid", "validateDate", "timeValid", "validateTime", "useEffect", "strValue", "datePart", "timePart", "formatted", "formatDateValue", "timeParts", "handleDateChange", "e", "input", "newValue", "newNumbers", "selection", "beforeSelection", "afterSelection", "beforeNumbers", "afterNumbers", "inputChar", "combinedNumbers", "formattedValue", "adjustedPos", "outputValue", "isBackspace", "trimmedNumbers", "measureTextWidth", "text", "style", "ctx", "handleDateClick", "cursorPos", "rect", "clickX", "paddingLeft", "textWidth", "start", "end", "getSegmentRange", "actualEnd", "actualStart", "handleDateKeyDown", "numLen", "handleTimeChange", "groupIndex", "idx", "clampedValue", "clampTimeValue", "refs", "newHour", "newMinute", "newSecond", "handleTimeKeyDown", "handleBlur", "paddedHour", "paddedMinute", "paddedSecond", "handleTimeBlur", "activeElement", "handleDateFocus", "handleCalendarSelect", "date", "year", "numbers", "dateToNumbers", "handleCalendarTimeChange", "h", "m", "s", "selectedDate", "parsed", "parseDateWithInternalYear", "calendarSelectedDate", "yearToUse", "invalidStyles", "readonlyStyles", "noBorderStyle", "dateFieldWidth", "datePlaceholder", "formatToPlaceholder", "timeFieldWidth", "renderTimeGroup", "groupValue", "placeholder", "showCursor", "Box", "TextField", "showTimeFields", "endAdornmentElement", "InputAdornment", "ColonBox", "IconButton", "CalendarIcon", "lr", "DateTimeTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "DateTimeTextField", "props", "useState", "useEffect", "useCallback", "useRef", "useMemo", "forwardRef", "useImperativeHandle", "TextField", "Box", "IconButton", "InfoAlert", "Fragment", "jsx", "jsxs", "BizNumTextFieldBase", "forwardRef", "label", "includeDash", "validate", "copyIcon", "fontSize", "fontColor", "fontFamily", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "sx", "value", "onChange", "size", "disabled", "className", "id", "autoFocus", "name", "fullWidth", "ref", "group1", "setGroup1", "useState", "group2", "setGroup2", "group3", "setGroup3", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "ref1", "useRef", "ref2", "ref3", "containerRef", "useImperativeHandle", "maxLengths", "debouncedEmit", "flushOnBlur", "useDebouncedEmit", "computedFontSize", "groups", "useMemo", "focusedGroup", "setFocusedGroup", "cursorVisible", "inputComplete", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "useEffect", "numbers", "getFullNumber", "useCallback", "emitChange", "g1", "g2", "g3", "fullNumber", "isComplete", "isValid", "validateBusinessNumber", "outputValue", "handleChange", "groupIndex", "newValue", "idx", "newValues", "handleKeyDown", "handleBlur", "e", "handleCopy", "copyValue", "InfoAlert", "fieldWidths", "cursorWidth", "cursorHeight", "noBorderStyle", "renderGroup", "groupValue", "placeholder", "showCursor", "refs", "Box", "TextField", "Dash", "DashIcon", "getTargetRefOnClick", "GroupedInputWrapper", "IconButton", "CopyIcon", "BizNumTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "BizNumTextField", "props", "useState", "useEffect", "useCallback", "useRef", "useMemo", "forwardRef", "useImperativeHandle", "TextField", "Box", "jsx", "jsxs", "CardNumTextFieldBase", "forwardRef", "label", "maskColor", "fontSize", "fontColor", "fontFamily", "onChange", "onValidationChange", "onCardBrandChange", "invalidBorderColor", "validate", "debounce", "readonly", "sx", "value", "size", "disabled", "logoIcon", "name", "className", "id", "fullWidth", "ref", "group1", "setGroup1", "useState", "group2", "setGroup2", "group3", "setGroup3", "group4", "setGroup4", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "cardBrand", "setCardBrand", "lastInputInfo", "setLastInputInfo", "ref1", "useRef", "ref2", "ref3", "ref4", "containerRef", "useImperativeHandle", "computedFontSize", "groups", "useMemo", "focusedGroup", "setFocusedGroup", "cursorVisible", "cursorPosRef", "inputComplete", "renderTrigger", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "emitChange", "flushOnBlur", "useDebouncedEmit", "getFullNumber", "useCallback", "emitCardChange", "g1", "g2", "g3", "g4", "fullValue", "isComplete", "isValid", "validateCardNumber", "brand", "detectCardBrand", "useEffect", "numbers", "handleChange", "groupIndex", "newValue", "idx", "newValues", "handleKeyDown", "handleBlur", "e", "handleContainerClick", "values", "refs", "lastFilledIndex", "i", "targetRef", "newPos", "dotSize", "cursorWidthPx", "cursorHeightPx", "normalFieldWidth", "maskedFieldWidth", "getMaskedCursorLeft", "cursorPos", "fieldWidthPx", "paddingPx", "gap", "noBorderStyle", "renderMaskedGroup", "groupValue", "isFocused", "showCursor", "Box", "TextField", "_", "isEntered", "isAtCursor", "isLastInput", "renderNormalGroup", "Dash", "DashIcon", "renderCardIcon", "iconSize", "VisaIcon", "MastercardIcon", "AmexIcon", "JcbIcon", "DinersIcon", "DiscoverIcon", "UnionPayIcon", "BcIcon", "CardIcon", "renderGroupedInput", "getTargetRefOnClick", "GroupedInputWrapper", "CardNumTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "CardNumTextField", "props"]
7
+ }