@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/index.ts", "../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 * @ehfuse/mui-form-controls\n *\n * @license MIT\n * @copyright 2025 \uAE40\uC601\uC9C4 (Kim Young Jin)\n * @author \uAE40\uC601\uC9C4 (ehfuse@gmail.com)\n */\n\nexport { SearchTextField } from \"./SearchTextField\";\nexport { ClearTextField } from \"./ClearTextField\";\nexport { PasswordTextField } from \"./PasswordTextField\";\nexport { TextArea } from \"./TextArea\";\nexport { Checkbox } from \"./Checkbox\";\nexport { RadioGroup } from \"./RadioGroup\";\nexport { Switch } from \"./Switch\";\nexport { DateRange } from \"./DateRange\";\nexport { Slider } from \"./Slider\";\nexport { Autocomplete } from \"./Autocomplete\";\nexport { Select } from \"./Select\";\nexport { LabelSelect } from \"./LabelSelect\";\nexport { PhoneTextField } from \"./PhoneTextField\";\nexport { AddressTextField } from \"./AddressTextField\";\nexport { NumberTextField } from \"./NumberTextField\";\nexport { JuminTextField } from \"./JuminTextField\";\nexport { VerificationCodeTextField } from \"./VerificationCodeTextField\";\nexport { EmailTextField } from \"./EmailTextField\";\nexport { DateTextField } from \"./DateTextField\";\nexport { TimeTextField } from \"./TimeTextField\";\nexport { DateTimeTextField } from \"./DateTimeTextField\";\nexport { BizNumTextField } from \"./BizNumTextField\";\nexport { CardNumTextField } from \"./CardNumTextField\";\nexport { useKoreanHolidays, useKoreanHolidaysRange } from \"./hooks\";\nexport {\n CardIcon,\n VisaIcon,\n MastercardIcon,\n AmexIcon,\n JcbIcon,\n DinersIcon,\n DiscoverIcon,\n UnionPayIcon,\n BcIcon,\n} from \"./icons\";\nexport type {\n SearchTextFieldProps,\n ClearTextFieldProps,\n PasswordTextFieldProps,\n TextAreaProps,\n CheckboxProps,\n SwitchProps,\n RadioGroupProps,\n RadioOption,\n DateRangeProps,\n SliderProps,\n AutocompleteProps,\n AutocompleteOption,\n SelectProps,\n SelectOption,\n LabelSelectProps,\n LabelSelectOption,\n PasswordValidationRules,\n PasswordValidationResult,\n PhoneTextFieldProps,\n PhoneFormat,\n AddressTextFieldProps,\n DaumPostcodeData,\n NumberTextFieldProps,\n JuminTextFieldProps,\n JuminInfo,\n VerificationCodeTextFieldProps,\n VerificationCodeType,\n EmailTextFieldProps,\n CustomDomain,\n DateTextFieldProps,\n DateFormat,\n TimeTextFieldProps,\n TimeFormat,\n DateTimeTextFieldProps,\n DateTimeFormat,\n BizNumTextFieldProps,\n CardNumTextFieldProps,\n SelectChangeEvent,\n} from \"./types\";\n", "/**\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": ["index_exports", "__export", "AddressTextField", "AmexIcon", "Autocomplete", "BcIcon", "BizNumTextField", "CardIcon", "CardNumTextField", "Checkbox", "ClearTextField", "DateRange", "DateTextField", "DateTimeTextField", "DinersIcon", "DiscoverIcon", "EmailTextField", "JcbIcon", "JuminTextField", "LabelSelect", "MastercardIcon", "NumberTextField", "PasswordTextField", "PhoneTextField", "RadioGroup", "SearchTextField", "Select", "Slider", "Switch", "TextArea", "TimeTextField", "UnionPayIcon", "VerificationCodeTextField", "VisaIcon", "useKoreanHolidays", "useKoreanHolidaysRange", "__toCommonJS", "import_react", "import_material", "import_Clear", "import_Search", "import_react", "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", "import_react", "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", "import_react", "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", "import_jsx_runtime", "SearchTextFieldBase", "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", "iconSize", "handleClear", "fakeEvent", "SearchIcon", "ClearIcon", "SearchTextFieldWithForm", "name", "rest", "formValue", "handleFormChange", "event", "SearchTextField", "import_react", "import_material", "import_Clear", "import_jsx_runtime", "ClearTextFieldBase", "value", "clearIcon", "debounce", "readonly", "spellCheck", "onChange", "onBlur", "onFocus", "onClear", "slotProps", "size", "externalInputRef", "props", "ref", "internalValue", "setInternalValue", "handleChange", "handleBlur", "emitChange", "useTextFieldBase", "isFocused", "setIsFocused", "internalInputRef", "iconSize", "handleClear", "eventTarget", "event", "ClearIcon", "ClearTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "ClearTextField", "import_react", "import_material", "import_Visibility", "import_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", "import_jsx_runtime", "PasswordTextFieldBase", "showToggle", "label", "validationRules", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "slotProps", "sx", "size", "value", "onChange", "onBlur", "externalInputRef", "props", "ref", "internalInputRef", "showPassword", "setShowPassword", "isInvalid", "setIsInvalid", "internalValue", "handleChange", "handleBlur", "useTextFieldBase", "iconSize", "handleTogglePassword", "prev", "performValidation", "inputValue", "mergedRules", "DEFAULT_PASSWORD_VALIDATION_RULES", "result", "validatePassword", "minLength", "VisibilityOff", "Visibility", "PasswordTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "event", "PasswordTextField", "import_react", "import_material", "import_jsx_runtime", "TextAreaBase", "label", "value", "name", "onChange", "onBlur", "onFocus", "minRows", "maxRows", "placeholder", "disabled", "readonly", "fullWidth", "externalInputRef", "sx", "inputProps", "debounce", "form", "rest", "ref", "internalInputRef", "isFocused", "setIsFocused", "internalValue", "setInternalValue", "emitChange", "handleBlur", "useTextFieldBase", "handleChange", "event", "newValue", "handleFocus", "handleBlurWithFocus", "node", "TextAreaWithForm", "formValue", "handleFormChange", "TextArea", "props", "import_react", "import_material", "import_jsx_runtime", "CheckboxBase", "label", "name", "checked", "onChange", "readonly", "disabled", "form", "props", "ref", "MuiCheckbox", "CheckboxWithForm", "rest", "formValue", "handleFormChange", "event", "nextChecked", "syntheticEvent", "Checkbox", "import_react", "import_material", "import_jsx_runtime", "RadioGroupBase", "label", "name", "value", "options", "onChange", "readonly", "disabled", "props", "ref", "MuiRadioGroup", "option", "RadioGroupWithForm", "form", "rest", "formValue", "handleFormChange", "event", "nextValue", "syntheticEvent", "RadioGroup", "import_react", "import_material", "import_jsx_runtime", "SwitchBase", "label", "name", "checked", "onChange", "readonly", "disabled", "form", "props", "ref", "MuiSwitch", "SwitchWithForm", "rest", "formValue", "handleFormChange", "event", "nextChecked", "syntheticEvent", "Switch", "import_material", "import_react", "import_material", "import_react", "import_material", "import_jsx_runtime", "import_overlay_scrollbar", "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", "ze", "resolveLocale", "locale", "getSizeValue", "size", "ChevronLeft", "color", "s", "jsx", "ChevronRight", "ColonIcon", "jsxs", "TimeSelector", "value", "onChange", "format", "minTime", "maxTime", "minuteStep", "secondStep", "showHeader", "hideDisabledTime", "selectedHour", "setSelectedHour", "useState", "h", "selectedMinute", "setSelectedMinute", "m", "selectedSecond", "setSelectedSecond", "initialScrollDone", "useRef", "hourRef", "minuteRef", "secondRef", "hasSeconds", "is12Hour", "maxHour", "minHourValue", "hours", "_", "i", "minutes", "seconds", "scrollToCenter", "useCallback", "scrollbarRef", "val", "scrollContainer", "element", "containerHeight", "elementTop", "elementHeight", "scrollTop", "useEffect", "timer", "isTimeInRange", "timeValue", "minParts", "minH", "minM", "minS", "minValue", "maxParts", "maxH", "maxM", "maxS", "maxValue", "handleHourSelect", "hour", "handleMinuteSelect", "minute", "handleSecondSelect", "second", "renderItem", "selected", "disabled", "onClick", "Box", "Typography", "renderColumn", "ref", "items", "selectedValue", "onSelect", "checkDisabled", "OverlayScrollbar", "item", "isDisabled", "isHourDisabled", "isMinuteDisabled", "isSecondDisabled", "Fragment", "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", "useMemo", "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", "IconButton", "renderContent", "isSelected", "isCurrent", "monthName", "index", "day", "isToday", "isCurrentMonth", "isHoliday", "renderFooter", "Button", "showFooter", "calendarContent", "footerContent", "resolveAnchorEl", "anchorEl", "TimePicker", "open", "resolvedAnchorEl", "tempHour", "setTempHour", "tempMinute", "setTempMinute", "tempSecond", "setTempSecond", "handleTimeChange", "Popover", "DatePicker", "onDateChange", "anchorOrigin", "transformOrigin", "slotProps", "popoverProps", "mergedPaperProps", "tempDate", "setTempDate", "prevYear", "prevMonth", "handleDateSelect", "DateTimePicker", "handleCalendarTimeChange", "newTime", "width", "height", "import_jsx_runtime", "CalendarIcon", "size", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "ClockIcon", "size", "color", "import_jsx_runtime", "ColonIcon", "size", "color", "height", "dotRadius", "width", "centerX", "import_jsx_runtime", "DashIcon", "size", "width", "height", "import_jsx_runtime", "CopyIcon", "size", "iconSize", "import_jsx_runtime", "CARD_WIDTH", "CARD_HEIGHT", "CardIcon", "size", "color", "scale", "width", "height", "VisaIcon", "logoWidth", "logoHeight", "logoScale", "offsetX", "offsetY", "MastercardIcon", "AmexIcon", "JcbIcon", "DinersIcon", "DiscoverIcon", "UnionPayIcon", "BcIcon", "logoSize", "import_jsx_runtime", "DateTextFieldBase", "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", "displayValue", "setDisplayValue", "prevNumbers", "setPrevNumbers", "calendarOpen", "setCalendarOpen", "calendarAnchorPos", "setCalendarAnchorPos", "calendarCloseReasonRef", "internalYear", "setInternalYear", "internalInputRef", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "maxLength", "getMaxLength", "completeLength", "getCompleteLength", "isYearlessFormat", "hasYearInFormat", "selectedDate", "parsed", "parseDateWithInternalYear", "calendarSelectedDate", "yearToUse", "buildOutputValue", "formattedValue", "buildDateOutputValue", "performValidation", "inputValue", "isValid", "validateDate", "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", "formatToPlaceholder", "CalendarIcon", "yt", "DateTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "DateTextField", "import_jsx_runtime", "DateRange", "form", "startName", "endName", "startLabel", "endLabel", "startValue", "endValue", "onStartChange", "onEndChange", "fullWidth", "size", "readonly", "gap", "startProps", "endProps", "DateTextField", "import_react", "import_material", "import_jsx_runtime", "SliderBase", "label", "name", "value", "onChange", "readonly", "disabled", "props", "ref", "MuiSlider", "SliderWithForm", "form", "rest", "formValue", "resolvedValue", "handleFormChange", "_event", "nextValue", "syntheticEvent", "Slider", "import_react", "import_material", "import_jsx_runtime", "AutocompleteBase", "name", "label", "options", "value", "onChange", "fullWidth", "size", "readonly", "disabled", "textFieldProps", "renderOption", "props", "ref", "selectedOption", "option", "handleChange", "_event", "MuiAutocomplete", "selected", "optionProps", "state", "labelText", "query", "lowerLabel", "lowerQuery", "matchIndex", "before", "match", "after", "params", "AutocompleteWithForm", "form", "rest", "formValue", "handleFormChange", "nextValue", "syntheticEvent", "Autocomplete", "import_react", "import_material", "import_jsx_runtime", "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", "MuiSelect", "selected", "opt", "SelectWithForm", "name", "rest", "formValue", "handleFormChange", "Select", "props", "import_react", "import_material", "import_jsx_runtime", "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", "import_react", "import_material", "import_jsx_runtime", "PhoneTextFieldBase", "label", "autoFormat", "includeDash", "prefix", "format", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "slotProps", "sx", "value", "onChange", "onBlur", "externalInputRef", "props", "ref", "isInvalid", "setIsInvalid", "displayValue", "setDisplayValue", "prevNumbers", "setPrevNumbers", "currentMaxLength", "setCurrentMaxLength", "internalInputRef", "cursorPositionRef", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "prefixFormatted", "performValidation", "inputValue", "numbers", "minLength", "isComplete", "strValue", "getPhoneMaxLength", "formattedValue", "formatPhoneNumber", "pos", "e", "newValue", "newNumbers", "cursorPos", "prefixNumbers", "originalPos", "isBackspace", "deletedDigitIndex", "prefixProtected", "numbersBeforeCursor", "trimmedNumbers", "targetPos", "digitCount", "i", "currentNumbers", "outputValue", "PhoneTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "event", "PhoneTextField", "import_material", "import_Search", "import_Close", "import_react", "import_react_daum_postcode", "import_jsx_runtime", "AddressTextFieldBase", "value", "onChange", "readonly", "debounce", "onBlur", "size", "spellCheck", "externalInputRef", "props", "ref", "internalInputRef", "address", "setAddress", "isPostcodeOpen", "setIsPostcodeOpen", "iconSize", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "strValue", "handlePostcodeComplete", "data", "fullAddress", "extraAddress", "handleSearchButtonClick", "handleKeyDown", "event", "handlePostcodeClose", "onClose", "e", "newValue", "SearchIcon", "CloseIcon", "DaumPostcode", "AddressTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "AddressTextField", "import_react", "import_material", "import_jsx_runtime", "NumberTextFieldBase", "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", "displayValue", "setDisplayValue", "isNegative", "setIsNegative", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "strValue", "formattedValue", "formatNumber", "handleChange", "e", "newValue", "withoutComma", "numValue", "maxFormatted", "emitValue", "minFormatted", "numericValue", "parseNumber", "handleBlur", "num", "finalValue", "inputStyles", "handleFocus", "NumberTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "event", "NumberTextField", "import_react", "import_material", "import_react", "import_material", "import_jsx_runtime", "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", "import_material", "import_jsx_runtime", "ColonBox", "size", "mx", "visible", "sx", "ColonIcon", "import_jsx_runtime", "JuminTextFieldBase", "label", "mask", "maskColor", "validateChecksum", "fontSize", "fontColor", "fontFamily", "onChange", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "sx", "value", "size", "disabled", "fullWidth", "className", "id", "props", "ref", "frontValue", "setFrontValue", "backValue", "setBackValue", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "focusedField", "setFocusedField", "cursorVisible", "setCursorVisible", "renderTrigger", "setRenderTrigger", "backComplete", "setBackComplete", "frontRef", "backRef", "containerRef", "isClickFocusRef", "cursorPosRef", "debounceTimer", "numbers", "displayBackValue", "emitChange", "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", "frontFieldCh", "backFieldCh", "noBorderStyle", "getFullNumber", "renderGroupedInput", "hasFrontValue", "hasBackValue", "DashIcon", "selStart", "selEnd", "_", "i", "getTargetRefOnClick", "focusedGroup", "setFocusedGroupWrapper", "group", "GroupedInputWrapper", "JuminTextFieldWithForm", "form", "name", "rest", "formValue", "handleFormChange", "syntheticEvent", "JuminTextField", "import_react", "import_material", "import_jsx_runtime", "VerificationCodeTextFieldBase", "label", "length", "type", "value", "onChange", "onComplete", "debounce", "readonly", "disabled", "size", "name", "fontSizeProp", "fontColor", "fontFamily", "dotSizeProp", "caretColor", "sx", "invalidBorderColor", "externalInputRef", "restProps", "ref", "internalValue", "setInternalValue", "isFocused", "setIsFocused", "isAllSelected", "setIsAllSelected", "internalInputRef", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "strValue", "isValidChar", "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", "_", "i", "VerificationCodeTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "VerificationCodeTextField", "props", "import_react", "import_material", "import_jsx_runtime", "GmailIcon", "size", "NaverIcon", "DaumIcon", "KakaoIcon", "NateIcon", "OutlookIcon", "YahooIcon", "ICloudIcon", "DefaultEmailIcon", "getEmailIcon", "domain", "import_jsx_runtime", "EmailTextFieldBase", "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", "lowerDomain", "getEmailIcon", "inputValue", "setInputValue", "isInvalid", "setIsInvalid", "localSuggestions", "setLocalSuggestions", "showPopper", "setShowPopper", "selectedIndex", "setSelectedIndex", "internalInputRef", "anchorRef", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "strValue", "generateSuggestions", "input", "atIndex", "localPart", "domainPart", "filteredDomains", "newSuggestions", "handleChange", "e", "newValue", "isValid", "validateEmail", "hasContent", "handleSelectSuggestion", "suggestion", "handleKeyDown", "prev", "handleClickAway", "handleBlur", "handleFocus", "borderColor", "setRefs", "node", "index", "EmailTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "EmailTextField", "import_react", "import_material", "import_jsx_runtime", "TimeTextFieldBase", "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", "minuteValue", "setMinuteValue", "secondValue", "setSecondValue", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "pickerOpen", "setPickerOpen", "hourRef", "minuteRef", "secondRef", "containerRef", "debounceTimer", "hasSecond", "getTimeFieldCount", "computedFontSize", "cursorHeight", "cursorWidth", "groups", "focusedGroup", "setFocusedGroup", "cursorVisible", "cursorPosRef", "inputComplete", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "strValue", "parts", "numbers", "emitChange", "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", "getFullTime", "showColon", "renderGroupedInput", "ColonBox", "clockIconElement", "ClockIcon", "GroupedInputWrapper", "Xt", "TimeTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "TimeTextField", "props", "import_react", "import_material", "import_jsx_runtime", "DateTimeTextFieldBase", "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", "prevDateNumbers", "setPrevDateNumbers", "internalYear", "setInternalYear", "hourValue", "setHourValue", "minuteValue", "setMinuteValue", "secondValue", "setSecondValue", "isInvalid", "setIsInvalid", "isDateFocused", "setIsDateFocused", "calendarOpen", "setCalendarOpen", "anchorEl", "setAnchorEl", "dateInputRef", "hourRef", "minuteRef", "secondRef", "selectionRangeRef", "containerRef", "hasSecond", "hasSecondField", "is12Hour", "is12HourFormat", "dateFormat", "extractDateFormat", "displayDateSeparator", "getSeparator", "dateMaxLength", "getMaxLength", "dateCompleteLength", "getCompleteLength", "isYearlessFormat", "hasYearInFormat", "computedFontSize", "cursorHeight", "cursorWidth", "emitChange", "flushOnBlur", "lastEmittedValue", "useDebouncedEmit", "timeGroups", "baseGroups", "focusedGroup", "cursorVisible", "inputComplete", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "buildDateTimeString", "dateStr", "hour", "minute", "second", "yearOverride", "outputDateStr", "buildDateOutputValue", "timeStr", "performValidation", "dateComplete", "timeComplete", "dateValid", "validateDate", "timeValid", "validateTime", "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", "showTimeFields", "endAdornmentElement", "ColonBox", "CalendarIcon", "lr", "DateTimeTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "DateTimeTextField", "props", "import_react", "import_material", "import_alerts", "import_jsx_runtime", "BizNumTextFieldBase", "label", "includeDash", "validate", "copyIcon", "fontSize", "fontColor", "fontFamily", "onValidationChange", "invalidBorderColor", "debounce", "readonly", "sx", "value", "onChange", "size", "disabled", "className", "id", "autoFocus", "name", "fullWidth", "ref", "group1", "setGroup1", "group2", "setGroup2", "group3", "setGroup3", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "ref1", "ref2", "ref3", "containerRef", "maxLengths", "debouncedEmit", "flushOnBlur", "useDebouncedEmit", "computedFontSize", "groups", "focusedGroup", "setFocusedGroup", "cursorVisible", "inputComplete", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "numbers", "getFullNumber", "emitChange", "g1", "g2", "g3", "fullNumber", "isComplete", "isValid", "validateBusinessNumber", "outputValue", "handleChange", "groupIndex", "newValue", "idx", "newValues", "handleKeyDown", "handleBlur", "e", "handleCopy", "copyValue", "fieldWidths", "cursorWidth", "cursorHeight", "noBorderStyle", "renderGroup", "groupValue", "placeholder", "showCursor", "refs", "Dash", "DashIcon", "getTargetRefOnClick", "GroupedInputWrapper", "CopyIcon", "BizNumTextFieldWithForm", "form", "rest", "formValue", "handleFormChange", "event", "BizNumTextField", "props", "import_react", "import_material", "import_jsx_runtime", "CardNumTextFieldBase", "label", "maskColor", "fontSize", "fontColor", "fontFamily", "onChange", "onValidationChange", "onCardBrandChange", "invalidBorderColor", "validate", "debounce", "readonly", "sx", "value", "size", "disabled", "logoIcon", "name", "className", "id", "fullWidth", "ref", "group1", "setGroup1", "group2", "setGroup2", "group3", "setGroup3", "group4", "setGroup4", "isInvalid", "setIsInvalid", "isInternalChange", "setIsInternalChange", "cardBrand", "setCardBrand", "lastInputInfo", "setLastInputInfo", "ref1", "ref2", "ref3", "ref4", "containerRef", "computedFontSize", "groups", "focusedGroup", "setFocusedGroup", "cursorVisible", "cursorPosRef", "inputComplete", "renderTrigger", "getCursorLeft", "createMouseDownHandler", "createClickHandler", "createFocusHandler", "createBlurHandler", "createKeyDownHandler", "createGroupChangeHandler", "useGroupedInput", "emitChange", "flushOnBlur", "useDebouncedEmit", "getFullNumber", "emitCardChange", "g1", "g2", "g3", "g4", "fullValue", "isComplete", "isValid", "validateCardNumber", "brand", "detectCardBrand", "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", "_", "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
+ }