@farmzone/fz-react-ui 1.0.4 → 1.0.6
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.
- package/dist/index.cjs +199 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.js +199 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/variants.ts","../src/components/Badge/index.tsx","../src/components/Tooltip/ui/tooltip.tsx","../src/config/zIndex.ts","../src/components/Tooltip/index.tsx","../src/components/Button/index.tsx","../src/components/Checkbox/config/default.ts","../src/components/Checkbox/index.tsx","../src/components/Input/ui/input.tsx","../src/components/Input/index.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/config/switchTypes.ts","../src/components/Switch/ui/BaseSwitch.tsx","../src/components/Switch/index.tsx","../src/components/Slider/index.tsx","../src/components/Skeleton/index.tsx","../src/components/ScrollArea/index.tsx","../src/components/Select/ui/select.tsx","../src/components/Select/config/default.ts","../src/components/Select/index.tsx","../src/components/SelectGroup/index.tsx","../src/components/Radio/config/default.ts","../src/components/Radio/index.tsx","../src/components/Popover/ui/popover.tsx","../src/components/Popover/index.tsx","../src/components/Spinner/index.tsx","../src/components/LoadingOverlay/index.tsx","../src/components/Loading/index.tsx","../src/components/Pagination/index.tsx","../src/components/BreadCrumb/config/utils.ts","../src/components/BreadCrumb/ui/BreadCrumbLink.tsx","../src/components/BreadCrumb/index.tsx","../src/components/BreadCrumb/config/buildItems.ts","../src/components/BreadCrumb/hooks/useBreadCrumbItems.ts","../src/components/Toast/ToastCore.ts","../src/components/Toast/index.tsx","../src/components/DatePicker/config/utils.ts","../src/components/DatePicker/calendar/config/default.ts","../src/components/DatePicker/calendar/config/calendar.ts","../src/components/DatePicker/calendar/Index.tsx","../src/components/DatePicker/calendar/hooks/useCalendarState.ts","../src/components/DatePicker/calendar/hooks/useFloatingCalendarPosition.ts","../src/components/DatePicker/ui/CalendarPortal.tsx","../src/components/DatePicker/config/styles.ts","../src/components/DatePicker/ui/DatePickerRange.tsx","../src/components/DatePicker/ui/DatePickerSingle.tsx","../src/components/DatePicker/index.tsx","../src/components/SearchBar/index.tsx","../src/components/DebouncedButton/index.tsx","../src/components/Tab/ui/ChildTabButton.tsx","../src/components/Tab/index.tsx","../src/components/Empty/config/style.ts","../src/components/Empty/ui/EmptyContent.tsx","../src/components/Empty/index.tsx","../src/components/Modal/ui/modalStack.ts","../src/components/Modal/ui/ModalContent.tsx","../src/components/Modal/ui/ModalOverlay.tsx","../src/components/Modal/ui/ModalBody.tsx","../src/components/Modal/ui/ModalFooter.tsx","../src/components/Modal/ui/ModalHeader.tsx","../src/components/Modal/ui/ModalIconHeader.tsx","../src/components/Modal/index.tsx","../src/components/Confirm/ui/ConfirmModal.tsx","../src/components/Confirm/model/confirmModal.tsx","../src/components/Table/component/TableFooter.tsx","../src/components/Table/hooks/useTableFixed.ts","../src/components/Table/component/ui/ArrowIcon.tsx","../src/components/Table/component/TableHeader.tsx","../src/components/Table/component/ui/SkeletonTd.tsx","../src/components/Table/component/ui/TableDataRow.tsx","../src/components/Table/component/ui/TableEmpty.tsx","../src/components/Table/component/ui/TableCellContent.tsx","../src/components/Table/config/utils.ts","../src/components/Table/component/Table.tsx","../src/components/Carousel/ui/carousel.tsx","../src/components/Carousel/index.tsx","../src/components/FilePreviewViewer/config/default.ts","../src/components/FilePreviewViewer/config/stableImageSrc.ts","../src/components/FilePreviewViewer/config/utils.ts","../src/components/FilePreviewViewer/hooks/useStableImageSrc.ts","../src/components/FilePreviewViewer/ui/FilePreviewViewerContent.tsx","../src/components/FilePreviewViewer/ui/FilePreviewViewerFooter.tsx","../src/components/FilePreviewViewer/ui/FilePreviewViewerNavigation.tsx","../src/components/FilePreviewViewer/ui/FilePreviewViewerTop.tsx","../src/components/FilePreviewViewer/FilePreviewViewerSession.tsx","../src/components/FilePreviewViewer/index.tsx","../src/components/SubmitForm/validation/context.ts","../src/components/SubmitForm/validation/useSubmitFormValidation.ts","../src/components/SubmitForm/config/utils.ts","../src/components/SubmitForm/config/styles.ts","../src/components/SubmitForm/ui/FormFieldControlStack.tsx","../src/components/SubmitForm/validation/zod.ts","../src/components/SubmitForm/components/FormTable.tsx","../src/components/SearchAddress/index.tsx","../src/components/SubmitForm/components/fields/AddressField.tsx","../src/components/SubmitForm/lib/cascadingSelectUtils.ts","../src/components/SubmitForm/lib/resolveSelectClassNameProp.ts","../src/components/SubmitForm/components/fields/CascadingSelectField.tsx","../src/components/SubmitForm/components/fields/CheckboxField.tsx","../src/components/SubmitForm/components/fields/DateField.tsx","../src/components/SubmitForm/components/fields/InputField.tsx","../src/components/SubmitForm/components/fields/InputWithButtonField.tsx","../src/components/SubmitForm/components/fields/NumberField.tsx","../src/components/SubmitForm/components/fields/PhoneField.tsx","../src/components/SubmitForm/components/fields/RadioField.tsx","../src/components/SubmitForm/components/fields/SelectField.tsx","../src/components/SubmitForm/lib/selectWithInputUtils.ts","../src/components/SubmitForm/components/fields/SelectWithInputField.tsx","../src/components/SubmitForm/components/fields/SwitchField.tsx","../src/components/SubmitForm/components/fields/TextareaField.tsx","../src/components/SubmitForm/ui/RequireIcon.tsx","../src/components/SubmitForm/validation/useBlurValidation.ts","../src/components/SubmitForm/components/FormField.tsx","../src/components/SubmitForm/config/rowPropsToFieldConfig.ts","../src/components/SubmitForm/components/SubmitFormRow.tsx","../src/components/SubmitForm/validation/seedHadValue.ts","../src/components/SubmitForm/validation/SubmitFormValidationProvider.tsx","../src/components/SubmitForm/index.tsx","../src/components/PageFilter/ui/LabeledFilterOption.tsx","../src/components/PageFilter/index.tsx","../src/components/MultiTab/index.tsx","../src/stores/multiTabStore.ts","../src/components/ScrollBar/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/lib/dateUtils.ts","../src/components/Uploader/BaseUploader.tsx","../src/components/Uploader/ExcelUploader.tsx","../src/components/FilePreviewViewer/hooks/useFilePreviewViewer.ts","../src/components/Uploader/FileUploader.tsx","../src/components/Sidebar/index.tsx","../src/components/DetailView/model/useDetailController.ts","../src/components/DetailView/ui/DetailEditView.tsx","../src/components/DetailView/ui/fieldRenderers/BadgeRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/BooleanRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/ImageRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/LinkRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/TagListRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/TextRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/index.tsx","../src/components/DetailView/ui/DetailReadView.tsx","../src/components/DetailView/ui/DetailContent.tsx","../src/components/DetailView/frames/DetailModalFrame.tsx","../src/hooks/useBlockModalConfirm.ts","../src/hooks/useCustomBlocker.ts","../src/components/DetailView/frames/DetailPageFrame.tsx","../src/hooks/useModal.ts","../src/hooks/useScrollToTop.ts"],"names":["twMerge","clsx","cva","jsxs","jsx","TooltipPrimitive","Tooltip","size","Slot","useId","Minus","Check","Input","useState","EyeOff","Eye","SwitchPrimitive","RadixSlider","forwardRef","SelectPrimitive","CircleX","ChevronDown","ChevronUp","Select","SelectGroup","RadioGroupPrimitive","CircleIcon","PopoverPrimitive","useEffect","useCallback","useMemo","ChevronFirst","ChevronLeft","ChevronRight","ChevronLast","Link","root","useLocation","setToasts","toast","useRef","createPortal","Fragment","isOpen","useLayoutEffect","Calendar","Search","debounce","container","FileSearch2","BadgePlus","Pencil","Info","Trash2","TriangleAlert","Icon","X","createRoot","getAlignStyle","mainGroups","subGroups","useDeferredValue","useVirtualizer","useReactTable","getCoreRowModel","React6","useEmblaCarousel","api","Carousel","useImperativeHandle","React","FileText","memo","ZoomIn","ZoomOut","RotateCcw","RotateCw","Download","isImageFile","createContext","useContext","cn","dayjs","customParseFormat","useFormContext","useFormState","useFieldArray","useWatch","column","Plus","useDaumPostcodePopup","value","toSelectOptions","Controller","useForm","zodResolver","FormProvider","rowGap","createJSONStorage","create","persist","uuidv4","Upload","heic2any","FileUp","VARIANT_STYLES","useNavigate","PanelRightClose","PanelLeftClose","useBlocker","useSearchParams"],"mappings":"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","file":"index.cjs","sourcesContent":["import { cva } from \"class-variance-authority\";\nimport clsx from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: Array<ClassValue>) {\n return twMerge(clsx(inputs));\n}\n\nexport const buttonVariants = cva(\n \"inline-flex items-center justify-center font-medium rounded-sm transition-colors duration-200 cursor-pointer focus:outline-none disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed\",\n {\n variants: {\n variant: {\n outline: \"bg-white border border-sub-lightgray-2 text-sub-darkgray hover:bg-gray-100 hover:text-black min-w-22\",\n save: \"bg-main border-none text-white opacity-100 hover:opacity-90 min-w-22\",\n delete:\n \"bg-white border border-sub-red text-main-red hover:bg-red-50 disabled:bg-light-gray disabled:border-sub-lightgray-2 disabled:text-sub-lightgray-2 font-bold min-w-22\",\n reset: \"bg-white border border-sub-lightgray-2 text-sub-darkgray hover:bg-gray-100 hover:text-black\",\n search: \"bg-main-blue border-none text-white hover:bg-main-blue/90\",\n file: \"bg-btn-file text-white hover:bg-btn-file/90\",\n carousel: \"bg-white border border-gray-300 hover:bg-gray-100 hover:text-black rounded-full\",\n accent: \"btn-grad text-white rounded-full\",\n metal: \"btn-metal text-white min-w-22\",\n ghost: \"p-1 h-auto rounded-sm bg-transparent hover:bg-sub-lightgray text-sub-darkgray hover:bg-inherit\",\n link: \"bg-transparent border-none text-main-blue underline-offset-4 hover:underline h-auto p-0\",\n },\n size: {\n default: \"h-8 px-4 font-semibold\",\n sm: \"h-7 px-2.5 text-sm min-w-auto\",\n lg: \"h-10 px-5 text-base font-semibold\",\n icon: \"size-8 p-0 min-w-auto\",\n link: \"m-0 p-0 text-sm\",\n \"icon-sm\": \"size-7 p-0 min-w-auto\",\n \"icon-lg\": \"size-10 p-0 min-w-auto\",\n },\n },\n defaultVariants: {\n variant: \"outline\",\n size: \"default\",\n },\n },\n);\n\nexport const textVariants = cva(\"leading-tight break-all\", {\n variants: {\n variant: {\n default: \"text-gray-900\",\n muted: \"text-gray-500\",\n danger: \"text-red-600\",\n success: \"text-green-600\",\n info: \"text-blue-600\",\n },\n size: {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n xl: \"text-xl\",\n \"2xl\": \"text-2xl\",\n \"3xl\": \"text-3xl\",\n \"4xl\": \"text-4xl\",\n \"5xl\": \"text-5xl\",\n \"6xl\": \"text-6xl\",\n \"7xl\": \"text-7xl\",\n \"8xl\": \"text-8xl\",\n },\n weight: {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n },\n color: {\n main: \"text-main\",\n lightGray: \"text-light-gray\",\n basicGray: \"text-basic-gray\",\n darkGray: \"text-dark-gray\",\n white: \"text-white\",\n black: \"text-black\",\n gray: \"text-gray-500\",\n brown: \"text-amber-700\",\n orange: \"text-orange-500\",\n yellow: \"text-yellow-500\",\n green: \"text-green-500\",\n blue: \"text-blue-500\",\n purple: \"text-purple-500\",\n pink: \"text-pink-500\",\n red: \"text-red-500\",\n inherit: \"text-inherit\",\n default: \"text-inherit\",\n },\n textLine: {\n underline: \"underline decoration-solid\",\n strikethrough: \"line-through\",\n },\n },\n});\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport interface BadgeProps {\n text?: string;\n children?: ReactNode;\n className?: string;\n textClassName?: string;\n badgeCount?: number;\n badgeCountClassName?: string;\n maxCount?: number;\n}\n\nexport default function Badge(props: BadgeProps) {\n const { text, children, className, textClassName, badgeCount, badgeCountClassName, maxCount = 99 } = props;\n\n return (\n <span\n className={cn(\n \"relative inline-flex items-center gap-1.5\",\n \"px-2.5 py-1\",\n \"text-xs font-medium\",\n \"rounded-full\",\n \"bg-gray-100 text-gray-800\",\n \"border border-gray-200\",\n className,\n )}\n >\n {children || <span className={cn(textClassName)}>{text}</span>}\n\n {badgeCount !== undefined && badgeCount !== null && (\n <span\n className={cn(\n \"absolute -top-3 -right-1\",\n \"flex items-center justify-center\",\n \"min-w-[18px] h-[18px]\",\n \"px-1\",\n \"text-[10px] font-bold\",\n \"rounded-full\",\n \"bg-red-500 text-white\",\n badgeCountClassName,\n )}\n >\n {badgeCount > maxCount ? `${maxCount}+` : badgeCount}\n </span>\n )}\n </span>\n );\n}\n","import * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"../../../lib/variants\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n arrowClassName,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content> & {\n arrowClassName?: string;\n}) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-full origin-(--radix-tooltip-content-transform-origin) rounded-md text-xs\",\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow\n className={cn(\n \"z-50 w-2.5 h-2.5 translate-y-[calc(-50%_-_0px)] rotate-45 rounded-[2px]\",\n arrowClassName,\n )}\n style={{ fill: \"currentColor\" }}\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","export const Z_INDEX = {\n TABLE_COL_STICKY: 1,\n TABLE_FIXED_CELL: 5,\n TABLE_FIXED_HEADER_CELL: 10,\n LOCAL_OVERLAY: 10,\n LAYOUT_HEADER: 20,\n DROPDOWN_LOCAL: 20,\n SIDEBAR_CONTAINER: 30,\n SIDEBAR_BACKDROP: 40,\n SIDEBAR: 50,\n DROPDOWN: 50,\n CALENDAR_ANCHORED: 50,\n LOADING_OVERLAY_DEFAULT: 50,\n DRAWING_CANVAS_1: 51,\n DRAWING_CANVAS_2: 52,\n DRAWING: 53,\n MODAL_OVERLAY: 54,\n MODAL: 55,\n CALENDAR_PORTAL: 60,\n TOOLTIP: 70,\n SELECT_CONTENT: 100,\n TOP: 9999,\n MODAL_Z_STEP: 10,\n} as const;\n\nexport type ZIndexKey = keyof typeof Z_INDEX;\n","import type { CSSProperties, ReactNode } from \"react\";\n\nimport { Tooltip as TooltipBase, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\nimport { Z_INDEX } from \"../../config/zIndex\";\n\nexport interface TooltipProps {\n children: ReactNode;\n text?: ReactNode;\n content: ReactNode;\n position?: \"top\" | \"bottom\";\n className?: string;\n triggerClassName?: string;\n arrowClassName?: string;\n contentClassName?: string;\n contentStyle?: CSSProperties;\n containerStyle?: CSSProperties;\n offsetX?: number;\n offsetY?: number;\n delayDuration?: number;\n asChild?: boolean;\n disableHoverableContent?: boolean;\n sideOffset?: number;\n}\n\nexport default function Tooltip(props: TooltipProps) {\n const {\n children,\n text,\n content,\n position = \"bottom\",\n className = \"\",\n triggerClassName = \"\",\n arrowClassName = \"\",\n contentClassName = \"\",\n contentStyle = {},\n containerStyle,\n offsetX = 0,\n offsetY = 2,\n delayDuration = 0,\n asChild = false,\n disableHoverableContent = false,\n sideOffset = 0,\n } = props;\n\n const translateY = position === \"top\" ? -offsetY : offsetY;\n\n return (\n <TooltipBase delayDuration={delayDuration} disableHoverableContent={disableHoverableContent}>\n <TooltipTrigger className={triggerClassName} asChild={asChild}>\n {children}\n </TooltipTrigger>\n <TooltipContent\n className={`bg-neutral-700 font-medium text-white text-sm ${className}`}\n arrowClassName={`bg-neutral-700 !fill-neutral-700 ${arrowClassName}`}\n side={position}\n sideOffset={sideOffset}\n collisionPadding={8}\n style={{\n zIndex: Z_INDEX.TOOLTIP,\n transform: `translateX(${offsetX}px) translateY(${translateY}px)`,\n ...containerStyle,\n }}\n >\n <div className=\"px-3 py-[5px] break-words whitespace-normal\" style={contentStyle}>\n <p className={contentClassName}>\n {content && <span>{content}</span>}\n {text}\n </p>\n </div>\n </TooltipContent>\n </TooltipBase>\n );\n}\n","import { type ButtonHTMLAttributes, type ReactNode, type Ref } from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport Tooltip from \"../Tooltip\";\nimport { buttonVariants, cn } from \"../../lib/variants\";\n\nexport type ButtonVariant =\n | \"outline\"\n | \"save\"\n | \"delete\"\n | \"reset\"\n | \"search\"\n | \"file\"\n | \"carousel\"\n | \"accent\"\n | \"ghost\"\n | \"link\"\n | \"metal\";\n\nexport type ButtonSize = \"default\" | \"sm\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\" | \"link\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n tooltip?: ReactNode;\n tooltipPosition?: \"top\" | \"bottom\";\n tooltipClassName?: string;\n tooltipContentClassName?: string;\n}\n\nexport default function Button(props: ButtonProps) {\n const {\n ref,\n asChild = false,\n variant = \"outline\",\n size = \"default\",\n type = \"button\",\n className,\n tooltip,\n tooltipPosition = \"bottom\",\n tooltipClassName,\n tooltipContentClassName,\n disabled,\n ...rest\n } = props;\n\n const Comp = asChild ? Slot : \"button\";\n const mergedClassName = cn(buttonVariants({ variant, size }), className);\n const buttonElement = <Comp ref={ref} type={type} className={mergedClassName} disabled={disabled} {...rest} />;\n\n if (tooltip) {\n if (disabled) {\n return (\n <Tooltip\n content={tooltip}\n position={tooltipPosition}\n className={tooltipClassName}\n contentClassName={tooltipContentClassName}\n asChild={true}\n >\n <span className=\"inline-block\">{buttonElement}</span>\n </Tooltip>\n );\n }\n\n return (\n <Tooltip\n content={tooltip}\n position={tooltipPosition}\n className={tooltipClassName}\n contentClassName={tooltipContentClassName}\n asChild={true}\n >\n {buttonElement}\n </Tooltip>\n );\n }\n\n return buttonElement;\n}\n","export const DEFAULT_CHECKED_CLASS = \"border-0 bg-[#009fe3]\";\nexport const DEFAULT_UNCHECKED_CLASS = \"border-neutral-300 bg-white hover:border-[#009fe3]\";\nexport const DEFAULT_DISABLED_CHECKED_CLASS = \"border-0 bg-[#009fe3]/40\";\nexport const DEFAULT_DISABLED_UNCHECKED_CLASS = \"border-neutral-300 bg-black/10\";\nexport const DEFAULT_ICON_CLASS = \"text-white\";\n","import { useId } from \"react\";\nimport type { Ref } from \"react\";\n\nimport { Check, Minus } from \"lucide-react\";\n\nimport { cn } from \"../../lib/variants\";\nimport Tooltip, { type TooltipProps } from \"../Tooltip\";\nimport {\n DEFAULT_CHECKED_CLASS,\n DEFAULT_DISABLED_CHECKED_CLASS,\n DEFAULT_DISABLED_UNCHECKED_CLASS,\n DEFAULT_ICON_CLASS,\n DEFAULT_UNCHECKED_CLASS,\n} from \"./config/default\";\n\nexport interface CheckboxProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"defaultChecked\" | \"checked\"\n> {\n checked: boolean;\n label?: string;\n indeterminate?: boolean;\n ref?: Ref<HTMLDivElement>;\n onChange?: (checked: boolean) => void;\n tooltipConfig?: Pick<TooltipProps, \"content\" | \"position\">;\n wrapperClassName?: string;\n labelClassName?: string;\n iconClassName?: string;\n checkedClassName?: string;\n uncheckedClassName?: string;\n disabledCheckedClassName?: string;\n disabledUncheckedClassName?: string;\n}\n\nexport default function Checkbox(props: CheckboxProps) {\n const {\n onChange,\n checked,\n disabled,\n className,\n id,\n label,\n indeterminate = false,\n ref,\n tooltipConfig,\n wrapperClassName,\n labelClassName,\n iconClassName,\n checkedClassName = DEFAULT_CHECKED_CLASS,\n uncheckedClassName = DEFAULT_UNCHECKED_CLASS,\n disabledCheckedClassName = DEFAULT_DISABLED_CHECKED_CLASS,\n disabledUncheckedClassName = DEFAULT_DISABLED_UNCHECKED_CLASS,\n ...rest\n } = props;\n\n const generatedId = useId();\n const checkboxId = id ?? `checkbox-${generatedId}`;\n\n const isActive = checked || indeterminate;\n\n const handleToggle = () => {\n if (disabled) return;\n onChange?.(!checked);\n };\n\n const checkboxBox = (\n <div\n id={checkboxId}\n ref={ref}\n role=\"checkbox\"\n aria-checked={indeterminate ? \"mixed\" : checked}\n aria-disabled={disabled}\n className={cn(\n \"size-4 shrink-0 rounded-[3px] border flex items-center justify-center transition-colors\",\n disabled\n ? cn(\"cursor-not-allowed\", isActive ? disabledCheckedClassName : disabledUncheckedClassName)\n : cn(\"cursor-pointer\", isActive ? checkedClassName : uncheckedClassName),\n className,\n )}\n onClick={handleToggle}\n >\n {indeterminate && <Minus strokeWidth={3} className={cn(\"size-3\", DEFAULT_ICON_CLASS, iconClassName)} />}\n {!indeterminate && checked && (\n <Check strokeWidth={3} className={cn(\"size-3\", DEFAULT_ICON_CLASS, iconClassName)} />\n )}\n </div>\n );\n\n const checkboxBoxWithTooltip =\n tooltipConfig && disabled ? (\n <Tooltip {...tooltipConfig}>\n <span className=\"inline-flex\">{checkboxBox}</span>\n </Tooltip>\n ) : (\n checkboxBox\n );\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-1.5\", wrapperClassName)}\n onClick={(e) => e.stopPropagation()}\n {...rest}\n >\n {checkboxBoxWithTooltip}\n {label && label.length > 0 && (\n <label\n htmlFor={checkboxId}\n className={cn(\n \"text-sm select-none\",\n disabled ? \"cursor-not-allowed text-neutral-400\" : \"cursor-pointer\",\n labelClassName,\n )}\n onClick={handleToggle}\n >\n {label}\n </label>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input border-gray-300 flex h-8 w-full min-w-0 rounded-sm border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[1px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","import {\n useId,\n useState,\n type ChangeEventHandler,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport { Eye, EyeOff } from \"lucide-react\";\n\nimport { Input as InputPrimitive } from \"./ui/input\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n placeholder?: string;\n disabled?: boolean;\n status?: \"default\" | \"success\" | \"error\";\n message?: string;\n label?: string;\n bare?: boolean;\n type?: \"text\" | \"number\" | \"date\" | \"password\" | \"email\" | \"money\";\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n showPasswordToggle?: boolean;\n}\n\nexport default function Input(props: InputProps) {\n const {\n ref,\n className,\n placeholder,\n disabled,\n status = \"default\",\n message,\n label,\n bare = false,\n type = \"text\",\n id,\n leftIcon,\n rightIcon,\n showPasswordToggle = true,\n onChange,\n ...rest\n } = props;\n\n const randomId = useId();\n const inputId = id || `input-${randomId}`;\n const [showPassword, setShowPassword] = useState(false);\n\n const getStatusStyles = () => {\n switch (status) {\n case \"success\":\n return \"border-green-500 focus-visible:ring-green-500\";\n case \"error\":\n return \"border-red-600 focus-visible:ring-red-600\";\n default:\n return \"\";\n }\n };\n\n const getMessageStyles = () => {\n switch (status) {\n case \"success\":\n return \"text-green-600\";\n case \"error\":\n return \"text-red-500\";\n default:\n return \"text-muted-foreground\";\n }\n };\n\n const shouldShowPasswordToggle = type === \"password\" && showPasswordToggle;\n const actualType = type === \"password\" && showPassword ? \"text\" : type;\n\n const handlePasswordToggle = () => setShowPassword((prev) => !prev);\n\n const finalRightIcon =\n rightIcon ||\n (shouldShowPasswordToggle ? (\n <button\n type=\"button\"\n onClick={handlePasswordToggle}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer transition-colors\"\n disabled={disabled}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n ) : null);\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n const { value } = event.target;\n\n if (type === \"number\" || type === \"money\") {\n let sanitized = value.replace(/[^0-9.]/g, \"\");\n\n const parts = sanitized.split(\".\");\n if (parts.length > 2) {\n sanitized = parts[0] + \".\" + parts.slice(1).join(\"\");\n }\n\n if (type === \"money\") {\n const digitsOnly = sanitized.replace(/\\D/g, \"\");\n if (digitsOnly.length === 0) {\n event.target.value = \"\";\n } else {\n const withCommas = digitsOnly.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n event.target.value = withCommas;\n }\n } else {\n event.target.value = sanitized;\n }\n }\n\n if (onChange) {\n onChange(event);\n }\n };\n\n const inputBlock = (\n <div className=\"relative m-0\">\n {leftIcon && (\n <div className=\"text-muted-foreground absolute top-1/2 left-3 -translate-y-1/2 transform\">\n {leftIcon}\n </div>\n )}\n <InputPrimitive\n id={inputId}\n type={actualType === \"money\" || actualType === \"number\" ? \"text\" : actualType}\n className={cn(\"w-full\", leftIcon && \"pl-10\", finalRightIcon && \"pr-10\", getStatusStyles(), className)}\n placeholder={placeholder}\n disabled={disabled}\n ref={ref}\n onChange={handleChange}\n {...rest}\n />\n {finalRightIcon && (\n <div className=\"text-muted-foreground absolute top-1/2 right-3 flex -translate-y-1/2 transform\">\n {finalRightIcon}\n </div>\n )}\n </div>\n );\n\n if (bare) {\n return inputBlock;\n }\n\n return (\n <div className=\"w-full space-y-2\">\n {label && <p className=\"text-foreground text-sm font-medium\">{label}</p>}\n {inputBlock}\n {message && <p className={cn(\"mt-1 text-[12px]\", getMessageStyles())}>{message}</p>}\n </div>\n );\n}\n","import { useId, type Ref, type TextareaHTMLAttributes } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n ref?: Ref<HTMLTextAreaElement>;\n status?: \"default\" | \"success\" | \"error\";\n message?: string;\n label?: string;\n bare?: boolean;\n}\n\nexport default function Textarea(props: TextareaProps) {\n const {\n ref,\n className,\n placeholder,\n disabled,\n readOnly,\n status = \"default\",\n message,\n label,\n bare = false,\n id,\n rows = 4,\n ...rest\n } = props;\n\n const randomId = useId();\n const textareaId = id || `textarea-${randomId}`;\n\n const getStatusStyles = () => {\n switch (status) {\n case \"success\":\n return \"border-green-500 focus-visible:ring-green-500\";\n case \"error\":\n return \"border-red-600 focus:border-main focus-visible:border-main focus-visible:ring-main/30\";\n default:\n return \"\";\n }\n };\n\n const getMessageStyles = () => {\n switch (status) {\n case \"success\":\n return \"text-green-600\";\n case \"error\":\n return \"text-red-500\";\n default:\n return \"text-muted-foreground\";\n }\n };\n\n const textareaEl = (\n <textarea\n id={textareaId}\n ref={ref}\n rows={rows}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n className={cn(\n \"placeholder:text-muted-foreground custom-view-scrollbar border-input flex w-full min-w-0 resize-y rounded-md border border-gray-300 bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[1px]\",\n \"aria-invalid:ring-destructive/20 aria-invalid:border-destructive\",\n getStatusStyles(),\n className,\n )}\n {...rest}\n />\n );\n\n if (bare) {\n return textareaEl;\n }\n\n return (\n <div className=\"w-full space-y-2\">\n {label ? <p className=\"text-foreground text-sm font-medium\">{label}</p> : null}\n {textareaEl}\n {message ? <p className={cn(\"mt-1 text-[12px]\", getMessageStyles())}>{message}</p> : null}\n </div>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type SwitchTrackSize = {\n width: string | number;\n height: string | number;\n dotSize: string | number;\n};\n\nexport type SwitchTrackSizeInput = Partial<SwitchTrackSize>;\n\nexport const switchTrackSizes = {\n sm: { width: \"1.75rem\", height: \"1rem\", dotSize: \"0.75rem\" },\n md: { width: \"2rem\", height: \"1.15rem\", dotSize: \"1rem\" },\n lg: { width: \"2.75rem\", height: \"1.5rem\", dotSize: \"1.25rem\" },\n} as const satisfies Record<string, SwitchTrackSizeInput>;\n\nconst DEFAULT_TRACK_SIZE: SwitchTrackSize = switchTrackSizes.md;\n\nconst toCssSize = (value: string | number) => (typeof value === \"number\" ? `${value}px` : value);\n\nexport function resolveTrackSizeStyle(trackSize?: SwitchTrackSizeInput): CSSProperties {\n const resolved = { ...DEFAULT_TRACK_SIZE, ...trackSize };\n\n return {\n \"--switch-width\": toCssSize(resolved.width),\n \"--switch-height\": toCssSize(resolved.height),\n \"--switch-thumb-size\": toCssSize(resolved.dotSize),\n } as CSSProperties;\n}\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"../../../lib/variants\";\nimport { resolveTrackSizeStyle, type SwitchTrackSizeInput } from \"../config/switchTypes\";\n\ninterface BaseSwitchProps extends React.ComponentProps<typeof SwitchPrimitive.Root> {\n activeColor?: string;\n dotColor?: string;\n trackSize?: SwitchTrackSizeInput;\n}\n\nfunction BaseSwitch({\n className,\n activeColor = \"rgb(38, 117, 226)\",\n dotColor = \"rgb(255 255 255)\",\n trackSize,\n style,\n ...props\n}: BaseSwitchProps) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex h-(--switch-height) w-(--switch-width) shrink-0 items-center rounded-full border border-gray-200 bg-gray-300 shadow-xs outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 data-[state=checked]:bg-(--switch-active-bg) disabled:cursor-not-allowed disabled:opacity-50 dark:data-[state=unchecked]:bg-input/80\",\n !props.disabled && \"cursor-pointer\",\n className,\n )}\n style={\n {\n ...resolveTrackSizeStyle(trackSize),\n \"--switch-active-bg\": activeColor,\n ...style,\n } as React.CSSProperties\n }\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block size-(--switch-thumb-size) rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(var(--switch-width)-var(--switch-thumb-size)-2px)] data-[state=unchecked]:translate-x-0\",\n )}\n style={{ backgroundColor: dotColor }}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { BaseSwitch };\nexport type { BaseSwitchProps };\n","import { useId, type ComponentProps } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport { BaseSwitch } from \"./ui/BaseSwitch\";\nimport type { SwitchTrackSizeInput } from \"./config/switchTypes\";\n\nexport type { SwitchTrackSizeInput } from \"./config/switchTypes\";\nexport { switchTrackSizes } from \"./config/switchTypes\";\n\nexport interface SwitchProps extends ComponentProps<typeof BaseSwitch> {\n label?: string;\n labelClassName?: string;\n contentClassName?: string;\n activeColor?: string;\n dotColor?: string;\n trackSize?: SwitchTrackSizeInput;\n}\n\nexport default function Switch(props: SwitchProps) {\n const generatedId = useId();\n\n const {\n id,\n label,\n labelClassName,\n contentClassName,\n className,\n disabled = false,\n activeColor,\n dotColor,\n trackSize,\n ...switchProps\n } = props;\n const switchId = id ?? generatedId;\n\n return (\n <div className={cn(\"flex items-center space-x-2\", contentClassName)}>\n <BaseSwitch\n id={switchId}\n disabled={disabled}\n activeColor={activeColor}\n dotColor={dotColor}\n trackSize={trackSize}\n className={className}\n {...switchProps}\n />\n {label && (\n <label\n htmlFor={switchId}\n className={`${disabled ? \"cursor-default\" : \"cursor-pointer\"} ${labelClassName ?? \"\"}`}\n >\n {label}\n </label>\n )}\n </div>\n );\n}\n","import * as RadixSlider from \"@radix-ui/react-slider\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport interface SliderProps {\n value?: Array<number>;\n defaultValue?: Array<number>;\n onValueChange?: (value: Array<number>) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n trackClassName?: string;\n rangeClassName?: string;\n thumbClassName?: string;\n ariaLabel?: string;\n name?: string;\n}\n\nexport default function Slider(props: SliderProps) {\n const {\n value,\n defaultValue = [50],\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n orientation = \"horizontal\",\n className,\n trackClassName,\n rangeClassName,\n thumbClassName,\n ariaLabel = \"Volume\",\n name,\n } = props;\n\n return (\n <RadixSlider.Root\n className={cn(\n \"relative flex h-5 w-full touch-none select-none items-center\",\n orientation === \"vertical\" && \"h-full w-5 flex-col\",\n className,\n )}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n orientation={orientation}\n name={name}\n >\n <RadixSlider.Track\n className={cn(\n \"relative h-[3px] grow rounded-full bg-blackA7\",\n orientation === \"vertical\" && \"w-[3px] h-full\",\n trackClassName,\n )}\n >\n <RadixSlider.Range\n className={cn(\n \"absolute h-full rounded-full bg-white\",\n orientation === \"vertical\" && \"w-full\",\n rangeClassName,\n )}\n />\n </RadixSlider.Track>\n <RadixSlider.Thumb\n className={cn(\n \"block size-5 rounded-[10px] bg-white shadow-[0_2px_10px] shadow-blackA4 hover:bg-violet3 focus:shadow-[0_0_0_5px] focus:shadow-blackA5 focus:outline-none\",\n disabled && \"cursor-not-allowed opacity-50\",\n thumbClassName,\n )}\n aria-label={ariaLabel}\n />\n </RadixSlider.Root>\n );\n}\n","import type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport type SkeletonProps = ComponentProps<\"div\">;\n\nexport default function Skeleton(props: SkeletonProps) {\n const { className, ...rest } = props;\n\n return (\n <div\n data-slot=\"skeleton\"\n aria-hidden\n className={cn(\"animate-pulse rounded-md bg-neutral-200/80\", className)}\n {...rest}\n />\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\n\ninterface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n height?: string | number;\n maxHeight?: string | number;\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n}\n\nconst ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ children, height, maxHeight, orientation = \"vertical\", className, style, ...props }, ref) => {\n const overflowStyle: CSSProperties = {\n overflowY: orientation === \"horizontal\" ? \"hidden\" : \"auto\",\n overflowX: orientation === \"vertical\" ? \"hidden\" : \"auto\",\n height,\n maxHeight,\n };\n\n return (\n <div\n ref={ref}\n className={`custom-view-scrollbar${className ? ` ${className}` : \"\"}`}\n style={{ ...overflowStyle, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nScrollArea.displayName = \"ScrollArea\";\n\nexport default ScrollArea;\n","import * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { ChevronDown, ChevronUp, CircleX } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n value = \"\",\n resetValue,\n canReset = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\";\n value?: string;\n canReset?: boolean;\n resetValue: () => void;\n}) {\n return (\n <div className=\"relative m-0 w-full min-w-0\">\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input cursor-pointer data-placeholder:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-full items-center justify-between gap-2 rounded-sm border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-gray-100 data-[size=default]:h-8 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"inline-block text-left w-full mr-3 ellipsis-1-line\">{children}</span>\n </SelectPrimitive.Trigger>\n <SelectPrimitive.Icon asChild className=\"absolute top-1/2 right-1.5 translate-y-[-50%]\">\n {value && canReset ? (\n <CircleX\n className=\"pl-0.5 size-4 opacity-60 cursor-pointer hover:stroke-main\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n resetValue();\n }}\n />\n ) : (\n <ChevronDown size={14} className=\"opacity-50 pointer-events-none \" />\n )}\n </SelectPrimitive.Icon>\n </div>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n disableScrollButtonEvents = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & {\n disableScrollButtonEvents?: boolean;\n}) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-100 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton className={disableScrollButtonEvents ? \"pointer-events-none\" : \"\"} />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton className={disableScrollButtonEvents ? \"pointer-events-none\" : \"\"} />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n `focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground \n relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden \n select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none\n [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center\n *:[span]:last:gap-2 data-[state=checked]:bg-blue-100 data-[state=checked]:text-blue-900\n *:data-[slot=item-text]:flex-1 *:data-[slot=item-text]:min-w-0`,\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText data-slot=\"item-text\">{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronUp size={14} />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronDown size={14} />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","export const SELECT_BORDER_COLORS = {\n default: \"border-gray-300\",\n open: \"border-blue-600\",\n} as const;\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport {\n Select as SelectPrimitive,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { SELECT_BORDER_COLORS } from \"./config/default\";\nimport type { SelectOptionType } from \"./config/type\";\n\nexport type { SelectOptionType } from \"./config/type\";\nexport {\n Select as SelectBase,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\n\nexport interface SelectProps<T extends SelectOptionType = SelectOptionType> extends Omit<\n React.ComponentProps<typeof SelectPrimitive>,\n \"onValueChange\" | \"value\" | \"defaultValue\"\n> {\n value: string;\n onChange: (value: string) => void;\n containerClassName?: string;\n options: Array<T>;\n placeholder?: string;\n triggerClassName?: string;\n contentClassName?: string;\n itemClassName?: string;\n disabledItemClassName?: string;\n label?: ReactNode | string;\n labelClassName?: string;\n disabled?: boolean;\n className?: string;\n hasError?: boolean;\n canReset?: boolean;\n disableScrollButtonEvents?: boolean;\n onReset?: () => void;\n}\n\nexport default function Select<T extends SelectOptionType = SelectOptionType>(props: SelectProps<T>) {\n const {\n containerClassName,\n options,\n placeholder = \"선택해 주세요\",\n triggerClassName,\n contentClassName,\n itemClassName,\n disabledItemClassName,\n label,\n labelClassName,\n disabled,\n className,\n hasError = false,\n value,\n canReset = false,\n disableScrollButtonEvents = false,\n onChange,\n onReset,\n onOpenChange,\n ...rest\n } = props;\n\n const [isSelectOptionOpen, setIsSelectOptionOpen] = useState(false);\n\n const handleSelectOptionOpenChange = (open: boolean) => {\n setIsSelectOptionOpen(open);\n onOpenChange?.(open);\n };\n\n const borderClass = hasError\n ? \"border-red-600\"\n : isSelectOptionOpen\n ? SELECT_BORDER_COLORS.open\n : SELECT_BORDER_COLORS.default;\n\n const resetValue = () => {\n onChange(\"\");\n onReset?.();\n };\n\n return (\n <div className={cn(\"space-y-0.5\", containerClassName ?? \"w-30\")}>\n {label && (\n <label\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 select-none\",\n labelClassName,\n )}\n >\n {label}\n </label>\n )}\n <SelectPrimitive\n value={value}\n disabled={disabled}\n onValueChange={onChange}\n onOpenChange={handleSelectOptionOpenChange}\n {...rest}\n >\n <SelectTrigger\n className={cn(\n \"w-full h-8 px-2 py-1 select-none border rounded-0.5 bg-white text-gray-900 focus:outline-none transition-colors\",\n triggerClassName,\n borderClass,\n className,\n )}\n value={value}\n resetValue={resetValue}\n canReset={canReset}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent\n className={cn(\n \"bg-white border border-gray-300 rounded-sm shadow-lg py-1 mt-0.25 w-full min-w-0 max-h-120\",\n contentClassName,\n )}\n disableScrollButtonEvents={disableScrollButtonEvents}\n >\n <SelectGroup>\n {options.map((option) => (\n <SelectItem\n key={String(option.value)}\n value={String(option.value)}\n disabled={option.disabled ?? false}\n className={cn(\n \"px-1 py-1.5 text-sm text-gray-900 cursor-pointer hover:bg-blue-50 focus:bg-neutral-100 rounded transition w-full\",\n itemClassName,\n option.disabled && cn(\"opacity-50 cursor-not-allowed text-gray-300 bg-white\", disabledItemClassName),\n )}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </SelectPrimitive>\n </div>\n );\n}\n","import type { ComponentProps, ReactNode } from \"react\";\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\n\nimport { Select as SelectBase, SelectLabel } from \"../Select/ui/select\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface SelectGroupProps extends ComponentProps<typeof SelectPrimitive.Root> {\n children: ReactNode;\n className?: string;\n label?: string;\n labelClassName?: string;\n}\n\nexport default function SelectGroup(props: SelectGroupProps) {\n const { children, label, labelClassName, ...rest } = props;\n\n return (\n <div className=\"space-y-0.5\">\n {label && (\n <SelectLabel className={cn(\"text-sm font-medium leading-none\", labelClassName)}>{label}</SelectLabel>\n )}\n <SelectBase {...rest}>{children}</SelectBase>\n </div>\n );\n}\n","export const DEFAULT_CHECK_COLOR = \"#009FE3\";\nexport const DEFAULT_UNCHECK_COLOR = \"#C6CCCE\";\n","import { cn } from \"../../lib/variants\";\nimport type { CSSProperties, ReactNode } from \"react\";\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { CircleIcon } from \"lucide-react\";\n\nimport { DEFAULT_CHECK_COLOR, DEFAULT_UNCHECK_COLOR } from \"./config/default\";\nimport type { RadioOptionType } from \"./config/type\";\nimport Tooltip from \"../Tooltip/index\";\n\nexport type { RadioOptionType } from \"./config/type\";\n\nexport interface RadioProps<T extends string = string> {\n name: string;\n value: T;\n label: ReactNode;\n checked?: boolean;\n onChange?: (value: T) => void;\n disabled?: boolean;\n disabledMessage?: string;\n checkColor?: string;\n unCheckColor?: string;\n labelClassName?: string;\n indicatorClassName?: string;\n wrapperClassName?: string;\n}\n\nexport function Radio<T extends string = string>(props: RadioProps<T>) {\n const {\n name,\n value,\n label,\n checked,\n onChange,\n disabled = false,\n disabledMessage,\n checkColor = DEFAULT_CHECK_COLOR,\n unCheckColor = DEFAULT_UNCHECK_COLOR,\n labelClassName,\n indicatorClassName,\n wrapperClassName,\n } = props;\n\n const inputId = `${name}-${value}`;\n\n const colorVars = {\n \"--radio-checked\": checkColor,\n \"--radio-unchecked\": unCheckColor,\n } as CSSProperties;\n\n const control = (\n <div className={cn(\"flex items-center gap-1.5\", wrapperClassName)} style={colorVars}>\n <RadioGroupPrimitive.Item\n value={value}\n disabled={disabled}\n id={inputId}\n className={cn(\n \"group relative size-4 shrink-0 rounded-full border box-border transition-colors duration-200 outline-none\",\n \"border-(--radio-unchecked) data-[state=checked]:border-(--radio-checked)\",\n \"data-[state=unchecked]:hover:opacity-80\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n )}\n >\n <RadioGroupPrimitive.Indicator className=\"relative flex items-center justify-center\">\n <CircleIcon\n className={cn(\n \"absolute top-1/2 left-1/2 size-2.5 -translate-x-1/2 -translate-y-1/2 fill-(--radio-checked) text-(--radio-checked) transition-opacity duration-200\",\n indicatorClassName,\n )}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n <label\n htmlFor={inputId}\n className={cn(\n \"text-sm font-medium cursor-pointer text-black select-none\",\n disabled && \"cursor-not-allowed text-gray-400 opacity-50\",\n labelClassName,\n )}\n >\n {label}\n </label>\n </div>\n );\n\n const withTooltip = (node: ReactNode) => {\n if (!disabled || !disabledMessage) return node;\n return (\n <Tooltip content={disabledMessage} position=\"bottom\" asChild sideOffset={4}>\n <span className=\"inline-flex\">{node}</span>\n </Tooltip>\n );\n };\n\n if (onChange !== undefined && checked !== undefined) {\n return withTooltip(\n <RadioGroupPrimitive.Root\n name={name}\n value={checked ? value : \"\"}\n onValueChange={(newValue) => {\n if (newValue === value) {\n onChange(value);\n }\n }}\n disabled={disabled}\n >\n {control}\n </RadioGroupPrimitive.Root>,\n );\n }\n\n return withTooltip(control);\n}\n\nexport interface RadioGroupProps<T extends string = string> {\n name: string;\n value: T;\n onChange: (value: T) => void;\n options: Array<RadioOptionType<T>>;\n direction?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n checkColor?: string;\n unCheckColor?: string;\n containerClassName?: string;\n labelClassName?: string;\n indicatorClassName?: string;\n wrapperClassName?: string;\n}\n\nexport function RadioGroup<T extends string = string>(props: RadioGroupProps<T>) {\n const {\n name,\n value,\n onChange,\n options,\n direction = \"horizontal\",\n disabled = false,\n checkColor = \"#009FE3\",\n unCheckColor = \"#C6CCCE\",\n containerClassName,\n labelClassName,\n indicatorClassName,\n wrapperClassName,\n } = props;\n\n return (\n <RadioGroupPrimitive.Root\n name={name}\n value={value}\n onValueChange={(newValue) => onChange(newValue as T)}\n disabled={disabled}\n className={cn(\n \"flex flex-wrap gap-3\",\n direction === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n containerClassName,\n )}\n >\n {options.map((option) => (\n <Radio\n key={option.value}\n name={name}\n value={option.value}\n label={option.label}\n disabled={disabled || option.disabled}\n disabledMessage={option.disabled ? option.disabledMessage : undefined}\n checkColor={checkColor}\n unCheckColor={unCheckColor}\n labelClassName={labelClassName}\n indicatorClassName={indicatorClassName}\n wrapperClassName={wrapperClassName}\n />\n ))}\n </RadioGroupPrimitive.Root>\n );\n}\n\nexport default RadioGroup;\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"../../../lib/variants\";\n\ntype PopoverContentPrimitiveProps = React.ComponentProps<typeof PopoverPrimitive.Content>;\n\nexport type PopoverAlign = NonNullable<PopoverContentPrimitiveProps[\"align\"]>;\nexport type PopoverPosition = NonNullable<PopoverContentPrimitiveProps[\"side\"]>;\n\nexport type PopoverContentProps = Omit<PopoverContentPrimitiveProps, \"side\"> & {\n position?: PopoverPosition;\n};\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nfunction PopoverContent({\n className,\n align = \"center\",\n position = \"bottom\",\n sideOffset = 4,\n ...props\n}: PopoverContentProps) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n side={position}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border border-neutral-200 bg-white p-4 text-neutral-950 shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div data-slot=\"popover-header\" className={cn(\"mb-3 space-y-1.5\", className)} {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n data-slot=\"popover-title\"\n className={cn(\"text-base font-semibold leading-none text-neutral-950\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p data-slot=\"popover-description\" className={cn(\"text-sm text-neutral-600\", className)} {...props} />\n );\n}\n\nfunction PopoverFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"popover-footer\"\n className={cn(\"mt-4 flex items-center justify-end gap-2 [&_button]:w-auto [&_button]:shrink-0\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverClose({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Close>) {\n return (\n <PopoverPrimitive.Close\n data-slot=\"popover-close\"\n className={cn(\n \"absolute right-3 top-3 rounded-sm p-1 text-neutral-500 opacity-70 transition-colors\",\n \"outline-none hover:bg-neutral-100 hover:text-neutral-700 hover:opacity-100\",\n \"focus:outline-none focus:ring-0\",\n \"focus-visible:ring-2 focus-visible:ring-neutral-300 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverAnchor,\n PopoverContent,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n PopoverFooter,\n PopoverClose,\n};\n","import type { ReactNode } from \"react\";\n\nimport {\n Popover as PopoverRoot,\n PopoverTrigger,\n PopoverContent,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n} from \"./ui/popover\";\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverAnchor,\n PopoverContent,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n PopoverFooter,\n PopoverClose,\n Popover as default,\n} from \"./ui/popover\";\n\nexport type { PopoverContentProps, PopoverAlign, PopoverPosition } from \"./ui/popover\";\n\nexport interface SimplePopoverProps {\n trigger: ReactNode;\n title?: string;\n description?: string;\n children?: ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n position?: \"top\" | \"right\" | \"bottom\" | \"left\";\n className?: string;\n contentClassName?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function SimplePopover(props: SimplePopoverProps) {\n const {\n trigger,\n title,\n description,\n children,\n align = \"center\",\n position = \"bottom\",\n className,\n contentClassName,\n open,\n onOpenChange,\n } = props;\n\n return (\n <PopoverRoot open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n <PopoverContent align={align} position={position} className={contentClassName}>\n {(title || description) && (\n <PopoverHeader className={className}>\n {title && <PopoverTitle>{title}</PopoverTitle>}\n {description && <PopoverDescription>{description}</PopoverDescription>}\n </PopoverHeader>\n )}\n {children}\n </PopoverContent>\n </PopoverRoot>\n );\n}\n","import { cn } from \"../../lib/variants\";\n\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type SpinnerColor = \"blue\" | \"purple\" | \"green\" | \"red\";\n\nexport interface SpinnerProps {\n className?: string;\n size?: SpinnerSize;\n color?: SpinnerColor;\n ariaLabel?: string;\n}\n\nconst SIZE_CLASSES: Record<SpinnerSize, string> = {\n sm: \"w-4 h-4\",\n md: \"w-8 h-8\",\n lg: \"w-12 h-12\",\n xl: \"w-16 h-16\",\n};\n\nconst SIZE_PX: Record<SpinnerSize, number> = {\n sm: 16,\n md: 32,\n lg: 48,\n xl: 64,\n};\n\nconst RING_INSET_PX: Record<SpinnerSize, number> = {\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n};\n\nconst RING_INNER_RADIUS_PX: Record<SpinnerSize, number> = {\n sm: SIZE_PX.sm / 2 - RING_INSET_PX.sm,\n md: SIZE_PX.md / 2 - RING_INSET_PX.md,\n lg: SIZE_PX.lg / 2 - RING_INSET_PX.lg,\n xl: SIZE_PX.xl / 2 - RING_INSET_PX.xl,\n};\n\nconst COLOR_HEX: Record<SpinnerColor, string> = {\n blue: \"#3b82f6\",\n purple: \"#a855f7\",\n green: \"#22c55e\",\n red: \"#ef4444\",\n};\n\nexport default function Spinner(props: SpinnerProps) {\n const { className, size = \"md\", color = \"blue\", ariaLabel = \"로딩 중\" } = props;\n const hex = COLOR_HEX[color];\n const innerRadius = RING_INNER_RADIUS_PX[size];\n const maskValue = `radial-gradient(circle, transparent ${innerRadius}px, #000 ${innerRadius}px)`;\n\n return (\n <div\n role=\"status\"\n aria-label={ariaLabel}\n className={cn(\"rounded-full animate-spin\", SIZE_CLASSES[size], className)}\n style={{\n background: `conic-gradient(transparent, ${hex})`,\n mask: maskValue,\n WebkitMask: maskValue,\n }}\n />\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Z_INDEX } from \"../../config/zIndex\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface LoadingOverlayProps {\n isVisible: boolean;\n children: ReactNode;\n fullScreen?: boolean;\n blur?: boolean;\n opacity?: number;\n backdropColor?: \"white\" | \"black\";\n zIndex?: number;\n}\n\nexport default function LoadingOverlay(props: LoadingOverlayProps) {\n const {\n isVisible,\n children,\n fullScreen = false,\n blur = false,\n opacity = 70,\n backdropColor = \"white\",\n zIndex = Z_INDEX.LOADING_OVERLAY_DEFAULT,\n } = props;\n\n if (!isVisible) return null;\n\n const bgRgb = backdropColor === \"white\" ? \"255,255,255\" : \"0,0,0\";\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center\",\n fullScreen ? \"fixed inset-0\" : \"absolute inset-0\",\n blur && \"backdrop-blur-sm\",\n )}\n style={{ backgroundColor: `rgba(${bgRgb},${opacity / 100})`, zIndex }}\n >\n {children}\n </div>\n );\n}\n","import { cn, textVariants } from \"../../lib/variants\";\nimport Spinner, { type SpinnerColor, type SpinnerSize } from \"../Spinner\";\nimport LoadingOverlay, { type LoadingOverlayProps } from \"../LoadingOverlay\";\n\nexport type LoadingSize = SpinnerSize;\nexport type LoadingColor = SpinnerColor;\nexport type LoadingTextSize = \"xs\" | \"sm\" | \"md\";\nexport type LoadingOverlayConfig = Omit<LoadingOverlayProps, \"children\">;\n\nexport interface LoadingProps {\n size?: LoadingSize;\n color?: LoadingColor;\n label?: string;\n className?: string;\n ariaLabel?: string;\n overlayConfig?: LoadingOverlayConfig;\n}\n\nconst TEXT_SIZE_BY_LOADING_SIZE: Record<LoadingSize, LoadingTextSize> = {\n sm: \"xs\",\n md: \"xs\",\n lg: \"sm\",\n xl: \"md\",\n};\n\nexport default function Loading(props: LoadingProps) {\n const { size = \"md\", color = \"blue\", label, className, ariaLabel, overlayConfig } = props;\n\n if (overlayConfig !== undefined) {\n const { isVisible, fullScreen, blur, opacity, backdropColor = \"white\", zIndex } = overlayConfig;\n\n return (\n <LoadingOverlay\n isVisible={isVisible}\n fullScreen={fullScreen}\n blur={blur}\n opacity={opacity}\n backdropColor={backdropColor}\n zIndex={zIndex}\n >\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size={size} color={color} ariaLabel={ariaLabel} />\n {label && (\n <p\n className={cn(\n backdropColor === \"black\"\n ? textVariants({ size: TEXT_SIZE_BY_LOADING_SIZE[size], color: \"white\" })\n : textVariants({ size: TEXT_SIZE_BY_LOADING_SIZE[size], variant: \"muted\" }),\n )}\n >\n {label}\n </p>\n )}\n </div>\n </LoadingOverlay>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col items-center gap-2\", className)}>\n <Spinner size={size} color={color} ariaLabel={ariaLabel} />\n {label && (\n <p className={cn(textVariants({ size: TEXT_SIZE_BY_LOADING_SIZE[size], variant: \"muted\" }))}>\n {label}\n </p>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport { ChevronLeft, ChevronRight, ChevronLast, ChevronFirst } from \"lucide-react\";\n\nimport { cn } from \"../../lib/variants\";\n\nconst MAX_VISIBLE_PAGES = 10;\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange?: (page: number) => void;\n showTotalCount?: boolean;\n}\n\nfunction getVisiblePageRange(currentPage: number, totalPages: number) {\n if (totalPages <= MAX_VISIBLE_PAGES) {\n return { start: 0, end: totalPages - 1 };\n }\n\n let start = currentPage - Math.floor(MAX_VISIBLE_PAGES / 2);\n let end = start + MAX_VISIBLE_PAGES - 1;\n\n if (start < 0) {\n start = 0;\n end = MAX_VISIBLE_PAGES - 1;\n } else if (end >= totalPages) {\n end = totalPages - 1;\n start = end - MAX_VISIBLE_PAGES + 1;\n }\n\n return { start, end };\n}\n\nexport default function Pagination(props: PaginationProps) {\n const { page = 0, totalPages = 50, onPageChange } = props;\n\n const [displayPage, setDisplayPage] = useState(page);\n\n useEffect(() => {\n setDisplayPage(page);\n }, [page]);\n\n const handlePageChange = useCallback(\n (newPage: number) => {\n setDisplayPage(newPage);\n onPageChange?.(newPage);\n },\n [onPageChange],\n );\n\n const pageButtons = useMemo(() => {\n const { start, end } = getVisiblePageRange(displayPage, totalPages);\n const buttons = [];\n\n for (let pageIndex = start; pageIndex <= end; pageIndex++) {\n const displayPageNumber = pageIndex + 1;\n const isActive = displayPage === pageIndex;\n\n buttons.push(\n <button\n key={`page-${pageIndex}`}\n type=\"button\"\n className={cn(\n \"min-w-7 min-h-7 rounded-[4px] text-[14px] px-[5px] font-medium cursor-pointer\",\n isActive\n ? \"bg-[#2675e2] text-white font-bold\"\n : \"bg-white text-[#000000] font-normal hover:bg-gray-50\",\n )}\n onClick={() => handlePageChange(pageIndex)}\n >\n {displayPageNumber}\n </button>,\n );\n }\n\n return buttons;\n }, [displayPage, totalPages, handlePageChange]);\n\n const isFirstDisabled = displayPage <= 0;\n const isPreviousDisabled = displayPage <= 0;\n const isNextDisabled = displayPage >= totalPages - 1;\n const isLastDisabled = displayPage >= totalPages - 1;\n\n const navButtonClass = (disabled: boolean) =>\n cn(\n \"w-7 h-7 rounded-[4px] bg-white flex items-center justify-center cursor-pointer\",\n disabled ? \"opacity-30 cursor-default\" : \"hover:bg-gray-50\",\n );\n\n const renderNavButton = (\n onClick: () => void,\n disabled: boolean,\n ariaLabel: string,\n children: ReactNode,\n ) => (\n <button\n type=\"button\"\n className={navButtonClass(disabled)}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n\n if (!totalPages || totalPages === 0) {\n return null;\n }\n\n return (\n <div className=\"flex flex-row items-center gap-1.5\">\n {renderNavButton(\n () => handlePageChange(0),\n isFirstDisabled,\n \"첫 페이지\",\n <ChevronFirst className=\"h-4.5 w-4.5 text-[#000000]\" strokeWidth={2} />,\n )}\n {renderNavButton(\n () => handlePageChange(displayPage - 1),\n isPreviousDisabled,\n \"이전 페이지\",\n <ChevronLeft className=\"w-4.5 h-4.5 text-[#000000]\" />,\n )}\n\n {pageButtons}\n\n {renderNavButton(\n () => handlePageChange(displayPage + 1),\n isNextDisabled,\n \"다음 페이지\",\n <ChevronRight className=\"w-4.5 h-4.5 text-[#000000]\" />,\n )}\n {renderNavButton(\n () => handlePageChange(totalPages - 1),\n isLastDisabled,\n \"마지막 페이지\",\n <ChevronLast className=\"h-4.5 w-4.5 text-[#000000]\" strokeWidth={2} />,\n )}\n </div>\n );\n}\n","import type {\n BreadCrumbItem,\n BreadCrumbHrefItem,\n BreadCrumbOnClickItem,\n BreadCrumbToItem,\n} from \"./type\";\n\nexport function isBreadCrumbToItem(item: BreadCrumbItem): item is BreadCrumbToItem {\n return \"to\" in item;\n}\n\nexport function isBreadCrumbHrefItem(item: BreadCrumbItem): item is BreadCrumbHrefItem {\n return \"href\" in item;\n}\n\nexport function isBreadCrumbOnClickItem(item: BreadCrumbItem): item is BreadCrumbOnClickItem {\n return \"onClick\" in item;\n}\n","import { Link } from \"react-router\";\n\nimport { cn } from \"../../../lib/variants\";\n\nimport {\n isBreadCrumbHrefItem,\n isBreadCrumbOnClickItem,\n isBreadCrumbToItem,\n} from \"../config/utils\";\nimport type { BreadCrumbItem } from \"../config/type\";\n\ninterface BreadCrumbLinkProps {\n item: BreadCrumbItem;\n className?: string;\n}\n\nexport default function BreadCrumbLink(props: BreadCrumbLinkProps) {\n const { item, className } = props;\n\n const linkClass = cn(\"text-[#666666] hover:text-[#333333] transition-colors\", className);\n\n // item 타입 to 일떄 Link 컴포넌트 반환\n if (isBreadCrumbToItem(item)) {\n return (\n <Link to={item.to} className={linkClass} onClick={item.onClick}>\n {item.label}\n </Link>\n );\n }\n\n // item 타입 href 일떄 a 컴포넌트 반환\n if (isBreadCrumbHrefItem(item)) {\n return (\n <a href={item.href} className={linkClass} onClick={item.onClick}>\n {item.label}\n </a>\n );\n }\n\n // item 타입 onClick 일떄 button 컴포넌트 반환\n if (isBreadCrumbOnClickItem(item)) {\n return (\n <button type=\"button\" className={cn(linkClass, \"cursor-pointer\")} onClick={item.onClick}>\n {item.label}\n </button>\n );\n }\n\n return <span className={linkClass}>{item.label}</span>;\n}\n","import type { ReactNode } from \"react\";\nimport type { BreadCrumbItem } from \"./config/type\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../lib/variants\";\nimport BreadCrumbLink from \"./ui/BreadCrumbLink\";\n\nexport interface BreadCrumbProps<T extends BreadCrumbItem = BreadCrumbItem> {\n items: Array<T>;\n separator?: ReactNode;\n className?: string;\n listClassName?: string;\n itemClassName?: string;\n linkClassName?: string;\n activeItemClassName?: string;\n separatorClassName?: string;\n}\n\nexport default function BreadCrumb<T extends BreadCrumbItem = BreadCrumbItem>(props: BreadCrumbProps<T>) {\n const {\n items,\n separator,\n className,\n listClassName,\n itemClassName,\n linkClassName,\n activeItemClassName,\n separatorClassName,\n } = props;\n\n if (!items.length) {\n return null;\n }\n\n const defaultSeparator = (\n <ChevronRight className={cn(\"size-4 shrink-0 text-[#999999]\", separatorClassName)} aria-hidden />\n );\n\n return (\n <nav aria-label=\"breadcrumb\" className={className}>\n <ol className={cn(\"flex flex-wrap items-center gap-1.5 text-sm\", listClassName)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li\n key={`${item.label}-${index}`}\n className={cn(\"inline-flex items-center gap-1.5\", itemClassName)}\n >\n {index > 0 && (separator ?? defaultSeparator)}\n {isLast ? (\n <span aria-current=\"page\" className={cn(\"font-medium text-[#333333]\", activeItemClassName)}>\n {item.label}\n </span>\n ) : (\n <BreadCrumbLink item={item} className={linkClassName} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import type {\n BreadCrumbItem,\n BreadCrumbMenuItem,\n BreadCrumbRoot,\n BuildBreadCrumbItemsParams,\n} from \"./type\";\n\n//\nfunction matchesPath(pathname: string, prefix: string) {\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n}\n\nfunction findRootKey(pathname: string, config: Record<string, BreadCrumbRoot>) {\n let best: { key: string; length: number } | undefined;\n\n for (const [key, root] of Object.entries(config)) {\n for (const prefix of [root.basePath, ...root.pathPrefixes]) {\n if (matchesPath(pathname, prefix) && (!best || prefix.length > best.length)) {\n best = { key, length: prefix.length };\n }\n }\n }\n\n return best?.key;\n}\n\nexport function findParentMenuItem(pathname: string, menuList: BreadCrumbMenuItem[]) {\n let parentItem: BreadCrumbMenuItem | undefined;\n\n const walk = (items: BreadCrumbMenuItem[]): boolean => {\n for (const item of items) {\n if (item.children?.length) {\n if (item.children.some((child) => child.path && matchesPath(pathname, child.path))) {\n parentItem = item;\n return true;\n }\n\n if (walk(item.children)) {\n return true;\n }\n\n continue;\n }\n\n if (item.path && matchesPath(pathname, item.path)) {\n return true;\n }\n }\n\n return false;\n };\n\n walk(menuList);\n return parentItem;\n}\n\nexport function findParentMenuName(pathname: string, menuList: BreadCrumbMenuItem[]) {\n return findParentMenuItem(pathname, menuList)?.label;\n}\n\nexport function buildBreadCrumbItems({\n pathname,\n title,\n rootConfig,\n rootKey,\n menuList,\n}: BuildBreadCrumbItemsParams): BreadCrumbItem[] {\n const items: BreadCrumbItem[] = [];\n\n const key = rootKey ?? (rootConfig ? findRootKey(pathname, rootConfig) : undefined);\n const root = key && rootConfig ? rootConfig[key] : undefined;\n\n if (root) {\n items.push({ label: root.displayName, to: root.basePath });\n }\n\n const parentMenu = menuList ? findParentMenuItem(pathname, menuList) : undefined;\n if (parentMenu) {\n if (parentMenu.path) {\n items.push({ label: parentMenu.label, to: parentMenu.path });\n } else {\n items.push({ label: parentMenu.label });\n }\n }\n\n items.push({ label: title });\n return items;\n}\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router\";\n\nimport { buildBreadCrumbItems } from \"../config/buildItems\";\nimport type { BuildBreadCrumbItemsParams } from \"../config/type\";\n\n// 현재 URL과 메뉴·루트 설정, 페이지 제목만으로 BreadCrumb에 넘길 items 배열을 자동 해주는 훅\nexport function useBreadCrumbItems(\n params: Omit<BuildBreadCrumbItemsParams, \"pathname\"> & { pathname?: string },\n) {\n const { pathname: currentPathname } = useLocation();\n const pathname = params.pathname ?? currentPathname;\n const { title, rootConfig, rootKey, menuList } = params;\n\n return useMemo(\n () => buildBreadCrumbItems({ pathname, title, rootConfig, rootKey, menuList }),\n [pathname, title, rootConfig, rootKey, menuList],\n );\n}\n","import { useRef, type ReactNode } from \"react\";\n\nexport type ToastPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type ToastType = \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\n\nexport interface ToastProps {\n toast: string;\n id?: string;\n type?: ToastType;\n position?: ToastPosition;\n duration?: number;\n showCloseButton?: boolean;\n className?: string;\n icon?: ReactNode;\n onClose?: () => void;\n onClick?: () => void;\n}\n\nexport interface ToastHookReturn {\n showToast: (props: ToastProps) => string;\n dismissToast: (toastId: string) => void;\n dismissAllToast: () => void;\n dismissAllExcept: (type: ToastType) => void;\n}\n\n// 토스트 아이템 인터페이스\nexport interface ToastItem {\n id: string;\n props: ToastProps;\n visible: boolean;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n// 전역 토스트 관리자\nexport class ToastManager {\n private static instance: ToastManager;\n private containers: Map<ToastPosition, (toasts: Array<ToastItem>) => void> = new Map();\n private toasts: Map<ToastPosition, Array<ToastItem>> = new Map();\n\n static getInstance(): ToastManager {\n if (!ToastManager.instance) {\n ToastManager.instance = new ToastManager();\n }\n return ToastManager.instance;\n }\n\n registerContainer(position: ToastPosition, setToasts: (toasts: Array<ToastItem>) => void) {\n this.containers.set(position, setToasts);\n // 기존 토스트가 있으면 즉시 표시\n const existingToasts = this.toasts.get(position) || [];\n if (existingToasts.length > 0) {\n setToasts([...existingToasts]);\n } else {\n setToasts([]);\n }\n }\n\n addToast(props: ToastProps): string {\n const position = props.position || \"top-center\";\n const duration = props.duration !== undefined ? props.duration : 1500;\n\n // id가 지정된 경우 모든 위치에서 동일 id의 기존 토스트 제거 (중복 방지)\n if (props.id) {\n for (const [pos, toasts] of this.toasts.entries()) {\n const existing = toasts.find((t) => t.id === props.id);\n if (existing) {\n if (existing.timer) clearTimeout(existing.timer);\n const updated = toasts.filter((t) => t.id !== props.id);\n this.toasts.set(pos, updated);\n const setToasts = this.containers.get(pos);\n if (setToasts) setToasts([...updated]);\n break;\n }\n }\n }\n\n // 같은 위치에 토스트가 이미 있으면 모두 삭제\n const positionToasts = this.toasts.get(position) || [];\n if (positionToasts.length > 0) {\n positionToasts.forEach((toast) => {\n if (toast.timer) clearTimeout(toast.timer);\n });\n this.toasts.set(position, []);\n const setToasts = this.containers.get(position);\n if (setToasts) setToasts([]);\n }\n\n const id = props.id ?? `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const newToast: ToastItem = {\n id,\n props,\n visible: true,\n };\n\n // 토스트를 먼저 저장 (컨테이너가 아직 등록되지 않았을 수 있음)\n const updatedToasts = [newToast];\n this.toasts.set(position, updatedToasts);\n\n // 컨테이너가 등록되어 있으면 즉시 UI 업데이트\n const setToasts = this.containers.get(position);\n if (setToasts) {\n setToasts([...updatedToasts]);\n }\n\n if (duration !== Infinity) {\n const timer = setTimeout(() => {\n this.removeToast(id);\n }, duration);\n\n newToast.timer = timer;\n }\n\n return id;\n }\n\n removeToast(id: string) {\n for (const [position, toasts] of this.toasts.entries()) {\n const toast = toasts.find((t) => t.id === id);\n if (toast) {\n if (toast.timer) {\n clearTimeout(toast.timer);\n }\n\n const updatedToasts = toasts.filter((t) => t.id !== id);\n this.toasts.set(position, updatedToasts);\n\n const setToasts = this.containers.get(position);\n if (setToasts) {\n setToasts(updatedToasts);\n }\n break;\n }\n }\n }\n\n removeAllToasts() {\n for (const toasts of this.toasts.values()) {\n toasts.forEach((toast) => {\n if (toast.timer) {\n clearTimeout(toast.timer);\n }\n });\n }\n\n this.toasts.clear();\n\n for (const [, setToasts] of this.containers.entries()) {\n setToasts([]);\n }\n }\n\n removeAllToastsExcept(type: ToastType) {\n for (const [position, toasts] of this.toasts.entries()) {\n const toKeep = toasts.filter((t) => t.props.type === type);\n const toRemove = toasts.filter((t) => t.props.type !== type);\n\n toRemove.forEach((toast) => {\n if (toast.timer) clearTimeout(toast.timer);\n });\n\n this.toasts.set(position, toKeep);\n const setToasts = this.containers.get(position);\n if (setToasts) setToasts([...toKeep]);\n }\n }\n}\n\nexport const useToast = (): ToastHookReturn => {\n const managerRef = useRef(ToastManager.getInstance());\n\n const showToast = (props: ToastProps): string => {\n return managerRef.current.addToast(props);\n };\n\n const dismissToast = (toastId: string) => {\n managerRef.current.removeToast(toastId);\n };\n\n const dismissAllToast = () => {\n managerRef.current.removeAllToasts();\n };\n\n const dismissAllExcept = (type: ToastType) => {\n managerRef.current.removeAllToastsExcept(type);\n };\n\n return {\n showToast,\n dismissToast,\n dismissAllToast,\n dismissAllExcept,\n };\n};\n\n// 편의 함수들\nexport const toast = {\n success: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"success\",\n ...options,\n });\n },\n error: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"error\",\n ...options,\n });\n },\n warning: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"warning\",\n ...options,\n });\n },\n info: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"info\",\n ...options,\n });\n },\n loading: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"loading\",\n ...options,\n });\n },\n dismissToast: (toastId: string) => {\n ToastManager.getInstance().removeToast(toastId);\n },\n dismissAllToast: () => {\n ToastManager.getInstance().removeAllToasts();\n },\n dismissAllExcept: (type: ToastType) => {\n ToastManager.getInstance().removeAllToastsExcept(type);\n },\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport type { CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Z_INDEX } from \"../../config/zIndex\";\nimport {\n ToastManager,\n type ToastItem,\n type ToastPosition,\n type ToastType,\n} from \"./ToastCore\";\n\ninterface ToastContainerProps {\n position: ToastPosition;\n}\n\nfunction ToastContainer(props: ToastContainerProps) {\n const { position } = props;\n const [toasts, setToasts] = useState<Array<ToastItem>>([]);\n const managerRef = useRef(ToastManager.getInstance());\n\n useEffect(() => {\n managerRef.current.registerContainer(position, setToasts);\n }, [position]);\n\n const getContainerStyles = (): CSSProperties => {\n const baseStyles: CSSProperties = {\n position: \"fixed\",\n zIndex: Z_INDEX.TOP,\n pointerEvents: \"none\",\n };\n\n const positionStyles = {\n \"top-left\": { top: \"1rem\", left: \"1rem\" },\n \"top-center\": { top: \"1rem\", left: \"50%\", transform: \"translateX(-50%)\" },\n \"top-right\": { top: \"1rem\", right: \"1rem\" },\n \"middle-left\": {\n top: \"50%\",\n left: \"1rem\",\n transform: \"translateY(-50%)\",\n },\n \"bottom-left\": { bottom: \"1rem\", left: \"1rem\" },\n \"bottom-center\": {\n bottom: \"1rem\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n },\n \"bottom-right\": { bottom: \"1rem\", right: \"1rem\" },\n };\n\n return { ...baseStyles, ...positionStyles[position] };\n };\n\n return createPortal(\n <div style={getContainerStyles()}>\n {toasts.map((toast) => (\n <ToastItemCard key={toast.id} toast={toast} onRemove={(id) => managerRef.current.removeToast(id)} />\n ))}\n </div>,\n document.body,\n );\n}\n\ninterface ToastItemCardProps {\n toast: ToastItem;\n onRemove: (id: string) => void;\n}\n\nfunction ToastItemCard(props: ToastItemCardProps) {\n const { toast, onRemove } = props;\n const [isVisible, setIsVisible] = useState(true);\n const removeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const duration = toast.props.duration ?? 1500;\n if (duration !== Infinity && duration > 300) {\n const fadeOutTime = Math.max(0, duration - 300);\n const fadeOutTimer = setTimeout(() => {\n setIsVisible(false);\n removeTimeoutRef.current = setTimeout(() => {\n onRemove(toast.id);\n }, 300);\n }, fadeOutTime);\n\n return () => {\n clearTimeout(fadeOutTimer);\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n }\n };\n }\n return undefined;\n }, [toast.props.duration, toast.id, onRemove]);\n\n const handleClick = () => {\n toast.props.onClick?.();\n };\n\n const handleClose = () => {\n setIsVisible(false);\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n }\n removeTimeoutRef.current = setTimeout(() => {\n onRemove(toast.id);\n }, 300);\n };\n\n const handleCloseClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n handleClose();\n };\n\n const getTypeStyles = (type: ToastType): string => {\n const baseStyles =\n \"px-4 py-3 rounded-lg shadow-lg border flex items-center gap-3 min-w-[300px] max-w-[500px] pointer-events-auto\";\n\n const typeStyles = {\n success: \"bg-green-50 border-green-200 text-green-800\",\n error: \"bg-red-50 border-red-200 text-red-800\",\n warning: \"bg-yellow-50 border-yellow-200 text-yellow-800\",\n info: \"bg-blue-50 border-blue-200 text-blue-800\",\n loading: \"bg-gray-50 border-gray-200 text-gray-800\",\n };\n\n return `${baseStyles} ${typeStyles[type]}`;\n };\n\n const getDefaultIcon = (type: ToastType): ReactNode => {\n const icons = {\n success: \"✓\",\n error: \"✕\",\n warning: \"⚠\",\n info: \"ℹ\",\n loading: \"⟳\",\n };\n\n return <span className={`text-lg ${type === \"loading\" ? \"animate-spin\" : \"\"}`}>{icons[type]}</span>;\n };\n\n const getCloseButtonStyles = (type: ToastType): string => {\n const baseStyles =\n \"w-6 h-6 rounded-full flex items-center justify-center transition-all duration-200 cursor-pointer focus:outline-none focus:ring-2 focus:ring-offset-1\";\n\n const typeStyles = {\n success:\n \"text-green-500 hover:text-green-700 hover:bg-green-100 active:bg-green-200 focus:ring-green-300\",\n error: \"text-red-500 hover:text-red-700 hover:bg-red-100 active:bg-red-200 focus:ring-red-300\",\n warning:\n \"text-yellow-500 hover:text-yellow-700 hover:bg-yellow-100 active:bg-yellow-200 focus:ring-yellow-300\",\n info: \"text-blue-500 hover:text-blue-700 hover:bg-blue-100 active:bg-blue-200 focus:ring-blue-300\",\n loading: \"text-gray-500 hover:text-gray-700 hover:bg-gray-100 active:bg-gray-200 focus:ring-gray-300\",\n };\n\n return `${baseStyles} ${typeStyles[type]}`;\n };\n\n return (\n <div\n className={`${getTypeStyles(toast.props.type || \"info\")} transition-all duration-300 ${\n isVisible\n ? \"animate-in slide-in-from-top-2 fade-in-0 duration-300 opacity-100\"\n : \"animate-out slide-out-to-top-2 fade-out-0 duration-300 opacity-0\"\n } mb-2 cursor-pointer`}\n onClick={handleClick}\n >\n {toast.props.icon || getDefaultIcon(toast.props.type || \"info\")}\n <span className=\"flex-1 text-sm font-medium\">{toast.props.toast}</span>\n {toast.props.showCloseButton !== false && (\n <button\n onClick={handleCloseClick}\n className={getCloseButtonStyles(toast.props.type || \"info\")}\n title=\"닫기\"\n aria-label=\"메시지 닫기\"\n >\n <span className=\"text-sm font-medium\">✕</span>\n </button>\n )}\n </div>\n );\n}\n\nconst TOAST_POSITIONS: Array<ToastPosition> = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n];\n\nexport default function ToastProvider() {\n return (\n <>\n {TOAST_POSITIONS.map((position) => (\n <ToastContainer key={position} position={position} />\n ))}\n </>\n );\n}\n","import type { YmdDateString } from \"./type\";\n\n// new Date(0~99, ...) 는 JS가 1900~1999년으로 처리하므로 setFullYear로 우회\nexport function makeLocalDate(year: number, monthIndex: number, day: number): Date {\n const d = new Date(0);\n d.setFullYear(year, monthIndex, day);\n return d;\n}\n\n// `YYYY-MM-DD` → 로컬 자정 기준 Date (유효하지 않으면 null)\nexport function parseLocalYmd(ymd: string): Date | null {\n const m = ymd.trim().match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const d = Number(m[3]);\n const dt = makeLocalDate(y, mo, d);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d) return null;\n return dt;\n}\n\nexport interface CanSelectTodayOptions {\n maxDate?: YmdDateString;\n range?: boolean;\n isSelectingEnd?: boolean;\n rangeStart?: string;\n rangeEnd?: string;\n // 테스트·고정 시각용 (기본: 현재 시각)\n now?: Date;\n}\n\n// Today 버튼으로 오늘 날짜를 선택할 수 있는지\nexport function canSelectToday(options: CanSelectTodayOptions): boolean {\n const today = options.now ?? new Date();\n const todayYmd = formatDate(today);\n\n if (options.maxDate && isCalendarDayAfterMax(today, options.maxDate)) {\n return false;\n }\n\n if (!options.range) {\n return true;\n }\n\n if (options.isSelectingEnd) {\n const start = options.rangeStart?.trim() ?? \"\";\n if (start.length === 10 && todayYmd < start) {\n return false;\n }\n return true;\n }\n\n const end = options.rangeEnd?.trim() ?? \"\";\n if (end.length === 10 && todayYmd > end) {\n return false;\n }\n\n return true;\n}\n\n// 달력상 `date`의 날짜가 `maxYmd`(YYYY-MM-DD)의 날짜보다 이후인지\nexport function isCalendarDayAfterMax(date: Date, maxYmd: YmdDateString): boolean {\n const max = parseLocalYmd(maxYmd);\n if (!max) return false;\n const ax = date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\n const bx = max.getFullYear() * 10000 + (max.getMonth() + 1) * 100 + max.getDate();\n return ax > bx;\n}\n\n// 날짜 포맷팅 함수\nexport function formatDate(date: Date): YmdDateString {\n const year = String(date.getFullYear()).padStart(4, \"0\");\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}` as YmdDateString;\n}\n\n// 날짜가 범위 내에 있는지 확인\nexport function isDateInRange(date: Date, range: boolean, rangeStart: string, rangeEnd: string): boolean {\n if (!range || !rangeStart) return false;\n\n const formatted = formatDate(date);\n if (!rangeEnd) return formatted === rangeStart;\n\n const startDate = parseLocalYmd(rangeStart);\n const endDate = parseLocalYmd(rangeEnd);\n if (!startDate || !endDate) return false;\n\n return date >= startDate && date <= endDate;\n}\n\n// 입력값 검증 및 포맷팅\nexport function validateAndFormatInput(input: string): string {\n const numbers = input.replace(/\\D/g, \"\");\n\n if (numbers.length === 0) return \"\";\n\n const clampYear = (raw: string): string => {\n const n = parseInt(raw, 10);\n if (n > 9999) return \"9999\";\n return raw;\n };\n\n const clampMonth = (raw: string): string => {\n if (raw.length < 2) return raw;\n const n = parseInt(raw, 10);\n if (n < 1) return \"01\";\n if (n > 12) return \"12\";\n return raw;\n };\n\n if (numbers.length <= 4) {\n return clampYear(numbers);\n }\n\n const year = clampYear(numbers.slice(0, 4));\n const month = clampMonth(numbers.slice(4, 6));\n\n if (numbers.length <= 6) {\n return `${year}-${month}`;\n }\n\n const dayRaw = numbers.slice(6, 8);\n let day = dayRaw;\n\n if (day.length === 2) {\n const dayNum = parseInt(day, 10);\n const lastDayOfMonth = makeLocalDate(parseInt(year, 10), parseInt(month, 10), 0).getDate();\n if (dayNum < 1) day = \"01\";\n else if (dayNum > lastDayOfMonth) day = lastDayOfMonth.toString().padStart(2, \"0\");\n }\n\n return `${year}-${month}-${day}`;\n}\n","// calendarYearRange 미지정 시 연도 목록은 기준연도(올해) ± 이 값\nexport const DEFAULT_CALENDAR_YEAR_HALF_SPAN = 50;\n\nexport const CALENDAR_WEEKDAY_LABELS = [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"] as const;\n\nexport const CALENDAR_RANGE_HINT = {\n start: \"시작 날짜를 선택하세요\",\n end: \"종료 날짜를 선택하세요\",\n} as const;\n\nimport { Z_INDEX } from \"../../../../config/zIndex\";\n\n// body 포털 달력 — @/shared/config/zIndex → Z_INDEX.CALENDAR_PORTAL\nexport const CALENDAR_PORTAL_Z_INDEX = Z_INDEX.CALENDAR_PORTAL;\n\nexport const CALENDAR_SELECT_CLASSNAMES = {\n containerClass: \"w-20 shrink-0\",\n triggerClassName: \"h-8 px-2 py-1 text-sm cursor-pointer\",\n contentClassName: \"min-w-[5rem]\",\n} as const;\n\nexport const CALENDAR_PANEL_BASE_CLASS = \"bg-white border border-gray-300 rounded-lg shadow-lg p-3 min-w-[280px]\";\n\n// 인라인(absolute) 앵커 — Tailwind z-50 = Z_INDEX.CALENDAR_ANCHORED\nexport const CALENDAR_PANEL_ANCHORED_CLASS = `${CALENDAR_PANEL_BASE_CLASS} absolute z-50`;\n\n/** @deprecated CALENDAR_PANEL_ANCHORED_CLASS 사용 */\nexport const CALENDAR_PANEL_CLASS = CALENDAR_PANEL_ANCHORED_CLASS;\n\nexport const YEAR_SELECT_CONTENT_EXTRA_CLASS = \"year-select-content custom-view-scrollbar max-h-50 overflow-y-auto\";\n\nexport const YEAR_SELECT_OPEN_CONTENT_SELECTOR = \".year-select-content[data-state='open']\";\nexport const SELECT_ITEM_CHECKED_SELECTOR = \"[data-slot='select-item'][data-state='checked']\";\n","import type { CalendarYearRange } from \"./type\";\nimport type { YmdDateString } from \"../../config/type\";\nimport {\n DEFAULT_CALENDAR_YEAR_HALF_SPAN,\n SELECT_ITEM_CHECKED_SELECTOR,\n YEAR_SELECT_OPEN_CONTENT_SELECTOR,\n} from \"./default\";\nimport { isCalendarDayAfterMax, makeLocalDate, parseLocalYmd } from \"../../config/utils\";\n\n// 연도·월 Select 한 줄 옵션에 쓰는 값·라벨·비활성 여부\ntype CalendarSelectOption = { value: string; label: string; disabled?: boolean };\n\n// `YYYY-MM-DD`(길이 10) 문자열을 로컬 Date로 변환 (유효하지 않으면 null)\nexport function parseYmdDateString(value: string): Date | null {\n if (value.length !== 10) return null;\n return parseLocalYmd(value);\n}\n\n// 설정값 또는 기본(기준연도 ± 간격)을 반영해 연도 선택 가능 구간을 숫자 min/max로 만들기\nexport function resolveCalendarYearBounds(\n anchorYear: number,\n calendarYearRange: CalendarYearRange | undefined,\n): { minYear: number; maxYear: number } {\n const fallbackMin = Math.max(0, anchorYear - DEFAULT_CALENDAR_YEAR_HALF_SPAN);\n const fallbackMax = anchorYear + DEFAULT_CALENDAR_YEAR_HALF_SPAN;\n\n const rawMin = calendarYearRange?.minYear?.trim();\n const rawMax = calendarYearRange?.maxYear?.trim();\n\n if (rawMin === undefined || rawMin === \"\" || rawMax === undefined || rawMax === \"\") {\n return { minYear: fallbackMin, maxYear: fallbackMax };\n }\n\n const minParsed = Number.parseInt(rawMin, 10);\n const maxParsed = Number.parseInt(rawMax, 10);\n\n if (Number.isNaN(minParsed) || Number.isNaN(maxParsed) || minParsed > maxParsed) {\n return { minYear: fallbackMin, maxYear: fallbackMax };\n }\n\n return { minYear: Math.max(0, minParsed), maxYear: maxParsed };\n}\n\n// 달력 헤더 연도 Select에 넣을 옵션 배열을 만들고(maxDate·연도 범위에 맞춰) 넘길 수 없는 연도는 비활성 처리\nexport function buildCalendarYearSelectOptions(\n maxDate: YmdDateString | undefined,\n anchorYear = new Date().getFullYear(),\n calendarYearRange?: CalendarYearRange,\n): Array<CalendarSelectOption> {\n const { minYear, maxYear } = resolveCalendarYearBounds(anchorYear, calendarYearRange);\n const maxSelectableYear = maxDate ? (parseLocalYmd(maxDate)?.getFullYear() ?? null) : null;\n const options: Array<CalendarSelectOption> = [];\n for (let y = maxYear; y >= minYear; y--) {\n options.push({\n value: String(y),\n label: `${String(y).padStart(4, \"0\")}년`,\n disabled: maxSelectableYear !== null && y > maxSelectableYear,\n });\n }\n return options;\n}\n\n// 보고 있는 연도 기준으로 월 Select 옵션을 만들고, maxDate가 있는 해에서는 그 이후 월은 비활성 처리\nexport function buildCalendarMonthSelectOptions(\n viewYear: number,\n maxDate: YmdDateString | undefined,\n): Array<CalendarSelectOption> {\n const maxDateParsed = maxDate ? parseLocalYmd(maxDate) : null;\n const maxYear = maxDateParsed?.getFullYear() ?? null;\n const maxMonth =\n maxDateParsed !== null && maxDateParsed !== undefined ? maxDateParsed.getMonth() + 1 : null;\n const isMaxYear = maxYear !== null && viewYear === maxYear;\n\n const options: Array<CalendarSelectOption> = [];\n for (let m = 1; m <= 12; m++) {\n options.push({\n value: String(m),\n label: `${m}월`,\n disabled: isMaxYear && maxMonth !== null && m > maxMonth,\n });\n }\n return options;\n}\n\n// 해당 월 달력 그리드(7열)를 채울 때 앞·뒤 빈 칸 수와 이번 달 일수를 계산\nexport function getCalendarMonthGrid(\n year: number,\n monthIndex: number,\n): {\n leadingEmpty: number;\n daysInMonth: number;\n trailingEmpty: number;\n} {\n const firstDay = makeLocalDate(year, monthIndex, 1);\n const daysInMonth = makeLocalDate(year, monthIndex + 1, 0).getDate();\n const leadingEmpty = firstDay.getDay();\n const totalCells = leadingEmpty + daysInMonth;\n const trailingEmpty = totalCells % 7 === 0 ? 0 : 7 - (totalCells % 7);\n return { leadingEmpty, daysInMonth, trailingEmpty };\n}\n\n// 「다음 달」로 넘어가면 maxDate보다 뒤가 되는지 검사해 월 이동 버튼(다음)을 비활성할지 결정\nexport function disableNextCalendarMonth(\n year: number,\n monthIndex: number,\n maxDate: YmdDateString | undefined,\n) {\n if (maxDate === undefined) return false;\n return isCalendarDayAfterMax(makeLocalDate(year, monthIndex + 1, 1), maxDate);\n}\n\n// 연도 Select를 열었을 때 현재 선택 연도 항목이 스크롤 영역 안에 보이도록 맞추기\nexport function scrollOpenYearSelectCheckedIntoView(): void {\n requestAnimationFrame(() => {\n const root = document.querySelector(YEAR_SELECT_OPEN_CONTENT_SELECTOR);\n if (!(root instanceof HTMLElement)) return;\n\n const checkedItem = root.querySelector(SELECT_ITEM_CHECKED_SELECTOR);\n if (!(checkedItem instanceof HTMLElement)) return;\n\n checkedItem.scrollIntoView({ block: \"start\" });\n });\n}\n\n// 날짜 UI 상태(오늘·단일 선택·범위·구간 비활성 등)에 맞는 style 지정\nexport function dayCellButtonClass(opts: {\n isToday: boolean;\n isSelected: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n interactiveDisabled: boolean;\n}): string {\n const { isToday, isSelected, isInRange, isRangeStart, isRangeEnd, interactiveDisabled } = opts;\n\n const parts = [\"w-8 h-8 text-sm flex items-center justify-center rounded-2xl transition-colors\"];\n // 오늘일때\n if (isToday) parts.push(\"bg-gray-100\");\n // 선택된 날짜이고 오늘이 아닐때\n if (isSelected && !isToday) parts.push(\"bg-neutral-200 text-gray-700\");\n // 범위 내에 있고 오늘이 아닐때\n if (isInRange && !isToday) parts.push(\"bg-gray-100/90\");\n // 범위 시작 또는 끝일때 오늘이 아닐때\n if ((isRangeStart || isRangeEnd) && !isToday) parts.push(\"bg-neutral-300 text-gray-700 opacity-100\");\n // 비활성 상태일때\n parts.push(interactiveDisabled ? \"opacity-20 cursor-not-allowed\" : \"hover:bg-blue-100 cursor-pointer\");\n\n return parts.filter(Boolean).join(\" \").trim();\n}\n","import type { MouseEvent } from \"react\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/variants\";\nimport Select from \"../../Select\";\nimport { canSelectToday, formatDate, isCalendarDayAfterMax, isDateInRange, makeLocalDate } from \"../config/utils\";\nimport {\n buildCalendarMonthSelectOptions,\n buildCalendarYearSelectOptions,\n dayCellButtonClass,\n disableNextCalendarMonth,\n getCalendarMonthGrid,\n scrollOpenYearSelectCheckedIntoView,\n} from \"./config/calendar\";\nimport {\n CALENDAR_PANEL_ANCHORED_CLASS,\n CALENDAR_PANEL_BASE_CLASS,\n CALENDAR_RANGE_HINT,\n CALENDAR_SELECT_CLASSNAMES,\n CALENDAR_WEEKDAY_LABELS,\n YEAR_SELECT_CONTENT_EXTRA_CLASS,\n} from \"./config/default\";\nimport type { CalendarYearRange } from \"./config/type\";\nimport type { YmdDateString } from \"../config/type\";\n\nexport interface RenderCalendarProps {\n currentDate: Date;\n range: boolean;\n rangeStart: string;\n rangeEnd: string;\n isSelectingEnd: boolean;\n handleDateSelect: (date: Date) => void;\n inputValue: string;\n calendarPosition: \"start\" | \"end\";\n goToPreviousMonth: () => void;\n goToNextMonth: () => void;\n onYearChange: (year: number) => void;\n onMonthChange: (month: number) => void;\n onSelectOpenChange?: (open: boolean) => void;\n editDateSelect?: boolean;\n datePosition?: \"top\" | \"bottom\";\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n floating?: boolean;\n showTodayButton?: boolean;\n}\n\nexport default function RenderCalendar(props: RenderCalendarProps) {\n const {\n currentDate,\n range,\n rangeStart,\n rangeEnd,\n isSelectingEnd,\n handleDateSelect,\n inputValue,\n calendarPosition,\n goToPreviousMonth,\n goToNextMonth,\n onYearChange,\n onMonthChange,\n onSelectOpenChange,\n editDateSelect = true,\n datePosition = \"bottom\",\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n floating = false,\n showTodayButton = true,\n } = props;\n\n const year = currentDate.getFullYear();\n const monthIndex = currentDate.getMonth();\n const anchorYear = year;\n\n const disableNextMonth = disableNextCalendarMonth(year, monthIndex, maxDate);\n const { leadingEmpty, daysInMonth, trailingEmpty } = getCalendarMonthGrid(year, monthIndex);\n\n const yearOptions = buildCalendarYearSelectOptions(maxDate, anchorYear, calendarYearRange);\n const monthOptions = buildCalendarMonthSelectOptions(year, maxDate);\n\n const todayFormatted = formatDate(new Date());\n const selectedSingleYmd = range ? null : inputValue;\n\n const rangeStartYmd = rangeStart.trim();\n const rangeEndYmd = rangeEnd.trim();\n\n const days: React.ReactNode[] = [];\n\n for (let i = 0; i < leadingEmpty; i++) {\n days.push(<div key={`lead-${i}`} className=\"size-8\" aria-hidden />);\n }\n\n for (let d = 1; d <= daysInMonth; d++) {\n const date = makeLocalDate(year, monthIndex, d);\n const dateFormatted = formatDate(date);\n\n const isToday = dateFormatted === todayFormatted;\n const isSelected = dateFormatted === selectedSingleYmd;\n const isInRange = isDateInRange(date, range, rangeStart, rangeEnd);\n const isRangeStartFlag = Boolean(range && dateFormatted === rangeStart);\n const isRangeEndFlag = Boolean(range && dateFormatted === rangeEnd);\n\n const isBeforeRangeStart =\n range && isSelectingEnd && rangeStartYmd.length === 10 && dateFormatted < rangeStartYmd;\n const isAfterRangeEnd =\n range && !isSelectingEnd && rangeEndYmd.length === 10 && dateFormatted > rangeEndYmd;\n const isGreyedForRange = Boolean(isBeforeRangeStart || isAfterRangeEnd);\n const isPastMax = maxDate ? isCalendarDayAfterMax(date, maxDate) : false;\n\n days.push(\n <button\n key={d}\n type=\"button\"\n onClick={() => handleDateSelect(date)}\n disabled={isGreyedForRange || isPastMax}\n className={dayCellButtonClass({\n isToday,\n isSelected: Boolean(isSelected),\n isInRange,\n isRangeStart: isRangeStartFlag,\n isRangeEnd: isRangeEndFlag,\n interactiveDisabled: isGreyedForRange || isPastMax,\n })}\n >\n {d}\n </button>,\n );\n }\n\n for (let i = 0; i < trailingEmpty; i++) {\n days.push(<div key={`trail-${i}`} className=\"size-8\" aria-hidden />);\n }\n\n const calendarPositionClass =\n !floating && range && calendarPosition === \"end\" ? \"right-0\" : !floating ? \"left-0\" : \"\";\n const datePositionClass = floating ? \"\" : datePosition === \"top\" ? \"bottom-full mb-1\" : \"top-full mt-1\";\n const panelClass = floating\n ? CALENDAR_PANEL_BASE_CLASS\n : cn(CALENDAR_PANEL_ANCHORED_CLASS, datePositionClass, calendarPositionClass);\n\n const handleYearSelectOpenChange = (open: boolean) => {\n onSelectOpenChange?.(open);\n if (open) scrollOpenYearSelectCheckedIntoView();\n };\n\n const sel = CALENDAR_SELECT_CLASSNAMES;\n const containerClass = cn(sel.containerClass, calendarSelectContainerClass);\n\n const stopBubble = (e: MouseEvent) => e.stopPropagation();\n\n const isTodaySelectable = canSelectToday({\n maxDate,\n range,\n isSelectingEnd,\n rangeStart,\n rangeEnd,\n });\n\n return (\n <div className={panelClass} onClick={stopBubble} onMouseDown={stopBubble}>\n <div className=\"mb-1 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={goToPreviousMonth}\n className=\"cursor-pointer rounded p-1 hover:bg-gray-100\"\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n\n {editDateSelect ? (\n <div\n role=\"presentation\"\n className=\"flex items-center gap-2\"\n onClick={stopBubble}\n onMouseDown={stopBubble}\n >\n <Select\n value={year.toString()}\n options={yearOptions}\n onChange={(value) => onYearChange(Number.parseInt(value, 10))}\n containerClassName={containerClass}\n triggerClassName={sel.triggerClassName}\n contentClassName={cn(YEAR_SELECT_CONTENT_EXTRA_CLASS, sel.contentClassName)}\n disableScrollButtonEvents\n onOpenChange={handleYearSelectOpenChange}\n />\n <Select\n value={(monthIndex + 1).toString()}\n options={monthOptions}\n onChange={(value) => onMonthChange(Number.parseInt(value, 10) - 1)}\n containerClassName={containerClass}\n triggerClassName={sel.triggerClassName}\n contentClassName={sel.contentClassName}\n onOpenChange={(open) => onSelectOpenChange?.(open)}\n />\n </div>\n ) : (\n <h3 className=\"text-lg font-semibold\">\n {String(year).padStart(4, \"0\")}년 {monthIndex + 1}월\n </h3>\n )}\n\n <button\n type=\"button\"\n onClick={goToNextMonth}\n disabled={disableNextMonth}\n className={cn(\n \"rounded p-1\",\n disableNextMonth ? \"cursor-not-allowed opacity-30\" : \"cursor-pointer hover:bg-gray-100\",\n )}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {CALENDAR_WEEKDAY_LABELS.map((day) => (\n <div key={day} className=\"py-2 text-center text-sm font-medium text-gray-500\">\n {day}\n </div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7 gap-2\">{days}</div>\n\n {range && (\n <div className=\"mt-3 text-sm text-gray-600\">\n <p className=\"text-center\">\n {isSelectingEnd ? CALENDAR_RANGE_HINT.end : CALENDAR_RANGE_HINT.start}\n </p>\n </div>\n )}\n\n {showTodayButton && isTodaySelectable && (\n <div className=\"-mx-3 -mb-3 mt-3 flex items-center justify-center border-t border-gray-200 py-2\">\n <button\n type=\"button\"\n onClick={() => handleDateSelect(new Date())}\n className=\"cursor-pointer text-sm text-gray-800 hover:text-main\"\n >\n Today\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect, type RefObject } from \"react\";\nimport { parseYmdDateString } from \"../config/calendar\";\nimport { makeLocalDate } from \"../../config/utils\";\n\ninterface UseCalendarStateProps {\n datePosition?: \"top\" | \"bottom\";\n disabled?: boolean;\n // body 포털로 렌더된 달력 래퍼 — outside click 판별용\n calendarRef?: RefObject<HTMLElement | null>;\n}\n\nexport function useCalendarState(props: UseCalendarStateProps) {\n const { datePosition = \"bottom\", disabled = false, calendarRef } = props;\n\n const [isCalendarOpen, setIsCalendarOpen] = useState(false);\n const [currentDate, setCurrentDate] = useState(new Date());\n const [autoDatePosition, setAutoDatePosition] = useState<\"top\" | \"bottom\">(datePosition);\n\n const isSelectOpenRef = useRef(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 년/월 Select 열림 상태 추적\n const handleSelectOpenChange = (open: boolean) => {\n if (open) {\n isSelectOpenRef.current = true;\n } else {\n setTimeout(() => {\n isSelectOpenRef.current = false;\n }, 0);\n }\n };\n\n // 외부 클릭 시 달력 닫기\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current?.contains(target) ||\n calendarRef?.current?.contains(target) ||\n isSelectOpenRef.current\n ) {\n return;\n }\n setIsCalendarOpen(false);\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [calendarRef]);\n\n // 달력 열기/닫기 토글\n const toggleCalendar = (initialDateValue?: string) => {\n if (disabled) return;\n\n // 캘린더를 열 때 viewport 공간을 계산하여 위/아래 방향 자동 결정\n if (!isCalendarOpen && containerRef.current) {\n const CALENDAR_HEIGHT = 320;\n const rect = containerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n setAutoDatePosition(spaceBelow >= CALENDAR_HEIGHT || spaceBelow >= spaceAbove ? \"bottom\" : \"top\");\n\n // currentDate는 달력 그리드에 표시할 년·월용(선택 값과 별개).\n // 열 때 입력값(initialDateValue) 기준으로 맞추지 않으면 오늘/이전에 넘겨 둔 달이 그대로 보일 수 있음.\n const parsed = initialDateValue ? parseYmdDateString(initialDateValue) : null;\n if (parsed) setCurrentDate(parsed);\n }\n\n setIsCalendarOpen(!isCalendarOpen);\n };\n\n // 팝업을 닫지 않고 표시 월만 변경 (범위 선택: 시작일 선택 후 종료일 달로 전환 등)\n const navigateToDateValue = (initialDateValue?: string) => {\n const parsed = initialDateValue ? parseYmdDateString(initialDateValue) : null;\n if (parsed) setCurrentDate(parsed);\n };\n\n const closeCalendar = () => {\n setIsCalendarOpen(false);\n };\n\n // 달력 네비게이션\n const goToPreviousMonth = () => {\n setCurrentDate(makeLocalDate(currentDate.getFullYear(), currentDate.getMonth() - 1, 1));\n };\n\n const goToNextMonth = () => {\n setCurrentDate(makeLocalDate(currentDate.getFullYear(), currentDate.getMonth() + 1, 1));\n };\n\n const handleYearChange = (year: number) => {\n setCurrentDate(makeLocalDate(year, currentDate.getMonth(), 1));\n };\n\n const handleMonthChange = (month: number) => {\n setCurrentDate(makeLocalDate(currentDate.getFullYear(), month, 1));\n };\n\n return {\n isCalendarOpen,\n currentDate,\n autoDatePosition,\n containerRef,\n toggleCalendar,\n navigateToDateValue,\n closeCalendar,\n goToPreviousMonth,\n goToNextMonth,\n handleYearChange,\n handleMonthChange,\n handleSelectOpenChange,\n };\n}\n","import { useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\n\nimport { CALENDAR_PORTAL_Z_INDEX } from \"../config/default\";\n\nconst CALENDAR_GAP = 4;\nconst CALENDAR_MIN_WIDTH = 280;\n\nexport function useFloatingCalendarPosition(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n placement: \"top\" | \"bottom\",\n align: \"start\" | \"end\" = \"start\",\n) {\n const [style, setStyle] = useState<CSSProperties>({ visibility: \"hidden\" });\n\n useLayoutEffect(() => {\n if (!isOpen || !anchorRef.current) return;\n\n const update = () => {\n const rect = anchorRef.current!.getBoundingClientRect();\n const left = align === \"end\" ? Math.max(8, rect.right - CALENDAR_MIN_WIDTH) : rect.left;\n\n const base: CSSProperties = {\n position: \"fixed\",\n left,\n zIndex: CALENDAR_PORTAL_Z_INDEX,\n minWidth: CALENDAR_MIN_WIDTH,\n visibility: \"visible\",\n };\n\n if (placement === \"top\") {\n setStyle({ ...base, bottom: window.innerHeight - rect.top + CALENDAR_GAP });\n } else {\n setStyle({ ...base, top: rect.bottom + CALENDAR_GAP });\n }\n };\n\n const handleScroll = (e: Event) => {\n // 연/월 셀렉트 드롭다운 내부 스크롤은 포지션 재계산 대상 아님\n if ((e.target as Element | null)?.closest?.('[data-slot=\"select-content\"]')) return;\n update();\n };\n\n update();\n window.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [isOpen, placement, align, anchorRef]);\n\n return style;\n}\n","import { createPortal } from \"react-dom\";\nimport type { ReactNode, RefObject } from \"react\";\n\nimport { useFloatingCalendarPosition } from \"../calendar/hooks/useFloatingCalendarPosition\";\n\nexport function CalendarPortal({\n anchorRef,\n calendarRef,\n isOpen,\n placement,\n align = \"start\",\n children,\n}: {\n anchorRef: RefObject<HTMLElement | null>;\n calendarRef: RefObject<HTMLDivElement | null>;\n isOpen: boolean;\n placement: \"top\" | \"bottom\";\n align?: \"start\" | \"end\";\n children: ReactNode;\n}) {\n const style = useFloatingCalendarPosition(anchorRef, isOpen, placement, align);\n\n if (!isOpen) return null;\n\n return createPortal(\n <div ref={calendarRef} style={style}>\n {children}\n </div>,\n document.body,\n );\n}\n","export const DATE_PICKER_FIELD_DISABLED_CLASS =\n \"cursor-not-allowed opacity-50 bg-gray-100 text-neutral-400 pointer-events-none\";\n\nexport const DATE_PICKER_ICON_DISABLED_CLASS = \"pointer-events-none cursor-not-allowed\";\nexport const DATE_PICKER_ICON_ENABLED_CLASS = \"cursor-pointer hover:bg-gray-100\";\n","import { Calendar } from \"lucide-react\";\nimport { type ChangeEvent, useEffect, useRef, useState } from \"react\";\nimport { toast } from \"../../Toast/ToastCore\";\n\nimport { cn } from \"../../../lib/variants\";\nimport RenderCalendar from \"../calendar/Index\";\nimport { useCalendarState } from \"../calendar/hooks/useCalendarState\";\nimport { CalendarPortal } from \"./CalendarPortal\";\n\nimport type { CalendarYearRange } from \"../../calendar/config/type\";\nimport type { YmdDateString } from \"../config/type\";\nimport {\n DATE_PICKER_FIELD_DISABLED_CLASS,\n DATE_PICKER_ICON_DISABLED_CLASS,\n DATE_PICKER_ICON_ENABLED_CLASS,\n} from \"../config/styles\";\nimport { formatDate, isCalendarDayAfterMax, validateAndFormatInput } from \"../config/utils\";\n\nexport interface DatePickerRangeProps {\n startValue?: string;\n endValue?: string;\n onRangeChange?: (startDate: string, endDate: string) => void;\n className?: string;\n editDateSelect?: boolean;\n onKeyDownEnter?: () => void;\n datePosition?: \"top\" | \"bottom\";\n disabled?: boolean;\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n showTodayButton?: boolean;\n}\n\nexport default function DatePickerRange(props: DatePickerRangeProps) {\n const {\n startValue = \"\",\n endValue = \"\",\n onRangeChange,\n className = \"\",\n editDateSelect = true,\n onKeyDownEnter,\n datePosition = \"bottom\",\n disabled = false,\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n showTodayButton = true,\n } = props;\n\n const [inputs, setInputs] = useState({ start: startValue, end: endValue });\n const startInputValue = inputs.start;\n const endInputValue = inputs.end;\n\n const [isSelectingEnd, setIsSelectingEnd] = useState(false);\n const [calendarPosition, setCalendarPosition] = useState<\"start\" | \"end\">(\"start\");\n const calendarRef = useRef<HTMLDivElement>(null);\n const startAnchorRef = useRef<HTMLDivElement>(null);\n const endAnchorRef = useRef<HTMLDivElement>(null);\n const calendarAnchorRef = calendarPosition === \"end\" ? endAnchorRef : startAnchorRef;\n\n const {\n isCalendarOpen,\n currentDate,\n autoDatePosition,\n containerRef,\n toggleCalendar,\n // 시작일을 캘린더에서 선택하면 종료일 캘린더가 열리게\n navigateToDateValue,\n closeCalendar,\n goToPreviousMonth,\n goToNextMonth,\n handleYearChange,\n handleMonthChange,\n handleSelectOpenChange,\n } = useCalendarState({ datePosition, disabled, calendarRef });\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled props 변경 시 로컬 draft와 맞춤\n setInputs({ start: startValue, end: endValue });\n }, [startValue, endValue]);\n\n const handleRangeInputChange = (e: ChangeEvent<HTMLInputElement>, isStart: boolean) => {\n const formatted = validateAndFormatInput(e.target.value);\n\n if (isStart) {\n setInputs((prev) => ({ ...prev, start: formatted }));\n if (formatted.length === 10) {\n if (endInputValue.length === 10 && formatted > endInputValue) {\n toast.error(\"시작 날짜는 종료 날짜보다 빠를 수 없습니다.\");\n setInputs((prev) => ({ ...prev, end: \"\" }));\n onRangeChange?.(\"\", \"\");\n return;\n }\n onRangeChange?.(formatted, endInputValue);\n if (isCalendarOpen && calendarPosition === \"start\") navigateToDateValue(formatted);\n } else if (formatted.length === 0) {\n onRangeChange?.(formatted, endInputValue);\n }\n } else {\n setInputs((prev) => ({ ...prev, end: formatted }));\n if (formatted.length === 10) {\n if (startInputValue.length === 10 && startInputValue > formatted) {\n toast.error(\"종료 날짜는 시작 날짜보다 빠를 수 없습니다.\");\n setInputs({ start: \"\", end: \"\" });\n onRangeChange?.(\"\", \"\");\n return;\n }\n onRangeChange?.(startInputValue, formatted);\n if (isCalendarOpen && calendarPosition === \"end\") navigateToDateValue(formatted);\n } else if (formatted.length === 0) {\n onRangeChange?.(startInputValue, formatted);\n }\n }\n };\n\n const handleDateSelect = (date: Date) => {\n const formatted = formatDate(date);\n\n if (maxDate && isCalendarDayAfterMax(date, maxDate)) {\n toast.error(\"미래 일자는 선택할 수 없습니다.\");\n return;\n }\n\n if (isSelectingEnd) {\n const currentStartValue = startInputValue;\n if (currentStartValue.length === 10 && formatted < currentStartValue) {\n toast.error(\"종료 날짜는 시작 날짜보다 빠를 수 없습니다.\");\n return;\n }\n setInputs((prev) => ({ ...prev, end: formatted }));\n onRangeChange?.(currentStartValue, formatted);\n setIsSelectingEnd(false);\n closeCalendar();\n } else {\n const currentEndValue = endInputValue;\n if (currentEndValue.length === 10 && formatted > currentEndValue) {\n toast.error(\"시작 날짜는 종료 날짜보다 늦을 수 없습니다.\");\n return;\n }\n setInputs((prev) => ({ ...prev, start: formatted }));\n onRangeChange?.(formatted, currentEndValue);\n setCalendarPosition(\"end\");\n setIsSelectingEnd(true);\n navigateToDateValue(currentEndValue.length === 10 ? currentEndValue : formatted);\n }\n };\n\n const handleCalendarIconClick = (position: \"start\" | \"end\") => {\n setCalendarPosition(position);\n setIsSelectingEnd(position === \"end\");\n\n const dateToShow =\n position === \"end\" ? endInputValue || startInputValue : startInputValue || endInputValue;\n\n toggleCalendar(dateToShow);\n };\n\n const handleFieldEnter = () => {\n onKeyDownEnter?.();\n closeCalendar();\n };\n\n const inputClassName = cn(\n \"w-full px-2 py-1.25 border border-gray-300 shadow-xs outline-none text-sm rounded-sm pr-7 transition-colors\",\n disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : \"bg-white text-gray-900 focus:border-blue-600\",\n );\n\n const iconWrapperClassName = cn(\n \"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-1\",\n disabled ? DATE_PICKER_ICON_DISABLED_CLASS : DATE_PICKER_ICON_ENABLED_CLASS,\n );\n\n const iconClassName = cn(\"size-[15px]\", disabled ? \"text-neutral-400 opacity-50\" : \"text-gray-600\");\n\n const calendarNode = (\n <CalendarPortal\n anchorRef={calendarAnchorRef}\n calendarRef={calendarRef}\n isOpen={isCalendarOpen}\n placement={autoDatePosition}\n align={calendarPosition === \"end\" ? \"end\" : \"start\"}\n >\n <RenderCalendar\n floating\n currentDate={currentDate}\n range={true}\n rangeStart={startInputValue}\n rangeEnd={endInputValue}\n isSelectingEnd={isSelectingEnd}\n handleDateSelect={handleDateSelect}\n inputValue=\"\"\n calendarPosition={calendarPosition}\n goToPreviousMonth={goToPreviousMonth}\n goToNextMonth={goToNextMonth}\n onYearChange={handleYearChange}\n onMonthChange={handleMonthChange}\n onSelectOpenChange={handleSelectOpenChange}\n editDateSelect={editDateSelect}\n datePosition={autoDatePosition}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n />\n </CalendarPortal>\n );\n\n return (\n <div ref={containerRef} className={cn(\"relative w-64 h-8\", className)} aria-disabled={disabled}>\n <div className=\"flex items-center space-x-1\">\n <div ref={startAnchorRef} className=\"relative flex-1\">\n <input\n type=\"text\"\n value={startInputValue}\n onChange={(e) => handleRangeInputChange(e, true)}\n placeholder=\"시작 날짜\"\n disabled={disabled}\n className={inputClassName}\n maxLength={10}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleFieldEnter();\n }}\n />\n <div\n onClick={() => {\n if (!disabled) handleCalendarIconClick(\"start\");\n }}\n className={iconWrapperClassName}\n >\n <Calendar size={15} className={iconClassName} />\n </div>\n </div>\n <div className={cn(\"text-sm w-2 text-center\", disabled && \"text-neutral-400 opacity-50\")}>~</div>\n <div ref={endAnchorRef} className=\"relative flex-1\">\n <input\n type=\"text\"\n value={endInputValue}\n onChange={(e) => handleRangeInputChange(e, false)}\n placeholder=\"종료 날짜\"\n disabled={disabled}\n className={inputClassName}\n maxLength={10}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleFieldEnter();\n }}\n />\n <div\n onClick={() => {\n if (!disabled) handleCalendarIconClick(\"end\");\n }}\n className={iconWrapperClassName}\n >\n <Calendar size={15} className={iconClassName} />\n </div>\n </div>\n </div>\n {calendarNode}\n </div>\n );\n}\n","import { Calendar } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { toast } from \"../../Toast/ToastCore\";\n\nimport { cn } from \"../../../lib/variants\";\nimport RenderCalendar from \"../calendar/Index\";\nimport { useCalendarState } from \"../calendar/hooks/useCalendarState\";\nimport { CalendarPortal } from \"./CalendarPortal\";\n\nimport {\n DATE_PICKER_FIELD_DISABLED_CLASS,\n DATE_PICKER_ICON_DISABLED_CLASS,\n DATE_PICKER_ICON_ENABLED_CLASS,\n} from \"../config/styles\";\n\nimport { formatDate, isCalendarDayAfterMax, makeLocalDate, validateAndFormatInput } from \"../config/utils\";\n\nimport type { CalendarYearRange } from \"../../calendar/config/type\";\nimport type { YmdDateString } from \"../config/type\";\nimport type { ChangeEvent } from \"react\";\n\nexport interface DatePickerSingleProps {\n value?: string;\n onChange?: (date: string) => void;\n placeholder?: string;\n className?: string;\n editDateSelect?: boolean;\n onKeyDownEnter?: () => void;\n datePosition?: \"top\" | \"bottom\";\n validation?: boolean;\n disabled?: boolean;\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n onBlur?: (value: string) => void;\n showTodayButton?: boolean;\n}\n\nexport default function DatePickerSingle(props: DatePickerSingleProps) {\n const {\n value = \"\",\n onChange,\n placeholder = \"날짜 선택\",\n className = \"\",\n editDateSelect = true,\n onKeyDownEnter,\n datePosition = \"bottom\",\n validation = false,\n disabled = false,\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n onBlur,\n showTodayButton = true,\n } = props;\n\n const [inputValue, setInputValue] = useState(value);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n const {\n isCalendarOpen,\n currentDate,\n autoDatePosition,\n containerRef,\n toggleCalendar,\n navigateToDateValue,\n closeCalendar,\n goToPreviousMonth,\n goToNextMonth,\n handleYearChange,\n handleMonthChange,\n handleSelectOpenChange,\n } = useCalendarState({ datePosition, disabled, calendarRef });\n\n useEffect(() => {\n setInputValue(value);\n }, [value]);\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const formatted = validateAndFormatInput(e.target.value);\n setInputValue(formatted);\n\n if (formatted.length === 10) {\n const dateMatch = formatted.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (dateMatch) {\n const [, year, month, day] = dateMatch;\n const date = makeLocalDate(\n Number.parseInt(year, 10),\n Number.parseInt(month, 10) - 1,\n Number.parseInt(day, 10),\n );\n\n if (\n date.getFullYear() === Number.parseInt(year, 10) &&\n date.getMonth() === Number.parseInt(month, 10) - 1 &&\n date.getDate() === Number.parseInt(day, 10)\n ) {\n if (maxDate && formatted > maxDate) {\n toast.error(\"미래 일자는 선택할 수 없습니다.\");\n setInputValue(value);\n return;\n }\n onChange?.(formatted);\n if (isCalendarOpen) navigateToDateValue(formatted);\n }\n }\n } else {\n onChange?.(formatted);\n }\n };\n\n const handleInputBlur = useCallback(() => {\n onBlur?.(inputValue);\n }, [onBlur, inputValue]);\n\n const handleDateSelect = (date: Date) => {\n const formatted = formatDate(date);\n\n if (maxDate && isCalendarDayAfterMax(date, maxDate)) {\n toast.error(\"미래 일자는 선택할 수 없습니다.\");\n return;\n }\n\n setInputValue(formatted);\n onChange?.(formatted);\n onBlur?.(formatted);\n closeCalendar();\n };\n\n const handleFieldEnter = () => {\n onKeyDownEnter?.();\n closeCalendar();\n };\n\n const calendarNode = (\n <CalendarPortal\n anchorRef={containerRef}\n calendarRef={calendarRef}\n isOpen={isCalendarOpen}\n placement={autoDatePosition}\n >\n <RenderCalendar\n floating\n currentDate={currentDate}\n range={false}\n rangeStart=\"\"\n rangeEnd=\"\"\n isSelectingEnd={false}\n handleDateSelect={handleDateSelect}\n inputValue={inputValue}\n calendarPosition=\"start\"\n goToPreviousMonth={goToPreviousMonth}\n goToNextMonth={goToNextMonth}\n onYearChange={handleYearChange}\n onMonthChange={handleMonthChange}\n onSelectOpenChange={handleSelectOpenChange}\n editDateSelect={editDateSelect}\n datePosition={autoDatePosition}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n />\n </CalendarPortal>\n );\n\n return (\n <div ref={containerRef} className={cn(\"relative w-30 h-8\", className)} aria-disabled={disabled}>\n <div className=\"relative\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={() => onBlur && handleInputBlur()}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n \"w-full px-2 py-1.25 border text-sm rounded-sm outline-none shadow-xs transition-colors\",\n validation\n ? \"border-red-600 focus:border-main focus-visible:border-main focus-visible:ring-1 focus-visible:ring-main/30 focus-visible:outline-none\"\n : \"border-gray-300 focus:border-main focus-visible:border-main focus-visible:ring-1 focus-visible:ring-main/30 focus-visible:outline-none\",\n disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : \"bg-white text-gray-900\",\n )}\n maxLength={10}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleFieldEnter();\n }}\n data-date-input=\"true\"\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-hidden={disabled}\n onClick={() => {\n if (!disabled) toggleCalendar(inputValue);\n }}\n className={cn(\n \"absolute right-1 top-1/2 -translate-y-1/2 rounded-full p-1\",\n disabled ? DATE_PICKER_ICON_DISABLED_CLASS : DATE_PICKER_ICON_ENABLED_CLASS,\n )}\n >\n <Calendar size={15} className={cn(disabled ? \"text-neutral-400 opacity-50\" : \"text-gray-600\")} />\n </div>\n </div>\n {calendarNode}\n </div>\n );\n}\n","import DatePickerRange from \"./ui/DatePickerRange\";\nimport DatePickerSingle from \"./ui/DatePickerSingle\";\n\nimport type { CalendarYearRange } from \"./calendar/config/type\";\nimport type { YmdDateString } from \"./config/type\";\n\nexport type { CalendarYearRange } from \"./calendar/config/type\";\nexport type { YmdDateString } from \"./config/type\";\n\ntype DatePickerBaseProps = {\n className?: string;\n editDateSelect?: boolean;\n onKeyDownEnter?: () => void;\n datePosition?: \"top\" | \"bottom\";\n disabled?: boolean;\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n showTodayButton?: boolean;\n};\n\ntype DatePickerSingleMode = DatePickerBaseProps & {\n isRange?: false;\n value?: string;\n onChange?: (date: string) => void;\n placeholder?: string;\n validation?: boolean;\n onBlur?: (value: string) => void;\n};\n\ntype DatePickerRangeMode = DatePickerBaseProps & {\n isRange: true;\n startValue?: string;\n endValue?: string;\n onRangeChange?: (startDate: string, endDate: string) => void;\n};\n\nexport type CalendarInputProps = DatePickerSingleMode | DatePickerRangeMode;\n\nexport default function DatePicker(props: CalendarInputProps) {\n const {\n isRange,\n className,\n editDateSelect,\n onKeyDownEnter,\n datePosition,\n disabled,\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n showTodayButton,\n } = props;\n\n if (isRange) {\n const { startValue, endValue, onRangeChange } = props;\n return (\n <DatePickerRange\n startValue={startValue}\n endValue={endValue}\n onRangeChange={onRangeChange}\n className={className}\n editDateSelect={editDateSelect}\n onKeyDownEnter={onKeyDownEnter}\n datePosition={datePosition}\n disabled={disabled}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n />\n );\n }\n\n const { value, onChange, placeholder, validation, onBlur } = props;\n return (\n <DatePickerSingle\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n className={className}\n editDateSelect={editDateSelect}\n onKeyDownEnter={onKeyDownEnter}\n datePosition={datePosition}\n validation={validation}\n disabled={disabled}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n onBlur={onBlur}\n />\n );\n}\n","import { useState, type ChangeEvent, type InputHTMLAttributes, type KeyboardEvent, type Ref } from \"react\";\n\nimport { Search } from \"lucide-react\";\n\nimport { Input as InputPrimitive } from \"../Input/ui/input\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onSearch\"> {\n ref?: Ref<HTMLInputElement>;\n placeholder?: string;\n onSearch?: (value: string) => void;\n className?: string;\n value?: string;\n defaultValue?: string;\n}\n\nexport default function SearchBar(props: SearchBarProps) {\n const {\n ref,\n placeholder = \"검색어를 입력하세요\",\n onSearch,\n className,\n value: controlledValue,\n defaultValue,\n onChange,\n ...rest\n } = props;\n\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? \"\");\n\n const isControlled = controlledValue !== undefined;\n const searchValue = isControlled ? controlledValue : uncontrolledValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n if (onChange) {\n onChange(e);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && onSearch) {\n onSearch(searchValue);\n }\n };\n\n const handleSearchClick = () => {\n if (onSearch) {\n onSearch(searchValue);\n }\n };\n\n return (\n <div className={cn(\"relative w-full\", className)}>\n <div className=\"text-muted-foreground absolute top-1/2 left-3 -translate-y-1/2 transform\">\n <Search className=\"h-4 w-4\" />\n </div>\n <InputPrimitive\n ref={ref}\n type=\"text\"\n placeholder={placeholder}\n value={searchValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n className={cn(\"w-full pl-10 pr-10\", className)}\n {...rest}\n />\n {searchValue && (\n <button\n type=\"button\"\n onClick={handleSearchClick}\n className=\"text-muted-foreground hover:text-foreground absolute top-1/2 right-3 -translate-y-1/2 transform cursor-pointer transition-colors\"\n aria-label=\"검색\"\n >\n <Search className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n );\n}\n","import { type MouseEvent, useEffect, useMemo, useState } from \"react\";\n\nimport { debounce } from \"es-toolkit\";\n\nimport Button, { type ButtonProps } from \"../Button\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface DebouncedButtonProps extends ButtonProps {\n debounceDelay?: number;\n}\n\nexport default function DebouncedButton(props: DebouncedButtonProps) {\n const { debounceDelay = 300, onClick, className, ...rest } = props;\n const [isDebouncing, setIsDebouncing] = useState(false);\n\n const debouncedOnClick = useMemo(() => {\n if (!onClick) return undefined;\n\n return debounce((event: MouseEvent<HTMLButtonElement>) => {\n setIsDebouncing(false);\n onClick(event);\n }, debounceDelay);\n }, [debounceDelay, onClick]);\n\n useEffect(() => {\n return () => {\n debouncedOnClick?.cancel();\n setIsDebouncing(false);\n };\n }, [debouncedOnClick]);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (debouncedOnClick) {\n setIsDebouncing(true);\n debouncedOnClick(event);\n } else {\n onClick?.(event);\n }\n };\n\n return (\n <Button\n {...rest}\n onClick={handleClick}\n className={cn(\"transition-opacity duration-150\", isDebouncing && \"opacity-50\", className)}\n />\n );\n}\n","import type { MouseEvent } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nimport type { TabItem } from \"../config/type\";\n\ninterface ChildTabButtonProps {\n childTab: TabItem;\n isActive: boolean;\n className?: string;\n onRef: (el: HTMLButtonElement | null) => void;\n onClick: (e: MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport default function ChildTabButton(props: ChildTabButtonProps) {\n const { childTab, isActive, className, onRef, onClick } = props;\n\n return (\n <button\n ref={onRef}\n onClick={onClick}\n className={cn(\n \"inline-flex w-full items-center gap-2\",\n childTab.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n className,\n )}\n disabled={childTab.disabled}\n aria-current={isActive ? \"page\" : undefined}\n >\n {childTab.icon && <span className=\"shrink-0\">{childTab.icon}</span>}\n <span>{childTab.label}</span>\n </button>\n );\n}\n","import { type MouseEvent, useRef, useEffect, useState, useCallback, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\n\nimport { cn } from \"../../lib/variants\";\n\nimport ChildTabButton from \"./ui/ChildTabButton\";\n\nimport type { TabItem } from \"./config/type\";\nexport type { TabItem };\n\nexport interface TabProps {\n tabs: TabItem[];\n activeTab: string;\n onChange: (value: string) => void;\n direction?: \"row\" | \"col\";\n className?: string;\n tabListClassName?: string;\n tabClassName?: string;\n childTabListClassName?: string;\n childTabClassName?: string;\n contentClassName?: string;\n showContent?: boolean;\n showIndicator?: boolean;\n indicatorClassName?: string;\n children?: ReactNode;\n}\n\nexport default function Tab(props: TabProps) {\n const {\n tabs,\n activeTab,\n onChange,\n direction = \"row\",\n className,\n tabListClassName,\n tabClassName,\n childTabListClassName,\n childTabClassName,\n contentClassName,\n showContent = true,\n showIndicator = false,\n indicatorClassName,\n children,\n } = props;\n\n const [indicatorStyle, setIndicatorStyle] = useState<{\n left: number;\n width: number;\n top: number;\n height: number;\n } | null>(null);\n const [expandedTabs, setExpandedTabs] = useState<Set<string>>(new Set());\n const tabRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const containerRef = useRef<HTMLUListElement | null>(null);\n\n const isTabOrChildActive = useCallback(\n (tab: TabItem): boolean => {\n if (tab.value === activeTab) return true;\n return tab.children?.some((child) => child.value === activeTab) ?? false;\n },\n [activeTab],\n );\n\n const toggleExpand = useCallback((tabValue: string, e: MouseEvent) => {\n e.stopPropagation();\n setExpandedTabs((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(tabValue)) {\n newSet.delete(tabValue);\n } else {\n newSet.add(tabValue);\n }\n return newSet;\n });\n }, []);\n\n const effectiveExpandedTabs = useMemo(() => {\n const result = new Set(expandedTabs);\n tabs.forEach((tab) => {\n if (tab.children && isTabOrChildActive(tab)) result.add(tab.value);\n });\n return result;\n }, [expandedTabs, tabs, isTabOrChildActive]);\n\n useEffect(() => {\n const allValues = new Set(\n tabs.flatMap((tab) => [tab.value, ...(tab.children?.map((c) => c.value) ?? [])]),\n );\n Object.keys(tabRefs.current).forEach((key) => {\n if (!allValues.has(key)) delete tabRefs.current[key];\n });\n }, [tabs]);\n\n const handleTabClick = useCallback(\n (e: MouseEvent, value: string, disabled?: boolean) => {\n e.preventDefault();\n if (!disabled) onChange(value);\n },\n [onChange],\n );\n\n const updateIndicator = useCallback(() => {\n let activeKey = activeTab;\n\n if (direction === \"row\") {\n for (const tab of tabs) {\n if (tab.children?.some((child) => child.value === activeTab)) {\n activeKey = tab.value;\n break;\n }\n }\n }\n\n const activeButton = tabRefs.current[activeKey];\n const container = containerRef.current;\n\n if (activeButton && container) {\n const containerRect = container.getBoundingClientRect();\n const buttonRect = activeButton.getBoundingClientRect();\n\n if (direction === \"col\") {\n setIndicatorStyle({\n left: 0,\n width: 2,\n top: buttonRect.top - containerRect.top,\n height: buttonRect.height,\n });\n } else {\n setIndicatorStyle({\n left: buttonRect.left - containerRect.left,\n width: buttonRect.width,\n top: 0,\n height: 2,\n });\n }\n }\n }, [activeTab, direction, tabs]);\n\n useEffect(() => {\n updateIndicator();\n }, [updateIndicator]);\n\n useEffect(() => {\n window.addEventListener(\"resize\", updateIndicator);\n return () => window.removeEventListener(\"resize\", updateIndicator);\n }, [updateIndicator]);\n\n const activeTabContent = useMemo((): ReactNode => {\n for (const tab of tabs) {\n if (tab.value === activeTab) return tab.content;\n if (tab.children) {\n const childTab = tab.children.find((child) => child.value === activeTab);\n if (childTab) return childTab.content;\n }\n }\n return null;\n }, [tabs, activeTab]);\n\n const isRow = direction === \"row\";\n const isCol = direction === \"col\";\n\n return (\n <div className={cn(\"w-full\", isCol && \"flex gap-4\", className)}>\n <div className={cn(\"relative\", isCol && \"shrink-0\")}>\n <ul\n ref={containerRef}\n className={cn(\n \"flex text-sm font-medium\",\n isRow && \"flex-row flex-wrap\",\n isCol && \"flex-col\",\n tabListClassName,\n )}\n >\n {tabs.map((tab) => {\n const isActive = activeTab === tab.value;\n const hasActiveChild = isTabOrChildActive(tab) && !isActive;\n const hasChildren = tab.children && tab.children.length > 0;\n const isExpanded = effectiveExpandedTabs.has(tab.value);\n\n return (\n <li key={tab.value} className={cn(isCol && \"w-full\")}>\n <div className={cn(\"relative\", isRow && hasChildren && \"group\")}>\n <div className={cn(isCol && hasChildren && \"flex w-full items-center\")}>\n <button\n ref={(el) => {\n tabRefs.current[tab.value] = el;\n }}\n onClick={(e: MouseEvent<HTMLButtonElement>) =>\n handleTabClick(e, tab.value, tab.disabled)\n }\n className={cn(\n \"inline-flex items-center gap-2 transition-all duration-300 ease-in-out\",\n isCol\n ? hasChildren\n ? \"flex-1 justify-start\"\n : \"w-full justify-start\"\n : \"justify-center\",\n tab.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n tabClassName,\n )}\n disabled={tab.disabled}\n aria-current={isActive ? \"page\" : undefined}\n data-active-child={hasActiveChild || undefined}\n >\n {tab.icon && <span className=\"shrink-0\">{tab.icon}</span>}\n <span className={cn(isCol && \"text-left\")}>{tab.label}</span>\n {isRow && hasChildren && (\n <ChevronDown className=\"w-3.5 h-3.5 shrink-0 transition-transform duration-300 ease-in-out group-hover:rotate-180\" />\n )}\n </button>\n {isCol && hasChildren && (\n <button\n onClick={(e) => toggleExpand(tab.value, e)}\n className=\"p-1 hover:bg-gray-100 rounded transition-colors shrink-0\"\n aria-label={isExpanded ? \"접기\" : \"펼치기\"}\n >\n <ChevronDown\n className={cn(\n \"w-4 h-4 transition-transform duration-300 ease-in-out\",\n isExpanded ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </button>\n )}\n </div>\n\n {isRow && hasChildren && (\n <div className=\"absolute top-full left-0 z-50 hidden group-hover:block pt-1\">\n <div className=\"min-w-35 overflow-hidden rounded-base border border-default bg-white py-1 shadow-lg\">\n {(tab.children ?? []).map((childTab) => {\n const isChildActive = activeTab === childTab.value;\n return (\n <ChildTabButton\n key={childTab.value}\n childTab={childTab}\n isActive={isChildActive}\n className={cn(\n \"px-3 py-2 text-left text-sm transition-colors\",\n !childTab.disabled && \"hover:bg-gray-50\",\n isChildActive && \"bg-blue-50 text-blue-500\",\n childTabClassName,\n )}\n onRef={(el) => {\n tabRefs.current[childTab.value] = el;\n }}\n onClick={(e) => handleTabClick(e, childTab.value, childTab.disabled)}\n />\n );\n })}\n </div>\n </div>\n )}\n\n {isCol && hasChildren && (\n <div\n className={cn(\n \"overflow-hidden transition-all duration-300 ease-in-out\",\n isExpanded ? \"max-h-250 opacity-100\" : \"max-h-0 opacity-0\",\n )}\n >\n <ul className={cn(\"flex flex-col\", childTabListClassName)}>\n {(tab.children ?? []).map((childTab) => {\n const isChildActive = activeTab === childTab.value;\n return (\n <li key={childTab.value} className=\"w-full\">\n <ChildTabButton\n childTab={childTab}\n isActive={isChildActive}\n className={cn(\"transition-all duration-300 ease-in-out\", childTabClassName)}\n onRef={(el) => {\n tabRefs.current[childTab.value] = el;\n }}\n onClick={(e) => handleTabClick(e, childTab.value, childTab.disabled)}\n />\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n {showIndicator && indicatorStyle && (\n <div\n className={cn(\n \"absolute transition-all duration-300 ease-in-out\",\n isRow && \"bottom-0\",\n isCol && \"left-0\",\n indicatorClassName,\n )}\n style={{\n left: `${indicatorStyle.left}px`,\n width: `${indicatorStyle.width}px`,\n top: isCol ? `${indicatorStyle.top}px` : undefined,\n height: `${indicatorStyle.height}px`,\n }}\n />\n )}\n </div>\n\n {isCol && children && <div className=\"flex-1\">{children}</div>}\n\n {isRow && showContent && activeTabContent && (\n <div className={cn(\"mt-4\", contentClassName)}>{activeTabContent}</div>\n )}\n </div>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// defaultUI 루트 — panel: 카드·폼 안 / page: 에러·404 단독 카드\nexport const emptyRootVariants = cva(\"flex flex-col items-center text-center text-balance\", {\n variants: {\n layout: {\n panel: \"min-w-0 flex-1 justify-center gap-6 p-6 md:p-12\",\n page: \"w-125 gap-6 pb-6 shadow-lg rounded-lg bg-gray-50\",\n },\n },\n});\n\nexport type EmptyLayout = NonNullable<VariantProps<typeof emptyRootVariants>[\"layout\"]>;\n\n// defaultUI 아이콘 영역\nexport const emptyIconVariants = cva(\n \"flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n iconVariant: {\n plain: \"\",\n boxed: \"size-10 rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n iconVariant: \"plain\",\n },\n },\n);\n\nexport type EmptyIconVariant = NonNullable<VariantProps<typeof emptyIconVariants>[\"iconVariant\"]>;\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\nimport { emptyIconVariants } from \"../config/style\";\nimport type { EmptyLayout, EmptyIconVariant } from \"../config/style\";\n\ninterface EmptyContentProps {\n layout: EmptyLayout;\n icon?: ReactNode;\n iconVariant: EmptyIconVariant;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n titleClassName?: string;\n descriptionClassName?: string;\n iconClassName?: string;\n actionClassName?: string;\n}\n\nexport default function EmptyContent(props: EmptyContentProps) {\n const {\n layout,\n icon,\n iconVariant,\n title,\n description,\n action,\n titleClassName,\n descriptionClassName,\n iconClassName,\n actionClassName,\n } = props;\n\n const hasHeader = icon || title || description;\n const isPage = layout === \"page\";\n\n return (\n <>\n {hasHeader && (\n <div className={cn(\"flex flex-col items-center gap-2\", isPage && \"mt-14 mb-10 gap-3\", !isPage && \"max-w-sm\")}>\n {icon && <div className={cn(emptyIconVariants({ iconVariant }), iconClassName)}>{icon}</div>}\n {title && (\n <div\n className={cn(\n isPage && \"text-2xl font-bold\",\n !isPage && \"text-lg font-medium tracking-tight text-foreground\",\n titleClassName,\n )}\n >\n {title}\n </div>\n )}\n {description && (\n <p\n className={cn(\n isPage && \"text-lg text-gray-500\",\n !isPage && \"text-sm leading-relaxed text-muted-foreground\",\n descriptionClassName,\n )}\n >\n {description}\n </p>\n )}\n </div>\n )}\n {action && (\n <div\n className={cn(\n isPage && \"flex items-center justify-center w-full\",\n !isPage && \"flex w-full max-w-sm flex-col items-center gap-3\",\n actionClassName,\n )}\n >\n {isPage ? <div className=\"flex w-full justify-center gap-3\">{action}</div> : action}\n </div>\n )}\n </>\n );\n}\n","import type { ComponentProps, ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport { emptyRootVariants } from \"./config/style\";\nimport type { EmptyLayout, EmptyIconVariant } from \"./config/style\";\nimport EmptyContent from \"./ui/EmptyContent\";\n\nexport type EmptyProps = Omit<ComponentProps<\"div\">, \"title\"> & {\n // true: 기본 UI / false·미지정: children 자유 구성\n defaultUI?: boolean;\n icon?: ReactNode;\n iconVariant?: EmptyIconVariant;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n titleClassName?: string;\n descriptionClassName?: string;\n iconClassName?: string;\n actionClassName?: string;\n // defaultUI일 때만 의미 있음. true: 전체 화면 중앙(page) / 생략·false: 패널(panel)\n fullScreen?: boolean;\n};\n\nexport default function Empty(props: EmptyProps) {\n const {\n defaultUI,\n icon,\n iconVariant: iconVariantProp,\n title,\n description,\n action,\n className,\n titleClassName,\n descriptionClassName,\n iconClassName,\n actionClassName,\n fullScreen,\n children,\n ...rest\n } = props;\n\n const useFullScreen = Boolean(defaultUI && fullScreen);\n const layout: EmptyLayout = useFullScreen ? \"page\" : \"panel\";\n const iconVariant = iconVariantProp ?? (icon ? \"boxed\" : \"plain\");\n const content = defaultUI ? (\n <EmptyContent\n layout={layout}\n icon={icon}\n iconVariant={iconVariant}\n title={title}\n description={description}\n action={action}\n titleClassName={titleClassName}\n descriptionClassName={descriptionClassName}\n iconClassName={iconClassName}\n actionClassName={actionClassName}\n />\n ) : (\n children\n );\n\n const root = (\n <div\n data-slot=\"empty\"\n data-default-ui={defaultUI || undefined}\n data-full-screen={useFullScreen || undefined}\n className={cn(\n \"flex flex-col items-center text-center text-balance\",\n defaultUI ? emptyRootVariants({ layout }) : \"w-full justify-center gap-3\",\n className,\n )}\n {...rest}\n >\n {content}\n </div>\n );\n\n if (useFullScreen) {\n return <div className=\"min-h-screen flex items-center justify-center\">{root}</div>;\n }\n\n return root;\n}\n","// 모달 중첩 스택 레지스트리 (모듈 스코프 — React state 불필요)\n// 역할: topmost 판별, z-index depth 계산, scroll-lock 해제 시점 결정\nlet stack: Array<symbol> = [];\n\nfunction push(id: symbol): number {\n stack = [...stack, id];\n return stack.length;\n}\n\nfunction pop(id: symbol): void {\n stack = stack.filter((s) => s !== id);\n}\n\nfunction isTop(id: symbol): boolean {\n return stack.at(-1) === id;\n}\n\nfunction size(): number {\n return stack.length;\n}\n\nexport const modalStack = { push, pop, isTop, size };\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalContentProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n zIndex?: number;\n}\n\nexport default function ModalContent(props: ModalContentProps) {\n const { ref, children, className, zIndex, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] max-h-[85vh] z-55 flex flex-col w-full max-w-lg translate-x-[-50%] translate-y-[-50%] bg-white rounded-lg overflow-hidden shadow-xl\",\n className,\n )}\n style={zIndex !== undefined ? { zIndex } : undefined}\n data-modal-content\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type { MouseEvent, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalOverlayProps {\n ref?: Ref<HTMLDivElement>;\n isOpen: boolean;\n onClose?: () => void;\n className?: string;\n closeOnOverlayClick?: boolean;\n zIndex?: number;\n}\n\nexport default function ModalOverlay(props: ModalOverlayProps) {\n const { ref, isOpen, onClose, className, closeOnOverlayClick = true, zIndex } = props;\n\n if (!isOpen) return null;\n\n const handleOverlayClick = (e: MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose?.();\n }\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"fixed inset-0 z-54 bg-black/50\",\n \"animate-in fade-in-0 duration-150\",\n className,\n )}\n style={zIndex !== undefined ? { zIndex } : undefined}\n onClick={handleOverlayClick}\n />\n );\n}\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalBodyProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalBody(props: ModalBodyProps) {\n const { ref, children, className, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\"p-6 text-sm text-gray-700 leading-relaxed overflow-y-auto\", className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalFooterProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalFooter(props: ModalFooterProps) {\n const { ref, children, className, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 border-t border-slate-200 p-4\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalHeaderProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalHeader(props: ModalHeaderProps) {\n const { ref, children, className, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col space-y-1.5 p-6 pb-4 text-center sm:text-left border-b border-gray-200\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import {\n BadgePlus,\n FileSearch2,\n Info,\n Pencil,\n Search,\n Trash2,\n TriangleAlert,\n X,\n type LucideIcon,\n} from \"lucide-react\";\n\nimport ModalHeader from \"./ModalHeader\";\nimport { cn } from \"../../../lib/variants\";\n\nexport type ModalType = \"detail\" | \"create\" | \"edit\" | \"search\" | \"info\" | \"delete\" | \"warning\";\n\nconst MODAL_ICONS: Record<ModalType, LucideIcon> = {\n detail: FileSearch2,\n create: BadgePlus,\n edit: Pencil,\n search: Search,\n info: Info,\n delete: Trash2,\n warning: TriangleAlert,\n};\n\nexport interface ModalIconHeaderProps {\n type: ModalType;\n title: string;\n description?: string;\n onClose: () => void;\n className?: string;\n}\n\nexport default function ModalIconHeader(props: ModalIconHeaderProps) {\n const { type, title, description, onClose, className } = props;\n const Icon = MODAL_ICONS[type];\n\n return (\n <ModalHeader\n className={cn(\n \"bg-gradient-to-r from-blue-50 to-indigo-50 border-blue-100 p-0 text-left space-y-0\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between px-6 py-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-10 h-10 bg-blue-100 rounded-full shrink-0\">\n <Icon size={20} className=\"text-main\" />\n </div>\n <div>\n <h2 className=\"text-xl font-bold text-gray-900\">{title}</h2>\n {description && <p className=\"text-sm text-gray-600 mt-0.5\">{description}</p>}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flex items-center justify-center w-10 h-10 rounded-full transition-colors group cursor-pointer hover:bg-black/5 shrink-0\"\n >\n <X size={20} className=\"text-gray-400 group-hover:text-gray-600 transition-colors\" />\n </button>\n </div>\n </ModalHeader>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { Z_INDEX } from \"../../config/zIndex\";\nimport { cn } from \"../../lib/variants\";\nimport { modalStack } from \"./ui/modalStack\";\nimport ModalContent from \"./ui/ModalContent\";\nimport ModalOverlay from \"./ui/ModalOverlay\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose?: () => void;\n children: ReactNode;\n overlayClassName?: string;\n contentClassName?: string;\n closeOnOverlayClick?: boolean;\n closeOnEscape?: boolean;\n}\n\nexport default function Modal(props: ModalProps) {\n const {\n isOpen,\n onClose,\n children,\n overlayClassName,\n contentClassName,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n } = props;\n\n const idRef = useRef<symbol>(Symbol(\"modal\"));\n const [depth, setDepth] = useState(0);\n\n // useLayoutEffect: 브라우저 페인트 전에 depth를 확정 → 두 번째 모달 overlay(z=54)가\n // 첫 번째 모달 content(z=55)보다 낮은 채로 한 프레임 그려지는 현상 방지\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n const id = idRef.current;\n const d = modalStack.push(id);\n setDepth(d);\n document.body.style.overflow = \"hidden\";\n\n return () => {\n modalStack.pop(id);\n if (modalStack.size() === 0) {\n document.body.style.overflow = \"unset\";\n }\n setDepth(0);\n };\n }, [isOpen]);\n\n // Escape는 topmost 모달만 처리\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !closeOnEscape) return;\n if (!modalStack.isTop(idRef.current)) return;\n\n const activeElement = document.activeElement;\n const isInputActive =\n activeElement?.tagName === \"INPUT\" ||\n activeElement?.tagName === \"TEXTAREA\" ||\n activeElement?.tagName === \"SELECT\" ||\n activeElement?.getAttribute(\"contenteditable\") === \"true\";\n\n if (!isInputActive) {\n onClose?.();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen, onClose, closeOnEscape]);\n\n if (!isOpen) return null;\n\n const overlayZ = Z_INDEX.MODAL_OVERLAY + Math.max(0, depth - 1) * Z_INDEX.MODAL_Z_STEP;\n const contentZ = Z_INDEX.MODAL + Math.max(0, depth - 1) * Z_INDEX.MODAL_Z_STEP;\n\n return (\n <>\n <ModalOverlay\n isOpen={isOpen}\n onClose={onClose}\n className={cn(overlayClassName, depth > 1 && \"bg-black/20\")}\n closeOnOverlayClick={closeOnOverlayClick}\n zIndex={overlayZ}\n />\n <ModalContent\n className={cn(\n contentClassName,\n depth > 1 && \"shadow-[0_0_0_1px_rgba(255,255,255,0.12),0_20px_50px_-5px_rgba(0,0,0,0.4)]\",\n )}\n zIndex={contentZ}\n >\n {children}\n </ModalContent>\n </>\n );\n}\n\nexport { default as ModalBody } from \"./ui/ModalBody\";\nexport { default as ModalContent } from \"./ui/ModalContent\";\nexport { default as ModalFooter } from \"./ui/ModalFooter\";\nexport { default as ModalHeader } from \"./ui/ModalHeader\";\nexport { default as ModalIconHeader } from \"./ui/ModalIconHeader\";\nexport { default as ModalOverlay } from \"./ui/ModalOverlay\";\nexport type { ModalIconHeaderProps, ModalType } from \"./ui/ModalIconHeader\";\n","import { useEffect, useRef } from \"react\";\nimport { Info } from \"lucide-react\";\n\nimport Button from \"../../Button\";\nimport Modal from \"../../Modal\";\nimport DebouncedButton from \"../../DebouncedButton\";\n\ninterface ConfirmModalProps<T = void> {\n isOpen: boolean;\n onClose: () => void;\n onOk: (data?: T) => void;\n content: string;\n data?: T;\n title?: string;\n okText?: string;\n cancelText?: string;\n subContent?: string;\n className?: string;\n contentClassName?: string;\n isHideOkButton?: boolean;\n isHideCancelButton?: boolean;\n}\n\n/**\n * 키보드 동작\n * - Tab / Shift+Tab : 버튼 간 포커스 순환 (모달 밖으로 이동하지 않음)\n * - ← → : '예' ↔ '아니오' 포커스 전환\n * - Enter : 버튼에 포커스된 경우 해당 버튼 클릭, 미포커스(컨테이너) 시 '예' 동작\n * - Escape : 모달 닫힘 (다른 모달로 이벤트 전파 차단)\n *\n * 초기 포커스 ('예' 버튼이 표시될 때)\n * - 키보드 트리거 (Input/Textarea에서 Enter로 모달 오픈): '예' 버튼에 포커스\n * - 마우스 트리거 (버튼 클릭 등): 컨테이너에 포커스 → Enter 입력 시 '예' 동작\n *\n * 초기 포커스 (isHideOkButton=true)\n * - '아니오' 버튼에 포커스\n */\nexport default function ConfirmModal<T = void>(props: ConfirmModalProps<T>) {\n const {\n isOpen,\n onClose,\n onOk,\n content,\n subContent,\n data,\n okText = \"예\",\n cancelText = \"아니오\",\n className,\n isHideOkButton = false,\n isHideCancelButton = false,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const okButtonRef = useRef<HTMLButtonElement>(null);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n\n // 모달 열릴 때 초기 포커스 설정\n // setTimeout(0) defer: Enter keydown으로 모달이 열린 경우 해당 이벤트가 완전히\n // 처리된 뒤 포커스를 이동해 '예' 버튼이 즉시 클릭되는 현상 방지\n useEffect(() => {\n if (!isOpen) return;\n const timer = setTimeout(() => {\n if (!isHideOkButton) {\n const activeEl = document.activeElement;\n const isKeyboardTrigger =\n activeEl instanceof HTMLInputElement || activeEl instanceof HTMLTextAreaElement;\n if (isKeyboardTrigger) {\n okButtonRef.current?.focus();\n } else {\n containerRef.current?.focus();\n }\n } else {\n const target =\n cancelButtonRef.current ??\n containerRef.current?.querySelector<HTMLElement>(\"button:not([disabled])\");\n target?.focus();\n }\n }, 0);\n return () => clearTimeout(timer);\n }, [isOpen, isHideOkButton]);\n\n const handleOkClick = async () => {\n await onOk(data);\n onClose();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n if (e.key === \"Escape\") {\n onClose();\n return;\n }\n\n // 컨테이너에 포커스된 상태(마우스 트리거)에서 Enter → '예' 동작\n if (e.key === \"Enter\" && document.activeElement === containerRef.current) {\n e.preventDefault();\n handleOkClick();\n return;\n }\n\n // ← → 로 버튼 간 포커스 이동\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n const active = document.activeElement;\n if (active === okButtonRef.current) {\n cancelButtonRef.current?.focus();\n } else if (active === cancelButtonRef.current) {\n okButtonRef.current?.focus();\n } else {\n containerRef.current?.querySelector<HTMLElement>(\"button:not([disabled])\")?.focus();\n }\n return;\n }\n\n // Tab 포커스 트랩\n if (e.key !== \"Tab\") return;\n const focusable = Array.from(\n containerRef.current?.querySelectorAll<HTMLElement>(\"button:not([disabled])\") ?? [],\n );\n if (focusable.length === 0) return;\n const first = focusable[0] as HTMLElement;\n const last = focusable[focusable.length - 1] as HTMLElement;\n if (e.shiftKey) {\n if (document.activeElement === first || document.activeElement === containerRef.current) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n contentClassName={`confirm-modal-flag bg-white px-6 py-3.5 ${className} top-[20%]`}\n >\n <div ref={containerRef} tabIndex={-1} className=\"flex flex-col outline-none\" onKeyDown={handleKeyDown}>\n <div className=\"flex py-2.5\">\n <div className=\"flex items-start pt-1\">\n <Info className=\"size-6 flex-shrink-0 rounded-full bg-blue-400 text-white\" />\n </div>\n <p className=\"font-sebang w-full pt-0.75 pl-2.5 whitespace-pre-line\">\n {content}\n <br />\n {subContent && (\n <span className=\"font-sebang text-sm whitespace-pre-line text-gray-600\">{subContent}</span>\n )}\n </p>\n </div>\n\n <div className=\"flex h-8 items-center justify-end gap-2\">\n {!isHideOkButton && (\n <DebouncedButton\n ref={okButtonRef}\n debounceDelay={500}\n variant=\"outline\"\n onClick={handleOkClick}\n className=\"focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-1\"\n >\n {okText}\n </DebouncedButton>\n )}\n {!isHideCancelButton && (\n <Button\n ref={cancelButtonRef}\n variant=\"outline\"\n onClick={onClose}\n className=\"focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-1\"\n >\n {cancelText}\n </Button>\n )}\n </div>\n </div>\n </Modal>\n );\n}\n","import { createRoot, type Root } from \"react-dom/client\";\n\nimport ConfirmModal from \"../ui/ConfirmModal\";\n\nlet container: HTMLElement | null = null;\nlet root: Root | null = null;\nlet currentResolve: ((v: unknown) => void) | null = null;\nlet isOpen = false;\n\nfunction ensureRoot() {\n if (!container) {\n container = document.createElement(\"div\");\n container.id = \"confirm-modal-portal\";\n document.body.appendChild(container);\n }\n if (!root) {\n root = createRoot(container);\n }\n}\n\nexport interface ConfirmOptions<T = void> {\n content: string;\n title?: string;\n okText?: string;\n cancelText?: string;\n subContent?: string;\n variant?: \"danger\" | \"warning\" | \"info\" | \"success\";\n data?: T;\n onOk?: (data?: T) => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n isHideOkButton?: boolean;\n isHideCancelButton?: boolean;\n className?: string;\n}\n\nexport function confirmModal<T = void>(options: ConfirmOptions<T>): Promise<T | undefined> {\n if (isOpen && currentResolve) return Promise.resolve(undefined);\n\n ensureRoot();\n\n isOpen = true;\n\n const promise = new Promise<T | undefined>((resolve) => {\n currentResolve = resolve as unknown as null;\n });\n\n const cleanup = async (value?: T, kind: \"ok\" | \"cancel\" = \"cancel\") => {\n try {\n root!.render(null);\n isOpen = false;\n\n if (kind === \"ok\") {\n await options.onOk?.(value);\n } else {\n await options.onCancel?.();\n }\n } finally {\n currentResolve?.(value);\n currentResolve = null;\n }\n };\n\n const handleOk = (data?: T) => cleanup(data, \"ok\");\n const handleCloseOrCancel = () => cleanup(undefined, \"cancel\");\n\n root!.render(\n <ConfirmModal\n isOpen\n onOk={handleOk}\n onClose={handleCloseOrCancel}\n className={options.className}\n {...options}\n />,\n );\n\n return promise;\n}\n","import type { ReactNode } from \"react\";\n\nimport Pagination from \"../../Pagination\";\nimport type { PaginationProps } from \"../../Pagination\";\n\nexport interface TableFooterProps {\n paginationInfo?: PaginationProps;\n renderLeft?: ReactNode;\n renderRight?: ReactNode;\n}\n\nexport default function TableFooter(props: TableFooterProps) {\n const { paginationInfo, renderLeft, renderRight } = props;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-center justify-between py-4 min-h-16\">\n <div className=\"flex justify-start flex-1 min-w-0\">{renderLeft}</div>\n {paginationInfo && (\n <div className=\"px-5\">\n <Pagination {...paginationInfo} />\n </div>\n )}\n <div className=\"flex justify-end flex-1 min-w-0\">{renderRight}</div>\n </div>\n </div>\n );\n}\n","/* eslint-disable react-hooks/set-state-in-effect */\nimport type { CSSProperties } from \"react\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nimport { Z_INDEX } from \"../../../config/zIndex\";\nimport type { Column } from \"../config/type\";\n\ntype TableFixed = \"left\" | \"right\";\n\nfunction calculateFixedPositions<T>(columns: Array<Column<T>>, isHeader: boolean = false) {\n const leftFixed: Record<string, string> = {};\n const rightFixed: Record<string, string> = {};\n let leftOffset = 0;\n let rightOffset = 0;\n\n columns.forEach((column) => {\n if (column.fixed === \"left\") {\n leftFixed[column.key] = `${leftOffset}px`;\n const targetNode = document.getElementById(`${column.key}${isHeader ? \"-header\" : \"-body\"}`);\n const width = targetNode?.getBoundingClientRect().width ?? 0;\n leftOffset += width;\n }\n });\n\n const rightFixedColumns = columns.filter((col) => col.fixed === \"right\").reverse();\n rightFixedColumns.forEach((column) => {\n rightFixed[column.key] = `${rightOffset}px`;\n const targetNode = document.getElementById(`${column.key}${isHeader ? \"-header\" : \"-body\"}`);\n const width = targetNode?.getBoundingClientRect().width ?? 0;\n rightOffset += width;\n });\n\n return { leftFixed, rightFixed };\n}\n\nfunction getFixedStyle<T>(\n column: Column<T>,\n leftFixed: Record<string, string>,\n rightFixed: Record<string, string>,\n isHeader = false,\n isCurrentFixed = false,\n) {\n const baseStyle: CSSProperties = {};\n if (!column.fixed) return;\n\n baseStyle.position = \"sticky\";\n baseStyle.zIndex = isHeader ? Z_INDEX.TABLE_FIXED_HEADER_CELL : Z_INDEX.TABLE_FIXED_CELL;\n\n if (column.fixed === \"left\") {\n baseStyle.left = leftFixed[column.key];\n if (isCurrentFixed) {\n baseStyle.boxShadow = \"3px 0 4px rgba(0, 0, 0, 0.06)\";\n }\n }\n\n if (column.fixed === \"right\") {\n baseStyle.right = rightFixed[column.key];\n if (isCurrentFixed) {\n baseStyle.boxShadow = \"-3px 0 4px rgba(0, 0, 0, 0.06)\";\n }\n }\n\n return baseStyle;\n}\n\nfunction getAbsoluteWidths<T>(columns: Array<Column<T>>) {\n return columns.reduce<Record<string, string>>((acc, col) => {\n const targetNode = document.getElementById(`${col.key}-body`);\n const width = targetNode?.getBoundingClientRect().width ?? 0;\n acc[col.key] = `${width}px`;\n return acc;\n }, {});\n}\n\ninterface Cell {\n targetKey: string;\n startWidth: string;\n position: TableFixed;\n}\n\ntype TableInfo = Record<string, string>;\ntype TableFixedInfo = Record<TableFixed, TableInfo>;\ntype FixedGroups = Record<TableFixed, Array<Cell>>;\n\nexport default function useTableFixed<T>(columns: Array<Column<T>>, isHeader: boolean = false) {\n const [tableFixedInfo, setTableFixedInfo] = useState<TableFixedInfo>({\n left: {},\n right: {},\n });\n const [currentFixedGroup, setCurrentFixedGroup] = useState<Array<Cell> | null>(null);\n const [absoluteWidths, setAbsoluteWidths] = useState<TableInfo>({});\n\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const mutationObserverRef = useRef<MutationObserver | null>(null);\n\n const tableRef = document.querySelector(\"#table-layout\");\n\n const handleResize = useCallback(() => {\n const nextAbsoluteWidths = getAbsoluteWidths(columns);\n const { leftFixed, rightFixed } = calculateFixedPositions(columns, isHeader);\n setTableFixedInfo({ left: leftFixed, right: rightFixed });\n setAbsoluteWidths(nextAbsoluteWidths);\n }, [columns, isHeader]);\n\n const processFixedGroup = useCallback(\n (targetColumns: Array<Column<T>>, position: TableFixed, maxScrollLeft?: number): Array<Cell> => {\n const fixedCells: Array<Cell> = [];\n let accumulatedWidth = 0;\n let currentGroup: Cell | null = null;\n\n const columnsByDirection = position === \"right\" ? [...targetColumns].reverse() : targetColumns;\n\n columnsByDirection.forEach((cur) => {\n const columnWidth = Number(absoluteWidths[cur.key]?.replace(\"px\", \"\")) || 0;\n\n if (cur.fixed === position) {\n const startWidth =\n position === \"right\" && maxScrollLeft !== undefined\n ? `${Math.max(0, maxScrollLeft - accumulatedWidth)}px`\n : `${accumulatedWidth}px`;\n\n if (!currentGroup || currentGroup.position !== position) {\n currentGroup = {\n position,\n startWidth,\n targetKey: cur.key,\n };\n fixedCells.push({\n position,\n startWidth,\n targetKey: cur.key,\n });\n } else {\n currentGroup.targetKey = cur.key;\n fixedCells[fixedCells.length - 1].targetKey = cur.key;\n }\n } else {\n accumulatedWidth += columnWidth;\n currentGroup = null;\n }\n });\n\n return position === \"right\" ? fixedCells.reverse() : fixedCells;\n },\n [absoluteWidths],\n );\n\n const getFixedGroup = useCallback((): FixedGroups => {\n const tableContainer = document.querySelector(\"#table-layout\");\n if (!tableContainer) {\n return { left: [], right: [] };\n }\n\n const tableWidth = tableContainer.scrollWidth;\n const containerWidth = tableContainer.clientWidth;\n const maxScrollLeft = Math.max(0, tableWidth - containerWidth);\n\n return {\n left: processFixedGroup(columns, \"left\"),\n right: processFixedGroup(columns, \"right\", maxScrollLeft),\n };\n }, [columns, processFixedGroup]);\n\n const getCurrentFixedGroup = useCallback(\n (scrollLeft: number, fixedTargetGroup: FixedGroups): Array<Cell> => {\n const result: Array<Cell> = [];\n\n const leftFixedCell = [...fixedTargetGroup.left]\n .reverse()\n .find((cell) => Number(cell.startWidth.replace(\"px\", \"\")) < scrollLeft);\n const rightFixedCell = fixedTargetGroup.right.find(\n (cell) => Number(cell.startWidth.replace(\"px\", \"\")) > scrollLeft,\n );\n\n if (leftFixedCell) {\n result.push(leftFixedCell);\n }\n if (rightFixedCell) {\n result.push(rightFixedCell);\n }\n\n return result;\n },\n [],\n );\n\n const handleScrollTable = useCallback(() => {\n const fixedGroup = getFixedGroup();\n const scrollLeft = tableRef instanceof HTMLElement ? tableRef.scrollLeft : 0;\n const nextCurrentFixedGroup = getCurrentFixedGroup(scrollLeft, fixedGroup);\n setCurrentFixedGroup(nextCurrentFixedGroup);\n }, [getCurrentFixedGroup, getFixedGroup, tableRef]);\n\n useEffect(() => {\n if (!(tableRef instanceof HTMLElement)) {\n return;\n }\n\n tableRef.addEventListener(\"scroll\", handleScrollTable);\n return () => {\n tableRef.removeEventListener(\"scroll\", handleScrollTable);\n };\n }, [handleScrollTable, tableRef]);\n\n useLayoutEffect(() => {\n handleResize();\n\n const onResize = () => {\n handleResize();\n };\n window.addEventListener(\"resize\", onResize);\n\n const firstKey = columns[0]?.key;\n const cell = firstKey ? document.getElementById(`${firstKey}${isHeader ? \"-header\" : \"-body\"}`) : null;\n\n const tableEl =\n (cell?.closest(\"table\") as HTMLElement | null) ||\n (document.querySelector(\"table.table-fixed\") as HTMLElement | null);\n\n if (tableEl && \"ResizeObserver\" in window) {\n resizeObserverRef.current = new ResizeObserver(handleResize);\n resizeObserverRef.current.observe(tableEl);\n }\n\n const tbodyEl = tableEl?.querySelector(\"tbody\");\n if (tbodyEl) {\n mutationObserverRef.current = new MutationObserver(handleResize);\n mutationObserverRef.current.observe(tbodyEl, {\n childList: true,\n subtree: true,\n });\n }\n\n return () => {\n window.removeEventListener(\"resize\", onResize);\n resizeObserverRef.current?.disconnect();\n mutationObserverRef.current?.disconnect();\n };\n }, [columns, handleResize, isHeader]);\n\n const isColumnFixed = useCallback(\n (columnKey: string) => {\n if (!currentFixedGroup?.length) {\n return false;\n }\n return currentFixedGroup.some((cell) => cell.targetKey === columnKey);\n },\n [currentFixedGroup],\n );\n\n const getColumnFixedStyle = (column: Column<T>) => {\n const isCurrentFixed = isColumnFixed(column.key);\n return getFixedStyle(column, tableFixedInfo.left, tableFixedInfo.right, isHeader, isCurrentFixed);\n };\n\n return { getColumnFixedStyle };\n}\n","import type { SVGProps } from \"react\";\n\ninterface ArrowIconProps extends SVGProps<SVGSVGElement> {\n direction?: \"up\" | \"down\";\n}\n\nexport default function ArrowIcon(props: ArrowIconProps) {\n const { direction = \"down\", style, ...reset } = props;\n\n const rotation = direction === \"up\" ? \"rotate(180deg)\" : undefined;\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 640 640\"\n fill=\"currentColor\"\n style={{\n transform: rotation,\n ...style,\n }}\n {...reset}\n >\n <path d=\"M297.4 566.6C309.9 579.1 330.2 579.1 342.7 566.6L502.7 406.6C515.2 394.1 515.2 373.8 502.7 361.3C490.2 348.8 469.9 348.8 457.4 361.3L352 466.7L352 96C352 78.3 337.7 64 320 64C302.3 64 288 78.3 288 96L288 466.7L182.6 361.3C170.1 348.8 149.8 348.8 137.3 361.3C124.8 373.8 124.8 394.1 137.3 406.6L297.3 566.6z\" />\n </svg>\n );\n}\n","import { useMemo, useState, type DragEvent } from \"react\";\nimport type { Column, SortOption, SortOrder } from \"../config/type\";\nimport useTableFixed from \"../hooks/useTableFixed\";\nimport ArrowIcon from \"./ui/ArrowIcon\";\n\nconst DEFAULT_SORT_KEY = \"\";\nconst DEFAULT_SORT_ORDER: SortOrder = \"asc\";\nconst DEFAULT_SORT_OPTIONS: SortOption = {\n visibleType: \"always\",\n sortKey: \"\",\n sortOrder: \"asc\",\n};\ninterface TableHeaderProps<T> {\n columns: Array<Column<T>>;\n getAlignStyle: (align: string) => string;\n sortOption?: SortOption;\n onSortChange?: (sortKey: string, sortOrder: SortOrder) => void;\n onColumnDragStartCapture?: (columnKey: string) => void;\n onColumnDragStart?: (columnKey: string, event: DragEvent<HTMLTableCellElement>) => void;\n onColumnDrop?: (columnKey: string) => void;\n onColumnDragEnd?: () => void;\n onColumnDragOver?: (event: DragEvent<HTMLTableCellElement>) => void;\n isColumnDraggable?: (columnKey: string) => boolean;\n}\n\nexport default function TableHeader<T>(props: TableHeaderProps<T>) {\n const {\n columns: customColumns,\n getAlignStyle,\n sortOption = DEFAULT_SORT_OPTIONS,\n onSortChange,\n onColumnDragStartCapture,\n onColumnDragStart,\n onColumnDrop,\n onColumnDragEnd,\n onColumnDragOver,\n isColumnDraggable,\n } = props;\n\n const [internalSortState, setInternalSortState] = useState<{\n columnKey: string | null;\n order: \"asc\" | \"desc\" | null;\n }>({\n columnKey: null,\n order: null,\n });\n\n const [hoveredColumn, setHoveredColumn] = useState<string | null>(null);\n\n const sortState = useMemo(\n () => ({\n columnKey: sortOption?.sortKey ?? internalSortState.columnKey,\n order: sortOption?.sortOrder ?? internalSortState.order,\n }),\n [internalSortState.columnKey, internalSortState.order, sortOption?.sortKey, sortOption?.sortOrder],\n );\n\n const columns = useMemo(() => {\n return customColumns.map((column) => {\n const { key } = column;\n const isCheckbox = key === \"__checkbox__\";\n\n return {\n ...column,\n width: isCheckbox ? \"40px\" : column.width,\n minWidth: isCheckbox ? \"40px\" : (column.minWidth ?? column.width),\n maxWidth: isCheckbox ? \"40px\" : column.maxWidth,\n align: isCheckbox ? (\"center\" as const) : ((column.align ?? \"left\") as \"left\" | \"center\" | \"right\"),\n };\n });\n }, [customColumns]);\n\n const { getColumnFixedStyle } = useTableFixed<T>(columns, true);\n\n const handleSort = (columnKey: string) => {\n if (onSortChange) {\n const isActive = sortOption?.sortKey === columnKey;\n const currentOrder = sortOption?.sortOrder;\n\n if (isActive) {\n if (currentOrder === \"desc\") {\n onSortChange(columnKey, \"asc\");\n } else if (currentOrder === \"asc\") {\n onSortChange(DEFAULT_SORT_KEY, DEFAULT_SORT_ORDER);\n } else {\n onSortChange(columnKey, \"desc\");\n }\n } else {\n onSortChange(columnKey, \"desc\");\n }\n return;\n }\n\n setInternalSortState((prev) => {\n if (prev.columnKey !== columnKey) {\n return { columnKey, order: \"desc\" };\n }\n if (prev.order === \"desc\") {\n return { columnKey, order: \"asc\" };\n }\n return { columnKey: null, order: null };\n });\n };\n\n const renderSortIcon = (columnKey: string) => {\n const isActive = sortState.columnKey === columnKey;\n const isHovered = hoveredColumn === columnKey;\n const currentOrder = sortState.order;\n\n if (isActive && currentOrder === \"asc\") {\n return <ArrowIcon direction=\"up\" className=\"size-4 text-gray-800 pt-[0.5px]\" />;\n }\n\n if (isActive && currentOrder === \"desc\") {\n return <ArrowIcon direction=\"down\" className=\"size-4 text-gray-800 pt-[0.5px]\" />;\n }\n\n const visibleType = sortOption?.visibleType ?? \"always\";\n const shouldShowInactive = visibleType === \"always\" || isHovered;\n if (shouldShowInactive) {\n return <ArrowIcon direction=\"down\" className=\"size-4 text-gray-400 pt-[0.5px]\" />;\n }\n\n return null;\n };\n\n const getDragProps = (column: Column<T>) => {\n const draggable = isColumnDraggable?.(column.key) ?? false;\n if (!draggable) {\n return {\n draggable: false as const,\n \"data-col-key\": column.key,\n };\n }\n return {\n draggable: true as const,\n \"data-col-key\": column.key,\n onDragStartCapture: () => onColumnDragStartCapture?.(column.key),\n onDragStart: (event: DragEvent<HTMLTableCellElement>) => onColumnDragStart?.(column.key, event),\n onDragEnd: onColumnDragEnd,\n onDragOver: onColumnDragOver,\n onDrop: () => onColumnDrop?.(column.key),\n };\n };\n\n const renderColumnTitle = (column: Column<T>, isClickableHead: string) => {\n const baseClasses = \"pt-0.5 select-none\";\n const subTitleClasses =\n column.key === \"subTitle\"\n ? \"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-800\"\n : \"\";\n\n if (column.align === \"left\") {\n return (\n <div className=\"flex item-center w-full\">\n <div className=\"flex items-center justify-center\">\n <span className={`pl-3 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>{column.title}</span>\n </div>\n {column.sortable && (\n <div\n className={`w-5 flex flex-col gap-[1.5px] items-center justify-center cursor-pointer ${isClickableHead}`}\n >\n {renderSortIcon(column.key)}\n </div>\n )}\n </div>\n );\n }\n\n if (column.align === \"center\") {\n return (\n <div className=\"flex justify-center w-full\">\n <div className={`flex items-center justify-center ${column.sortable ? \"pl-5\" : \"\"}`}>\n <span className={`whitespace-nowrap ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>\n {column.title}\n </span>\n </div>\n {column.sortable && (\n <div\n className={`w-5 flex flex-col gap-[1.5px] items-center justify-center cursor-pointer ${isClickableHead}`}\n >\n {renderSortIcon(column.key)}\n </div>\n )}\n </div>\n );\n }\n\n if (column.align === \"right\") {\n return (\n <div className=\"flex justify-end w-full\">\n {column.sortable && (\n <div\n className={`w-5 flex flex-col gap-[1.5px] items-center justify-center cursor-pointer ${isClickableHead}`}\n >\n {renderSortIcon(column.key)}\n </div>\n )}\n <div className=\"flex items-center justify-center\">\n <span className={`pr-3 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>{column.title}</span>\n </div>\n </div>\n );\n }\n\n return (\n <span className={`px-1.5 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>{column.title}</span>\n );\n };\n\n const createGroupHeaders = () => {\n const mainGroups: Record<string, Record<string, Array<Column<T>>>> = {};\n const subGroups: Record<string, Array<Column<T>>> = {};\n\n const ensureMainGroup = (mainTitle: string) => {\n if (!mainGroups[mainTitle]) {\n mainGroups[mainTitle] = {};\n }\n return mainGroups[mainTitle];\n };\n\n const ensureSubGroupInMain = (mainTitle: string, subTitle: string) => {\n const mainGroup = ensureMainGroup(mainTitle);\n if (!mainGroup[subTitle]) {\n mainGroup[subTitle] = [];\n }\n return mainGroup[subTitle];\n };\n\n const ensureSubGroup = (subTitle: string) => {\n if (!subGroups[subTitle]) {\n subGroups[subTitle] = [];\n }\n return subGroups[subTitle];\n };\n\n columns.forEach((column) => {\n if (column.mainTitle && column.subTitle) {\n ensureSubGroupInMain(column.mainTitle, column.subTitle).push(column);\n } else if (column.subTitle) {\n ensureSubGroup(column.subTitle).push(column);\n }\n });\n\n return { mainGroups, subGroups };\n };\n\n const { mainGroups, subGroups } = createGroupHeaders();\n const hasMainGroups = Object.keys(mainGroups).length > 0;\n const hasSubGroups = Object.keys(subGroups).length > 0;\n\n if (!hasMainGroups && !hasSubGroups) {\n return (\n <thead className=\"w-full sticky top-0 z-10\">\n <tr className=\"w-full h-10\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n return (\n <th\n id={`${column.key}-header`}\n key={`${column.key}-${idx}`}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-2 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden last:border-r-0 transition-all ${isClickableHead}`}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n onMouseEnter={() => column.sortable && setHoveredColumn(column.key)}\n onMouseLeave={() => column.sortable && setHoveredColumn(null)}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n <div\n className=\"w-full\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: getAlignStyle(column.align ?? \"\"),\n }}\n >\n {column.key === \"__checkbox__\" ? (\n <div className=\"px-1.5 pt-0.5 truncate select-none\">{column.title}</div>\n ) : (\n <div className=\"flex items-center w-full\">{renderColumnTitle(column, isClickableHead)}</div>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n }\n\n if (hasMainGroups) {\n return (\n <thead className=\"w-full sticky top-0 z-10\">\n <tr className=\"w-full h-8\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const fixedStyle = getColumnFixedStyle(column);\n\n if (column.mainTitle && column.subTitle) {\n const mainGroup = mainGroups[column.mainTitle];\n if (!mainGroup) {\n return null;\n }\n const mainGroupColumns = Object.values(mainGroup).flat();\n const isFirstInMainGroup = mainGroupColumns[0] === column;\n const mainGroupSpan = mainGroupColumns.length;\n const mainTitleRowSpan = (column as Column<T> & { mainTitleRowSpan?: number }).mainTitleRowSpan;\n\n if (isFirstInMainGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`main-group-${column.mainTitle}-${idx}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={mainGroupSpan}\n rowSpan={mainTitleRowSpan ?? 1}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.mainTitle}\n </th>\n );\n }\n\n return null;\n }\n\n if (column.subTitle) {\n const groupColumns = subGroups[column.subTitle];\n if (!groupColumns) {\n return null;\n }\n const isFirstInGroup = groupColumns[0] === column;\n const groupSpan = groupColumns.length;\n\n if (isFirstInGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`sub-group-${column.subTitle}-${idx}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={groupSpan}\n rowSpan={2}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.subTitle}\n </th>\n );\n }\n\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={`${column.key}-${idx}`}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all ${column.sortable ? \"cursor-pointer\" : \"\"}`}\n rowSpan={3}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n {renderColumnTitle(column, column.sortable ? \"cursor-pointer\" : \"\")}\n </th>\n );\n })}\n </tr>\n\n <tr className=\"w-full h-8\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const fixedStyle = getColumnFixedStyle(column);\n\n if (!column.mainTitle || !column.subTitle) {\n return null;\n }\n\n const mainGroup = mainGroups[column.mainTitle];\n if (!mainGroup) {\n return null;\n }\n\n const mainGroupFirstColumn = Object.values(mainGroup).flat()[0];\n const firstRowSpan = (mainGroupFirstColumn as Column<T> & { mainTitleRowSpan?: number }).mainTitleRowSpan;\n if (firstRowSpan && firstRowSpan >= 2) {\n return null;\n }\n\n const subGroup = mainGroup[column.subTitle];\n if (!subGroup) {\n return null;\n }\n const isFirstInSubGroup = subGroup[0] === column;\n const subGroupSpan = subGroup.length;\n\n if (isFirstInSubGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`sub-group-${column.mainTitle}-${column.subTitle}-${idx}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={subGroupSpan}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.subTitle}\n </th>\n );\n }\n\n return null;\n })}\n </tr>\n\n <tr className=\"w-full h-8\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n if (!column.mainTitle && !column.subTitle) {\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={`${column.key}-${idx}`}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden transition-all ${isClickableHead}`}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n <div\n className=\"w-full\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: getAlignStyle(column.align ?? \"\"),\n }}\n >\n <div className=\"flex items-center w-full\">{renderColumnTitle(column, isClickableHead)}</div>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n }\n\n return (\n <thead className=\"w-full sticky top-0 z-10\">\n <tr className=\"w-full h-8 \">\n {columns.map((column) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n if (column.subTitle) {\n const groupColumns = subGroups[column.subTitle];\n if (!groupColumns) {\n return null;\n }\n const isFirstInGroup = groupColumns[0] === column;\n const groupSpan = groupColumns.length;\n\n if (isFirstInGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`group-${column.subTitle}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={groupSpan}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.subTitle}\n </th>\n );\n }\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={column.key}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all ${column.sortable ? \"cursor-pointer\" : \"\"}`}\n rowSpan={2}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n {renderColumnTitle(column, isClickableHead)}\n </th>\n );\n })}\n </tr>\n\n <tr className=\"w-full h-8\">\n {columns.map((column) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n if (!column.subTitle) {\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={column.key}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden transition-all ${isClickableHead}`}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n <div\n className=\"w-full\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: getAlignStyle(column.align ?? \"\"),\n }}\n >\n {column.key === \"__checkbox__\" ? (\n <div className=\"px-1.5 pt-0.5 truncate select-none\">{column.title}</div>\n ) : (\n <div className=\"flex items-center w-full\">{renderColumnTitle(column, isClickableHead)}</div>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n}\n","import Skeleton from \"../../../Skeleton\";\n\nimport type { Column } from \"../config/type\";\n\ninterface SkeletonTdProps<T> {\n col: Column<T>;\n showSquare?: boolean;\n}\n\nexport default function SkeletonTd<T>(props: SkeletonTdProps<T>) {\n const { col, showSquare = false } = props;\n\n return (\n <td\n className={`${col.key === \"__checkbox__\" ? \"p-0\" : \"px-2 py-4\"} whitespace-nowrap text-sm border-r border-b border-gray-200/70 last:border-r-0`}\n style={{\n width: col.width as string,\n minWidth: (col.minWidth as string) || (col.width as string),\n maxWidth: col.key === \"__checkbox__\" ? ((col.maxWidth as string) || (col.width as string)) : undefined,\n }}\n >\n <div className=\"flex items-center justify-center min-h-4\">\n {showSquare ? (\n <Skeleton className=\"size-4 rounded-xs\" />\n ) : (\n <Skeleton className=\"h-1.5 rounded-sm\" style={{ width: \"calc(100% - 20px)\" }} />\n )}\n </div>\n </td>\n );\n}\n","import type { DragEvent, ReactNode } from \"react\";\n\ninterface TableDataRowProps {\n record: Record<string, unknown>;\n rowIdx: number;\n rowId: string;\n leftColspan: number;\n rightColspan: number;\n draggable?: boolean;\n onDragStart?: (rowId: string, event: DragEvent<HTMLTableRowElement>) => void;\n onDragOver?: (event: DragEvent<HTMLTableRowElement>) => void;\n onDrop?: (rowId: string) => void;\n onDragEnd?: () => void;\n renderLeadingPinnedCols: (record: Record<string, unknown>, rowIdx: number) => ReactNode;\n renderVisibleGroupCols: (record: Record<string, unknown>, rowIdx: number) => ReactNode;\n renderTrailingPinnedCols: (record: Record<string, unknown>, rowIdx: number) => ReactNode;\n}\n\nexport default function TableDataRow(props: TableDataRowProps) {\n const {\n record,\n rowIdx,\n rowId,\n leftColspan,\n rightColspan,\n draggable = false,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n renderLeadingPinnedCols,\n renderVisibleGroupCols,\n renderTrailingPinnedCols,\n } = props;\n\n return (\n <tr\n className=\"group bg-white hover:bg-gray-100\"\n draggable={draggable}\n onDragStart={(event) => onDragStart?.(rowId, event)}\n onDragOver={onDragOver}\n onDrop={() => onDrop?.(rowId)}\n onDragEnd={onDragEnd}\n >\n {renderLeadingPinnedCols(record, rowIdx)}\n {leftColspan > 0 && <td colSpan={leftColspan} style={{ padding: 0, border: \"none\" }} />}\n {renderVisibleGroupCols(record, rowIdx)}\n {rightColspan > 0 && <td colSpan={rightColspan} style={{ padding: 0, border: \"none\" }} />}\n {renderTrailingPinnedCols(record, rowIdx)}\n </tr>\n );\n}\n","import { TriangleAlert } from \"lucide-react\";\n\nimport Empty from \"../../../Empty\";\n\ninterface TableEmptyProps {\n columnCount: number;\n}\n\nexport default function TableEmpty(props: TableEmptyProps) {\n const { columnCount } = props;\n\n return (\n <tr>\n <td colSpan={columnCount} className=\"border-none bg-white p-0 align-middle\">\n <Empty className=\"flex min-h-72 w-full flex-col items-center justify-center gap-1\">\n <TriangleAlert className=\"size-8 shrink-0 text-gray-400\" strokeWidth={1.5} />\n <span className=\"text-lg text-gray-500\">등록된 데이터가 없습니다.</span>\n </Empty>\n </td>\n </tr>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport Tooltip from \"../../../Tooltip\";\n\ninterface TableCellContentProps {\n cellContent: ReactNode;\n tooltipText: string;\n align: string;\n tooltipConfig: \"always\" | \"overflow\" | false;\n onCellClick?: () => void;\n}\n\nexport default function TableCellContent(props: TableCellContentProps) {\n const { cellContent, tooltipText, align, tooltipConfig, onCellClick } = props;\n const textRef = useRef<HTMLDivElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useEffect(() => {\n if (tooltipConfig !== \"overflow\") return;\n const el = textRef.current;\n if (!el) return;\n const check = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\n check();\n const observer = new ResizeObserver(check);\n observer.observe(el);\n return () => observer.disconnect();\n }, [tooltipConfig]);\n\n const shouldShowTooltip = tooltipConfig === \"always\" || (tooltipConfig === \"overflow\" && isOverflowing);\n\n const textAlign = align === \"center\" ? \"center\" : align === \"right\" ? \"right\" : (\"left\" as const);\n\n return (\n <div\n ref={textRef}\n className={`ellipsis-1-line table-item w-full min-w-0 ${onCellClick ? \"hover:text-main cursor-pointer\" : \"cursor-default\"}`}\n style={{ textAlign }}\n onClick={onCellClick}\n >\n {shouldShowTooltip ? (\n <Tooltip content={tooltipText} position=\"bottom\" asChild>\n <span>{cellContent}</span>\n </Tooltip>\n ) : (\n cellContent\n )}\n </div>\n );\n}\n","import type { ColumnDef } from \"@tanstack/react-table\";\n\nimport { Z_INDEX } from \"../../../config/zIndex\";\nimport type { Column } from \"../config/type\";\n\nexport interface ColumnDragOverlayItem {\n element: HTMLElement;\n top: number;\n width: number;\n height: number;\n}\n\nexport function getAlignStyle(align: string) {\n return align === \"left\" ? \"flex-start\" : align === \"center\" ? \"center\" : \"flex-end\";\n}\n\nexport function applyColDefaults<T>(col: Column<T>): Column<T> {\n const width = col.key === \"__checkbox__\" ? \"40px\" : (col.width ?? col.minWidth);\n const align =\n col.key === \"__checkbox__\" ? (\"center\" as const) : ((col.align ?? \"left\") as \"left\" | \"center\" | \"right\");\n return { ...col, width, align };\n}\n\nexport function parseColPx<T>(col: Column<T>): number {\n const w = col.width ?? col.minWidth;\n if (typeof w === \"string\") {\n const px = parseFloat(w);\n return Number.isNaN(px) ? 100 : px;\n }\n return typeof w === \"number\" ? w : 100;\n}\n\nexport function buildColumnDefs<T>(columns: Array<Column<T>>): Array<ColumnDef<T>> {\n return columns.map(\n (col): ColumnDef<T> => ({\n id: col.key,\n accessorFn: (row) => row[col.key as keyof T],\n enableSorting: col.sortable ?? false,\n size: parseColPx(col),\n meta: { column: col },\n }),\n );\n}\n\nexport function createColumnDragGhost(items: Array<ColumnDragOverlayItem>) {\n const ghost = document.createElement(\"div\");\n ghost.style.position = \"fixed\";\n ghost.style.pointerEvents = \"none\";\n ghost.style.zIndex = String(Z_INDEX.TOP);\n ghost.style.overflow = \"hidden\";\n ghost.style.boxSizing = \"border-box\";\n\n const rects = items.map((item) => item.element.getBoundingClientRect());\n const unionLeft = Math.min(...rects.map((r) => r.left));\n const unionTop = Math.min(...rects.map((r) => r.top));\n const unionRight = Math.max(...rects.map((r) => r.right));\n const unionBottom = Math.max(...rects.map((r) => r.bottom));\n\n const ghostWidth = Math.max(unionRight - unionLeft, 1);\n const ghostHeight = Math.max(unionBottom - unionTop, 1);\n\n ghost.style.left = `${unionLeft}px`;\n ghost.style.top = `${unionTop}px`;\n ghost.style.width = `${ghostWidth}px`;\n ghost.style.height = `${ghostHeight}px`;\n\n items.forEach((item, index) => {\n const rect = rects[index];\n const cloned = item.element.cloneNode(true) as HTMLElement;\n const style = window.getComputedStyle(item.element);\n\n cloned.setAttribute(\"class\", \"\");\n cloned.setAttribute(\"style\", \"\");\n\n cloned.style.position = \"absolute\";\n cloned.style.left = `${rect.left - unionLeft}px`;\n cloned.style.top = `${rect.top - unionTop}px`;\n cloned.style.width = `${item.width}px`;\n cloned.style.height = `${item.height}px`;\n cloned.style.margin = \"0\";\n cloned.style.padding = style.padding;\n cloned.style.boxSizing = \"border-box\";\n cloned.style.background = style.background;\n cloned.style.color = style.color;\n cloned.style.font = style.font;\n cloned.style.border = style.border;\n cloned.style.borderRadius = style.borderRadius;\n cloned.style.display = style.display;\n cloned.style.alignItems = style.alignItems;\n cloned.style.justifyContent = style.justifyContent;\n cloned.style.whiteSpace = style.whiteSpace;\n cloned.style.overflow = \"hidden\";\n cloned.style.textOverflow = style.textOverflow;\n cloned.style.boxShadow = index === 0 ? \"0 1px 2px rgba(0, 0, 0, 0.08)\" : style.boxShadow;\n\n const allChildren = cloned.querySelectorAll(\"*\");\n allChildren.forEach((child) => {\n const childEl = child as HTMLElement;\n childEl.setAttribute(\"class\", \"\");\n childEl.style.width = \"100%\";\n childEl.style.height = \"100%\";\n });\n\n ghost.appendChild(cloned);\n });\n\n document.body.appendChild(ghost);\n\n return ghost;\n}\n","import { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport {\n useCallback,\n useDeferredValue,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n} from \"react\";\n\nimport Checkbox from \"../../Checkbox\";\nimport TableFooter, { type TableFooterProps } from \"./TableFooter\";\nimport TableHeader from \"./TableHeader\";\nimport useTableFixed from \"../hooks/useTableFixed\";\nimport SkeletonTd from \"./ui/SkeletonTd\";\nimport TableDataRow from \"./ui/TableDataRow\";\nimport TableEmpty from \"./ui/TableEmpty\";\nimport TableCellContent from \"./ui/TableCellContent\";\nimport { applyColDefaults, buildColumnDefs, createColumnDragGhost, getAlignStyle, parseColPx } from \"../config/utils\";\n\nimport type { Column } from \"../config/type\";\nimport type { PaginationProps } from \"../../Pagination\";\nimport type { ColumnDragOverlayItem } from \"../config/utils\";\nimport type { SortOrder } from \"../config/type\";\nimport type { SortOption } from \"../config/type\";\ninterface CheckboxInfo {\n selectedKeys: Array<string | number>;\n onSelectionChange: (keys: Array<string | number>) => void;\n fixed?: boolean;\n}\n\ntype DragEndResult = {\n type: \"row\" | \"column\";\n order: Array<string>;\n movedKey: string;\n targetKey: string;\n};\nexport interface TableProps<T> {\n columns: Array<Column<T>>;\n data: Array<T>;\n isLoading?: boolean;\n onRowClick?: (record: T, index: number) => void;\n rowKey?: keyof T | ((record: T, index: number) => string | number);\n\n sortOption?: SortOption; // 정렬 상태\n onSortChange?: (sortKey: string, sortOrder: SortOrder) => void; // 정렬 변경 시 호출\n\n paginationInfo?: PaginationProps; // pagination 정보\n checkboxInfo?: CheckboxInfo; // checkbox 정보\n renderFooter?: Pick<TableFooterProps, \"renderLeft\" | \"renderRight\">;\n\n rowDraggable?: boolean; // row 드래그 가능 여부\n columnDraggable?: boolean; // column 드래그 가능 여부\n onRowDragEnd?: (result: DragEndResult) => void;\n onColumnDragEnd?: (result: DragEndResult) => void;\n tooltipConfig?: \"always\" | \"overflow\" | false;\n\n isDynamicHeight?: boolean; // true일 경우 화면 높이에 테이블 높이를 맞춤\n}\n\nfunction reorderList(list: Array<string>, fromKey: string, toKey: string) {\n const fromIndex = list.indexOf(fromKey);\n const toIndex = list.indexOf(toKey);\n if (fromIndex < 0 || toIndex < 0 || fromIndex === toIndex) return list;\n\n const next = [...list];\n const moved = next.splice(fromIndex, 1)[0];\n if (moved === undefined) return list;\n next.splice(toIndex, 0, moved);\n return next;\n}\n\nexport default function Table<T>(props: TableProps<T>) {\n const {\n columns,\n data: currentData,\n isLoading = false,\n onRowClick,\n checkboxInfo,\n rowKey,\n sortOption,\n onSortChange,\n rowDraggable = false,\n columnDraggable = false,\n onRowDragEnd,\n onColumnDragEnd,\n paginationInfo,\n renderFooter,\n tooltipConfig = \"overflow\",\n isDynamicHeight = true,\n } = props;\n const { fixed = false, onSelectionChange, selectedKeys = [] } = checkboxInfo ?? {};\n const scrollRef = useRef<HTMLDivElement>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const [tableHeight, setTableHeight] = useState<number>(500);\n const [columnOrder, setColumnOrder] = useState<Array<string>>([]);\n const [draggingColumnKey, setDraggingColumnKey] = useState<string | null>(null);\n const [rowOrder, setRowOrder] = useState<Array<string>>([]);\n const [draggingRowId, setDraggingRowId] = useState<string | null>(null);\n const columnDragOverlayItemsRef = useRef<Array<ColumnDragOverlayItem>>([]);\n const columnDragGhostRef = useRef<HTMLDivElement | null>(null);\n\n const data = useDeferredValue(currentData);\n const showSkeleton = isLoading;\n const showEmpty = !isLoading && currentData.length === 0;\n\n useLayoutEffect(() => {\n if (!isDynamicHeight) return;\n const el = scrollRef.current;\n if (!el) return;\n const update = () => {\n const top = el.getBoundingClientRect().top;\n const footerH = footerRef.current?.getBoundingClientRect().height ?? 0;\n setTableHeight(window.innerHeight - top - footerH - 24);\n };\n update();\n window.addEventListener(\"resize\", update);\n const observer = new ResizeObserver(update);\n const pageContainer = el.parentElement?.parentElement;\n if (pageContainer) observer.observe(pageContainer);\n const footer = footerRef.current;\n if (footer) observer.observe(footer);\n return () => {\n window.removeEventListener(\"resize\", update);\n observer.disconnect();\n };\n }, []);\n\n useLayoutEffect(() => {\n if (!isDynamicHeight) return;\n const el = scrollRef.current;\n if (!el) return;\n const top = el.getBoundingClientRect().top;\n const footerH = footerRef.current?.getBoundingClientRect().height ?? 0;\n setTableHeight(window.innerHeight - top - footerH - 24);\n }, [showSkeleton, showEmpty]);\n\n const isAllSelected = data.length > 0 && selectedKeys.length === data.length;\n\n const selectedKeysRef = useRef(selectedKeys);\n selectedKeysRef.current = selectedKeys;\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n const dataRef = useRef(data);\n dataRef.current = data;\n const onRowClickRef = useRef(onRowClick);\n onRowClickRef.current = onRowClick;\n\n const getRowKey = useCallback(\n (record: T, index: number): string | number => {\n if (typeof rowKey === \"function\") {\n return rowKey(record, index);\n }\n const key = (rowKey ?? (\"id\" as keyof T)) as keyof T;\n return record[key] as string | number;\n },\n [rowKey],\n );\n\n const allColumns = useMemo<Array<Column<T>>>(() => {\n const checkboxCol: Column<T> = {\n key: \"__checkbox__\",\n width: \"40px\",\n minWidth: \"40px\",\n maxWidth: \"40px\",\n align: \"center\",\n fixed: fixed ? \"left\" : undefined,\n title: (\n <Checkbox\n checked={isAllSelected}\n onChange={() => {\n if (!onSelectionChangeRef.current) return;\n const allKeys = dataRef.current.map((record, index) => getRowKey(record, index));\n onSelectionChangeRef.current(isAllSelected ? [] : allKeys);\n }}\n />\n ),\n render: (_value, record, rowIdx) => {\n const key = getRowKey(record, rowIdx);\n return (\n <div className=\"flex h-full w-full items-center justify-center\">\n <Checkbox\n checked={selectedKeysRef.current.includes(key)}\n onChange={() => {\n if (!onSelectionChangeRef.current) return;\n const cur = selectedKeysRef.current;\n const next = cur.includes(key) ? cur.filter((k) => k !== key) : [...cur, key];\n onSelectionChangeRef.current(next);\n }}\n />\n </div>\n );\n },\n };\n const raw = checkboxInfo ? [checkboxCol, ...columns] : columns;\n return raw.map(applyColDefaults);\n }, [fixed, isAllSelected, checkboxInfo, columns, getRowKey]);\n\n const effectiveColumnOrder = useMemo(() => {\n const keys = allColumns.map((column) => column.key);\n if (columnOrder.length !== keys.length) return keys;\n if (!columnOrder.every((key) => keys.includes(key))) return keys;\n return columnOrder;\n }, [allColumns, columnOrder]);\n\n const orderedColumns = useMemo(() => {\n const columnMap = new Map(allColumns.map((column) => [column.key, column]));\n const ordered = effectiveColumnOrder\n .map((key) => columnMap.get(key))\n .filter((column): column is Column<T> => Boolean(column));\n const rest = allColumns.filter((column) => !effectiveColumnOrder.includes(column.key));\n return [...ordered, ...rest];\n }, [allColumns, effectiveColumnOrder]);\n\n const { leadingPinnedCols, groupCols, trailingPinnedCols } = useMemo(() => {\n const firstGroupIdx = orderedColumns.findIndex((c) => c.mainTitle || c.subTitle);\n if (firstGroupIdx === -1) {\n return {\n leadingPinnedCols: orderedColumns,\n groupCols: [] as Array<Column<T>>,\n trailingPinnedCols: [] as Array<Column<T>>,\n };\n }\n let lastGroupIdx = firstGroupIdx;\n for (let i = orderedColumns.length - 1; i >= firstGroupIdx; i--) {\n if (orderedColumns[i]?.mainTitle || orderedColumns[i]?.subTitle) {\n lastGroupIdx = i;\n break;\n }\n }\n return {\n leadingPinnedCols: orderedColumns.slice(0, firstGroupIdx),\n groupCols: orderedColumns.slice(firstGroupIdx, lastGroupIdx + 1),\n trailingPinnedCols: orderedColumns.slice(lastGroupIdx + 1),\n };\n }, [orderedColumns]);\n\n const segmentByKey = useMemo(() => {\n const map = new Map<string, \"leading\" | \"group\" | \"trailing\">();\n leadingPinnedCols.forEach((c) => map.set(c.key, \"leading\"));\n groupCols.forEach((c) => map.set(c.key, \"group\"));\n trailingPinnedCols.forEach((c) => map.set(c.key, \"trailing\"));\n return map;\n }, [leadingPinnedCols, groupCols, trailingPinnedCols]);\n\n const isColumnDraggable = useCallback(\n (columnKey: string) => columnDraggable && groupCols.length === 0 && columnKey !== \"__checkbox__\",\n [columnDraggable, groupCols],\n );\n\n const handleColumnDragStartCapture = useCallback(\n (columnKey: string) => {\n if (!columnDraggable) return;\n\n const containerEl = scrollRef.current;\n if (!containerEl) return;\n\n const containerRect = containerEl.getBoundingClientRect();\n const cellEls = Array.from(containerEl.querySelectorAll<HTMLElement>(`[data-col-key=\"${columnKey}\"]`));\n\n const items = cellEls.map((cellEl) => {\n const cellRect = cellEl.getBoundingClientRect();\n return {\n element: cellEl,\n top: cellRect.top - containerRect.top + containerEl.scrollTop,\n width: cellRect.width,\n height: cellRect.height,\n };\n });\n\n columnDragOverlayItemsRef.current = items;\n },\n [columnDraggable],\n );\n\n const handleColumnDragStart = useCallback(\n (columnKey: string, event: DragEvent<HTMLTableCellElement>) => {\n if (!columnDraggable) return;\n\n const items = columnDragOverlayItemsRef.current;\n if (items.length > 0 && event.dataTransfer) {\n const ghost = createColumnDragGhost(items);\n columnDragGhostRef.current = ghost;\n event.dataTransfer.effectAllowed = \"move\";\n const ghostRect = ghost.getBoundingClientRect();\n const rawX = event.clientX - ghostRect.left;\n const rawY = event.clientY - ghostRect.top;\n const offsetX = Math.min(Math.max(0, rawX), ghostRect.width);\n const offsetY = Math.min(Math.max(0, rawY), ghostRect.height);\n event.dataTransfer.setDragImage(ghost, offsetX, offsetY);\n ghost.style.left = \"-9999px\";\n ghost.style.top = \"-9999px\";\n }\n\n setDraggingColumnKey(columnKey);\n },\n [columnDraggable],\n );\n\n const handleColumnDragEnd = useCallback(() => {\n setDraggingColumnKey(null);\n columnDragOverlayItemsRef.current = [];\n if (columnDragGhostRef.current) {\n columnDragGhostRef.current.remove();\n columnDragGhostRef.current = null;\n }\n }, []);\n\n const handleColumnDragOver = useCallback((event: DragEvent<HTMLTableCellElement>) => {\n event.preventDefault();\n }, []);\n\n const handleColumnDrop = useCallback(\n (targetColumnKey: string) => {\n if (!draggingColumnKey) return;\n if (!columnDraggable) return;\n if (!isColumnDraggable(draggingColumnKey) || !isColumnDraggable(targetColumnKey)) {\n setDraggingColumnKey(null);\n return;\n }\n // Drag is allowed only within the same segment (leading / group / trailing).\n // Cross-segment drag would silently break virtualization and header alignment.\n if (segmentByKey.get(draggingColumnKey) !== segmentByKey.get(targetColumnKey)) {\n setDraggingColumnKey(null);\n return;\n }\n const keys =\n columnOrder.length === orderedColumns.length ? columnOrder : orderedColumns.map((column) => column.key);\n const nextOrder = reorderList(keys, draggingColumnKey, targetColumnKey);\n setColumnOrder(nextOrder);\n onColumnDragEnd?.({\n type: \"column\",\n order: nextOrder,\n movedKey: draggingColumnKey,\n targetKey: targetColumnKey,\n });\n setDraggingColumnKey(null);\n columnDragOverlayItemsRef.current = [];\n if (columnDragGhostRef.current) {\n columnDragGhostRef.current.remove();\n columnDragGhostRef.current = null;\n }\n },\n [columnDraggable, columnOrder, draggingColumnKey, isColumnDraggable, onColumnDragEnd, orderedColumns, segmentByKey],\n );\n\n // Dev-only structural validation. Helps catch column-definition mistakes that would\n // otherwise silently misalign header colSpans against virtualized body cells.\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return;\n\n const mainTitleEnded = new Map<string, boolean>();\n const subTitleEnded = new Map<string, boolean>();\n let prevMain: string | undefined;\n let prevSub: string | undefined;\n\n for (const col of orderedColumns) {\n if (col.mainTitle !== prevMain) {\n if (prevMain !== undefined) mainTitleEnded.set(prevMain, true);\n if (col.mainTitle) {\n if (mainTitleEnded.get(col.mainTitle)) {\n console.warn(\n `[Table] Non-contiguous mainTitle \"${col.mainTitle}\" at column \"${col.key}\". ` +\n `Group header colSpan and body cell positions will misalign.`,\n );\n } else if (!mainTitleEnded.has(col.mainTitle)) {\n mainTitleEnded.set(col.mainTitle, false);\n }\n }\n prevMain = col.mainTitle;\n }\n if (col.subTitle !== prevSub) {\n if (prevSub !== undefined) subTitleEnded.set(prevSub, true);\n if (col.subTitle) {\n if (subTitleEnded.get(col.subTitle)) {\n console.warn(\n `[Table] Non-contiguous subTitle \"${col.subTitle}\" at column \"${col.key}\". ` +\n `Sub-group header colSpan will not match body cell layout.`,\n );\n } else if (!subTitleEnded.has(col.subTitle)) {\n subTitleEnded.set(col.subTitle, false);\n }\n }\n prevSub = col.subTitle;\n }\n }\n\n const firstGroupIdx = orderedColumns.findIndex((c) => c.mainTitle || c.subTitle);\n if (firstGroupIdx !== -1) {\n let lastGroupIdx = firstGroupIdx;\n for (let i = orderedColumns.length - 1; i >= firstGroupIdx; i--) {\n if (orderedColumns[i]?.mainTitle || orderedColumns[i]?.subTitle) {\n lastGroupIdx = i;\n break;\n }\n }\n for (let i = firstGroupIdx; i <= lastGroupIdx; i++) {\n const col = orderedColumns[i];\n if (col && !col.mainTitle && !col.subTitle) {\n console.warn(\n `[Table] Plain column \"${col.key}\" sits inside the grouped-header range. ` +\n `It will be virtualized and its \"fixed\" property will be ignored.`,\n );\n }\n }\n }\n }, [orderedColumns]);\n\n const estimatedLeadingPinnedWidth = useMemo(\n () => leadingPinnedCols.reduce((sum, col) => sum + parseColPx(col), 0),\n [leadingPinnedCols],\n );\n // Sticky-right trailing only — non-sticky trailing flows with horizontal scroll\n // and shares the virtualized viewport, so it must NOT be subtracted from width.\n const estimatedStickyTrailingPinnedWidth = useMemo(\n () => trailingPinnedCols.filter((c) => c.fixed === \"right\").reduce((sum, col) => sum + parseColPx(col), 0),\n [trailingPinnedCols],\n );\n\n const columnVirtualizer = useVirtualizer({\n count: groupCols.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: (i) => parseColPx(groupCols[i] ?? ({} as Column<T>)),\n horizontal: true,\n overscan: 5,\n scrollMargin: estimatedLeadingPinnedWidth,\n initialRect: {\n width: Math.max(0, window.innerWidth - estimatedLeadingPinnedWidth - estimatedStickyTrailingPinnedWidth),\n height: 600,\n },\n });\n\n const virtualItems = columnVirtualizer.getVirtualItems();\n const startIdx = virtualItems[0]?.index ?? 0;\n const endIdx = virtualItems.length > 0 ? (virtualItems[virtualItems.length - 1]?.index ?? 0) + 1 : 0;\n const leftColspan = startIdx;\n const rightColspan = groupCols.length - endIdx;\n\n // Pass full visual order so left/right offsets accumulate in the same order users see.\n // useTableFixed only accumulates width for cols with `fixed` set, so non-fixed cols are no-op.\n const { getColumnFixedStyle } = useTableFixed<T>(orderedColumns, false);\n\n const getColumnFixedStyleRef = useRef(getColumnFixedStyle);\n getColumnFixedStyleRef.current = getColumnFixedStyle;\n const leadingPinnedColsRef = useRef(leadingPinnedCols);\n leadingPinnedColsRef.current = leadingPinnedCols;\n const trailingPinnedColsRef = useRef(trailingPinnedCols);\n trailingPinnedColsRef.current = trailingPinnedCols;\n const groupColsRef = useRef(groupCols);\n groupColsRef.current = groupCols;\n const virtualItemsRef = useRef(virtualItems);\n virtualItemsRef.current = virtualItems;\n\n const rowSelection = useMemo(() => Object.fromEntries(selectedKeys.map((k) => [String(k), true])), [selectedKeys]);\n\n const tanstackCols = useMemo(() => buildColumnDefs<T>(orderedColumns), [orderedColumns]);\n\n const table = useReactTable({\n data,\n columns: tanstackCols,\n getCoreRowModel: getCoreRowModel(),\n enableRowSelection: !!checkboxInfo,\n getRowId: (row, index) => String(getRowKey(row, index)),\n state: { rowSelection },\n onRowSelectionChange: (updater) => {\n if (isLoading) return;\n const next = typeof updater === \"function\" ? updater(rowSelection) : updater;\n const newKeys: Array<string | number> = Object.keys(next)\n .filter((k) => next[k])\n .map((k) => {\n const n = Number(k);\n return Number.isNaN(n) ? k : n;\n });\n onSelectionChangeRef.current?.(newKeys);\n },\n manualSorting: true,\n manualPagination: true,\n });\n\n const renderTd = useCallback(\n (col: Column<T>, record: Record<string, unknown>, rowIdx: number, colIdx: number, isPinned: boolean) => {\n const { width, minWidth, maxWidth, align } = col;\n const fixedStyle = isPinned ? getColumnFixedStyleRef.current(col) : undefined;\n const cellContent = col.render ? col.render(record[col.key], record as T, rowIdx) : String(record[col.key] ?? \"\");\n\n const isCheckbox = col.key === \"__checkbox__\";\n return (\n <td\n key={`${col.key}-${colIdx}`}\n id={`${col.key}-body`}\n data-row-cell=\"true\"\n data-col-key={col.key}\n className={`${isCheckbox ? \"p-0\" : \"px-2 py-4\"} whitespace-nowrap text-sm text-gray-900 border-r border-b border-gray-200 last:border-r-0 bg-inherit group-hover:bg-gray-100 transition-all`}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: isCheckbox ? maxWidth || width : undefined,\n ...fixedStyle,\n }}\n onClick={(event) => {\n if (col.key === \"__checkbox__\") event.stopPropagation();\n }}\n >\n <div className=\"flex\" style={{ justifyContent: getAlignStyle(align ?? \"\") }}>\n <TableCellContent\n cellContent={cellContent}\n tooltipText={String(record[col.key] ?? \"\")}\n align={align ?? \"\"}\n tooltipConfig={col.key === \"__checkbox__\" ? false : tooltipConfig}\n onCellClick={col.key !== \"__checkbox__\" && onRowClickRef.current ? () => onRowClickRef.current?.(record as T, rowIdx) : undefined}\n />\n </div>\n </td>\n );\n },\n [tooltipConfig],\n );\n\n const renderLeadingPinnedCols = useCallback(\n (record: Record<string, unknown>, rowIdx: number) =>\n leadingPinnedColsRef.current.map((col, idx) => renderTd(col, record, rowIdx, idx, true)),\n [renderTd],\n );\n\n const renderTrailingPinnedCols = useCallback(\n (record: Record<string, unknown>, rowIdx: number) =>\n trailingPinnedColsRef.current.map((col, idx) => renderTd(col, record, rowIdx, idx, true)),\n [renderTd],\n );\n\n const renderVisibleGroupCols = useCallback(\n (record: Record<string, unknown>, rowIdx: number) =>\n virtualItemsRef.current.map((vc) => {\n const col = groupColsRef.current[vc.index];\n if (!col) return null;\n return renderTd(col, record, rowIdx, vc.index, false);\n }),\n [renderTd],\n );\n\n const baseRows = table.getRowModel().rows;\n\n const effectiveRowOrder = useMemo(() => {\n const ids = baseRows.map((row) => String(getRowKey(row.original, row.index)));\n if (rowOrder.length !== ids.length) return ids;\n if (!rowOrder.every((id) => ids.includes(id))) return ids;\n return rowOrder;\n }, [baseRows, getRowKey, rowOrder]);\n\n const handleRowDragStart = useCallback(\n (rowId: string, event: DragEvent<HTMLTableRowElement>) => {\n if (!rowDraggable) return;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", rowId);\n }\n setDraggingRowId(rowId);\n },\n [rowDraggable],\n );\n\n const handleRowDragEnd = useCallback(() => {\n setDraggingRowId(null);\n }, []);\n\n const handleRowDragOver = useCallback((event: DragEvent<HTMLTableRowElement>) => {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"move\";\n }\n }, []);\n\n const handleRowDrop = useCallback(\n (targetRowId: string) => {\n if (!draggingRowId) return;\n if (!rowDraggable) return;\n\n const ids =\n rowOrder.length === effectiveRowOrder.length\n ? rowOrder\n : baseRows.map((row) => String(getRowKey(row.original, row.index)));\n const nextOrder = reorderList(ids, draggingRowId, targetRowId);\n setRowOrder(nextOrder);\n onRowDragEnd?.({\n type: \"row\",\n order: nextOrder,\n movedKey: draggingRowId,\n targetKey: targetRowId,\n });\n setDraggingRowId(null);\n },\n [baseRows, draggingRowId, effectiveRowOrder.length, getRowKey, onRowDragEnd, rowDraggable, rowOrder],\n );\n\n const rows = useMemo(() => {\n const rowMap = new Map(baseRows.map((row) => [String(getRowKey(row.original, row.index)), row]));\n const ordered = effectiveRowOrder\n .map((id) => rowMap.get(id))\n .filter((row): row is (typeof baseRows)[number] => Boolean(row));\n const rest = baseRows.filter((row) => !effectiveRowOrder.includes(String(getRowKey(row.original, row.index))));\n return [...ordered, ...rest];\n }, [baseRows, effectiveRowOrder, getRowKey]);\n\n return (\n <div className=\"bg-white rounded shadow-panel\">\n <div\n id=\"table-layout\"\n ref={scrollRef}\n className=\"relative w-full overflow-y-auto overflow-x-auto custom-view-scrollbar bg-white\"\n style={{ height: `${tableHeight}px` }}\n >\n <table className=\"w-full table-fixed\">\n <TableHeader\n columns={orderedColumns}\n getAlignStyle={getAlignStyle}\n sortOption={sortOption}\n onSortChange={onSortChange}\n onColumnDragStartCapture={handleColumnDragStartCapture}\n onColumnDragStart={handleColumnDragStart}\n onColumnDrop={handleColumnDrop}\n onColumnDragEnd={handleColumnDragEnd}\n onColumnDragOver={handleColumnDragOver}\n isColumnDraggable={isColumnDraggable}\n />\n <tbody className=\"w-full h-full\">\n {showSkeleton ? (\n Array.from({ length: 3 }).map((_, rowIdx) => (\n <tr key={rowIdx} className=\"hover:bg-gray-50\">\n {leadingPinnedCols.map((col, idx) => (\n <SkeletonTd key={`leading-${idx}`} col={col} showSquare={idx === 0 && !!checkboxInfo} />\n ))}\n {leftColspan > 0 && <td colSpan={leftColspan} style={{ padding: 0, border: \"none\" }} />}\n {virtualItems.map((vc) => (\n <SkeletonTd key={`group-${vc.index}`} col={groupCols[vc.index]} />\n ))}\n {rightColspan > 0 && <td colSpan={rightColspan} style={{ padding: 0, border: \"none\" }} />}\n {trailingPinnedCols.map((col, idx) => (\n <SkeletonTd key={`trailing-${idx}`} col={col} />\n ))}\n </tr>\n ))\n ) : showEmpty ? (\n <TableEmpty columnCount={allColumns.length} />\n ) : (\n rows.map((row) => {\n const rowId = String(getRowKey(row.original, row.index));\n return (\n <TableDataRow\n key={row.id}\n record={row.original as Record<string, unknown>}\n rowIdx={row.index}\n rowId={rowId}\n draggable={rowDraggable && !showSkeleton}\n onDragStart={handleRowDragStart}\n onDragOver={handleRowDragOver}\n onDrop={handleRowDrop}\n onDragEnd={handleRowDragEnd}\n leftColspan={leftColspan}\n rightColspan={rightColspan}\n renderLeadingPinnedCols={renderLeadingPinnedCols}\n renderVisibleGroupCols={renderVisibleGroupCols}\n renderTrailingPinnedCols={renderTrailingPinnedCols}\n />\n );\n })\n )}\n </tbody>\n </table>\n </div>\n {!showEmpty && !showSkeleton && (paginationInfo || renderFooter?.renderLeft || renderFooter?.renderRight) && (\n <div ref={footerRef}>\n <TableFooter\n paginationInfo={paginationInfo}\n renderLeft={renderFooter?.renderLeft}\n renderRight={renderFooter?.renderRight}\n />\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\nimport useEmblaCarousel, { type UseEmblaCarouselType } from \"embla-carousel-react\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport Button from \"../../Button\";\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: \"horizontal\" | \"vertical\";\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext],\n );\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n className={cn(\"flex\", orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"carousel\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-12 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <div>\n <ChevronLeft className=\"text-black\" />\n </div>\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\nfunction CarouselNext({\n className,\n variant = \"carousel\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-12 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <div>\n <ChevronRight />\n </div>\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport { type CarouselApi, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext };\n","import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport {\n type CarouselApi,\n Carousel as CarouselBase,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"./ui/carousel\";\n\nexport interface CarouselRef {\n /** 현재 선택된 슬라이드 인덱스 */\n currentIndex: number;\n /** Embla Carousel API 인스턴스 */\n api: CarouselApi | undefined;\n /** 특정 인덱스로 이동 */\n scrollTo: (index: number) => void;\n /** 이전 슬라이드로 이동 */\n scrollPrev: () => void;\n /** 다음 슬라이드로 이동 */\n scrollNext: () => void;\n /** 이전 슬라이드로 이동 가능한지 여부 */\n canScrollPrev: boolean;\n /** 다음 슬라이드로 이동 가능한지 여부 */\n canScrollNext: boolean;\n}\n\nexport interface CarouselProps {\n /** 캐러셀에 표시할 아이템들 */\n children: React.ReactNode;\n /** 화살표 버튼 표시 여부 (기본: true) */\n showArrows?: boolean;\n /** 인디케이터(도트) 표시 여부 (기본: false) */\n showDots?: boolean;\n /** 자동 재생 여부 (기본: false) 3000ms 마다 자동 재생 */\n autoPlay?: boolean;\n /** 자동 재생 간격 (ms, 기본: 3000) */\n autoPlayInterval?: number;\n /** 무한 루프 여부 (기본: false) */\n loop?: boolean;\n /** 아이템 간격 (px, 기본: 16) */\n spacing?: number;\n /** 화살표 버튼 위치 (기본: \"outside\") */\n arrowsPosition?: \"inside\" | \"outside\";\n /** 커스텀 이전 버튼 (제공하지 않으면 기본 버튼 사용) */\n previousButton?: React.ReactNode;\n /** 커스텀 다음 버튼 (제공하지 않으면 기본 버튼 사용) */\n nextButton?: React.ReactNode;\n /** 슬라이드 변경 시 호출되는 콜백 */\n onSlideChange?: (index: number) => void;\n /** 초기 슬라이드 인덱스 (기본: 0) */\n initialSlide?: number;\n /** 컨테이너 커스텀 클래스 */\n containerClassName?: string;\n /** 컨텐츠 영역 커스텀 클래스 */\n contentClassName?: string;\n /** 아이템 커스텀 클래스 */\n itemClassName?: string;\n /** 인디케이터 커스텀 클래스 */\n dotsClassName?: string;\n /** 인디케이터 활성화 상태 커스텀 클래스 */\n dotActiveClassName?: string;\n /** Embla 캐러셀 옵션 */\n carouselOptions?: Parameters<typeof CarouselBase>[0][\"opts\"];\n /** Embla 캐러셀 플러그인 */\n plugins?: Parameters<typeof CarouselBase>[0][\"plugins\"];\n}\n\nconst Carousel = forwardRef<CarouselRef, CarouselProps>(function Carousel(props, ref) {\n const {\n children,\n showArrows = true,\n showDots = false,\n autoPlay = false,\n autoPlayInterval = 3000,\n loop = false,\n spacing = 16,\n arrowsPosition = \"inside\",\n previousButton,\n nextButton,\n onSlideChange,\n initialSlide = 0,\n containerClassName,\n contentClassName,\n itemClassName,\n dotsClassName,\n dotActiveClassName,\n carouselOptions,\n plugins,\n } = props;\n const [api, setApi] = useState<CarouselApi>();\n const [selectedIndex, setSelectedIndex] = useState(initialSlide);\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n const [pauseToken, setPauseToken] = useState<symbol | null>(null);\n const autoPlayTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // 초기 슬라이드 설정\n useEffect(() => {\n if (!api || initialSlide === 0) return;\n api.scrollTo(initialSlide);\n }, [api, initialSlide]);\n\n // 슬라이드 변경 감지 및 버튼 상태 업데이트\n useEffect(() => {\n if (!api) return;\n\n const onSelect = () => {\n const index = api.selectedScrollSnap();\n setSelectedIndex(index);\n\n // loop가 false일 때 버튼 disabled 상태 업데이트\n if (!loop) {\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n } else {\n // loop가 true일 때는 항상 스크롤 가능\n setCanScrollPrev(true);\n setCanScrollNext(true);\n }\n\n onSlideChange?.(index);\n };\n\n api.on(\"select\", onSelect);\n api.on(\"reInit\", onSelect);\n onSelect();\n\n return () => {\n api.off(\"select\", onSelect);\n api.off(\"reInit\", onSelect);\n };\n }, [api, onSlideChange, loop]);\n\n // ref를 통해 부모 컴포넌트에 현재 상태 노출\n useImperativeHandle(\n ref,\n () => ({\n currentIndex: selectedIndex,\n api,\n scrollTo: (index: number) => api?.scrollTo(index),\n scrollPrev: () => api?.scrollPrev(),\n scrollNext: () => api?.scrollNext(),\n canScrollPrev,\n canScrollNext,\n }),\n [selectedIndex, api, canScrollPrev, canScrollNext],\n );\n\n // 자동 재생 (pauseToken이 null이 아니면 일시 정지)\n useEffect(() => {\n if (!autoPlay || !api || pauseToken !== null) {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n autoPlayTimerRef.current = null;\n }\n return;\n }\n\n autoPlayTimerRef.current = setInterval(() => {\n if (api.canScrollNext()) {\n api.scrollNext();\n } else if (loop) {\n api.scrollTo(0);\n } else {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n autoPlayTimerRef.current = null;\n }\n }\n }, autoPlayInterval);\n\n return () => {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n autoPlayTimerRef.current = null;\n }\n };\n }, [autoPlay, api, autoPlayInterval, loop, pauseToken]);\n\n // pauseToken이 있으면 대기 후 재개 (재클릭 시 새 symbol로 타이머 리셋)\n useEffect(() => {\n if (!autoPlay || pauseToken === null) return;\n const timer = setTimeout(() => setPauseToken(null), autoPlayInterval);\n return () => clearTimeout(timer);\n }, [pauseToken, autoPlay, autoPlayInterval]);\n\n // 수동 조작 시 자동 재생 일시 정지 — Symbol()로 고유 토큰 발행, ref 접근 없음\n const pauseAutoPlay = useCallback(() => {\n if (!autoPlay) return;\n setPauseToken(Symbol());\n }, [autoPlay]);\n\n // children을 배열로 변환\n const childrenArray = React.Children.toArray(children);\n const totalSlides = childrenArray.length;\n\n // 인디케이터 클릭 핸들러\n const handleDotClick = (index: number) => {\n pauseAutoPlay();\n api?.scrollTo(index);\n };\n\n // 커스텀 버튼에 onClick 핸들러와 disabled 상태 주입\n const enhanceButton = (button: React.ReactNode, onClickHandler: () => void, disabled: boolean) => {\n if (!button || !React.isValidElement(button)) return null;\n\n const buttonElement = button as React.ReactElement<React.ButtonHTMLAttributes<HTMLButtonElement>>;\n const existingProps = buttonElement.props || {};\n\n return React.cloneElement(buttonElement, {\n ...existingProps,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n if (existingProps.onClick) {\n existingProps.onClick(e);\n }\n onClickHandler();\n },\n disabled: disabled || existingProps.disabled,\n });\n };\n\n return (\n <CarouselBase\n orientation=\"horizontal\"\n opts={{\n loop,\n align: \"start\",\n slidesToScroll: 1,\n ...carouselOptions,\n }}\n plugins={plugins}\n setApi={setApi}\n className={cn(\"relative w-full\", containerClassName)}\n >\n <CarouselContent\n className={cn(\"-ml-4\", contentClassName)}\n style={{\n gap: `${spacing}px`,\n }}\n >\n {childrenArray.map((child, index) => (\n <CarouselItem\n key={index}\n className={cn(\"basis-full\", itemClassName)}\n style={{\n paddingLeft: `${spacing}px`,\n }}\n >\n {child}\n </CarouselItem>\n ))}\n </CarouselContent>\n\n {showArrows && (\n <>\n {previousButton ? (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 z-10\",\n arrowsPosition === \"inside\" ? \"left-4\" : \"-left-12\",\n )}\n >\n {enhanceButton(\n previousButton,\n () => {\n pauseAutoPlay();\n api?.scrollPrev();\n },\n !loop && !canScrollPrev,\n )}\n </div>\n ) : (\n <CarouselPrevious\n className={cn(\n \"disabled:opacity-50 disabled:cursor-not-allowed text-black disabled:bg-gray-100\",\n arrowsPosition === \"inside\" ? \"left-4 -translate-x-0\" : \"\",\n )}\n disabled={!loop && !canScrollPrev}\n onClick={() => {\n pauseAutoPlay();\n api?.scrollPrev();\n }}\n />\n )}\n {nextButton ? (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 z-10\",\n arrowsPosition === \"inside\" ? \"right-4\" : \"-right-12\",\n )}\n >\n {enhanceButton(\n nextButton,\n () => {\n pauseAutoPlay();\n api?.scrollNext();\n },\n !loop && !canScrollNext,\n )}\n </div>\n ) : (\n <CarouselNext\n className={cn(\n \"disabled:opacity-50 disabled:cursor-not-allowed text-black disabled:bg-gray-100\",\n arrowsPosition === \"inside\" ? \"right-4 -translate-x-0\" : \"\",\n )}\n disabled={!loop && !canScrollNext}\n onClick={() => {\n pauseAutoPlay();\n api?.scrollNext();\n }}\n />\n )}\n </>\n )}\n\n {showDots && totalSlides > 1 && (\n <div className={cn(\"flex justify-center items-center gap-2 mt-4\", dotsClassName)}>\n {Array.from({ length: totalSlides }).map((_, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleDotClick(index)}\n className={cn(\n \"w-2 h-2 rounded-full transition-all\",\n selectedIndex === index\n ? cn(\"bg-gray-900 w-6\", dotActiveClassName)\n : \"bg-gray-300 hover:bg-gray-400\",\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n )}\n </CarouselBase>\n );\n});\n\nexport default Carousel;\n","import type { FilePreviewViewerFeatures } from \"./type\";\n\nexport const DEFAULT_FEATURES: Required<FilePreviewViewerFeatures> = {\n zoom: true,\n rotate: true,\n download: true,\n navigation: true,\n};\n","import { getPreviewFileType } from \"./utils\";\n\ninterface CacheEntry {\n blobUrl: string;\n refCount: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\n/** 요청마다 다른 이미지가 내려오는 URL을 안정적인 키로 변환 */\nexport function normalizeImagePreviewKey(src: string): string {\n try {\n const url = new URL(src, window.location.origin);\n if (!url.hostname.includes(\"picsum.photos\")) return src;\n\n const random = url.searchParams.get(\"random\");\n const hasStablePath = url.pathname.includes(\"/id/\") || url.pathname.includes(\"/seed/\");\n\n if (random && !hasStablePath) {\n const segments = url.pathname.split(\"/\").filter(Boolean);\n const width = segments[0] ?? \"800\";\n const height = segments[1] ?? \"600\";\n return `https://picsum.photos/seed/preview-${random}/${width}/${height}`;\n }\n } catch {\n // ignore\n }\n\n return src;\n}\n\nexport async function resolveStableImageSrc(src: string): Promise<string> {\n if (getPreviewFileType(src) !== \"image\") return src;\n if (src.startsWith(\"blob:\") || src.startsWith(\"data:\")) return src;\n\n const key = normalizeImagePreviewKey(src);\n const cached = cache.get(key);\n if (cached) {\n cached.refCount += 1;\n return cached.blobUrl;\n }\n\n try {\n const response = await fetch(key, { mode: \"cors\" });\n if (!response.ok) throw new Error(\"Failed to fetch image\");\n\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n cache.set(key, { blobUrl, refCount: 1 });\n return blobUrl;\n } catch {\n return key;\n }\n}\n\nexport function releaseStableImageSrc(src: string): void {\n if (getPreviewFileType(src) !== \"image\") return;\n if (src.startsWith(\"blob:\") || src.startsWith(\"data:\")) return;\n\n const key = normalizeImagePreviewKey(src);\n const entry = cache.get(key);\n if (!entry) return;\n\n entry.refCount -= 1;\n if (entry.refCount <= 0) {\n URL.revokeObjectURL(entry.blobUrl);\n cache.delete(key);\n }\n}\n","import type { PreviewFileType } from \"./type\";\nimport { resolveStableImageSrc } from \"./stableImageSrc\";\n\nconst IMAGE_EXTENSIONS = new Set([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\", \"bmp\", \"avif\", \"heic\", \"heif\"]);\n\nconst PDF_EXTENSIONS = new Set([\"pdf\"]);\n\nconst MIME_FILE_TYPES: Array<{ pattern: RegExp; type: PreviewFileType }> = [\n { pattern: /^data:image\\//i, type: \"image\" },\n { pattern: /^data:application\\/pdf/i, type: \"pdf\" },\n];\n\nfunction normalizeExtension(ext: string): string {\n const lower = ext.replace(/^\\./, \"\").toLowerCase();\n if (lower === \"jpeg\") return \"jpg\";\n if (lower === \"svg+xml\") return \"svg\";\n return lower.split(\"+\")[0] || \"\";\n}\n\nfunction getExtensionFromPathname(pathname: string): string | null {\n const segments = pathname.split(\"/\");\n for (let i = segments.length - 1; i >= 0; i -= 1) {\n const segment = segments[i];\n const dotIndex = segment?.lastIndexOf(\".\") ?? -1;\n if (dotIndex <= 0) continue;\n return segment?.slice(dotIndex + 1).toLowerCase() ?? \"\";\n }\n return null;\n}\n\nexport function getExtensionFromSrc(src: string): string | null {\n for (const { pattern, type } of MIME_FILE_TYPES) {\n if (!pattern.test(src)) continue;\n if (type === \"image\") {\n const dataUrlMatch = src.match(/^data:image\\/([a-zA-Z0-9+.-]+)/i);\n return dataUrlMatch ? normalizeExtension(dataUrlMatch[1] ?? \"\") : \"jpg\";\n }\n if (type === \"pdf\") return \"pdf\";\n }\n\n try {\n const url = new URL(src, window.location.origin);\n const fromQuery = url.searchParams.get(\"format\") ?? url.searchParams.get(\"ext\");\n if (fromQuery) return normalizeExtension(fromQuery);\n\n const fromPath = getExtensionFromPathname(url.pathname);\n if (fromPath) return normalizeExtension(fromPath);\n } catch {\n // blob URL 등\n }\n\n return null;\n}\n\nfunction inferTypeFromUrl(src: string): PreviewFileType | null {\n if (src.startsWith(\"blob:\")) return null; // blob URL만으로는 타입 판별 불가 — 호출자가 별도 제공해야 함\n\n try {\n const url = new URL(src, window.location.origin);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return null;\n\n const pathname = url.pathname.toLowerCase();\n const contentType = url.searchParams.get(\"content-type\")?.toLowerCase();\n\n if (contentType?.includes(\"pdf\")) return \"pdf\";\n if (contentType?.startsWith(\"image/\")) return \"image\";\n\n if (pathname.includes(\".pdf\") || /\\/pdf(?:\\/|$)/i.test(pathname)) {\n return \"pdf\";\n }\n\n return \"image\";\n } catch {\n return null;\n }\n}\n\nexport function getPreviewFileType(src: string): PreviewFileType {\n const extension = getExtensionFromSrc(src);\n\n if (extension) {\n if (PDF_EXTENSIONS.has(extension)) return \"pdf\";\n if (IMAGE_EXTENSIONS.has(extension)) return \"image\";\n }\n\n for (const { pattern, type } of MIME_FILE_TYPES) {\n if (pattern.test(src)) return type;\n }\n\n const inferred = inferTypeFromUrl(src);\n if (inferred) return inferred;\n\n return \"unsupported\";\n}\n\nfunction hasKnownExtension(filename: string): boolean {\n const dotIndex = filename.lastIndexOf(\".\");\n if (dotIndex <= 0) return false;\n const ext = filename.slice(dotIndex + 1).toLowerCase();\n return IMAGE_EXTENSIONS.has(ext) || PDF_EXTENSIONS.has(ext);\n}\n\nfunction defaultExtensionForType(fileType: PreviewFileType): string {\n return fileType === \"pdf\" ? \"pdf\" : \"jpg\";\n}\n\nfunction withExtension(name: string, extension: string | null, fileType: PreviewFileType): string {\n if (extension && name.toLowerCase().endsWith(`.${extension}`)) return name;\n const ext = extension ?? defaultExtensionForType(fileType);\n return `${name}.${ext}`;\n}\n\nexport function getFileLabel(src: string, index: number, fileTypeOverride?: PreviewFileType): string {\n const fileType = fileTypeOverride ?? getPreviewFileType(src);\n const extension = getExtensionFromSrc(src);\n\n try {\n const pathname = new URL(src, window.location.origin).pathname;\n const filename = pathname.split(\"/\").pop();\n if (filename && hasKnownExtension(decodeURIComponent(filename))) {\n return decodeURIComponent(filename);\n }\n if (filename && /[a-zA-Z]/.test(filename) && !/^\\d+$/.test(filename)) {\n return withExtension(decodeURIComponent(filename), extension, fileType);\n }\n } catch {\n // blob URL 등은 파일명 추출 불가\n }\n\n const labelPrefix = fileType === \"pdf\" ? \"PDF\" : \"Image\";\n\n return withExtension(`${labelPrefix} ${index + 1}`, extension, fileType);\n}\n\nexport function getFileDisplayParts(src: string, index = 0): { name: string; extension: string } {\n const label = getFileLabel(src, index);\n const lastDot = label.lastIndexOf(\".\");\n\n if (lastDot > 0) {\n return {\n name: label.slice(0, lastDot),\n extension: label.slice(lastDot + 1),\n };\n }\n\n return {\n name: label,\n extension: getExtensionFromSrc(src) ?? \"\",\n };\n}\n\nexport function getAdjacentIndexes(currentIndex: number, length: number): [number, number] {\n if (length <= 1) return [currentIndex, currentIndex];\n const prev = (currentIndex - 1 + length) % length;\n const next = (currentIndex + 1) % length;\n return [prev, next];\n}\n\nexport function preloadPreviewImages<T extends string>(urls: Array<T>): void {\n urls.forEach((url) => {\n if (getPreviewFileType(url) !== \"image\") return;\n void resolveStableImageSrc(url);\n });\n}\n","import { useEffect, useState } from \"react\";\n\nimport {\n releaseStableImageSrc,\n resolveStableImageSrc,\n} from \"../config/stableImageSrc\";\n\n/** 썸네일·모달이 동일한 이미지 픽셀을 쓰도록 blob URL 캐시 */\nexport function useStableImageSrc(src: string | undefined): string {\n const [displaySrc, setDisplaySrc] = useState(src ?? \"\");\n const [prevSrc, setPrevSrc] = useState(src);\n\n if (src !== prevSrc) {\n setPrevSrc(src);\n if (src) setDisplaySrc(src);\n }\n\n useEffect(() => {\n if (!src) return;\n\n let active = true;\n\n resolveStableImageSrc(src).then((resolved) => {\n if (active) setDisplaySrc(resolved);\n });\n\n return () => {\n active = false;\n releaseStableImageSrc(src);\n };\n }, [src]);\n\n if (!src) return \"\";\n\n return displaySrc;\n}\n","import { FileText } from \"lucide-react\";\nimport { memo } from \"react\";\n\nimport type { PreviewFileType } from \"../config/type\";\nimport { useStableImageSrc } from \"../hooks/useStableImageSrc\";\n\ninterface FilePreviewViewerContentProps {\n src: string;\n alt: string;\n fileType: PreviewFileType;\n zoom: number;\n rotation: number;\n enableTransform: boolean;\n}\n\nfunction FilePreviewViewerContent(props: FilePreviewViewerContentProps) {\n const { src, alt, fileType, zoom, rotation, enableTransform } = props;\n const imageSrc = useStableImageSrc(fileType === \"image\" ? src : undefined);\n\n if (fileType === \"pdf\") {\n return (\n <div className=\"preview-viewer-container w-[90vw] h-[85vh] max-w-[90vw] max-h-[85vh] flex items-center justify-center\">\n <iframe src={src} title={alt} className=\"w-full h-full rounded bg-white border-0\" />\n </div>\n );\n }\n\n if (fileType === \"unsupported\") {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 max-w-md px-6 py-10 text-center\">\n <FileText className=\"size-12 text-gray-300\" />\n <p className=\"text-lg font-medium text-white\">지원하지 않는 파일 형식</p>\n <p className=\"text-sm text-gray-300 leading-relaxed\">이미지, PDF 형식만 미리보기할 수 있습니다.</p>\n </div>\n );\n }\n\n return (\n <div className=\"relative max-w-[85vw] max-h-[85vh] w-full h-full flex items-center justify-center\">\n <div className=\"preview-viewer-container flex items-center justify-center w-full h-full overflow-hidden\">\n <img\n src={imageSrc}\n alt={alt}\n decoding=\"async\"\n fetchPriority=\"high\"\n className=\"max-w-full max-h-full object-contain transition-transform duration-200\"\n style={\n enableTransform\n ? {\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\n transformOrigin: \"center center\",\n }\n : undefined\n }\n />\n </div>\n </div>\n );\n}\n\nexport default memo(FilePreviewViewerContent);\n","import { RotateCcw, RotateCw, ZoomIn, ZoomOut } from \"lucide-react\";\nimport { memo } from \"react\";\n\ninterface FilePreviewViewerFooterProps {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onRotateLeft: () => void;\n onRotateRight: () => void;\n showZoom: boolean;\n showRotate: boolean;\n}\n\nfunction FilePreviewViewerFooter(props: FilePreviewViewerFooterProps) {\n const { zoom, onZoomIn, onZoomOut, onRotateLeft, onRotateRight, showZoom, showRotate } = props;\n\n if (!showZoom && !showRotate) return null;\n\n const zoomPercentage = Math.round(zoom * 100);\n\n return (\n <>\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 flex items-center gap-1 shadow-2xl overflow-hidden\">\n {showZoom && (\n <>\n <button\n onClick={onZoomIn}\n disabled={zoom >= 3}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n aria-label=\"확대\"\n >\n <ZoomIn className=\"size-6 text-gray-200\" />\n </button>\n <button\n onClick={onZoomOut}\n disabled={zoom <= 0.5}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n aria-label=\"축소\"\n >\n <ZoomOut className=\"size-6 text-gray-200\" />\n </button>\n </>\n )}\n\n {showRotate && (\n <>\n <button\n onClick={onRotateLeft}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors\"\n aria-label=\"왼쪽 회전\"\n >\n <RotateCcw className=\"size-6 text-gray-200\" />\n </button>\n <button\n onClick={onRotateRight}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors\"\n aria-label=\"오른쪽 회전\"\n >\n <RotateCw className=\"size-6 text-gray-200\" />\n </button>\n </>\n )}\n </div>\n\n {showZoom && (\n <div className=\"absolute bottom-3 right-6 bg-gray-900/90 backdrop-blur-sm shadow-2xl rounded-lg border border-gray-700/50 px-3 py-1.5\">\n <span className=\"text-sm font-medium text-gray-100\">{zoomPercentage}%</span>\n </div>\n )}\n </>\n );\n}\n\nexport default memo(FilePreviewViewerFooter);\n","import { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { memo } from \"react\";\n\ninterface FilePreviewViewerNavigationProps {\n onPrevious: () => void;\n onNext: () => void;\n}\n\nfunction FilePreviewViewerNavigation(props: FilePreviewViewerNavigationProps) {\n const { onPrevious, onNext } = props;\n\n const handleClick = (handler: () => void) => (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n handler();\n };\n\n return (\n <>\n <button\n type=\"button\"\n onClick={handleClick(onPrevious)}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 bg-black/60 text-white rounded-full p-3 hover:bg-black/80 transition-colors z-10 cursor-pointer\"\n aria-label=\"이전 이미지\"\n >\n <ChevronLeft size={26} />\n </button>\n <button\n type=\"button\"\n onClick={handleClick(onNext)}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 bg-black/60 text-white rounded-full p-3 hover:bg-black/80 transition-colors z-10 cursor-pointer\"\n aria-label=\"다음 이미지\"\n >\n <ChevronRight size={26} />\n </button>\n </>\n );\n}\n\nexport default memo(FilePreviewViewerNavigation);\n","import { Download, X } from \"lucide-react\";\nimport { memo } from \"react\";\n\ninterface FilePreviewViewerTopProps {\n currentIndex: number;\n totalCount: number;\n fileLabel: string;\n onDownload: () => void;\n onClose: () => void;\n showDownload: boolean;\n showCounter: boolean;\n}\n\nfunction FilePreviewViewerTop(props: FilePreviewViewerTopProps) {\n const { currentIndex, totalCount, fileLabel, onDownload, onClose, showDownload, showCounter } = props;\n\n return (\n <div className=\"absolute top-6 left-0 w-full z-20 px-10\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-white text-sm min-w-16\">\n {showCounter ? `${currentIndex + 1} / ${totalCount}` : null}\n </div>\n\n <div className=\"bg-black/60 text-white px-4 py-2 rounded-lg text-sm max-w-md truncate\">\n {fileLabel}\n </div>\n\n <div className=\"flex items-center gap-3 min-w-16 justify-end\">\n {showDownload && (\n <button\n onClick={onDownload}\n className=\"text-white hover:text-gray-300 transition-colors cursor-pointer\"\n aria-label=\"다운로드\"\n >\n <Download size={28} />\n </button>\n )}\n\n <button\n onClick={onClose}\n className=\"text-white hover:text-gray-300 transition-colors cursor-pointer\"\n aria-label=\"닫기\"\n >\n <X size={32} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default memo(FilePreviewViewerTop);\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { DEFAULT_FEATURES } from \"./config/default\";\nimport type { PreviewFileType, FilePreviewViewerFeatures } from \"./config/type\";\nimport {\n getAdjacentIndexes,\n getFileLabel,\n getPreviewFileType,\n preloadPreviewImages,\n} from \"./config/utils\";\nimport FilePreviewViewerContent from \"./ui/FilePreviewViewerContent\";\nimport FilePreviewViewerFooter from \"./ui/FilePreviewViewerFooter\";\nimport FilePreviewViewerNavigation from \"./ui/FilePreviewViewerNavigation\";\nimport FilePreviewViewerTop from \"./ui/FilePreviewViewerTop\";\n\ninterface FilePreviewViewerSessionProps<T extends string = string> {\n fileArray: Array<T>;\n fileTypes?: Array<PreviewFileType>;\n fileNames?: Array<string>;\n initialIndex: number;\n features?: Partial<FilePreviewViewerFeatures>;\n onClose: () => void;\n}\n\nexport default function FilePreviewViewerSession<T extends string = string>(\n props: FilePreviewViewerSessionProps<T>,\n) {\n const { fileArray, fileTypes, fileNames, initialIndex, features: featuresProp, onClose } = props;\n\n const features = useMemo(() => ({ ...DEFAULT_FEATURES, ...featuresProp }), [featuresProp]);\n\n const [currentIndex, setCurrentIndex] = useState(initialIndex);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n\n const currentFile = fileArray[currentIndex];\n const isMultipleFiles = fileArray.length > 1;\n const showNavigation = isMultipleFiles && features.navigation;\n\n const fileType = useMemo(\n () => fileTypes?.[currentIndex] ?? (currentFile ? getPreviewFileType(currentFile) : \"unsupported\"),\n [fileTypes, currentIndex, currentFile],\n );\n\n const isImageFile = fileType === \"image\";\n\n const fileLabel = useMemo(\n () =>\n fileNames?.[currentIndex] ??\n (currentFile ? getFileLabel(currentFile, currentIndex, fileTypes?.[currentIndex]) : \"\"),\n [currentFile, currentIndex, fileTypes, fileNames],\n );\n\n const resetTransform = useCallback(() => {\n setZoom(1);\n setRotation(0);\n }, []);\n\n const handlePrevious = useCallback(() => {\n setCurrentIndex((prev) => (prev > 0 ? prev - 1 : fileArray.length - 1));\n resetTransform();\n }, [fileArray.length, resetTransform]);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prev) => (prev < fileArray.length - 1 ? prev + 1 : 0));\n resetTransform();\n }, [fileArray.length, resetTransform]);\n\n const handleDownload = useCallback(async () => {\n if (!currentFile || !isImageFile) return;\n\n try {\n const response = await fetch(currentFile);\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileLabel;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n } catch (error) {\n console.error(\"파일 다운로드 실패:\", error);\n }\n }, [currentFile, fileLabel, isImageFile]);\n\n const handleZoomIn = useCallback(() => {\n setZoom((prev) => Math.min(prev + 0.25, 3));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom((prev) => Math.max(prev - 0.25, 0.5));\n }, []);\n\n const handleRotateRight = useCallback(() => {\n setRotation((prev) => prev + 90);\n }, []);\n\n const handleRotateLeft = useCallback(() => {\n setRotation((prev) => prev - 90);\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowLeft\":\n if (showNavigation) {\n event.preventDefault();\n event.stopPropagation();\n handlePrevious();\n }\n break;\n case \"ArrowRight\":\n if (showNavigation) {\n event.preventDefault();\n event.stopPropagation();\n handleNext();\n }\n break;\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n onClose();\n break;\n }\n },\n [showNavigation, handlePrevious, handleNext, onClose],\n );\n\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n },\n [onClose],\n );\n\n useEffect(() => {\n if (!showNavigation) return;\n\n const [prevIndex, nextIndex] = getAdjacentIndexes(currentIndex, fileArray.length);\n const urlsToPreload = [prevIndex, nextIndex]\n .filter((idx) => idx !== currentIndex)\n .map((idx) => fileArray[idx]);\n\n preloadPreviewImages(urlsToPreload);\n }, [showNavigation, currentIndex, fileArray]);\n\n useEffect(() => {\n if (!features.zoom || !isImageFile) return;\n\n const handleWheel = (e: WheelEvent) => {\n const target = e.target as HTMLElement;\n const isImageOrContainer = target.tagName === \"IMG\" || target.closest(\".preview-viewer-container\");\n\n if (!isImageOrContainer) return;\n\n e.preventDefault();\n\n const zoomStep = 0.1;\n setZoom((prev) => (e.deltaY < 0 ? Math.min(prev + zoomStep, 3) : Math.max(prev - zoomStep, 0.5)));\n };\n\n window.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => window.removeEventListener(\"wheel\", handleWheel);\n }, [features.zoom, isImageFile]);\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"unset\";\n };\n }, [handleKeyDown]);\n\n if (!currentFile) return null;\n\n const showZoom = features.zoom && isImageFile;\n const showRotate = features.rotate && isImageFile;\n const showDownload = features.download && isImageFile;\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/80 flex items-center justify-center\"\n onClick={handleBackdropClick}\n >\n <FilePreviewViewerTop\n currentIndex={currentIndex}\n totalCount={fileArray.length}\n fileLabel={fileLabel}\n onDownload={handleDownload}\n onClose={onClose}\n showDownload={showDownload}\n showCounter={isMultipleFiles}\n />\n\n <div className=\"relative max-w-[90vw] max-h-[90vh] w-full h-full flex items-center justify-center\">\n <FilePreviewViewerContent\n src={currentFile}\n alt={fileLabel}\n fileType={fileType}\n zoom={zoom}\n rotation={rotation}\n enableTransform={isImageFile}\n />\n\n {showNavigation && <FilePreviewViewerNavigation onPrevious={handlePrevious} onNext={handleNext} />}\n </div>\n\n <FilePreviewViewerFooter\n zoom={zoom}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onRotateLeft={handleRotateLeft}\n onRotateRight={handleRotateRight}\n showZoom={showZoom}\n showRotate={showRotate}\n />\n </div>\n );\n}\n","import { useMemo } from \"react\";\n\nimport FilePreviewViewerSession from \"./FilePreviewViewerSession\";\nimport type { PreviewFileType, FilePreviewViewerFeatures } from \"./config/type\";\n\nexport interface FilePreviewViewerProps<T extends string = string> {\n isOpen: boolean;\n onClose: () => void;\n files: T | Array<T>;\n /** 각 파일의 타입을 명시적으로 지정합니다. blob URL처럼 URL에서 타입을 추론할 수 없을 때 사용합니다. */\n fileTypes?: Array<PreviewFileType>;\n /** 각 파일의 원본 파일명을 지정합니다. blob URL처럼 URL에서 파일명을 추출할 수 없을 때 사용합니다. */\n fileNames?: Array<string>;\n initialIndex?: number;\n features?: Partial<FilePreviewViewerFeatures>;\n}\n\nexport default function FilePreviewViewer<T extends string = string>(props: FilePreviewViewerProps<T>) {\n const { isOpen, onClose, files, fileTypes, fileNames, initialIndex = 0, features } = props;\n\n const fileArray = useMemo((): Array<T> => (Array.isArray(files) ? files : [files]), [files]);\n\n const sessionKey = useMemo(() => `${isOpen}-${initialIndex}`, [isOpen, initialIndex]);\n\n if (!isOpen) return null;\n\n return (\n <FilePreviewViewerSession\n key={sessionKey}\n fileArray={fileArray}\n fileTypes={fileTypes}\n fileNames={fileNames}\n initialIndex={initialIndex}\n features={features}\n onClose={onClose}\n />\n );\n}\n","import { createContext } from \"react\";\n\nexport interface SubmitFormValidationContextValue {\n markFieldHadValue: (name: string) => void;\n hadFieldValue: (name: string) => boolean;\n}\n\nexport const SubmitFormValidationContext = createContext<SubmitFormValidationContextValue | null>(null);\n","import { useContext } from \"react\";\n\nimport {\n SubmitFormValidationContext,\n type SubmitFormValidationContextValue,\n} from \"../validation/context\";\n\nexport function useSubmitFormValidation(): SubmitFormValidationContextValue | null {\n return useContext(SubmitFormValidationContext);\n}\n","/** Tailwind: 동적 col-span-* 는 빌드에 포함되지 않으므로 고정 맵 (gg-livestock getColspan) */\nexport const COL_SPAN_CLASS = {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n 7: \"col-span-7\",\n 8: \"col-span-8\",\n 9: \"col-span-9\",\n 10: \"col-span-10\",\n 11: \"col-span-11\",\n 12: \"col-span-12\",\n} as const;\n\nexport type ColSpanKey = keyof typeof COL_SPAN_CLASS;\n\n/** 값 영역 col-span — gg-livestock RowItem colspan (기본 10) */\nexport function resolveValueColSpan(colspan?: number): string {\n const span = colspan ?? 10;\n return COL_SPAN_CLASS[span as ColSpanKey] ?? COL_SPAN_CLASS[10];\n}\n\nexport function formatPhoneNumber(value: string): string {\n const numbers = value.replace(/\\D/g, \"\");\n\n if (numbers.length <= 3) return numbers;\n if (numbers.length <= 7) return `${numbers.slice(0, 3)}-${numbers.slice(3)}`;\n if (numbers.length <= 11) {\n return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-${numbers.slice(7)}`;\n }\n return `${numbers.slice(0, 3)}-${numbers.slice(3, 7)}-${numbers.slice(7, 11)}`;\n}\n\nexport function formatNumberWithCommas(value: string | number): string {\n const numStr = String(value).replace(/,/g, \"\");\n const parts = numStr.split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n}\n\nexport function removeNonNumeric(value: string, allowDecimal = false): string {\n if (allowDecimal) {\n return value.replace(/[^\\d.]/g, \"\").replace(/(\\..*?)\\./g, \"$1\");\n }\n return value.replace(/\\D/g, \"\");\n}\n\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function toSelectOptions(options: Array<{ label: string; value: string | number }> = []) {\n return options.map((opt) => ({\n label: opt.label,\n value: String(opt.value),\n }));\n}\n","/** gg-livestock RowItem / TableItem 레이아웃 (widgets/rowItem/index.tsx) */\n\nimport { cn } from \"../config/utils\";\n\nexport const SUBMIT_FORM_CLASS = \"bg-white\";\n\n/** form 밖 submit 버튼 영역 (구 SubmitFormActions 대체) */\nexport const SUBMIT_FORM_FOOTER_CLASS =\n \"flex justify-end gap-3 border-t border-gray-200 bg-neutral-50 px-6 py-4\";\n\n/** RowItem 라벨 셀 — col-span-2 고정 */\nexport const ROW_LABEL_CLASS =\n \"col-span-2 flex items-center px-5 bg-th border-b border-gray-200 transition-all duration-150 ease-in-out py-4.5 h-full\";\n\nexport const ROW_LABEL_TEXT_CLASS = \"text-sm font-semibold text-gray-800\";\n\nexport const TABLE_ROW_LABEL_CLASS = ROW_LABEL_CLASS;\n\n/** RowItem 값 셀 외곽 (FormInput 등) */\nexport const ROW_VALUE_CELL_CLASS = \"flex h-full w-full items-center border-b border-gray-200 bg-white\";\n\n/** 값 셀 내부 래퍼 (gg relative w-full + pt-3 px-2.5) */\nexport const ROW_VALUE_INNER_CLASS = \"relative w-full px-2.5 py-3\";\n\n/** 필드 한 줄 */\nexport const ROW_VALUE_FIELD_ROW_CLASS = \"flex w-full items-center\";\n\n/** textarea 래퍼 */\nexport const ROW_VALUE_TEXTAREA_WRAPPER_CLASS = \"w-full p-2\";\n\n/** validation 에러 시 border (focus 시 main으로 덮음) */\nexport const FORM_FIELD_ERROR_BORDER_CLASS = \"border-red-600\";\n\n/** focus — main blue (에러 border보다 우선) */\nexport const FORM_CONTROL_FOCUS_CLASS =\n \"focus:border-main focus-visible:border-main focus-visible:ring-1 focus-visible:ring-main/30 focus-visible:outline-none\";\n\nexport const FORM_FIELD_ERROR_MESSAGE_CLASS = \"mt-0.5 text-xs leading-tight text-red-600\";\n\nexport type FormFieldContentAlign = \"left\" | \"center\" | \"right\";\n\n/** 입력 + 에러 문구를 한 덩어리로 묶는 flex-col (에러는 항상 컨트롤 바로 아래) */\nexport const FORM_FIELD_CONTROL_STACK_CLASS = \"flex min-w-0 flex-col\";\n\nexport function formFieldControlStackClass(align: FormFieldContentAlign = \"left\") {\n return cn(\n FORM_FIELD_CONTROL_STACK_CLASS,\n align === \"left\" && \"w-full items-stretch\",\n align === \"center\" && \"w-full max-w-full items-center\",\n align === \"right\" && \"w-full max-w-full items-end\",\n );\n}\n\nexport function formFieldControlRowClass(align: FormFieldContentAlign = \"left\") {\n return cn(\n ROW_VALUE_FIELD_ROW_CLASS,\n align === \"center\" && \"justify-center\",\n align === \"right\" && \"justify-end\",\n );\n}\n\nexport function formFieldErrorMessageClass(align: FormFieldContentAlign = \"left\") {\n return cn(\n FORM_FIELD_ERROR_MESSAGE_CLASS,\n \"w-full shrink-0\",\n align === \"center\" && \"text-center\",\n align === \"right\" && \"text-right\",\n align === \"left\" && \"text-left\",\n );\n}\n\n/** RowItem getInputClass — input 영역 */\nexport const FORM_CONTROL_CLASS =\n\n \"h-8 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm shadow-none\";\n\nexport function formControlClass(hasError: boolean, extra?: string): string {\n return cn(FORM_CONTROL_CLASS, FORM_CONTROL_FOCUS_CLASS, hasError && FORM_FIELD_ERROR_BORDER_CLASS, extra);\n}\n\n/** readOnly 필드 — border·컨트롤 없이 텍스트만 표시 */\nexport const FIELD_READONLY_TEXT_CLASS = \"text-sm text-gray-800 leading-tight\";\n\n/** Row 필드 — className은 wrapper 너비, 내부 컨트롤은 w-full */\nexport function fieldControlWrapClass(className?: string): string {\n return className ? cn(\"min-w-0 shrink-0\", className) : \"min-w-0 w-full\";\n}\n\nexport const TABLE_HEADER_BASE_CLASS =\n \"flex items-center justify-center border-b border-r border-gray-200 bg-th px-5 py-3 text-center text-sm font-semibold text-gray-800\";\n\n/** flex-col — 입력 아래에 validation 문구 배치 (gg ValidationNotice) */\nexport const TABLE_ROW_CELL_BASE_CLASS =\n \"flex min-h-8 flex-col items-stretch justify-center border-b border-r border-gray-200 bg-white px-2 py-1.5 text-sm\";\n\nexport const TABLE_ADD_HEADER_CLASS = \"cursor-pointer hover:text-primary\";\n\nexport const TABLE_DELETE_CELL_CLASS = \"flex cursor-pointer items-center justify-center hover:text-red-600\";\n","import type { ReactNode } from \"react\";\n\nimport {\n formFieldControlStackClass,\n formFieldErrorMessageClass,\n type FormFieldContentAlign,\n} from \"../config/styles\";\n\ntype FormFieldErrorMessageProps = {\n message?: string;\n align?: FormFieldContentAlign;\n};\n\nfunction FormFieldErrorMessage(props: FormFieldErrorMessageProps) {\n const { message, align = \"left\" } = props;\n if (!message) return null;\n return <p className={formFieldErrorMessageClass(align)}>{message}</p>;\n}\n\ntype FormFieldControlStackProps = {\n align?: FormFieldContentAlign;\n showError?: boolean;\n errorMessage?: string;\n children: ReactNode;\n};\n\nexport default function FormFieldControlStack(props: FormFieldControlStackProps) {\n const { align = \"left\", showError, errorMessage, children } = props;\n return (\n <div className={formFieldControlStackClass(align)}>\n {children}\n {showError ? <FormFieldErrorMessage message={errorMessage} align={align} /> : null}\n </div>\n );\n}\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport { z } from \"zod\";\n\ndayjs.extend(customParseFormat);\n\nconst DATE_YYYY_MM_DD_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** gg-livestock `checkEmptyWithRequired` / blur 정책과 동일한 빈 값 판별 */\n// NumberField 등이 number | undefined 로 넘길 때 zod string 스키마와 맞추기 위한 정규화\nexport function normalizeFormFieldString(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"number\") return Number.isNaN(value) ? \"\" : String(value);\n return String(value).trim();\n}\n\nexport function isEmptyFieldValue(value: unknown): boolean {\n if (value === undefined || value === null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (typeof value === \"number\") return Number.isNaN(value);\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"boolean\") return false;\n return false;\n}\n\n// 제출 시 빈 필수값 기본 메시지: `{label}을 입력해 주세요.\nexport function requiredFieldMessage(label: string): string {\n return `${label}을 입력해 주세요.`;\n}\n\n// select/라디오/날짜 등 선택형 필수값 기본 메시지: `{label}을 선택해 주세요.\nexport function requiredSelectMessage(label: string): string {\n return `${label}을 선택해 주세요.`;\n}\n\n// YYYY-MM-DD 형식 오류: `{label}을 올바르게 입력해 주세요.`\nexport function dateInvalidMessage(label: string): string {\n return `${label}을 올바르게 입력해 주세요.`;\n}\n\n// 오늘 이후 날짜 불가: `{label}은 현재 날짜 이후로 입력할 수 없습니다.`\nexport function dateFutureNotAllowedMessage(label: string): string {\n return `${label}은 현재 날짜 이후로 입력할 수 없습니다.`;\n}\n\nexport type ValidateDateOptions = {\n // true면 오늘 이후 날짜 허용 (기본 false)\n allowFuture?: boolean;\n};\n\n// 날짜 형식·미래일 검증 — 빈 값은 undefined (필수는 requiredZodDate가 처리)\nexport function validateDateString(\n value: string,\n label: string,\n options?: ValidateDateOptions,\n): string | undefined {\n if (isEmptyFieldValue(value)) return undefined;\n\n if (!DATE_YYYY_MM_DD_REGEX.test(value) || !dayjs(value, \"YYYY-MM-DD\", true).isValid()) {\n return dateInvalidMessage(label);\n }\n\n if (!options?.allowFuture) {\n const today = dayjs().startOf(\"day\");\n const parsed = dayjs(value, \"YYYY-MM-DD\", true).startOf(\"day\");\n if (parsed.isAfter(today)) {\n return dateFutureNotAllowedMessage(label);\n }\n }\n\n return undefined;\n}\n\n// 필수 날짜 — 빈 값은 선택 메시지, 값이 있으면 YYYY-MM-DD·미래일(옵션) 검증\nexport function requiredZodDate(label: string, options?: ValidateDateOptions) {\n return z\n .string()\n .trim()\n .min(1, requiredSelectMessage(label))\n .superRefine((val, ctx) => {\n const msg = validateDateString(val, label, options);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n });\n}\n\n// 필수 string — 빈 값이면 requiredFieldMessage만 (도메인 검증은 값이 있을 때만)\nexport function requiredZodString(label: string) {\n return z.string().trim().min(1, requiredFieldMessage(label));\n}\n\n// 필수 string + 값이 있을 때 추가 검증\nexport function requiredZodStringWith(label: string, validate: (value: string) => string | undefined) {\n return requiredZodString(label).superRefine((val, ctx) => {\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n });\n}\n\n// 필수 number — undefined / 0 / NaN 은 `{label}을 입력해 주세요.`\nexport function requiredZodNumber(label: string) {\n const message = requiredFieldMessage(label);\n return z.custom<number>(\n (val) => {\n if (val === undefined || val === null) return false;\n if (typeof val !== \"number\" || Number.isNaN(val)) return false;\n return val > 0;\n },\n { message },\n );\n}\n\n// 선택 string — 값이 있을 때만 검증\nexport function optionalZodStringWith(validate: (value: string) => string | undefined) {\n return z\n .string()\n .optional()\n .superRefine((val, ctx) => {\n if (!val?.trim()) return;\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n });\n}\n\n// 필수 string — NumberField(number) 입력을 string 스키마로 받음\nexport function requiredZodStringFromInput(label: string) {\n return z.preprocess(normalizeFormFieldString, z.string().min(1, requiredFieldMessage(label)));\n}\n\nexport function requiredZodStringFromInputWith(\n label: string,\n validate: (value: string) => string | undefined,\n) {\n return z.preprocess(\n normalizeFormFieldString,\n z\n .string()\n .min(1, requiredFieldMessage(label))\n .superRefine((val, ctx) => {\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n }),\n );\n}\n\n// 선택 string — NumberField(number) 입력을 string 스키마로 받음\nexport function optionalZodStringFromInput() {\n return z.preprocess(normalizeFormFieldString, z.string().optional());\n}\n\nexport function optionalZodStringFromInputWith(validate: (value: string) => string | undefined) {\n return z.preprocess(\n normalizeFormFieldString,\n z.string().superRefine((val, ctx) => {\n if (!val?.trim()) return;\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n }),\n );\n}\n","import { Plus, Trash2 } from \"lucide-react\";\nimport {\n useFieldArray,\n useFormContext,\n useFormState,\n useWatch,\n type FieldArrayPath,\n type FieldValues,\n type Path,\n} from \"react-hook-form\";\n\nimport Input from \"../../Input\";\n\nimport { useSubmitFormValidation } from \"../validation/useSubmitFormValidation\";\nimport {\n FORM_FIELD_ERROR_BORDER_CLASS,\n formControlClass,\n TABLE_ADD_HEADER_CLASS,\n TABLE_DELETE_CELL_CLASS,\n TABLE_HEADER_BASE_CLASS,\n TABLE_ROW_CELL_BASE_CLASS,\n TABLE_ROW_LABEL_CLASS,\n type FormFieldContentAlign,\n} from \"../config/styles\";\nimport FormFieldControlStack from \"../ui/FormFieldControlStack\";\nimport type {\n FormTableProps,\n SubmitTableColumn,\n TableCellRenderContext,\n} from \"../config/types\";\nimport { cn, resolveValueColSpan } from \"../config/utils\";\nimport { isEmptyFieldValue } from \"../validation/zod\";\n\nfunction getRowId(row: Record<string, unknown>, index: number): string {\n const id = row.id;\n if (typeof id === \"string\" || typeof id === \"number\") return String(id);\n return `row-${index}`;\n}\n\nfunction resolveCellAlign(column: SubmitTableColumn): FormFieldContentAlign {\n if (column.align) return column.align;\n if (column.cellType === \"number\") return \"center\";\n return \"left\";\n}\n\ntype DefaultTextCellProps = {\n ctx: TableCellRenderContext;\n maxLength?: number;\n placeholder?: string;\n align?: \"left\" | \"center\" | \"right\";\n};\n\nfunction DefaultTextCell(props: DefaultTextCellProps) {\n const { ctx, maxLength, placeholder, align = \"left\" } = props;\n return (\n <Input\n bare\n value={String(ctx.value ?? \"\")}\n placeholder={placeholder}\n maxLength={maxLength}\n status={ctx.hasError ? \"error\" : \"default\"}\n className={cn(\n formControlClass(ctx.hasError ?? false),\n align === \"center\" && \"text-center\",\n align === \"right\" && \"text-right\",\n )}\n onChange={(e) => ctx.onChange(e.target.value)}\n onBlur={ctx.onBlur}\n disabled={ctx.disabled}\n />\n );\n}\n\ntype TableCellFrameProps = {\n className?: string;\n align?: FormFieldContentAlign;\n errorMessage?: string;\n showError: boolean;\n children: React.ReactNode;\n};\n\nfunction TableCellFrame(props: TableCellFrameProps) {\n const { className, align = \"left\", errorMessage, showError, children } = props;\n return (\n <div className={cn(className, \"min-w-0\")}>\n <FormFieldControlStack align={align} showError={showError} errorMessage={errorMessage}>\n {children}\n </FormFieldControlStack>\n </div>\n );\n}\n\nexport default function FormTable<TFieldValues extends FieldValues = FieldValues>(\n props: FormTableProps<TFieldValues>,\n) {\n const {\n name: nameProp,\n formKey,\n label,\n columns: columnsProp,\n column,\n colspan = 10,\n isLabel = true,\n firstRowAppliesAll = false,\n containerClassName = \"\",\n minRows = 1,\n protectFirstRow = true,\n createEmptyRow,\n disabled = false,\n } = props;\n\n const name = (formKey ?? nameProp) as FieldArrayPath<TFieldValues>;\n const columns = column ?? columnsProp ?? [];\n\n if (!name) {\n throw new Error(\"SubmitForm.Table requires formKey or name.\");\n }\n\n const { control, setValue, getValues, trigger, clearErrors, getFieldState } =\n useFormContext<TFieldValues>();\n const formState = useFormState({ control });\n const { errors, isSubmitted } = formState;\n const validationCtx = useSubmitFormValidation();\n\n const fieldArrayName = name as FieldArrayPath<TFieldValues>;\n const { fields, append, remove } = useFieldArray({ control, name: fieldArrayName });\n /** setValue만으로는 fields가 갱신되지 않음 — 입력마다 구독해 controlled value 동기화 */\n const watchedRows = useWatch({\n control,\n name: name as Path<TFieldValues>,\n }) as Record<string, unknown>[] | undefined;\n\n const valueColSpan = resolveValueColSpan(colspan);\n const fullWidth = !isLabel;\n\n const handleAddRow = () => {\n append(createEmptyRow() as never);\n };\n\n const handleDeleteRow = (index: number) => {\n if (fields.length <= minRows) return;\n if (protectFirstRow && index === 0) return;\n remove(index);\n };\n\n const updateCell = (rowIndex: number, key: string, value: string) => {\n const path = `${name}.${rowIndex}.${key}` as Path<TFieldValues>;\n\n if (firstRowAppliesAll && rowIndex === 0) {\n fields.forEach((_, i) => {\n setValue(`${name}.${i}.${key}` as Path<TFieldValues>, value as never, {\n shouldDirty: true,\n });\n });\n return;\n }\n\n setValue(path, value as never, { shouldDirty: true });\n };\n\n const getRowData = (rowIndex: number): Record<string, unknown> => {\n const fromWatch = watchedRows?.[rowIndex];\n if (fromWatch && typeof fromWatch === \"object\") {\n return fromWatch as Record<string, unknown>;\n }\n return (getValues(`${name}.${rowIndex}` as Path<TFieldValues>) as Record<string, unknown>) ?? {};\n };\n\n const getCellError = (rowIndex: number, key: string): string | undefined => {\n const rowErrors = (errors as Record<string, unknown>)[name as string];\n if (!Array.isArray(rowErrors)) return undefined;\n const cell = rowErrors[rowIndex] as Record<string, { message?: string }> | undefined;\n return cell?.[key]?.message;\n };\n\n const renderCell = (column: SubmitTableColumn, rowIndex: number, rowData: Record<string, unknown>) => {\n const rowId = getRowId(rowData, rowIndex);\n const rawValue = column.key === \"id\" ? rowIndex + 1 : rowData[column.key];\n const displayValue =\n firstRowAppliesAll && rowIndex === 0 && column.key === \"id\" ? \"[전체반영]\" : rawValue;\n\n const cellPath = `${name}.${rowIndex}.${column.key}` as Path<TFieldValues>;\n const cellValue = rowData[column.key];\n const isCellRequired = Boolean(column.required);\n const errorMessage = getCellError(rowIndex, column.key);\n const showCellError = Boolean(errorMessage) && isSubmitted;\n const hasError = showCellError;\n\n const cellPathKey = String(cellPath);\n\n const shouldDeferEmptyRequiredBlur = () => {\n if (!isCellRequired || !isEmptyFieldValue(cellValue)) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(cellPathKey)) {\n return false;\n }\n\n const { isTouched, invalid } = getFieldState(cellPath, formState);\n if (isTouched || isSubmitted || invalid) {\n return false;\n }\n\n return true;\n };\n\n const shouldValidateEmptyOnChange = (value: string) => {\n if (!isCellRequired || !isEmptyFieldValue(value)) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(cellPathKey)) {\n return true;\n }\n\n const { isTouched, invalid } = getFieldState(cellPath, formState);\n return isTouched || isSubmitted || Boolean(invalid);\n };\n\n const handleCellBlur = () => {\n if (shouldDeferEmptyRequiredBlur()) {\n clearErrors(cellPath);\n return;\n }\n\n void trigger(cellPath);\n };\n\n const ctx: TableCellRenderContext = {\n value: displayValue,\n rowIndex,\n rowId,\n fieldKey: column.key,\n onChange: (value) => {\n if (!isEmptyFieldValue(value)) {\n validationCtx?.markFieldHadValue(cellPathKey);\n }\n updateCell(rowIndex, column.key, value);\n if (shouldValidateEmptyOnChange(value)) {\n void trigger(cellPath);\n }\n },\n onBlur: handleCellBlur,\n onDelete: () => handleDeleteRow(rowIndex),\n isFirstRow: rowIndex === 0,\n disabled,\n hasError,\n errorClassName: hasError ? FORM_FIELD_ERROR_BORDER_CLASS : \"\",\n errorMessage: showCellError ? errorMessage : undefined,\n };\n\n if (column.type === \"add\") {\n if (protectFirstRow && rowIndex === 0) {\n return <div className=\"min-h-8 w-full\" aria-hidden />;\n }\n return (\n <button\n type=\"button\"\n className={cn(\n TABLE_DELETE_CELL_CLASS,\n \"w-full min-h-8\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n onClick={() => !disabled && ctx.onDelete()}\n disabled={disabled || fields.length <= minRows}\n aria-label=\"행 삭제\"\n >\n <Trash2 size={16} />\n </button>\n );\n }\n\n if (column.render) {\n return column.render(ctx);\n }\n\n if (column.key === \"id\") {\n return (\n <div className=\"flex w-full items-center justify-center\">\n <span className=\"w-full text-center text-sm\">{String(displayValue ?? rowIndex + 1)}</span>\n </div>\n );\n }\n\n if (column.cellType === \"number\") {\n return (\n <DefaultTextCell\n ctx={ctx}\n maxLength={column.maxLength}\n placeholder={column.placeholder}\n align=\"center\"\n />\n );\n }\n\n return (\n <DefaultTextCell\n ctx={ctx}\n maxLength={column.maxLength}\n placeholder={column.placeholder}\n align={column.align ?? \"left\"}\n />\n );\n };\n\n const renderHeader = (column: SubmitTableColumn, index: number) => {\n const isAdd = column.type === \"add\";\n const headerClickable = isAdd && !disabled;\n\n return (\n <div\n key={`${column.key}-header-${index}`}\n className={cn(\n column.className ?? TABLE_HEADER_BASE_CLASS,\n isAdd && TABLE_ADD_HEADER_CLASS,\n headerClickable && \"cursor-pointer\",\n )}\n onClick={() => headerClickable && handleAddRow()}\n onKeyDown={(e) => {\n if (headerClickable && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleAddRow();\n }\n }}\n role={headerClickable ? \"button\" : undefined}\n tabIndex={headerClickable ? 0 : undefined}\n >\n {isAdd ? (\n <Plus size={16} className=\"mx-auto\" />\n ) : (\n <>\n {column.title}\n {column.required ? <span className=\"ml-0.5 text-red-500\">*</span> : null}\n </>\n )}\n </div>\n );\n };\n\n const rows = fields.map((field, rowIndex) => {\n const rowData = getRowData(rowIndex);\n const stickyClass = firstRowAppliesAll && rowIndex === 0 ? \"sticky z-20 top-[44px] bg-white\" : \"\";\n\n return (\n <div key={field.id} className={cn(\"relative flex text-sm\", stickyClass)}>\n {columns.map((column, colIndex) => {\n const cellClassName = column.rowClassName ?? TABLE_ROW_CELL_BASE_CLASS;\n const errorMessage = getCellError(rowIndex, column.key);\n const showCellError = Boolean(errorMessage) && isSubmitted;\n\n if (column.type === \"add\") {\n return (\n <div key={`${field.id}-${column.key}-${colIndex}`} className={cellClassName}>\n {renderCell(column, rowIndex, rowData ?? {})}\n </div>\n );\n }\n\n return (\n <TableCellFrame\n key={`${field.id}-${column.key}-${colIndex}`}\n className={cellClassName}\n align={resolveCellAlign(column)}\n errorMessage={errorMessage}\n showError={showCellError}\n >\n {renderCell(column, rowIndex, rowData ?? {})}\n </TableCellFrame>\n );\n })}\n </div>\n );\n });\n\n const tableBody = (\n <div className={cn(\"w-full\", containerClassName)}>\n <div className=\"sticky top-0 z-[1] flex text-sm\">{columns.map(renderHeader)}</div>\n {rows}\n </div>\n );\n\n if (fullWidth) {\n return <div className=\"col-span-12 w-full h-full\">{tableBody}</div>;\n }\n\n return (\n <>\n <div className={TABLE_ROW_LABEL_CLASS}>\n <p className=\"text-sm font-semibold text-gray-800\">{label}</p>\n </div>\n <div className={cn(valueColSpan, \"h-full w-full\", containerClassName)}>{tableBody}</div>\n </>\n );\n}\n","import { useRef, type Ref } from \"react\";\nimport { useDaumPostcodePopup, type Address } from \"react-daum-postcode\";\n\nimport Button from \"../Button\";\nimport { cn } from \"../../lib/variants\";\n\nexport type { Address };\n\nexport type SearchAddressProps = {\n ref?: Ref<HTMLButtonElement>;\n handleComplete: (data: Address) => void;\n disabled?: boolean;\n label?: string;\n buttonClassName?: string;\n};\n\nexport function SearchAddress(props: SearchAddressProps) {\n const { ref, handleComplete, disabled = false, label = \"주소찾기\", buttonClassName } = props;\n const isPopupOpenRef = useRef(false);\n\n const scriptUrl = \"//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js\";\n const open = useDaumPostcodePopup(scriptUrl);\n\n const handleClick = () => {\n if (isPopupOpenRef.current) return;\n\n isPopupOpenRef.current = true;\n open({\n onComplete: (data: Address) => {\n isPopupOpenRef.current = false;\n handleComplete(data);\n },\n onClose: () => {\n isPopupOpenRef.current = false;\n },\n });\n };\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n variant=\"search\"\n size=\"sm\"\n className={cn(\"ml-2 shrink-0\", buttonClassName)}\n disabled={disabled}\n onClick={(e) => {\n e.preventDefault();\n handleClick();\n }}\n >\n {label}\n </Button>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport type { FieldValues, Path } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\nimport { SearchAddress, type Address } from \"../../../SearchAddress\";\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function AddressField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"주소를 검색하세요\",\n disabled = false,\n readOnly = false,\n className = \"\",\n addressDetailKey,\n addressClassNames,\n } = config;\n\n const { setFocus } = useFormContext<TFieldValues>();\n const inputRef = useRef<HTMLInputElement>(null);\n const searchButtonRef = useRef<HTMLButtonElement>(null);\n const isAddressSelectedRef = useRef(false);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (isFocused && !isAddressSelectedRef.current) {\n searchButtonRef.current?.click();\n }\n }, [isFocused]);\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n const handleComplete = (data: Address) => {\n isAddressSelectedRef.current = true;\n const nextAddress = data.roadAddress || data.address;\n onChange(nextAddress);\n inputRef.current?.blur();\n setIsFocused(false);\n\n if (addressDetailKey) {\n setTimeout(() => {\n setFocus(addressDetailKey as Path<TFieldValues>);\n isAddressSelectedRef.current = false;\n }, 300);\n } else {\n setTimeout(() => {\n isAddressSelectedRef.current = false;\n }, 300);\n }\n };\n\n const handleInputClick = () => {\n searchButtonRef.current?.click();\n };\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div\n className={cn(\"flex w-full min-w-0 items-center\", addressClassNames?.controlClassName)}\n onClick={handleInputClick}\n >\n <Input\n ref={inputRef}\n id={String(name)}\n name={name}\n placeholder={placeholder}\n value={String(value ?? \"\")}\n readOnly\n disabled={disabled}\n bare\n className={cn(formControlClass(hasError), addressClassNames?.inputClassName)}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => {\n if (!isAddressSelectedRef.current) setIsFocused(true);\n }}\n onBlur={() => {\n if (!isAddressSelectedRef.current) {\n setIsFocused(false);\n onBlur();\n }\n }}\n />\n <SearchAddress\n ref={searchButtonRef}\n handleComplete={handleComplete}\n disabled={disabled}\n buttonClassName={addressClassNames?.buttonClassName}\n />\n </div>\n </div>\n );\n}\n","export function parseCascadingSelectValue(value: string, separator: string) {\n if (!value) return { primary: \"\", secondary: \"\" };\n const [primary, secondary] = value.split(separator);\n return { primary: primary ?? \"\", secondary: secondary ?? \"\" };\n}\n\nexport function createCascadingSelectValue(primary: string, secondary: string, separator: string) {\n if (!primary && !secondary) return \"\";\n if (!secondary) return primary;\n return `${primary}${separator}${secondary}`;\n}\n","import type {\n SubmitFormSelectClassNameProp,\n SubmitFormSelectClassNames,\n} from \"../config/types\";\nimport { cn } from \"../config/utils\";\n\n// 문자열이면 container·trigger에 공통 적용, 객체면 개별 병합\nexport function resolveSelectClassNameProp(\n value: SubmitFormSelectClassNameProp | undefined,\n defaults?: SubmitFormSelectClassNames,\n): SubmitFormSelectClassNames {\n if (!value) {\n return {\n containerClassName: defaults?.containerClassName,\n triggerClassName: defaults?.triggerClassName,\n };\n }\n\n if (typeof value === \"string\") {\n return {\n containerClassName: cn(defaults?.containerClassName, value),\n triggerClassName: cn(defaults?.triggerClassName, value),\n };\n }\n\n return {\n containerClassName: cn(defaults?.containerClassName, value.containerClassName),\n triggerClassName: cn(defaults?.triggerClassName, value.triggerClassName),\n };\n}\n","import { useLayoutEffect, useMemo } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Select from \"../../../Select\";\nimport {\n createCascadingSelectValue,\n parseCascadingSelectValue,\n} from \"../../lib/cascadingSelectUtils\";\nimport { resolveSelectClassNameProp } from \"../../lib/resolveSelectClassNameProp\";\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS, FORM_CONTROL_FOCUS_CLASS } from \"../../config/styles\";\nimport type { CascadingSelectFieldConfig, FieldComponentProps } from \"../../config/types\";\nimport { cn, toSelectOptions } from \"../../config/utils\";\n\nconst DEFAULT_TRIGGER_CLASS = \"h-8 w-full min-w-[7.5rem] rounded border bg-white px-2 text-sm shadow-none\";\n\nconst SELECT_CONTAINER_DEFAULT = \"min-w-[7.5rem]\";\n\nfunction resolveCascadingSelectState(\n formValue: string,\n separator: string,\n getSecondaryOptions: CascadingSelectFieldConfig[\"getSecondaryOptions\"],\n) {\n const parsed = parseCascadingSelectValue(formValue, separator);\n const secondaryOptions = parsed.primary ? getSecondaryOptions(parsed.primary) : [];\n const secondaryIsValid =\n !parsed.secondary || secondaryOptions.some((opt) => String(opt.value) === parsed.secondary);\n const secondary = secondaryIsValid ? parsed.secondary : \"\";\n\n return {\n primary: parsed.primary,\n secondary,\n secondaryOptions,\n normalizedFormValue: createCascadingSelectValue(parsed.primary, secondary, separator),\n };\n}\n\nexport default function CascadingSelectField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const { cascadingSelect } = props.config;\n\n if (!cascadingSelect) {\n return null;\n }\n\n return <CascadingSelectFieldInner {...props} cascadingSelect={cascadingSelect} />;\n}\n\ntype CascadingSelectFieldInnerProps<TFieldValues extends FieldValues> = FieldComponentProps<TFieldValues> & {\n cascadingSelect: CascadingSelectFieldConfig;\n};\n\nfunction CascadingSelectFieldInner<TFieldValues extends FieldValues = FieldValues>(\n props: CascadingSelectFieldInnerProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value },\n config,\n hasError = false,\n cascadingSelect,\n } = props;\n\n const { disabled = false, readOnly = false, className = \"\", cascadingSelectClassNames } = config;\n\n const {\n primaryOptions,\n getSecondaryOptions,\n primaryPlaceholder = \"1차 선택\",\n secondaryPlaceholder = \"2차 선택\",\n separator = \" \",\n } = cascadingSelect;\n\n const formValue = String(value ?? \"\");\n const { primary, secondary, secondaryOptions, normalizedFormValue } = useMemo(\n () => resolveCascadingSelectState(formValue, separator, getSecondaryOptions),\n [formValue, getSecondaryOptions, separator],\n );\n\n useLayoutEffect(() => {\n if (readOnly) return;\n if (normalizedFormValue !== formValue) {\n onChange(normalizedFormValue);\n }\n }, [formValue, normalizedFormValue, onChange, readOnly]);\n\n if (readOnly) {\n const primaryLabel = primaryOptions.find((o) => String(o.value) === primary)?.label ?? primary;\n const secondaryLabel = secondary\n ? (secondaryOptions.find((o) => String(o.value) === secondary)?.label ?? secondary)\n : \"\";\n const displayText = secondaryLabel ? `${primaryLabel} ${secondaryLabel}` : primaryLabel || \"—\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{displayText}</span>\n </div>\n );\n }\n\n const updateValue = (nextPrimary: string, nextSecondary: string) => {\n onChange(createCascadingSelectValue(nextPrimary, nextSecondary, separator));\n };\n\n const firstSelectClass = resolveSelectClassNameProp(cascadingSelectClassNames?.firstClassName, {\n containerClassName: SELECT_CONTAINER_DEFAULT,\n triggerClassName: cn(DEFAULT_TRIGGER_CLASS, FORM_CONTROL_FOCUS_CLASS),\n });\n const secondSelectClass = resolveSelectClassNameProp(cascadingSelectClassNames?.secondClassName, {\n containerClassName: SELECT_CONTAINER_DEFAULT,\n triggerClassName: cn(DEFAULT_TRIGGER_CLASS, FORM_CONTROL_FOCUS_CLASS),\n });\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div className={cn(\"flex flex-wrap gap-2\", cascadingSelectClassNames?.controlClassName)}>\n <Select\n value={primary}\n placeholder={primaryPlaceholder}\n disabled={disabled}\n hasError={hasError}\n options={toSelectOptions(primaryOptions)}\n containerClassName={firstSelectClass.containerClassName}\n triggerClassName={firstSelectClass.triggerClassName}\n canReset\n onChange={(nextPrimary) => {\n updateValue(nextPrimary, \"\");\n if (!nextPrimary) onBlur();\n }}\n />\n <Select\n value={secondary}\n placeholder={secondaryPlaceholder}\n disabled={disabled || !primary || secondaryOptions.length === 0}\n hasError={hasError}\n options={toSelectOptions(secondaryOptions)}\n containerClassName={secondSelectClass.containerClassName}\n triggerClassName={secondSelectClass.triggerClassName}\n canReset\n onChange={(nextSecondary) => {\n updateValue(primary, nextSecondary);\n onBlur();\n }}\n />\n </div>\n </div>\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport Checkbox from \"../../../Checkbox\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function CheckboxField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value },\n config,\n } = props;\n\n const { disabled = false, readOnly = false, checkboxLabel, className = \"\" } = config;\n\n if (readOnly) {\n const text = value ? (checkboxLabel ?? \"선택됨\") : \"—\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{text}</span>\n </div>\n );\n }\n\n return (\n <Checkbox\n checked={Boolean(value)}\n onChange={(checked) => onChange(!!checked)}\n disabled={disabled}\n label={checkboxLabel}\n wrapperClassName={cn(\"!justify-start !items-center\", fieldControlWrapClass(className))}\n />\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport DatePicker from \"../../../DatePicker\";\nimport { formatDate } from \"../../../DatePicker/config/utils\";\n\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport { cn } from \"../../config/utils\";\n\nexport default function DateField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"YYYY-MM-DD\",\n disabled = false,\n readOnly = false,\n className = \"w-40\",\n datePosition = \"bottom\",\n disableFutureDates = false,\n calendarSelectContainerClass = \"w-20\",\n } = config;\n\n const maxDate = disableFutureDates ? formatDate(new Date()) : undefined;\n\n if (readOnly) {\n return (\n <div className={cn(\"flex items-center\", fieldControlWrapClass(className))}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex items-center\", fieldControlWrapClass(className))}>\n <DatePicker\n value={String(value ?? \"\")}\n onChange={(date) => onChange(date)}\n onBlur={onBlur}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full\"\n validation={hasError}\n datePosition={datePosition}\n maxDate={maxDate}\n calendarSelectContainerClass={calendarSelectContainerClass}\n />\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\n\nimport type { FieldComponentProps } from \"../../config/types\";\n\nexport default function InputField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"\",\n disabled = false,\n readOnly = false,\n maxLength,\n className = \"\",\n type = \"input\",\n numbersOnly = false,\n autoComplete,\n } = config;\n\n const inputType = type === \"email\" ? \"email\" : type === \"password\" ? \"password\" : \"text\";\n\n if (readOnly) {\n const text = type === \"password\" ? (value ? \"**********\" : \"\") : String(value ?? \"\") || \"\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{text}</span>\n </div>\n );\n }\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const value = numbersOnly ? e.target.value.replace(/\\D/g, \"\") : e.target.value;\n onChange(value);\n };\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Input\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={String(value ?? \"\")}\n type={inputType}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n status=\"default\"\n className={formControlClass(hasError)}\n autoComplete={autoComplete}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","import type { MouseEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Button from \"../../../Button\";\nimport Input from \"../../../Input\";\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\n\nexport default function InputWithButtonField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onBlur, value },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"조회 버튼으로 선택\",\n disabled = false,\n className = \"\",\n readOnly = false,\n inputWithButton,\n onClickInputWithButton,\n } = config;\n\n const handleClick = (event: MouseEvent) => {\n event.preventDefault();\n if (disabled) return;\n onClickInputWithButton?.();\n };\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div className=\"flex w-full min-w-0 items-center gap-2\">\n <Input\n placeholder={placeholder}\n value={String(value ?? \"\")}\n readOnly\n disabled={disabled}\n bare\n className={formControlClass(hasError)}\n onClick={handleClick}\n onBlur={onBlur}\n />\n <Button type=\"button\" variant=\"search\" size=\"sm\" disabled={disabled} onClick={handleClick}>\n {inputWithButton?.buttonLabel ?? \"조회\"}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\n\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { formatNumberWithCommas, removeNonNumeric } from \"../../config/utils\";\n\nexport default function NumberField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"\",\n disabled = false,\n readOnly = false,\n maxLength,\n className = \"\",\n allowDecimal = false,\n type = \"number\",\n } = config;\n\n const isMoney = type === \"money\";\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/,/g, \"\");\n const cleaned = removeNonNumeric(raw, allowDecimal && !isMoney);\n\n if (cleaned === \"\") {\n onChange(undefined);\n return;\n }\n\n const numValue = allowDecimal && !isMoney ? parseFloat(cleaned) : parseInt(cleaned, 10);\n if (!Number.isNaN(numValue)) {\n onChange(numValue);\n }\n };\n\n const displayValue =\n value != null && value !== \"\"\n ? isMoney\n ? formatNumberWithCommas(value as string | number)\n : String(value)\n : \"\";\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{displayValue || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Input\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={displayValue}\n type={isMoney ? \"money\" : \"number\"}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n status=\"default\"\n className={formControlClass(hasError)}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\n\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { formatPhoneNumber } from \"../../config/utils\";\n\nexport default function PhoneField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const { placeholder = \"010-0000-0000\", disabled = false, readOnly = false, className = \"\" } = config;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange(formatPhoneNumber(e.target.value));\n };\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Input\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={String(value ?? \"\")}\n type=\"text\"\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={13}\n status=\"default\"\n className={formControlClass(hasError)}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport { RadioGroup } from \"../../../Radio\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function RadioField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value, name },\n config,\n } = props;\n\n const { disabled = false, readOnly = false, options = [], className = \"\" } = config;\n\n if (readOnly) {\n const label = options.find((o) => String(o.value) === String(value ?? \"\"))?.label ?? String(value ?? \"\");\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{label || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <RadioGroup\n name={String(name)}\n value={String(value ?? \"\")}\n onChange={(nextValue) => onChange(nextValue)}\n direction=\"horizontal\"\n disabled={disabled}\n containerClassName={cn(\"justify-start\", fieldControlWrapClass(className))}\n options={options.map((option) => ({\n label: option.label,\n value: String(option.value),\n disabled: option.disabled,\n disabledMessage: option.disabledMessage,\n }))}\n />\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport Select from \"../../../Select\";\nimport type { SelectOptionType } from \"../../../Select/config/type\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS, FORM_CONTROL_FOCUS_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps, SelectOption } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nfunction toSelectOptions(options: SelectOption[] = []): SelectOptionType[] {\n return options.map((opt) => ({\n label: opt.label,\n value: String(opt.value),\n }));\n}\n\nexport default function SelectField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"선택하세요\",\n disabled = false,\n readOnly = false,\n options = [],\n className = \"\",\n canReset = false,\n } = config;\n\n const selectOptions = toSelectOptions(options);\n\n if (readOnly) {\n const label = selectOptions.find((o) => o.value === String(value ?? \"\"))?.label ?? String(value ?? \"\");\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{label || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Select\n value={String(value ?? \"\")}\n placeholder={placeholder}\n disabled={disabled}\n hasError={hasError}\n options={selectOptions}\n containerClassName=\"flex w-full min-w-0 max-w-full items-center\"\n className=\"w-full min-w-0\"\n triggerClassName={cn(\n \"h-8 w-full min-w-0 max-w-full rounded border bg-white px-2 py-1 text-sm shadow-none\",\n FORM_CONTROL_FOCUS_CLASS,\n )}\n canReset={canReset}\n onChange={(nextValue) => {\n if (nextValue === \"\") {\n onChange(undefined);\n return;\n }\n const option = options.find((opt) => String(opt.value) === nextValue);\n onChange(option?.value);\n }}\n />\n </div>\n );\n}\n","export function parseSelectWithInputValue(value: string, defaultPrefix: string) {\n if (!value) {\n return { prefix: defaultPrefix, input: \"\" };\n }\n\n const match = value.match(/^([A-Za-z]+)(.*)$/);\n if (!match) {\n return { prefix: defaultPrefix, input: value };\n }\n\n return {\n prefix: match[1] || defaultPrefix,\n input: match[2] ?? \"\",\n };\n}\n\nexport function combineSelectWithInputValue(prefix: string, input: string) {\n if (!input) return \"\";\n return `${prefix}${input}`;\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\nimport Select from \"../../../Select\";\nimport {\n combineSelectWithInputValue,\n parseSelectWithInputValue,\n} from \"../../lib/selectWithInputUtils\";\nimport { resolveSelectClassNameProp } from \"../../lib/resolveSelectClassNameProp\";\nimport {\n fieldControlWrapClass,\n formControlClass,\n FIELD_READONLY_TEXT_CLASS,\n FORM_CONTROL_FOCUS_CLASS,\n} from \"../../config/styles\";\nimport type { FieldComponentProps, SelectOption } from \"../../config/types\";\nimport { cn, toSelectOptions } from \"../../config/utils\";\nimport { useSubmitFormValidation } from \"../../validation/useSubmitFormValidation\";\n\nconst DEFAULT_SELECT_TRIGGER = \"h-8 rounded border bg-white px-2 text-sm shadow-none min-w-[5rem]\";\n\nexport default function SelectWithInputField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value },\n config,\n hasError = false,\n } = props;\n\n const {\n disabled = false,\n readOnly = false,\n options = [],\n maxLength,\n className = \"\",\n selectWithInput,\n selectWithInputClassNames,\n } = config;\n\n const validationCtx = useSubmitFormValidation();\n const numbersOnly = selectWithInput?.numbersOnly ?? selectWithInput?.inputMode !== \"text\";\n const defaultPrefix = String(options[0]?.value ?? \"\");\n const numberInputRef = useRef<HTMLInputElement>(null);\n\n const formValue = String(value ?? \"\");\n\n const { prefix, inputPart, normalizedFormValue } = useMemo(() => {\n const parsed = parseSelectWithInputValue(formValue, defaultPrefix);\n const validPrefixes = new Set((options as SelectOption[]).map((opt) => String(opt.value)));\n const resolvedPrefix = validPrefixes.has(parsed.prefix) ? parsed.prefix : defaultPrefix;\n return {\n prefix: resolvedPrefix,\n inputPart: parsed.input,\n normalizedFormValue: combineSelectWithInputValue(resolvedPrefix, parsed.input),\n };\n }, [defaultPrefix, formValue, options]);\n\n // select는 항상 값이 있어 form 값(\"\") 에서 prefix를 파싱할 수 없음.\n // selectedPrefix를 별도 상태로 관리해 input이 비어있어도 선택값을 유지.\n // useEffect 대신 React의 derived state 패턴으로 외부 변경(reset·prefill)만 동기화.\n const [selectedPrefix, setSelectedPrefix] = useState(prefix);\n const [prevFormValue, setPrevFormValue] = useState(formValue);\n\n if (prevFormValue !== formValue) {\n setPrevFormValue(formValue);\n // formValue가 외부에서 바뀔 때만 동기화 (select onChange는 formValue를 바꾸지 않으므로 제외됨)\n setSelectedPrefix(formValue ? prefix : defaultPrefix);\n }\n\n // 유효하지 않은 prefix 정규화 (formValue가 있을 때만 실행해 mount 시 자동 onChange 방지)\n useLayoutEffect(() => {\n if (readOnly) return;\n if (formValue && normalizedFormValue !== formValue) {\n onChange(normalizedFormValue);\n }\n }, [formValue, normalizedFormValue, onChange, readOnly]);\n\n if (readOnly) {\n const prefixLabel = (options as SelectOption[]).find((o) => String(o.value) === prefix)?.label ?? prefix;\n const displayText = inputPart ? `${prefixLabel} ${inputPart}` : prefix ? prefixLabel : \"—\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{displayText || \"—\"}</span>\n </div>\n );\n }\n\n const updateCombined = (nextPrefix: string, nextInput: string) => {\n onChange(combineSelectWithInputValue(nextPrefix, nextInput));\n };\n\n const normalizeInput = (raw: string) => {\n if (numbersOnly) return raw.replace(/\\D+/g, \"\");\n return raw;\n };\n\n const handleInputChange = (raw: string) => {\n const normalized = normalizeInput(raw.normalize(\"NFKC\"));\n if (normalized) {\n validationCtx?.markFieldHadValue(String(config.name));\n }\n updateCombined(selectedPrefix, normalized);\n };\n\n const selectClass = resolveSelectClassNameProp(selectWithInputClassNames?.selectClassName, {\n containerClassName: \"shrink-0\",\n triggerClassName: cn(DEFAULT_SELECT_TRIGGER, FORM_CONTROL_FOCUS_CLASS),\n });\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div className={cn(\"flex items-center gap-2\", selectWithInputClassNames?.controlClassName)}>\n <Select\n value={selectedPrefix}\n placeholder=\"선택\"\n disabled={disabled}\n hasError={hasError}\n options={toSelectOptions(options)}\n containerClassName={selectClass.containerClassName}\n triggerClassName={selectClass.triggerClassName}\n onChange={(nextPrefix) => {\n setSelectedPrefix(nextPrefix);\n updateCombined(nextPrefix, inputPart);\n // select는 blur 이벤트가 없으므로 변경 시 직접 blur 처리\n onBlur();\n }}\n />\n <Input\n ref={numberInputRef}\n value={inputPart}\n disabled={disabled}\n maxLength={maxLength}\n bare\n className={cn(formControlClass(hasError), selectWithInputClassNames?.inputClassName, \"-ml-0.5\")}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n handleInputChange(e.target.value);\n }}\n onBlur={(e: ChangeEvent<HTMLInputElement>) => {\n const normalized = normalizeInput(e.target.value.normalize(\"NFKC\"));\n updateCombined(selectedPrefix, normalized);\n onBlur();\n }}\n />\n </div>\n </div>\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport { BaseSwitch } from \"../../../Switch/ui/BaseSwitch\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\n\nexport default function SwitchField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value },\n config,\n } = props;\n\n const { disabled = false, readOnly = false, className = \"\" } = config;\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{value ? \"켜짐\" : \"꺼짐\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <BaseSwitch checked={Boolean(value)} onCheckedChange={onChange} disabled={disabled} />\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Textarea from \"../../../Textarea\";\n\nimport {\n fieldControlWrapClass,\n FIELD_READONLY_TEXT_CLASS,\n FORM_CONTROL_FOCUS_CLASS,\n FORM_FIELD_ERROR_BORDER_CLASS,\n} from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function TextareaField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const { placeholder = \"\", disabled = false, readOnly = false, maxLength, className = \"\" } = config;\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.target.value);\n };\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={cn(FIELD_READONLY_TEXT_CLASS, \"whitespace-pre-wrap\")}>\n {String(value ?? \"\") || \"—\"}\n </span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Textarea\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={String(value ?? \"\")}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n status=\"default\"\n className={cn(\n \"min-h-18 w-full rounded border border-gray-300 bg-white px-3 py-2 text-sm shadow-none resize-none\",\n FORM_CONTROL_FOCUS_CLASS,\n hasError && FORM_FIELD_ERROR_BORDER_CLASS,\n )}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","// gg-livestock shared/ui/RequireIcon\nexport default function SubmitFormRequireIcon() {\n return <span className=\"pl-0.5 text-main-red\">*</span>;\n}\n","import { useCallback } from \"react\";\nimport { useFormContext, useFormState, type FieldValues, type Path } from \"react-hook-form\";\n\nimport { useSubmitFormValidation } from \"../validation/useSubmitFormValidation\";\nimport { isEmptyFieldValue } from \"../validation/zod\";\n\nexport function useBlurValidation<TFieldValues extends FieldValues = FieldValues>(\n name: Path<TFieldValues>,\n options: {\n required?: boolean;\n // checkbox/radio/select/date 등 blur 없이 값이 바뀌는 필드 — 변경 시 재검증\n revalidateOnChange?: boolean;\n // 빈 값이 됐을 때 onChange에서도 즉시 재검증할지 여부 (타이핑 필드는 false)\n validateEmptyOnChange?: boolean;\n // 값 변경·blur 시 함께 trigger할 다른 필드 (연관 필드 zod 검증)\n revalidateFields?: Path<TFieldValues>[];\n },\n) {\n const { clearErrors, getValues, trigger, control, getFieldState } = useFormContext<TFieldValues>();\n const formState = useFormState({ control });\n const { isSubmitted } = formState;\n const validationCtx = useSubmitFormValidation();\n const fieldName = String(name);\n\n const triggerRelatedFields = useCallback(async () => {\n const fields = options.revalidateFields;\n if (!fields?.length) return;\n await trigger(fields);\n }, [options.revalidateFields, trigger]);\n\n // 최초 방문(비어 있음·미터치·미제출) blur만 검증 생략 — 값을 지운 경우 등은 필수 메시지 유지\n const shouldDeferEmptyRequiredBlur = useCallback(() => {\n if (!options.required || !isEmptyFieldValue(getValues(name))) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(fieldName)) {\n return false;\n }\n\n const { isTouched, invalid } = getFieldState(name, formState);\n if (isTouched || isSubmitted || invalid) {\n return false;\n }\n\n return true;\n }, [options.required, getValues, name, validationCtx, fieldName, getFieldState, formState, isSubmitted]);\n\n const shouldValidateEmptyOnChange = useCallback(\n (value: unknown) => {\n if (!options.required || !isEmptyFieldValue(value)) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(fieldName)) {\n return true;\n }\n\n const { isTouched, invalid } = getFieldState(name, formState);\n return isTouched || isSubmitted || Boolean(invalid);\n },\n [options.required, validationCtx, fieldName, getFieldState, name, formState, isSubmitted],\n );\n\n const handleBlur = useCallback(\n async (fieldOnBlur?: () => void) => {\n if (shouldDeferEmptyRequiredBlur()) {\n clearErrors(name);\n return;\n }\n\n fieldOnBlur?.();\n await trigger(name);\n await triggerRelatedFields();\n },\n [shouldDeferEmptyRequiredBlur, clearErrors, name, trigger, triggerRelatedFields],\n );\n\n const markHadValueIfFilled = useCallback(\n (value: unknown) => {\n if (!isEmptyFieldValue(value)) {\n validationCtx?.markFieldHadValue(fieldName);\n }\n },\n [validationCtx, fieldName],\n );\n\n const handleChange = useCallback(\n (value: unknown, fieldOnChange: (value: unknown) => void) => {\n markHadValueIfFilled(value);\n fieldOnChange(value);\n if (options.revalidateOnChange || (options.validateEmptyOnChange && shouldValidateEmptyOnChange(value))) {\n void trigger(name);\n }\n void triggerRelatedFields();\n },\n [\n markHadValueIfFilled,\n options.revalidateOnChange,\n options.validateEmptyOnChange,\n shouldValidateEmptyOnChange,\n trigger,\n name,\n triggerRelatedFields,\n ],\n );\n\n return { handleBlur, handleChange, markHadValueIfFilled, shouldDeferEmptyRequiredBlur };\n}\n","import { useEffect } from \"react\";\nimport { Controller, useFormContext, useFormState } from \"react-hook-form\";\nimport type { ControllerFieldState, ControllerRenderProps, FieldValues, Path } from \"react-hook-form\";\n\nimport AddressField from \"./fields/AddressField\";\nimport CascadingSelectField from \"./fields/CascadingSelectField\";\nimport CheckboxField from \"./fields/CheckboxField\";\nimport DateField from \"./fields/DateField\";\nimport InputField from \"./fields/InputField\";\nimport InputWithButtonField from \"./fields/InputWithButtonField\";\nimport NumberField from \"./fields/NumberField\";\nimport PhoneField from \"./fields/PhoneField\";\nimport RadioField from \"./fields/RadioField\";\nimport SelectField from \"./fields/SelectField\";\nimport SelectWithInputField from \"./fields/SelectWithInputField\";\nimport SwitchField from \"./fields/SwitchField\";\nimport TextareaField from \"./fields/TextareaField\";\nimport {\n formFieldControlRowClass,\n ROW_LABEL_CLASS,\n ROW_LABEL_TEXT_CLASS,\n ROW_VALUE_CELL_CLASS,\n ROW_VALUE_INNER_CLASS,\n ROW_VALUE_TEXTAREA_WRAPPER_CLASS,\n} from \"../config/styles\";\nimport FormFieldControlStack from \"../ui/FormFieldControlStack\";\nimport type { FormFieldConfig, FormFieldProps } from \"../config/types\";\nimport SubmitFormRequireIcon from \"../ui/RequireIcon\";\nimport { useBlurValidation } from \"../validation/useBlurValidation\";\nimport { cn, resolveValueColSpan } from \"../config/utils\";\n\nfunction wrapFieldHandlers<TFieldValues extends FieldValues>(\n field: ControllerRenderProps<TFieldValues>,\n options: {\n onBlur: () => void | Promise<void>;\n onChange: (value: unknown, fieldOnChange: (value: unknown) => void) => void;\n },\n): ControllerRenderProps<TFieldValues> {\n return {\n ...field,\n onBlur: options.onBlur,\n onChange: (value) => options.onChange(value, field.onChange),\n };\n}\n\n// 변경 시 재검증할 필드 타입 (blur 없이 값이 바뀌는 경우 포함)\n// date: 직접 타이핑 가능 + DatePickerSingle이 캘린더 선택 시 onBlur를 직접 호출하므로 제외\n// select-with-input: Input 서브필드에 실제 blur 이벤트가 있으므로 제외\nconst REVALIDATE_ON_CHANGE_TYPES = new Set<FormFieldConfig[\"type\"]>([\n \"checkbox\",\n \"radio\",\n \"switch\",\n \"select\",\n \"cascading-select\",\n \"input-with-button\",\n \"address\",\n]);\n\n// 빈 문자열로 초기화할 필드 타입\nconst AUTO_INIT_EMPTY_STRING_TYPES = new Set<FormFieldConfig[\"type\"]>([\n \"input\",\n \"email\",\n \"password\",\n \"phone\",\n \"textarea\",\n \"date\",\n \"address\",\n \"input-with-button\",\n \"cascading-select\",\n \"select-with-input\",\n]);\n\ntype FormFieldRowProps<TFieldValues extends FieldValues> = {\n field: ControllerRenderProps<TFieldValues, Path<TFieldValues>>;\n fieldState: ControllerFieldState;\n config: FormFieldConfig<TFieldValues>;\n valueColSpan: string;\n};\n\nfunction FormFieldRow<TFieldValues extends FieldValues>(props: FormFieldRowProps<TFieldValues>) {\n const { field, fieldState, config, valueColSpan } = props;\n const { control } = useFormContext<TFieldValues>();\n const { isSubmitted } = useFormState({ control });\n const { name, label, type = \"input\", required = false, renderCustomField, contentAlign = \"left\" } = config;\n\n const revalidateOnChange = REVALIDATE_ON_CHANGE_TYPES.has(type);\n const { handleBlur, handleChange } = useBlurValidation(name, {\n required,\n revalidateOnChange,\n validateEmptyOnChange: revalidateOnChange,\n revalidateFields: config.revalidateFields,\n });\n\n const showError = Boolean(fieldState.error?.message) && (isSubmitted || fieldState.isTouched);\n\n const isTextarea = type === \"textarea\";\n\n const wrappedField = wrapFieldHandlers(field, {\n onBlur: () => handleBlur(() => field.onBlur()),\n onChange: (value) => {\n handleChange(value, field.onChange);\n // datepicker 캘린더 선택은 blur 타이밍이 어긋날 수 있어 touched 처리\n if (revalidateOnChange) {\n field.onBlur();\n }\n },\n });\n\n const fieldProps = {\n field: wrappedField,\n config,\n fieldState,\n hasError: showError,\n };\n\n const fieldContent = renderCustomField ? (\n renderCustomField({ field: wrappedField, fieldState })\n ) : (\n <>\n {type === \"input\" || type === \"email\" || type === \"password\" ? <InputField {...fieldProps} /> : null}\n {type === \"number\" || type === \"money\" ? <NumberField {...fieldProps} /> : null}\n {type === \"phone\" ? <PhoneField {...fieldProps} /> : null}\n {type === \"textarea\" ? <TextareaField {...fieldProps} /> : null}\n {type === \"select\" ? <SelectField {...fieldProps} /> : null}\n {type === \"date\" ? <DateField {...fieldProps} /> : null}\n {type === \"radio\" ? <RadioField {...fieldProps} /> : null}\n {type === \"checkbox\" ? <CheckboxField {...fieldProps} /> : null}\n {type === \"switch\" ? <SwitchField {...fieldProps} /> : null}\n {type === \"address\" ? <AddressField {...fieldProps} /> : null}\n {type === \"input-with-button\" ? <InputWithButtonField {...fieldProps} /> : null}\n {type === \"cascading-select\" ? <CascadingSelectField {...fieldProps} /> : null}\n {type === \"select-with-input\" ? <SelectWithInputField {...fieldProps} /> : null}\n </>\n );\n\n return (\n <>\n <div className={ROW_LABEL_CLASS}>\n <p className={ROW_LABEL_TEXT_CLASS}>\n {label}\n {required ? <SubmitFormRequireIcon /> : null}\n </p>\n </div>\n\n <div className={cn(valueColSpan, ROW_VALUE_CELL_CLASS)}>\n {isTextarea ? (\n <div className={ROW_VALUE_TEXTAREA_WRAPPER_CLASS}>\n <FormFieldControlStack\n align={contentAlign}\n showError={showError}\n errorMessage={fieldState.error?.message}\n >\n {fieldContent}\n </FormFieldControlStack>\n </div>\n ) : (\n <div className={ROW_VALUE_INNER_CLASS}>\n <FormFieldControlStack\n align={contentAlign}\n showError={showError}\n errorMessage={fieldState.error?.message}\n >\n <div className={formFieldControlRowClass(contentAlign)}>{fieldContent}</div>\n </FormFieldControlStack>\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport default function FormField<TFieldValues extends FieldValues = FieldValues>(\n props: FormFieldProps<TFieldValues>,\n) {\n const { config } = props;\n const { control, getValues, setValue } = useFormContext<TFieldValues>();\n const valueColSpan = resolveValueColSpan(config.colspan);\n const fieldType = config.type ?? \"input\";\n\n useEffect(() => {\n if (!AUTO_INIT_EMPTY_STRING_TYPES.has(fieldType)) {\n return;\n }\n\n const currentValue = getValues(config.name);\n if (currentValue !== undefined) {\n return;\n }\n\n // defaultValues가 없어 undefined인 텍스트 필드는 빈 문자열로 초기화해\n // zod 기본 \"Required\" 대신 스키마의 min(1) 공통 메시지를 사용한다.\n setValue(config.name, \"\" as TFieldValues[Path<TFieldValues>], {\n // 초기값만 세팅(검증/dirty/touched 상태는 변경하지 않음)\n shouldDirty: false,\n shouldTouch: false,\n shouldValidate: false,\n });\n }, [fieldType, getValues, setValue, config.name]);\n\n return (\n <Controller\n name={config.name}\n control={control}\n render={({ field, fieldState }) => (\n <FormFieldRow field={field} fieldState={fieldState} config={config} valueColSpan={valueColSpan} />\n )}\n />\n );\n}\n","import type { FieldValues, Path } from \"react-hook-form\";\n\nimport type { FormFieldConfig, FormFieldType } from \"../config/types\";\n\nexport type SubmitFormRowProps<TFieldValues extends FieldValues = FieldValues> = Omit<\n FormFieldConfig<TFieldValues>,\n \"name\" | \"type\"\n> & {\n formKey: Path<TFieldValues>;\n name?: Path<TFieldValues>;\n formType?: FormFieldType;\n type?: FormFieldType;\n};\n\nexport function rowPropsToFieldConfig<TFieldValues extends FieldValues>(\n props: SubmitFormRowProps<TFieldValues>,\n): FormFieldConfig<TFieldValues> {\n const {\n formKey,\n name,\n formType,\n type,\n label,\n required,\n placeholder,\n disabled,\n readOnly,\n maxLength,\n options,\n className,\n allowDecimal,\n numbersOnly,\n canReset,\n datePosition,\n disableFutureDates,\n calendarSelectContainerClass,\n revalidateFields,\n renderCustomField,\n colspan,\n checkboxLabel,\n contentAlign,\n addressDetailKey,\n addressClassNames,\n cascadingSelect,\n cascadingSelectClassNames,\n selectWithInput,\n selectWithInputClassNames,\n inputWithButton,\n onClickInputWithButton,\n } = props;\n\n return {\n name: (name ?? formKey) as Path<TFieldValues>,\n label,\n type: formType ?? type ?? \"input\",\n placeholder,\n required,\n disabled,\n readOnly,\n maxLength,\n options,\n className,\n allowDecimal,\n numbersOnly,\n canReset,\n datePosition,\n disableFutureDates,\n calendarSelectContainerClass,\n revalidateFields,\n renderCustomField,\n colspan,\n checkboxLabel,\n contentAlign,\n addressDetailKey,\n addressClassNames,\n cascadingSelect,\n cascadingSelectClassNames,\n selectWithInput,\n selectWithInputClassNames,\n inputWithButton,\n onClickInputWithButton,\n };\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport FormField from \"./FormField\";\nimport {\n rowPropsToFieldConfig,\n type SubmitFormRowProps,\n} from \"../config/rowPropsToFieldConfig\";\n\nexport default function SubmitFormRow<TFieldValues extends FieldValues = FieldValues>(\n props: SubmitFormRowProps<TFieldValues>,\n) {\n return <FormField config={rowPropsToFieldConfig(props)} />;\n}\n","import { isEmptyFieldValue } from \"../validation/zod\";\n\n/** defaultValues에 값이 있으면 hadFieldValue로 시드 (수정 화면 등) */\nexport function seedHadValueFromDefaults(\n values: unknown,\n ref: Record<string, boolean>,\n pathPrefix = \"\",\n): void {\n if (values === undefined || values === null) return;\n\n if (Array.isArray(values)) {\n values.forEach((item, index) => {\n seedHadValueFromDefaults(item, ref, pathPrefix ? `${pathPrefix}.${index}` : String(index));\n });\n return;\n }\n\n if (typeof values === \"object\") {\n for (const [key, val] of Object.entries(values as Record<string, unknown>)) {\n const path = pathPrefix ? `${pathPrefix}.${key}` : key;\n seedHadValueFromDefaults(val, ref, path);\n }\n return;\n }\n\n if (!isEmptyFieldValue(values) && pathPrefix) {\n ref[pathPrefix] = true;\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, type ReactNode } from \"react\";\n\nimport { seedHadValueFromDefaults } from \"../validation/seedHadValue\";\nimport { SubmitFormValidationContext } from \"../validation/context\";\n\ntype SubmitFormValidationProviderProps = {\n children: ReactNode;\n defaultValues?: Record<string, unknown>;\n};\n\nexport default function SubmitFormValidationProvider(props: SubmitFormValidationProviderProps) {\n const { children, defaultValues } = props;\n const hadValueRef = useRef<Record<string, boolean>>({});\n\n useEffect(() => {\n if (defaultValues) {\n seedHadValueFromDefaults(defaultValues, hadValueRef.current);\n }\n }, [defaultValues]);\n\n const markFieldHadValue = useCallback((name: string) => {\n hadValueRef.current[name] = true;\n }, []);\n\n const hadFieldValue = useCallback((name: string) => !!hadValueRef.current[name], []);\n\n const value = useMemo(\n () => ({\n markFieldHadValue,\n hadFieldValue,\n }),\n [markFieldHadValue, hadFieldValue],\n );\n\n return (\n <SubmitFormValidationContext.Provider value={value}>{children}</SubmitFormValidationContext.Provider>\n );\n}\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\n\nimport FormTable from \"./components/FormTable\";\nimport SubmitFormRow from \"./components/SubmitFormRow\";\nimport { SUBMIT_FORM_CLASS } from \"./config/styles\";\nimport type { SubmitFormProps } from \"./config/types\";\nimport { cn } from \"./config/utils\";\nimport SubmitFormValidationProvider from \"./validation/SubmitFormValidationProvider\";\n\nfunction SubmitFormRoot<TSchema extends z.ZodTypeAny = z.ZodTypeAny>(props: SubmitFormProps<TSchema>) {\n const {\n schema,\n formId,\n defaultValues,\n onSubmit,\n children,\n className = \"\",\n formClassName,\n gridClassName = \"grid-cols-12\",\n mode = \"onSubmit\",\n autoComplete,\n } = props;\n const methods = useForm<z.infer<TSchema>>({\n resolver: zodResolver(schema),\n defaultValues,\n mode,\n reValidateMode: \"onSubmit\",\n shouldFocusError: false,\n });\n\n const handleSubmit = methods.handleSubmit(\n async (data) => {\n await onSubmit(data);\n },\n async () => {\n await methods.trigger();\n },\n );\n\n return (\n <SubmitFormValidationProvider defaultValues={defaultValues as Record<string, unknown> | undefined}>\n <FormProvider {...methods}>\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(SUBMIT_FORM_CLASS, formClassName, className)}\n autoComplete={autoComplete}\n noValidate\n >\n <div className={`grid ${gridClassName} items-stretch gap-0`}>{children}</div>\n </form>\n </FormProvider>\n </SubmitFormValidationProvider>\n );\n}\n\nexport const SubmitForm = Object.assign(SubmitFormRoot, {\n Row: SubmitFormRow,\n Table: FormTable,\n});\n","import type { ReactNode } from \"react\";\n\ninterface LabeledFilterOptionProps {\n label?: string;\n children: ReactNode;\n gap: number;\n}\n\nexport default function LabeledFilterOption(props: LabeledFilterOptionProps) {\n const { label, children, gap } = props;\n\n return (\n <div style={{ marginLeft: gap }} className=\"flex flex-row items-center gap-5\">\n {label && <label className=\"text-sm font-medium text-gray-60 shrink-0\">{label}</label>}\n {children}\n </div>\n );\n}\n","import { useState, useRef } from \"react\";\nimport { cn } from \"../../lib/variants\";\nimport Input from \"../Input\";\nimport Select from \"../Select\";\nimport RadioGroup from \"../Radio\";\nimport Checkbox from \"../Checkbox\";\nimport DatePickerSingle from \"../DatePicker/ui/DatePickerSingle\";\nimport DatePickerRange from \"../DatePicker/ui/DatePickerRange\";\nimport type { FilterRow } from \"./config/type\";\nimport LabeledFilterOption from \"./ui/LabeledFilterOption\";\nimport Button from \"../Button\";\n\ninterface PageFilterProps<P> {\n rows: Array<FilterRow<P>>;\n onChange: (updates: Partial<P>) => void;\n onSubmit: () => void;\n onReset?: () => void;\n containerClassName?: string;\n rowGap?: number;\n colGap?: number;\n submitButtonText?: string;\n resetButtonText?: string;\n values: P;\n primaryColor?: string;\n}\n\nexport default function PageFilter<P extends Record<keyof P, string>>(props: PageFilterProps<P>) {\n const {\n rows,\n onChange,\n onSubmit,\n onReset,\n containerClassName,\n rowGap = 32,\n colGap = 0,\n submitButtonText = \"검색\",\n resetButtonText = \"초기화\",\n values,\n primaryColor,\n } = props;\n\n const [localValues, setLocalValues] = useState<P>(values);\n const initialValuesRef = useRef<P>(values);\n\n const updateLocal = (updates: Partial<P>) => {\n // @ts-expect-cast: spread of P (extends Record<keyof P, string>) into a new object is safe\n setLocalValues((prev) => ({ ...prev, ...updates }) as P);\n };\n\n const handleInputChange = (key: keyof P) => (e: React.ChangeEvent<HTMLInputElement>) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n updateLocal({ [key]: e.target.value } as Partial<P>);\n };\n\n const handleSelectChange = (key: keyof P) => (value: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n updateLocal({ [key]: value } as Partial<P>);\n };\n\n const handleRadioChange = (key: keyof P) => (value: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n updateLocal({ [key]: value } as Partial<P>);\n };\n\n const handleDateChange = (key: keyof P) => (date: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n updateLocal({ [key]: date } as Partial<P>);\n };\n\n const handleRangeChangeCurried = (startKey: keyof P, endKey: keyof P) => (start: string, end: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n updateLocal({ [startKey]: start, [endKey]: end } as Partial<P>);\n };\n\n const handleCheckboxChange = (key: keyof P) => (checked: boolean) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n updateLocal({ [key]: checked ? \"true\" : \"false\" } as Partial<P>);\n };\n\n const handleSubmit = () => {\n onChange(localValues);\n onSubmit();\n };\n\n const handleReset = () => {\n setLocalValues(initialValuesRef.current);\n onReset?.();\n };\n\n const renderFilterOption = (option: FilterRow<P>[\"options\"][0], gap: number, index: number) => {\n const optionKey = option.key;\n const currentValue = String(localValues[optionKey] ?? \"\");\n\n const rowGap = index !== 0 ? (option.label ? gap : 5) : 0;\n\n switch (option.type) {\n case \"input\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <Input\n placeholder={option.placeholder}\n value={currentValue}\n onChange={handleInputChange(optionKey)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSubmit();\n }}\n />\n </LabeledFilterOption>\n );\n\n case \"select\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <Select\n value={currentValue}\n onChange={handleSelectChange(optionKey)}\n options={option.options}\n placeholder=\"선택\"\n canReset\n containerClassName={option.containerClassName ?? \"w-30\"}\n />\n </LabeledFilterOption>\n );\n\n case \"radio\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <RadioGroup\n name={String(optionKey)}\n value={currentValue}\n onChange={handleRadioChange(optionKey)}\n options={option.options}\n direction=\"horizontal\"\n />\n </LabeledFilterOption>\n );\n\n case \"date\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <DatePickerSingle\n value={currentValue}\n onChange={handleDateChange(optionKey)}\n placeholder={option.placeholder}\n />\n </LabeledFilterOption>\n );\n\n case \"date-range\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <DatePickerRange\n startValue={currentValue}\n endValue={String(values[option.endKey] ?? \"\")}\n onRangeChange={handleRangeChangeCurried(optionKey, option.endKey)}\n />\n </LabeledFilterOption>\n );\n\n case \"checkbox\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <Checkbox\n checked={currentValue === \"true\"}\n name={String(optionKey)}\n value={currentValue}\n onChange={handleCheckboxChange(optionKey)}\n />\n </LabeledFilterOption>\n );\n\n default: {\n const _exhaustive: never = option;\n return _exhaustive;\n }\n }\n };\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 bg-white py-3 px-5 border-t-main border-t-1 shadow-panel\",\n containerClassName,\n )}\n style={primaryColor ? { borderTopColor: primaryColor } : undefined}\n >\n <div className=\"relative flex flex-col\" style={{ gap: `${colGap}px` }}>\n {rows.map((row, ix) => {\n const isLastRow = rows.length - 1 === ix;\n\n return (\n <div key={row.options.map((opt) => String(opt.key)).join(\"_\")} className=\"flex flex-row min-h-12\">\n {row.options.map((option, index) => renderFilterOption(option, rowGap, index))}\n {isLastRow && (\n <div className=\"ml-4 flex flex-row items-center gap-2\">\n <Button variant=\"search\" onClick={handleSubmit}>\n {submitButtonText}\n </Button>\n {onReset && (\n <Button variant=\"reset\" onClick={handleReset}>\n {resetButtonText}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Plus, X } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport type { MultiTab } from \"../../stores/multiTabStore\";\n\nexport type MultiTabVariant = \"light\" | \"dark\" | \"system-light\" | \"system-dark\";\n\ninterface TabVariantStyle {\n container: string;\n activeTab: string;\n inactiveTab: string;\n activeText: string;\n inactiveText: string;\n indicator: string;\n closeBtn: string; // hover/color classes (include ml-auto for system variants)\n closeBtnWH: string; // dimension: \"w-3.5 h-3.5\" or \"w-4 h-4\"\n closeBtnSize: number; // <X> icon px size\n plusBtnArea: string;\n plusBtn: string;\n fadeOpacity: number; // peak opacity of the dark edge overlay (0–1)\n tabPy: string;\n tabPx: string;\n tabTextSize: string;\n scrollPadding: string;\n rounded: string;\n}\n\nconst VARIANT_STYLES: Record<MultiTabVariant, TabVariantStyle> = {\n light: {\n container: \"bg-white border-b border-gray-200\",\n activeTab: \"bg-gray-50 border-gray-200 text-gray-800 shadow-sm\",\n inactiveTab: \"bg-white border-gray-100 text-gray-400 hover:text-gray-600 hover:border-gray-200 hover:bg-gray-50\",\n activeText: \"font-semibold text-gray-800\",\n inactiveText: \"font-normal\",\n indicator: \"bg-blue-500\",\n closeBtn: \"rounded hover:bg-gray-300/60\",\n closeBtnWH: \"w-3.5 h-3.5\",\n closeBtnSize: 10,\n plusBtnArea: \"border-l border-gray-100 bg-white\",\n plusBtn: \"text-gray-400 hover:text-gray-600 hover:bg-gray-100\",\n fadeOpacity: 0.12,\n tabPy: \"py-1.5\",\n tabPx: \"px-3\",\n tabTextSize: \"text-xs\",\n scrollPadding: \"px-3 pt-1.5\",\n rounded: \"rounded-t-md\",\n },\n dark: {\n container: \"bg-gray-900 border-b border-gray-700\",\n activeTab: \"bg-gray-800 border-gray-600 text-white shadow-sm\",\n inactiveTab:\n \"bg-gray-900 border-gray-700/50 text-gray-500 hover:text-gray-300 hover:border-gray-600 hover:bg-gray-800\",\n activeText: \"font-semibold text-white\",\n inactiveText: \"font-normal\",\n indicator: \"bg-indigo-400\",\n closeBtn: \"rounded hover:bg-gray-600/60\",\n closeBtnWH: \"w-3.5 h-3.5\",\n closeBtnSize: 10,\n plusBtnArea: \"border-l border-gray-700 bg-gray-900\",\n plusBtn: \"text-gray-500 hover:text-gray-300 hover:bg-gray-700\",\n fadeOpacity: 0.4,\n tabPy: \"py-1.5\",\n tabPx: \"px-3\",\n tabTextSize: \"text-xs\",\n scrollPadding: \"px-3 pt-1.5\",\n rounded: \"rounded-t-md\",\n },\n \"system-light\": {\n container: \"bg-gray-200 border-b border-gray-300\",\n activeTab: \"bg-white border-gray-300 text-slate-800 shadow-sm\",\n inactiveTab:\n \"bg-transparent border-gray-300/80 text-slate-500 hover:text-slate-700 hover:bg-[#efefef] hover:border-gray-300\",\n activeText: \"font-semibold text-slate-800\",\n inactiveText: \"font-medium\",\n indicator: \"bg-[#2b2b2b]\",\n closeBtn: \"ml-auto text-slate-400 hover:text-slate-700\",\n closeBtnWH: \"w-4 h-4\",\n closeBtnSize: 13,\n plusBtnArea: \"border-l border-gray-300 bg-gray-200\",\n plusBtn: \"text-slate-400 hover:text-slate-600 hover:bg-gray-300\",\n fadeOpacity: 0.15,\n tabPy: \"py-2.5\",\n tabPx: \"px-5\",\n tabTextSize: \"text-sm\",\n scrollPadding: \"px-3 pt-2\",\n rounded: \"rounded-t-none\",\n },\n \"system-dark\": {\n container: \"bg-slate-900 border-b border-slate-700\",\n activeTab: \"bg-slate-800 border-slate-600 text-slate-100 shadow-sm\",\n inactiveTab:\n \"bg-transparent border-slate-700/50 text-slate-400 hover:text-slate-200 hover:bg-slate-800/60 hover:border-slate-700\",\n activeText: \"font-semibold text-slate-100\",\n inactiveText: \"font-medium\",\n indicator: \"bg-indigo-400\",\n closeBtn: \"ml-auto text-slate-500 hover:text-slate-200\",\n closeBtnWH: \"w-4 h-4\",\n closeBtnSize: 13,\n plusBtnArea: \"border-l border-slate-700 bg-slate-900\",\n plusBtn: \"text-slate-400 hover:text-slate-200 hover:bg-slate-700\",\n fadeOpacity: 0.45,\n tabPy: \"py-2.5\",\n tabPx: \"px-5\",\n tabTextSize: \"text-sm\",\n scrollPadding: \"px-4 pt-2\",\n rounded: \"rounded-t-none\",\n },\n};\n\nconst PLUS_BTN_WIDTH = 36;\n\n// ease-out 곡선을 5개 stop으로 근사해 자연스럽게 감쇠하는 dark 오버레이 그라디언트\nfunction easedFade(dir: string, opacity: number): string {\n const c = (t: number) => `rgba(0,0,0,${(opacity * t).toFixed(3)})`;\n return `linear-gradient(${dir}, ${c(1)} 0%, ${c(0.72)} 20%, ${c(0.38)} 45%, ${c(0.1)} 70%, transparent 100%)`;\n}\n\ninterface MultiTabBarProps {\n tabs: Array<MultiTab>;\n activeTabId: string | null;\n onTabClick: (tabId: string) => void;\n onTabClose: (tabId: string) => void;\n onTabAdd?: () => void;\n variant?: MultiTabVariant;\n primaryColor?: string;\n}\n\nexport default function MultiTabBar(props: MultiTabBarProps) {\n const { tabs, activeTabId, onTabClick, onTabClose, onTabAdd, variant = \"light\", primaryColor } = props;\n const s = VARIANT_STYLES[variant];\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const tabRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n\n const [showLeftFade, setShowLeftFade] = useState(false);\n const [showRightFade, setShowRightFade] = useState(false);\n\n const isDragging = useRef(false);\n const hasDragged = useRef(false);\n const dragStartX = useRef(0);\n const dragScrollLeft = useRef(0);\n\n /* ── 활성 탭이 항상 보이도록 자동 스크롤 ── */\n useEffect(() => {\n if (!activeTabId || !scrollRef.current) return;\n const el = tabRefs.current.get(activeTabId);\n if (!el) return;\n\n const container = scrollRef.current;\n const tabLeft = el.offsetLeft;\n const tabRight = tabLeft + el.offsetWidth;\n const containerLeft = container.scrollLeft;\n const containerRight = containerLeft + container.clientWidth;\n\n if (tabLeft < containerLeft) {\n container.scrollTo({ left: tabLeft - 12, behavior: \"smooth\" });\n } else if (tabRight > containerRight) {\n container.scrollTo({ left: tabRight - container.clientWidth + 12, behavior: \"smooth\" });\n }\n }, [activeTabId, tabs.length]);\n\n /* ── 좌우 페이드 상태 갱신 ── */\n const updateFades = () => {\n const c = scrollRef.current;\n if (!c) return;\n setShowLeftFade(c.scrollLeft > 2);\n setShowRightFade(c.scrollLeft + c.clientWidth < c.scrollWidth - 2);\n };\n\n useEffect(() => {\n updateFades();\n const obs = new ResizeObserver(updateFades);\n if (scrollRef.current) obs.observe(scrollRef.current);\n return () => obs.disconnect();\n }, [tabs]);\n\n /* ── 마우스 드래그 스크롤 ── */\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!scrollRef.current) return;\n isDragging.current = true;\n hasDragged.current = false;\n dragStartX.current = e.pageX - scrollRef.current.getBoundingClientRect().left;\n dragScrollLeft.current = scrollRef.current.scrollLeft;\n };\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging.current || !scrollRef.current) return;\n const x = e.pageX - scrollRef.current.getBoundingClientRect().left;\n const walk = x - dragStartX.current;\n if (Math.abs(walk) > 4) hasDragged.current = true;\n scrollRef.current.scrollLeft = dragScrollLeft.current - walk;\n };\n\n const handleStopDrag = () => {\n isDragging.current = false;\n };\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n el.scrollLeft += e.deltaY || e.deltaX;\n };\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, []);\n\n if (tabs.length === 0) return null;\n\n return (\n <div className={`flex-shrink-0 w-full overflow-hidden ${s.container}`}>\n <div className=\"relative flex items-stretch\">\n {showLeftFade && (\n <div\n className=\"absolute left-0 top-0 bottom-0 w-10 pointer-events-none z-10\"\n style={{ background: easedFade(\"to right\", s.fadeOpacity) }}\n />\n )}\n\n {showRightFade && (\n <div\n className=\"absolute top-0 bottom-0 w-10 pointer-events-none z-10\"\n style={{\n right: PLUS_BTN_WIDTH,\n background: easedFade(\"to left\", s.fadeOpacity),\n }}\n />\n )}\n\n <div\n ref={scrollRef}\n className={`flex-1 min-w-0 flex items-end gap-0.5 ${s.scrollPadding} overflow-x-auto [&::-webkit-scrollbar]:hidden`}\n style={{ scrollbarWidth: \"none\" }}\n onScroll={updateFades}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleStopDrag}\n onMouseLeave={handleStopDrag}\n >\n {tabs.map((tab) => {\n const isActive = tab.id === activeTabId;\n return (\n <div\n key={tab.id}\n ref={(el) => {\n if (el) tabRefs.current.set(tab.id, el);\n else tabRefs.current.delete(tab.id);\n }}\n onClick={() => {\n if (hasDragged.current) return;\n if (!isActive) onTabClick(tab.id);\n }}\n className={`\n group relative flex items-center gap-1.5 ${s.tabPx} ${s.tabPy} flex-shrink-0\n ${s.rounded} border border-b-0 cursor-pointer select-none\n transition-colors duration-100\n ${isActive ? s.activeTab : s.inactiveTab}\n `}\n >\n {isActive && (\n <div\n className={`absolute top-0 left-0 right-0 h-0.5 ${s.rounded} ${s.indicator}`}\n style={primaryColor ? { backgroundColor: primaryColor } : undefined}\n />\n )}\n\n <span\n className={`${s.tabTextSize} max-w-35 truncate leading-none ${isActive ? s.activeText : s.inactiveText}`}\n >\n {tab.label}\n </span>\n\n {tabs.length > 1 && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onTabClose(tab.id);\n }}\n className={`\n flex-shrink-0 ${s.closeBtnWH} flex items-center justify-center\n transition-all duration-100 cursor-pointer\n ${s.closeBtn}\n ${isActive ? \"opacity-100\" : \"opacity-40 group-hover:opacity-60\"}\n `}\n >\n <X size={s.closeBtnSize} strokeWidth={2.5} />\n </button>\n )}\n </div>\n );\n })}\n </div>\n\n {onTabAdd && (\n <div\n className={`flex-shrink-0 flex items-center justify-center ${s.plusBtnArea}`}\n style={{ width: PLUS_BTN_WIDTH }}\n >\n <button\n onClick={onTabAdd}\n title=\"현재 페이지를 새 탭으로 열기\"\n className={`w-6 h-6 flex items-center justify-center rounded cursor-pointer transition-colors ${s.plusBtn}`}\n >\n <Plus size={13} strokeWidth={2} />\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { create } from \"zustand\";\nimport { createJSONStorage, persist } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport type MultiTab = {\n id: string;\n basePath: string;\n label: string;\n currentPath: string;\n};\n\ninterface MultiTabStore {\n tabs: MultiTab[];\n activeTabId: string | null;\n hasHydrated: boolean;\n /**\n * 탭 열기 (메뉴 클릭용)\n * - 동일 basePath 탭이 있으면 활성화 후 currentPath 반환\n * - 없으면 새 탭 생성 후 null 반환\n */\n openTab: (basePath: string, label: string, initialPath?: string) => string | null;\n /**\n * 탭 강제 추가 ([+] 버튼용)\n * - 동일 basePath가 있어도 항상 새 탭 생성\n */\n addTab: (basePath: string, label: string, currentPath: string) => string;\n /**\n * 탭 전환\n * - 이전 탭의 currentPath를 fromPath로 갱신 후 대상 탭 활성화\n * - 전환할 탭의 currentPath 반환\n */\n switchToTab: (toId: string, fromPath: string) => string;\n closeTab: (id: string) => string | null;\n updateCurrentPath: (id: string, path: string) => void;\n setActiveTabId: (id: string) => void;\n setHasHydrated: (v: boolean) => void;\n}\n\n// 읽기/쓰기 시점마다 currentId를 조회하므로 로그인 전/후 모두 올바른 키 사용\nconst userScopedStorage = createJSONStorage(() => ({\n getItem: (name: string) => {\n const userId = localStorage.getItem(\"currentId\") ?? \"guest\";\n return localStorage.getItem(`${name}-${userId}`);\n },\n setItem: (name: string, value: string) => {\n const userId = localStorage.getItem(\"currentId\") ?? \"guest\";\n localStorage.setItem(`${name}-${userId}`, value);\n },\n removeItem: (name: string) => {\n const userId = localStorage.getItem(\"currentId\") ?? \"guest\";\n localStorage.removeItem(`${name}-${userId}`);\n },\n}));\n\nexport const useMultiTabStore = create<MultiTabStore>()(\n persist(\n (set, get) => ({\n tabs: [],\n activeTabId: null,\n hasHydrated: false,\n\n openTab: (basePath, label, initialPath) => {\n const { tabs } = get();\n const existing = tabs.find((t) => t.basePath === basePath);\n if (existing) {\n set({ activeTabId: existing.id });\n return existing.currentPath;\n }\n const id = uuidv4();\n const currentPath = initialPath ?? basePath;\n set({ tabs: [...tabs, { id, basePath, label, currentPath }], activeTabId: id });\n return null;\n },\n\n addTab: (basePath, label, currentPath) => {\n const id = uuidv4();\n set((s) => ({ tabs: [...s.tabs, { id, basePath, label, currentPath }], activeTabId: id }));\n return currentPath;\n },\n\n switchToTab: (toId, fromPath) => {\n const { tabs, activeTabId } = get();\n const fromTab = activeTabId ? tabs.find((t) => t.id === activeTabId) : null;\n const urlBelongsToFrom =\n fromTab != null &&\n (fromPath === fromTab.basePath ||\n fromPath.startsWith(fromTab.basePath + \"/\") ||\n fromPath.startsWith(fromTab.basePath + \"?\"));\n const updatedTabs =\n urlBelongsToFrom && activeTabId\n ? tabs.map((t) => (t.id === activeTabId ? { ...t, currentPath: fromPath } : t))\n : tabs;\n const toTab = updatedTabs.find((t) => t.id === toId)!;\n set({ tabs: updatedTabs, activeTabId: toId });\n return toTab.currentPath;\n },\n\n closeTab: (id) => {\n const { tabs, activeTabId } = get();\n const idx = tabs.findIndex((t) => t.id === id);\n const newTabs = tabs.filter((t) => t.id !== id);\n if (activeTabId !== id) {\n set({ tabs: newTabs });\n return null;\n }\n if (newTabs.length === 0) {\n set({ tabs: [], activeTabId: null });\n return null;\n }\n const nextTab = newTabs[Math.min(idx, newTabs.length - 1)];\n if (!nextTab) {\n set({ tabs: newTabs, activeTabId: null });\n return null;\n }\n set({ tabs: newTabs, activeTabId: nextTab.id });\n return nextTab.currentPath;\n },\n\n updateCurrentPath: (id, path) =>\n set((s) => ({ tabs: s.tabs.map((t) => (t.id === id ? { ...t, currentPath: path } : t)) })),\n\n setActiveTabId: (id) => set({ activeTabId: id }),\n\n setHasHydrated: (v) => set({ hasHydrated: v }),\n }),\n {\n name: \"multi-tab-store\",\n storage: userScopedStorage,\n partialize: (state) => ({ tabs: state.tabs, activeTabId: state.activeTabId }),\n onRehydrateStorage: () => (state) => {\n state?.setHasHydrated(true);\n },\n },\n ),\n);\n","import { useCallback, useEffect, useRef, useState, type RefObject } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\ninterface ScrollBarProps {\n direction: \"horizontal\" | \"vertical\";\n scrollRef: RefObject<HTMLDivElement | null>;\n}\n\nexport default function ScrollBar(props: ScrollBarProps) {\n const { direction, scrollRef } = props;\n const [scrollPosition, setScrollPosition] = useState(0);\n const [thumbSize, setThumbSize] = useState(0);\n const [trackSize, setTrackSize] = useState(0);\n const [clientSize, setClientSize] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n const dragOffsetRef = useRef(0);\n\n const getWrapperClassName = () => {\n if (direction === \"horizontal\") {\n return \"w-full h-[6px]\";\n }\n return \"h-full w-[6px]\";\n };\n\n const getThumbClassName = () => {\n const defaultClass = \"bg-[#D8D8D8] cursor-pointer hover:bg-[#999999] transition-colors\";\n if (direction === \"horizontal\") {\n return cn(defaultClass, \"h-full\", isDragging ? \"bg-[#999999]\" : \"\");\n }\n return cn(defaultClass, \"w-full\", isDragging ? \"bg-[#999999]\" : \"\");\n };\n\n const updateScrollBar = useCallback(() => {\n if (!scrollRef.current) {\n return;\n }\n\n const scrollElement = scrollRef.current;\n\n if (direction === \"horizontal\") {\n setTrackSize(scrollElement.scrollWidth);\n const scrollWidth = scrollElement.scrollWidth;\n const clientWidth = scrollElement.clientWidth;\n setClientSize(clientWidth);\n const scrollLeft = scrollElement.scrollLeft;\n\n const thumbSizeRatio = clientWidth / scrollWidth;\n const newThumbSize = Math.max(thumbSizeRatio * clientWidth, 30);\n const maxScroll = scrollWidth - clientWidth;\n const scrollRatio = maxScroll > 0 ? scrollLeft / maxScroll : 0;\n const maxThumbPosition = clientWidth - newThumbSize;\n const newScrollPosition = scrollRatio * maxThumbPosition;\n\n setThumbSize(newThumbSize);\n setScrollPosition(newScrollPosition);\n } else {\n setTrackSize(scrollElement.scrollHeight);\n const scrollHeight = scrollElement.scrollHeight;\n const clientHeight = scrollElement.clientHeight;\n setClientSize(clientHeight);\n const scrollTop = scrollElement.scrollTop;\n\n const thumbSizeRatio = clientHeight / scrollHeight;\n const newThumbSize = Math.max(thumbSizeRatio * clientHeight, 30);\n const maxScroll = scrollHeight - clientHeight;\n const scrollRatio = maxScroll > 0 ? scrollTop / maxScroll : 0;\n const maxThumbPosition = clientHeight - newThumbSize;\n const newScrollPosition = scrollRatio * maxThumbPosition;\n\n setThumbSize(newThumbSize);\n setScrollPosition(newScrollPosition);\n }\n }, [direction, scrollRef]);\n\n const handleThumbMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n\n if (!thumbRef.current) {\n return;\n }\n const thumbRect = thumbRef.current.getBoundingClientRect();\n\n // 마우스가 thumb 내에서 클릭한 위치의 offset 저장\n if (direction === \"horizontal\") {\n dragOffsetRef.current = e.clientX - thumbRect.left;\n } else {\n dragOffsetRef.current = e.clientY - thumbRect.top;\n }\n\n setIsDragging(true);\n };\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !scrollRef.current || !trackRef.current) {\n return;\n }\n const trackRect = trackRef.current.getBoundingClientRect();\n const scrollBoxRect = scrollRef.current.getBoundingClientRect();\n const scrollElement = scrollRef.current;\n\n if (direction === \"horizontal\") {\n // 마우스 위치에서 클릭 offset을 빼서 thumb의 시작 위치 계산\n const thumbPosition = e.clientX - trackRect.left - dragOffsetRef.current;\n const trackWidth = trackRect.width;\n const maxThumbPosition = trackWidth - thumbSize;\n\n // thumb 위치를 0과 maxThumbPosition 사이로 제한\n const clampedThumbPosition = Math.max(0, Math.min(thumbPosition, maxThumbPosition));\n // thumb 위치 비율을 스크롤 위치로 변환\n const scrollRatio = maxThumbPosition > 0 ? clampedThumbPosition / maxThumbPosition : 0;\n const maxScroll = scrollElement.scrollWidth - scrollElement.clientWidth;\n scrollElement.scrollLeft = scrollRatio * maxScroll;\n } else {\n // 마우스 위치에서 클릭 offset을 빼서 thumb의 시작 위치 계산\n const thumbPosition = e.clientY - trackRect.top - dragOffsetRef.current;\n const scrollBoxHeight = scrollBoxRect.height;\n const maxThumbPosition = scrollBoxHeight - thumbSize;\n\n // thumb 위치를 0과 maxThumbPosition 사이로 제한\n const clampedThumbPosition = Math.max(0, Math.min(thumbPosition, maxThumbPosition));\n // thumb 위치 비율을 스크롤 위치로 변환\n const scrollRatio = maxThumbPosition > 0 ? clampedThumbPosition / maxThumbPosition : 0;\n const maxScroll = scrollElement.scrollHeight - scrollElement.clientHeight;\n scrollElement.scrollTop = scrollRatio * maxScroll;\n }\n },\n [isDragging, direction, scrollRef, thumbSize],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n useEffect(() => {\n const scrollElement = scrollRef.current;\n if (!scrollElement) {\n return;\n }\n\n const updateAfterRender = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updateScrollBar();\n });\n });\n };\n\n updateAfterRender();\n scrollElement.addEventListener(\"scroll\", updateScrollBar);\n\n const resizeObserver = new ResizeObserver(() => {\n updateScrollBar();\n });\n resizeObserver.observe(scrollElement);\n\n const mutationObserver = new MutationObserver(() => {\n updateScrollBar();\n });\n mutationObserver.observe(scrollElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n return () => {\n scrollElement.removeEventListener(\"scroll\", updateScrollBar);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [updateScrollBar, scrollRef]);\n\n useEffect(() => {\n if (isDragging) {\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }\n return undefined;\n }, [isDragging, handleMouseMove, handleMouseUp]);\n\n // 스크롤바가 필요하지 않은 경우 렌더링하지 않음\n\n if (thumbSize === 0 || thumbSize === trackSize) {\n return null;\n }\n\n return (\n <div\n ref={trackRef}\n className={cn(\"bg-[#F4F4F4] relative\", getWrapperClassName())}\n style={{\n [direction === \"horizontal\" ? \"width\" : \"height\"]:\n direction === \"horizontal\"\n ? `${clientSize > 0 ? clientSize : trackSize}px`\n : `${clientSize > 0 ? clientSize : trackSize}px`,\n }}\n >\n <div\n ref={thumbRef}\n className={getThumbClassName()}\n style={{\n [direction === \"horizontal\" ? \"width\" : \"height\"]: `${thumbSize}px`,\n transform:\n direction === \"horizontal\"\n ? `translateX(${scrollPosition}px)`\n : `translateY(${scrollPosition}px)`,\n }}\n onMouseDown={handleThumbMouseDown}\n />\n </div>\n );\n}\n","interface ToggleSwitchProps {\n isOn: boolean;\n toggleSwitch: () => void;\n offText?: string;\n onText?: string;\n width?: string;\n height?: string;\n circleSize?: string;\n onColor?: {\n from: string;\n to: string;\n };\n offColor?: {\n from: string;\n to: string;\n };\n textPosition?: {\n on: string;\n off: string;\n };\n}\n\nexport default function ToggleSwitch(props: ToggleSwitchProps) {\n const {\n isOn,\n toggleSwitch,\n offText = \"상하\",\n onText = \"좌우\",\n width = \"w-15\",\n height = \"h-6.5\",\n circleSize = \"w-4 h-4\",\n onColor = { from: \"#4ade80\", to: \"#22c55e\" },\n offColor = { from: \"#f87171\", to: \"#ef4444\" },\n } = props;\n\n return (\n <button\n className={`relative ${width} ${height} rounded-full bg-white shadow-md flex items-center cursor-pointer transition-all duration-300 ease-in-out`}\n onClick={toggleSwitch}\n aria-pressed={isOn}\n >\n <div\n className={`absolute w-10 text-xs font-semibold text-red-600 transition-opacity duration-300 left-2/3 -translate-x-1/2 ${\n !isOn ? \"opacity-100\" : \"opacity-0\"\n }`}\n >\n {offText}\n </div>\n\n <div\n className={`absolute w-10 text-xs font-semibold text-green-700 transition-opacity duration-300 left-1/3 -translate-x-1/2 ${\n isOn ? \"opacity-100\" : \"opacity-0\"\n }`}\n >\n {onText}\n </div>\n\n <div\n className={`absolute ${circleSize} rounded-full shadow-md transition-transform duration-300 ease-in-out left-1 ${\n isOn ? \"translate-x-8\" : \"translate-x-0\"\n }`}\n style={{\n background: isOn\n ? `linear-gradient(to bottom right, ${onColor.from}, ${onColor.to})`\n : `linear-gradient(to bottom right, ${offColor.from}, ${offColor.to})`,\n }}\n />\n </button>\n );\n}\n","import dayjs from \"dayjs\";\n\nexport function formatDate(date: string, time: boolean = false): string {\n return dayjs(date).format(time ? \"YYYY-MM-DD HH:mm:ss\" : \"YYYY-MM-DD\");\n}\n\nexport function todayDate(): string {\n return dayjs().format(\"YYYY-MM-DD\");\n}\n\nexport function chatTime(timestamp: string): string {\n const date = new Date(timestamp);\n return dayjs(date).format(\"HH:MM\");\n}\n\nexport function chatFullTime(timestamp: string): string {\n const date = new Date(timestamp);\n return dayjs(date).format(\"YYYY-MM-DD HH:MM\");\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useId, useRef, useState } from \"react\";\nimport { Upload, X, FileText } from \"lucide-react\";\nimport { cn } from \"../../lib/variants\";\nimport { formatFileSize } from \"../../lib/dateUtils\";\n\nexport interface BaseUploaderProps {\n files: Array<File>;\n onChange: (files: Array<File>) => void;\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n}\n\nfunction checkAccept(file: File, accept?: string): boolean {\n if (!accept) return true;\n const parts = accept.split(\",\").map((s) => s.trim().toLowerCase());\n const name = file.name.toLowerCase();\n const mime = file.type.toLowerCase();\n return parts.some((part) => {\n if (part.startsWith(\".\")) return name.endsWith(part);\n if (part.endsWith(\"/*\")) return mime.startsWith(part.slice(0, -2));\n return mime === part;\n });\n}\n\nexport default function BaseUploader(props: BaseUploaderProps) {\n const {\n files,\n onChange,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n disabled = false,\n placeholder,\n className,\n } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n const [isDragging, setIsDragging] = useState(false);\n const [error, setError] = useState(\"\");\n\n const processFiles = useCallback(\n (incoming: Array<File>) => {\n setError(\"\");\n const valid: Array<File> = [];\n const errors: Array<string> = [];\n\n for (const file of incoming) {\n if (!checkAccept(file, accept)) {\n errors.push(`${file.name}: 허용되지 않는 파일 형식`);\n continue;\n }\n if (maxSize && file.size > maxSize) {\n errors.push(`${file.name}: 파일 크기 초과 (최대 ${formatFileSize(maxSize)})`);\n continue;\n }\n valid.push(file);\n }\n\n if (errors.length) setError(errors.join(\" / \"));\n if (!valid.length) return;\n\n const next = multiple ? [...files, ...valid] : [valid[0]];\n const limited = maxFiles ? next.slice(0, maxFiles) : next;\n\n onChange(limited as Array<File>);\n },\n [accept, files, maxFiles, maxSize, multiple, onChange],\n );\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n processFiles(Array.from(e.dataTransfer.files));\n };\n\n const removeFile = (idx: number) => {\n const next = files.filter((_, i) => i !== idx);\n onChange(next);\n setError(\"\");\n };\n\n const showZone = multiple || files.length === 0;\n const acceptLabel = accept\n ? accept\n .split(\",\")\n .map((s) => s.trim().toUpperCase())\n .join(\", \")\n : \"모든 형식\";\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <input\n id={inputId}\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n className=\"hidden\"\n onChange={(e) => {\n processFiles(Array.from(e.target.files ?? []));\n if (inputRef.current) inputRef.current.value = \"\";\n }}\n />\n\n {showZone && (\n <div\n onClick={() => !disabled && inputRef.current?.click()}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n }}\n onDragEnter={(e) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n setIsDragging(false);\n }}\n onDrop={handleDrop}\n className={cn(\n \"flex flex-col items-center justify-center gap-2 min-h-28 w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed\",\n disabled ? \"cursor-not-allowed border-gray-200 bg-gray-100 opacity-60\" : \"cursor-pointer hover:bg-gray-50\",\n isDragging ? \"border-blue-500 bg-blue-50\" : \"border-gray-300\",\n error && !isDragging ? \"border-red-300 bg-red-50\" : \"\",\n )}\n >\n <Upload className=\"w-6 h-6 text-gray-400\" />\n <p className=\"text-sm text-gray-600\">{placeholder ?? \"클릭하거나 파일을 드래그하세요\"}</p>\n <p className=\"text-xs text-gray-400\">\n {acceptLabel}\n {maxFiles ? ` · 최대 ${maxFiles}개` : \"\"}\n {maxSize ? ` · 최대 ${formatFileSize(maxSize)}` : \"\"}\n </p>\n </div>\n )}\n\n {error && <p className=\"text-xs text-red-500 bg-red-50 border border-red-200 rounded px-3 py-2\">{error}</p>}\n\n {files.length > 0 && (\n <ul className=\"space-y-2\">\n {files.map((file, idx) => (\n <li\n key={`${file.name}-${idx}`}\n className=\"flex items-center gap-3 rounded-lg border border-gray-200 bg-white px-3 py-2\"\n >\n <FileText className=\"w-4 h-4 shrink-0 text-gray-400\" />\n <span className=\"flex-1 truncate text-sm text-gray-700\" title={file.name}>\n {file.name}\n </span>\n <span className=\"shrink-0 text-xs text-gray-400\">{formatFileSize(file.size)}</span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => removeFile(idx)}\n className=\"shrink-0 text-gray-400 hover:text-red-500 transition-colors cursor-pointer\"\n aria-label=\"파일 제거\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","import BaseUploader from \"./BaseUploader\";\n\nexport interface ExcelUploaderProps {\n files: Array<File>;\n onChange: (files: Array<File>) => void;\n disabled?: boolean;\n className?: string;\n}\n\nconst EXCEL_ACCEPT = \".xlsx,.xls,.csv\";\nconst MAX_EXCEL_BYTES = 10 * 1024 * 1024; // Excel 파일당 10 MB\n\nexport default function ExcelUploader(props: ExcelUploaderProps) {\n const { files, onChange, disabled, className } = props;\n return (\n <BaseUploader\n files={files}\n onChange={onChange}\n accept={EXCEL_ACCEPT}\n multiple={false}\n maxSize={MAX_EXCEL_BYTES}\n disabled={disabled}\n placeholder=\"엑셀 파일을 클릭하거나 드래그하세요\"\n className={className}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\n\nimport type { FilePreviewViewerProps } from \"..\";\n\ntype FilePreviewViewerFiles<T extends string> = FilePreviewViewerProps<T>[\"files\"];\n\nexport function useFilePreviewViewer<T extends string = string>(files: FilePreviewViewerFiles<T>) {\n const [isOpen, setIsOpen] = useState(false);\n const [initialIndex, setInitialIndex] = useState(0);\n\n const open = useCallback((index = 0) => {\n setInitialIndex(index);\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const viewerProps: FilePreviewViewerProps<T> = {\n isOpen,\n onClose: close,\n files,\n initialIndex,\n };\n\n return { isOpen, initialIndex, open, close, viewerProps };\n}\n","import heic2any from \"heic2any\";\nimport { useCallback, useEffect, useRef, useState, type DragEvent } from \"react\";\nimport { FileText, FileUp, X } from \"lucide-react\";\nimport FilePreviewViewer from \"../FilePreviewViewer\";\nimport { useFilePreviewViewer } from \"../FilePreviewViewer/hooks/useFilePreviewViewer\";\nimport { formatFileSize } from \"../../lib/dateUtils\";\nimport { cn } from \"../../lib/variants\";\n\n// ── 업로드 사양 ────────────────────────────────────────────────────────────\nconst MAX_FILES = 20;\nconst MAX_TOTAL_BYTES = 20 * 1024 * 1024; // 전체 합산 20 MB\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024; // 이미지 파일당 50 MB\nconst MAX_PDF_BYTES = 10 * 1024 * 1024; // PDF 파일당 10 MB\nconst COMPRESS_THRESHOLD = 1 * 1024 * 1024; // 1 MB 초과 시 압축\nconst TARGET_MAX_BYTES = 1 * 1024 * 1024; // 압축 목표 출력 크기\nconst MAX_DIMENSION = 1920;\nconst QUALITY_STEPS = [0.92, 0.85, 0.75, 0.65, 0.55, 0.45, 0.3, 0.2];\n\nconst ALLOWED_IMAGE_EXTS = new Set([\"jpg\", \"jpeg\", \"png\", \"heic\", \"heif\", \"webp\"]);\n\nconst getExt = (name: string) => name.split(\".\").pop()?.toLowerCase() ?? \"\";\nconst isImageFile = (file: File) => ALLOWED_IMAGE_EXTS.has(getExt(file.name));\nconst isPdfFile = (file: File) => getExt(file.name) === \"pdf\";\nconst isHeicFile = (file: File) => [\"heic\", \"heif\"].includes(getExt(file.name));\n\n// ── URL 캐시 (WeakMap: render 중 접근 가능, react-hooks/refs 위반 없음) ────\nconst urlCache = new WeakMap<File, string>();\n\nfunction getOrCreateUrl(file: File): string {\n if (!urlCache.has(file)) {\n const previewable = file.type.startsWith(\"image/\") || file.type === \"application/pdf\";\n urlCache.set(file, previewable ? URL.createObjectURL(file) : \"\");\n }\n return urlCache.get(file)!;\n}\n\nfunction revokeFile(file: File) {\n const url = urlCache.get(file);\n if (url) {\n URL.revokeObjectURL(url);\n urlCache.delete(file);\n }\n}\n\n// ── HEIC/HEIF → JPEG 변환 ─────────────────────────────────────────────────\nconst convertHeicToJpeg = async (file: File): Promise<File> => {\n const blob = await heic2any({ blob: file, toType: \"image/jpeg\", quality: 0.92 });\n const result = Array.isArray(blob) ? blob[0] : blob;\n const baseName = file.name.replace(/\\.[^.]+$/, \"\");\n if (!result) throw new Error(\"HEIC conversion failed\");\n return new File([result], `${baseName}.jpg`, { type: \"image/jpeg\" });\n};\n\n// ── 1MB 초과 이미지 압축 (Canvas 리사이징 + 단계적 품질 조정) ────────────\nconst compressImage = (file: File): Promise<File> => {\n if (!isImageFile(file) || file.size <= COMPRESS_THRESHOLD) return Promise.resolve(file);\n return createImageBitmap(file)\n .then((bitmap) => {\n let { width, height } = bitmap;\n if (Math.max(width, height) > MAX_DIMENSION) {\n if (width >= height) {\n height = Math.round((height * MAX_DIMENSION) / width);\n width = MAX_DIMENSION;\n } else {\n width = Math.round((width * MAX_DIMENSION) / height);\n height = MAX_DIMENSION;\n }\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n canvas.getContext(\"2d\")!.drawImage(bitmap, 0, 0, width, height);\n bitmap.close();\n\n const tryQuality = (stepIdx: number): Promise<File> =>\n new Promise<File>((resolve) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n resolve(file);\n return;\n }\n if (blob.size <= TARGET_MAX_BYTES || stepIdx >= QUALITY_STEPS.length - 1) {\n const baseName = file.name.replace(/\\.[^.]+$/, \"\");\n resolve(new File([blob], `${baseName}.jpg`, { type: \"image/jpeg\" }));\n } else {\n resolve(tryQuality(stepIdx + 1));\n }\n },\n \"image/jpeg\",\n QUALITY_STEPS[stepIdx],\n );\n });\n\n return tryQuality(0);\n })\n .catch(() => file);\n};\n\nexport interface FileUploaderProps {\n files: Array<File>;\n onChange: (files: Array<File>) => void;\n multiple?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport default function FileUploader(props: FileUploaderProps) {\n const { files, onChange, multiple = true, disabled = false, className } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [processingCount, setProcessingCount] = useState(0);\n const [error, setError] = useState(\"\");\n\n // render 중 WeakMap에서 URL 파생 (ref 미사용)\n const previewUrls = files.map(getOrCreateUrl);\n\n // effect 내부에서만 접근하는 ref\n const prevFilesRef = useRef<Array<File>>([]);\n\n useEffect(() => {\n const prevFiles = prevFilesRef.current;\n prevFilesRef.current = files;\n return () => {\n const nextSet = new Set(files);\n prevFiles.forEach((f) => {\n if (!nextSet.has(f)) revokeFile(f);\n });\n };\n }, [files]);\n\n useEffect(() => {\n return () => {\n prevFilesRef.current.forEach(revokeFile);\n };\n }, []);\n\n const viewer = useFilePreviewViewer(previewUrls);\n\n const fileTypes = files.map((f): \"image\" | \"pdf\" | \"unsupported\" => {\n if (f.type.startsWith(\"image/\")) return \"image\";\n if (f.type === \"application/pdf\") return \"pdf\";\n return \"unsupported\";\n });\n\n const handleFiles = useCallback(\n async (list: FileList | null) => {\n if (!list || list.length < 1) return;\n setError(\"\");\n\n const remaining = MAX_FILES - files.length;\n if (remaining <= 0) {\n setError(`최대 업로드 가능 개수(${MAX_FILES}개)를 초과했습니다.`);\n return;\n }\n\n const allFiles = Array.from(list);\n const filesToProcess = allFiles.slice(0, remaining);\n const errors: Array<string> = [];\n\n if (allFiles.length > remaining) {\n errors.push(\n `파일은 최대 ${MAX_FILES}개까지 업로드할 수 있습니다. 선택한 파일 중 ${remaining}개만 추가됩니다.`,\n );\n }\n\n let currentTotalBytes = files.reduce((sum, f) => sum + (f.size || 0), 0);\n const processed: Array<File> = [];\n\n for (const el of filesToProcess) {\n if (!isImageFile(el) && !isPdfFile(el)) {\n errors.push(`${el.name}: 지원하지 않는 형식 (이미지 또는 PDF만 가능)`);\n continue;\n }\n if (isImageFile(el) && el.size > MAX_IMAGE_BYTES) {\n errors.push(`${el.name}: 이미지 파일은 50MB를 초과할 수 없습니다.`);\n continue;\n }\n if (isPdfFile(el) && el.size > MAX_PDF_BYTES) {\n errors.push(`${el.name}: PDF 파일은 10MB를 초과할 수 없습니다.`);\n continue;\n }\n\n setProcessingCount((c) => c + 1);\n try {\n const converted = isHeicFile(el) ? await convertHeicToJpeg(el) : el;\n const compressed = await compressImage(converted);\n if (currentTotalBytes + compressed.size > MAX_TOTAL_BYTES) {\n errors.push(`${el.name}: 전체 업로드 용량(20MB)을 초과하여 추가되지 않았습니다.`);\n continue;\n }\n currentTotalBytes += compressed.size;\n processed.push(compressed);\n } catch (err) {\n console.error(err);\n errors.push(`${el.name}: 처리 중 오류가 발생했습니다.`);\n } finally {\n setProcessingCount((c) => c - 1);\n }\n }\n\n if (errors.length > 0) setError(errors.join(\"\\n\"));\n if (processed.length > 0) {\n const first = processed[0];\n onChange(multiple ? [...files, ...processed] : (first ? [first] : []));\n }\n },\n [files, multiple, onChange],\n );\n\n const handleDragOver = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n const relatedTarget = e.relatedTarget as Node | null;\n if (!relatedTarget || (containerRef.current && !containerRef.current.contains(relatedTarget))) {\n setIsDragging(false);\n }\n };\n\n const handleDrop = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled) handleFiles(e.dataTransfer.files);\n };\n\n const removeFile = (idx: number) => {\n onChange(files.filter((_, i) => i !== idx));\n setError(\"\");\n };\n\n const isProcessing = processingCount > 0;\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept=\"image/jpeg,image/png,image/webp,image/heic,image/heif,application/pdf,.heic,.heif\"\n disabled={disabled}\n className=\"hidden\"\n onChange={(e) => {\n handleFiles(e.target.files);\n if (inputRef.current) inputRef.current.value = \"\";\n }}\n />\n\n <div\n ref={containerRef}\n onClick={isProcessing || disabled ? undefined : () => inputRef.current?.click()}\n onDragOver={handleDragOver}\n onDragEnter={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={cn(\n \"relative w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed\",\n disabled\n ? \"cursor-not-allowed border-gray-200 bg-gray-100 opacity-60\"\n : isProcessing\n ? \"cursor-default border-gray-300\"\n : \"cursor-pointer hover:bg-gray-50\",\n isDragging ? \"border-blue-500 bg-blue-50\" : \"border-gray-300\",\n error && !isDragging ? \"border-red-300 bg-red-50\" : \"\",\n files.length > 0 ? \"p-3\" : \"flex flex-col items-center justify-center gap-1 min-h-32\",\n )}\n >\n {/* 파일 처리 중 오버레이 */}\n {isProcessing && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-white/80\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-blue-400 border-t-transparent\" />\n <p className=\"text-xs text-gray-600\">처리 중...</p>\n </div>\n )}\n\n {files.length > 0 ? (\n <>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3\">\n {files.map((file, idx) => {\n const url = previewUrls[idx];\n const isImage = file.type.startsWith(\"image/\");\n return (\n <div\n key={`${file.name}-${idx}`}\n className=\"group relative overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow-md\"\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n viewer.open(idx);\n }}\n className=\"block w-full aspect-square cursor-pointer\"\n aria-label={`${file.name} 미리보기`}\n >\n {isImage && url ? (\n <img src={url} alt={file.name} className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full flex-col items-center justify-center bg-gray-50 text-gray-400\">\n <FileText className=\"w-8 h-8\" />\n <span className=\"mt-1 max-w-full truncate px-1 text-center text-[10px]\">\n {file.name}\n </span>\n </div>\n )}\n </button>\n <div className=\"flex items-center justify-between gap-1 border-t border-gray-100 px-1.5 py-1\">\n <span className=\"flex-1 truncate text-[10px] text-gray-600\" title={file.name}>\n {file.name}\n </span>\n <span className=\"shrink-0 text-[10px] text-gray-400\">{formatFileSize(file.size)}</span>\n </div>\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(idx);\n }}\n className=\"absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded-full bg-black/60 text-white opacity-0 transition-opacity group-hover:opacity-100 cursor-pointer\"\n aria-label=\"파일 제거\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n <div className=\"mt-2 flex items-center justify-between text-xs text-gray-500\">\n <span>\n {files.length}개 파일 선택됨{!disabled && \" · 클릭하여 추가\"}\n </span>\n <span>총 {formatFileSize(files.reduce((sum, f) => sum + f.size, 0))}</span>\n </div>\n </>\n ) : isDragging ? (\n <div className=\"flex flex-col items-center justify-center gap-1 text-blue-500\">\n <p className=\"text-sm font-semibold flex gap-1\">\n <FileUp size={15} className=\"mt-[1px]\" />\n 파일을 여기에 놓아주세요\n </p>\n <p className=\"text-xs font-medium\">드롭하면 자동으로 업로드됩니다.</p>\n </div>\n ) : (\n <>\n <p className=\"text-sm text-gray-600 flex gap-1\">\n <FileUp size={15} className=\"text-gray-400 mt-[1px]\" /> 클릭하여 파일을 선택하거나 드래그하세요\n </p>\n <p className=\"text-xs text-gray-400\">\n 이미지(JPG · PNG · WEBP · HEIC, 최대 50MB) · PDF(최대 10MB)\n </p>\n <p className=\"text-xs text-gray-400\">\n {multiple ? `최대 ${MAX_FILES}개 · 전체 20MB 이하` : \"단일 파일\"}\n </p>\n </>\n )}\n </div>\n\n {error && (\n <p className=\"whitespace-pre-line text-xs text-red-500 bg-red-50 border border-red-200 rounded px-3 py-2\">\n {error}\n </p>\n )}\n\n <FilePreviewViewer {...viewer.viewerProps} fileTypes={fileTypes} fileNames={files.map((f) => f.name)} />\n </div>\n );\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport { useNavigate, useLocation } from \"react-router\";\nimport { PanelLeftClose, PanelRightClose } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface MenuGrandchild {\n label: string;\n path: string;\n}\n\nexport interface MenuChild {\n label: string;\n path?: string;\n children?: Array<MenuGrandchild>;\n}\n\nexport interface MenuItem {\n icon: LucideIcon;\n label: string;\n path?: string;\n children?: Array<MenuChild>;\n}\n\nexport interface MenuSection {\n title?: string;\n items: Array<MenuItem>;\n}\n\nexport type SidebarVariant = \"light\" | \"dark\" | \"system-dark\" | \"system-light\";\n\nexport interface SidebarProps {\n menuSections: Array<MenuSection>;\n header?: ReactNode;\n footer?: ReactNode;\n className?: string;\n showCollapseButton?: boolean;\n onClose?: () => void;\n variant?: SidebarVariant;\n primaryColor?: string;\n}\n\ninterface VariantStyle {\n aside: string;\n sectionTitle: string;\n itemActive: string;\n itemInactive: string;\n subItemActive: string;\n subItemInactive: string;\n childGroupBorder: string;\n childActive: string;\n childInactive: string;\n grandchildActive: string;\n grandchildInactive: string;\n collapseBtn: string;\n collapseIcon: string;\n rounded: string;\n itemPy: string;\n childPy: string;\n grandchildPy: string;\n itemFont: string;\n itemTextSize: string;\n grandchildTextSize: string;\n iconClass: string;\n activeItemStyle: React.CSSProperties;\n activeChildStyle: React.CSSProperties;\n activeGrandchildStyle: React.CSSProperties;\n footerBorder: string;\n}\n\nconst VARIANT_STYLES: Record<SidebarVariant, VariantStyle> = {\n light: {\n aside: \"bg-white border-r border-gray-200\",\n sectionTitle: \"text-xs font-semibold text-gray-500 tracking-wider mb-3\",\n itemActive: \"bg-blue-50 text-blue-600\",\n itemInactive: \"text-gray-700 hover:bg-gray-100\",\n subItemActive: \"text-blue-600 font-medium\",\n subItemInactive: \"text-gray-600 hover:bg-gray-50 hover:text-gray-900\",\n childGroupBorder: \"border-gray-100\",\n childActive: \"bg-blue-50 text-blue-600 font-medium\",\n childInactive: \"text-gray-600 hover:bg-gray-50 hover:text-gray-900\",\n grandchildActive: \"bg-blue-50 text-blue-600 font-medium\",\n grandchildInactive: \"text-gray-500 hover:bg-gray-50 hover:text-gray-900\",\n collapseBtn: \"bg-gray-50 hover:bg-gray-100\",\n collapseIcon: \"var(--color-sub-darkgray)\",\n rounded: \"rounded-lg\",\n itemPy: \"py-2\",\n childPy: \"py-1.5\",\n grandchildPy: \"py-1\",\n itemFont: \"font-semibold\",\n itemTextSize: \"text-sm\",\n grandchildTextSize: \"text-xs\",\n iconClass: \"w-4 h-4 flex-shrink-0\",\n activeItemStyle: {},\n activeChildStyle: {},\n activeGrandchildStyle: {},\n footerBorder: \"border-t border-gray-200\",\n },\n dark: {\n aside: \"bg-gray-900 border-r border-gray-700\",\n sectionTitle: \"text-xs font-semibold text-gray-400 tracking-wider mb-3\",\n itemActive: \"bg-gray-700 text-white\",\n itemInactive: \"text-gray-300 hover:bg-gray-800\",\n subItemActive: \"text-blue-400 font-medium\",\n subItemInactive: \"text-gray-400 hover:bg-gray-800 hover:text-gray-100\",\n childGroupBorder: \"border-gray-700\",\n childActive: \"bg-gray-700 text-white font-medium\",\n childInactive: \"text-gray-400 hover:bg-gray-800 hover:text-gray-100\",\n grandchildActive: \"bg-gray-700 text-blue-400 font-medium\",\n grandchildInactive: \"text-gray-500 hover:bg-gray-800 hover:text-gray-100\",\n collapseBtn: \"bg-gray-800 hover:bg-gray-700\",\n collapseIcon: \"#9ca3af\",\n rounded: \"rounded-lg\",\n itemPy: \"py-2\",\n childPy: \"py-1.5\",\n grandchildPy: \"py-1\",\n itemFont: \"font-semibold\",\n itemTextSize: \"text-sm\",\n grandchildTextSize: \"text-xs\",\n iconClass: \"w-4 h-4 flex-shrink-0\",\n activeItemStyle: {},\n activeChildStyle: {},\n activeGrandchildStyle: {},\n footerBorder: \"border-t border-gray-700\",\n },\n \"system-dark\": {\n aside: \"bg-slate-900 border-r border-slate-700\",\n sectionTitle:\n \"text-[10px] font-bold text-slate-500 uppercase tracking-[0.12em] mb-2 pb-2 border-b border-slate-700/70\",\n itemActive: \"bg-slate-800 text-white\",\n itemInactive: \"text-slate-300 hover:bg-slate-800/60 hover:text-white\",\n subItemActive: \"text-slate-100 font-medium\",\n subItemInactive: \"text-slate-400 hover:bg-slate-800/50 hover:text-slate-200\",\n childGroupBorder: \"border-slate-700/60\",\n childActive: \"bg-slate-800/70 text-slate-100 font-medium\",\n childInactive: \"text-slate-400 hover:bg-slate-800/50 hover:text-slate-200\",\n grandchildActive: \"text-slate-100 font-medium\",\n grandchildInactive: \"text-slate-500 hover:bg-slate-800/50 hover:text-slate-200\",\n collapseBtn: \"bg-slate-800 hover:bg-slate-700\",\n collapseIcon: \"#94a3b8\",\n rounded: \"rounded-none\",\n itemPy: \"py-3\",\n childPy: \"py-[10px]\",\n grandchildPy: \"py-2\",\n itemFont: \"font-medium\",\n itemTextSize: \"text-sm\",\n grandchildTextSize: \"text-xs\",\n iconClass: \"w-4.5 h-4.5 flex-shrink-0\",\n activeItemStyle: { borderLeft: \"3px solid #818cf8\", paddingLeft: \"9px\" },\n activeChildStyle: { borderLeft: \"2px solid #818cf8\", paddingLeft: \"14px\" },\n activeGrandchildStyle: { borderLeft: \"2px solid #818cf8\", paddingLeft: \"10px\" },\n footerBorder: \"border-t border-slate-700\",\n },\n \"system-light\": {\n aside: \"bg-gray-50 border-r border-gray-200\",\n sectionTitle: \"text-[10px] font-bold text-slate-400 uppercase tracking-[0.12em] mb-2 pb-2 border-b border-gray-200\",\n itemActive: \"font-medium\",\n itemInactive: \"text-slate-700 hover:bg-gray-100\",\n subItemActive: \"text-[#2b2b2b] font-medium\",\n subItemInactive: \"text-slate-500 hover:bg-gray-100 hover:text-slate-800\",\n childGroupBorder: \"border-gray-200\",\n childActive: \"font-medium\",\n childInactive: \"text-slate-500 hover:bg-gray-100 hover:text-slate-800\",\n grandchildActive: \"text-[#2b2b2b] font-medium\",\n grandchildInactive: \"text-slate-500 hover:bg-gray-100 hover:text-slate-800\",\n collapseBtn: \"bg-gray-100 hover:bg-gray-200\",\n collapseIcon: \"#64748b\",\n rounded: \"rounded-none\",\n itemPy: \"py-3\",\n childPy: \"py-[10px]\",\n grandchildPy: \"py-2\",\n itemFont: \"font-medium\",\n itemTextSize: \"text-[15px]\",\n grandchildTextSize: \"text-sm\",\n iconClass: \"w-4.5 h-4.5 flex-shrink-0\",\n activeItemStyle: {\n color: \"#2b2b2b\",\n backgroundColor: \"color-mix(in srgb, #2b2b2b 10%, transparent)\",\n borderLeft: \"3px solid #2b2b2b\",\n paddingLeft: \"9px\",\n },\n activeChildStyle: {\n color: \"#2b2b2b\",\n backgroundColor: \"color-mix(in srgb, #2b2b2b 10%, transparent)\",\n borderLeft: \"2px solid #2b2b2b\",\n paddingLeft: \"14px\",\n },\n activeGrandchildStyle: {\n color: \"#2b2b2b\",\n backgroundColor: \"color-mix(in srgb, #2b2b2b 10%, transparent)\",\n borderLeft: \"2px solid #2b2b2b\",\n paddingLeft: \"10px\",\n },\n footerBorder: \"border-t border-gray-200\",\n },\n};\n\n// tinted: bg=light tint of primary, text=primary → light variant item/child active\n// text: text=primary only → sub/grandchild active, dark variant\n// solid: bg=primary, text=white → system variant item active\nfunction tintedStyle(color: string): React.CSSProperties {\n return {\n color,\n backgroundColor: `color-mix(in srgb, ${color} 12%, transparent)`,\n };\n}\nfunction textStyle(color: string): React.CSSProperties {\n return { color };\n}\nfunction solidStyle(color: string): React.CSSProperties {\n return {\n backgroundColor: `color-mix(in srgb, ${color} 25%, transparent)`,\n color: \"#ffffff\",\n boxShadow: `inset 3px 0 0 ${color}`,\n };\n}\n\ntype AccentApplier = {\n itemActive: (c: string) => React.CSSProperties;\n subItemActive: (c: string) => React.CSSProperties;\n childActive: (c: string) => React.CSSProperties;\n grandchildActive: (c: string) => React.CSSProperties;\n};\n\nconst ACCENT_APPLIERS: Record<SidebarVariant, AccentApplier> = {\n light: {\n itemActive: tintedStyle,\n subItemActive: textStyle,\n childActive: tintedStyle,\n grandchildActive: textStyle,\n },\n dark: {\n itemActive: textStyle,\n subItemActive: textStyle,\n childActive: textStyle,\n grandchildActive: textStyle,\n },\n \"system-dark\": {\n itemActive: (c: string) => ({\n ...solidStyle(c),\n boxShadow: undefined,\n borderLeft: `3px solid ${c}`,\n paddingLeft: \"9px\",\n }),\n subItemActive: textStyle,\n childActive: (c: string) => ({\n ...solidStyle(c),\n boxShadow: undefined,\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"14px\",\n }),\n grandchildActive: (c: string) => ({\n ...textStyle(c),\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"10px\",\n }),\n },\n \"system-light\": {\n itemActive: (c: string) => ({\n ...tintedStyle(c),\n borderLeft: `3px solid ${c}`,\n paddingLeft: \"9px\",\n }),\n subItemActive: textStyle,\n childActive: (c: string) => ({\n ...tintedStyle(c),\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"14px\",\n }),\n grandchildActive: (c: string) => ({\n ...tintedStyle(c),\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"10px\",\n }),\n },\n};\n\nexport default function Sidebar(props: SidebarProps) {\n const navigate = useNavigate();\n const {\n onClose,\n menuSections,\n header,\n footer,\n className,\n showCollapseButton = false,\n variant = \"light\",\n primaryColor,\n } = props;\n const { pathname } = useLocation();\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [overflowVisible, setOverflowVisible] = useState(true);\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n const [expandedSubItems, setExpandedSubItems] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n if (isCollapsed) {\n setOverflowVisible(false);\n return;\n }\n const timer = setTimeout(() => setOverflowVisible(true), 300);\n return () => clearTimeout(timer);\n }, [isCollapsed]);\n\n const s = VARIANT_STYLES[variant];\n const applier = ACCENT_APPLIERS[variant];\n\n useEffect(() => {\n menuSections.forEach((section) => {\n section.items.forEach((item) => {\n if (!item.children) return;\n\n const allLeafPaths = item.children.flatMap((child) =>\n child.children ? child.children.map((gc) => gc.path) : child.path ? [child.path] : [],\n );\n\n if (!allLeafPaths.includes(pathname)) return;\n\n setExpandedItems((prev) => {\n if (prev.has(item.label)) return prev;\n const next = new Set(prev);\n next.add(item.label);\n return next;\n });\n\n item.children.forEach((child) => {\n if (!child.children) return;\n const gcPaths = child.children.map((gc) => gc.path);\n if (!gcPaths.includes(pathname)) return;\n const subKey = `${item.label}::${child.label}`;\n setExpandedSubItems((prev) => {\n if (prev.has(subKey)) return prev;\n const next = new Set(prev);\n next.add(subKey);\n return next;\n });\n });\n });\n });\n }, [pathname, menuSections]);\n\n const toggleExpand = (label: string) => {\n setExpandedItems((prev) => {\n const next = new Set(prev);\n if (next.has(label)) next.delete(label);\n else next.add(label);\n return next;\n });\n };\n\n const toggleSubExpand = (subKey: string) => {\n setExpandedSubItems((prev) => {\n const next = new Set(prev);\n if (next.has(subKey)) next.delete(subKey);\n else next.add(subKey);\n return next;\n });\n };\n\n const handleItemClick = (path: string) => {\n if (path.includes(\"https\")) {\n window.open(path, \"_blank\", \"noopener,noreferrer\");\n } else if (path !== \"\") {\n navigate(path);\n onClose?.();\n }\n };\n\n return (\n <aside\n className={`\n ${isCollapsed ? \"w-11 min-w-11\" : \"min-w-60 w-62\"}\n transition-[width,min-width] duration-300 ease-in-out\n relative h-screen shrink-0 overflow-x-hidden flex flex-col\n ${s.aside}\n ${className ?? \"\"}\n `}\n >\n {showCollapseButton && (\n <button\n onClick={() => setIsCollapsed((prev) => !prev)}\n className={`absolute top-4 right-2 z-20 w-6.5 h-6.5 rounded-full flex items-center justify-center transition-colors cursor-pointer ${s.collapseBtn}`}\n >\n {isCollapsed ? (\n <PanelRightClose size={18} color={primaryColor ?? s.collapseIcon} />\n ) : (\n <PanelLeftClose size={18} color={primaryColor ?? s.collapseIcon} />\n )}\n </button>\n )}\n\n <div className={`flex-1 min-h-0 hide-scrollbar ${overflowVisible ? \"overflow-y-auto\" : \"overflow-hidden\"}`}>\n <div\n className={`transition-opacity duration-200 ease-in-out ${isCollapsed ? \"opacity-0 pointer-events-none select-none\" : \"opacity-100\"} ${variant === \"system-dark\" || variant === \"system-light\" ? \"pb-6\" : \"px-4 pb-6\"}`}\n style={{ transitionDelay: isCollapsed ? \"0ms\" : \"150ms\" }}\n >\n {header && header}\n\n <nav className={`space-y-6 ${variant === \"system-dark\" || variant === \"system-light\" ? \"px-1\" : \"\"}`}>\n {menuSections.map((section, sectionIndex) => (\n <div key={section.title ?? sectionIndex}>\n {section.title && <div className={s.sectionTitle}>{section.title}</div>}\n\n <div className=\"space-y-0.5\">\n {section.items.map((item) => {\n const isActive = !item.children && pathname === item.path;\n return (\n <div key={item.label}>\n {/* 1depth: 아이콘 + 라벨, children 있으면 토글 / 없으면 이동 */}\n <button\n onClick={() => {\n if (item.children) {\n toggleExpand(item.label);\n } else if (item.path) {\n handleItemClick(item.path);\n }\n }}\n className={`\n w-full text-left flex items-center gap-2 px-3 ${s.itemPy} ${s.rounded} ${s.itemTextSize} ${s.itemFont} transition-colors cursor-pointer\n ${isActive ? s.itemActive : s.itemInactive}\n `}\n style={{\n ...(isActive ? s.activeItemStyle : {}),\n ...(isActive && primaryColor ? applier.itemActive(primaryColor) : {}),\n }}\n >\n <item.icon className={s.iconClass} />\n <span className=\"flex-1\">{item.label}</span>\n\n {item.children && (\n <svg\n className={`w-4 h-4 transition-transform ${expandedItems.has(item.label) ? \"rotate-90\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n\n {item.path?.includes(\"https\") && (\n <svg\n className=\"w-4 h-4 flex-shrink-0 opacity-50\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n </button>\n\n {item.children && expandedItems.has(item.label) && (\n <div className={`ml-5 mt-0.5 space-y-0.5 border-l ${s.childGroupBorder}`}>\n {item.children.map((child, childIndex) => {\n if (child.children && child.children.length > 0) {\n const subKey = `${item.label}::${child.label}`;\n const isSubExpanded = expandedSubItems.has(subKey);\n const isSubActive = child.children.some((gc) => gc.path === pathname);\n\n return (\n <div key={child.label}>\n {/* 2depth (sub): children 있는 경우 — 토글 버튼 */}\n <button\n onClick={() => toggleSubExpand(subKey)}\n className={`\n w-full text-left flex items-center justify-between pl-4 pr-3 ${s.childPy} ${s.rounded} ${s.itemTextSize} transition-colors cursor-pointer\n ${isSubActive ? s.subItemActive : s.subItemInactive}\n `}\n style={\n isSubActive && primaryColor ? applier.subItemActive(primaryColor) : undefined\n }\n >\n <span>{child.label}</span>\n <svg\n className={`w-3 h-3 transition-transform ${isSubExpanded ? \"rotate-90\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n\n {isSubExpanded && (\n <div className=\"ml-3 mt-0.5 space-y-0.5 pl-2\">\n {/* 3depth: 리프 노드, 항상 경로로 이동 */}\n {child.children.map((grandchild) => {\n const isGrandchildActive = pathname === grandchild.path;\n return (\n <button\n key={grandchild.path}\n onClick={() => handleItemClick(grandchild.path)}\n className={`\n w-full text-left px-3 ${s.grandchildPy} ${s.rounded} ${s.grandchildTextSize} transition-colors cursor-pointer\n ${isGrandchildActive ? s.grandchildActive : s.grandchildInactive}\n `}\n style={{\n ...(isGrandchildActive ? s.activeGrandchildStyle : {}),\n ...(isGrandchildActive && primaryColor\n ? applier.grandchildActive(primaryColor)\n : {}),\n }}\n >\n {grandchild.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n }\n\n // 2depth (leaf): children 없는 경우 — 바로 이동\n const isChildActive = pathname === child.path;\n return (\n <button\n key={childIndex}\n onClick={() => handleItemClick(child.path ?? \"\")}\n className={`\n w-full text-left pl-4 pr-3 ${s.childPy} ${s.rounded} ${s.itemTextSize} transition-colors cursor-pointer\n ${isChildActive ? s.childActive : s.childInactive}\n `}\n style={{\n ...(isChildActive ? s.activeChildStyle : {}),\n ...(isChildActive && primaryColor ? applier.childActive(primaryColor) : {}),\n }}\n >\n {child.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n </div>\n </div>\n\n {footer && (\n <div\n className={`flex-shrink-0 transition-opacity duration-200 ease-in-out ${isCollapsed ? \"opacity-0 pointer-events-none select-none\" : \"opacity-100\"} ${s.footerBorder}`}\n style={{ transitionDelay: isCollapsed ? \"0ms\" : \"150ms\" }}\n >\n {footer}\n </div>\n )}\n </aside>\n );\n}\n","import { useCallback, useId, useState } from \"react\";\n\nimport type { DetailController, DetailMode, UseDetailControllerParams } from \"./types\";\n\nexport function useDetailController(params: UseDetailControllerParams = {}): DetailController {\n const { mode: controlledMode, onModeChange } = params;\n\n const [internalMode, setInternalMode] = useState<DetailMode>(\"read\");\n const [isDirty, setIsDirty] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n\n // React useId — 안정적인 formId (SubmitForm ↔ 외부 submit 버튼 연결)\n const rawId = useId();\n // useId 반환값 \":r0:\" 형태에서 콜론 제거 (form id에 콜론 불가)\n const formId = `detail-form-${rawId.replace(/:/g, \"\")}`;\n\n const mode = controlledMode ?? internalMode;\n\n const toEdit = useCallback(() => {\n if (onModeChange) {\n onModeChange(\"edit\");\n } else {\n setInternalMode(\"edit\");\n }\n }, [onModeChange]);\n\n const toRead = useCallback(() => {\n setIsDirty(false);\n if (onModeChange) {\n onModeChange(\"read\");\n } else {\n setInternalMode(\"read\");\n }\n }, [onModeChange]);\n\n const handleDirtyChange = useCallback((dirty: boolean) => {\n setIsDirty(dirty);\n }, []);\n\n const handleSaveStart = useCallback(() => {\n setIsSaving(true);\n }, []);\n\n const handleSaveEnd = useCallback(() => {\n setIsSaving(false);\n }, []);\n\n return {\n mode,\n isDirty,\n isSaving,\n formId,\n toEdit,\n toRead,\n handleDirtyChange,\n handleSaveStart,\n handleSaveEnd,\n };\n}\n","import { useCallback, useRef, type ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport type { FieldValues, UseFormReturn } from \"react-hook-form\";\nimport type { z } from \"zod\";\n\nimport FormField from \"../../SubmitForm/components/FormField\";\nimport type { FormFieldConfig } from \"../../SubmitForm/config/types\";\nimport { SubmitForm } from \"../../SubmitForm\";\n\nimport type { DetailEditBodyContext } from \"../model/types\";\n\n// ─── FormDirtyBridge ─────────────────────────────────────────────────────────\n// widgets 레이어에서 pages 레이어 import 불가 → 동일 로직 인라인\n// (원본: src/pages/form/blocker/FormDirtyBridge.tsx)\n\ninterface DirtyBridgeProps {\n onDirtyChange: (dirty: boolean) => void;\n}\n\nfunction DirtyBridge(props: DirtyBridgeProps) {\n const { onDirtyChange } = props;\n const { formState } = useFormContext();\n\n useEffect(() => {\n onDirtyChange(formState.isDirty);\n }, [formState.isDirty, onDirtyChange]);\n\n return null;\n}\n\n// ─── EditBodyBridge ───────────────────────────────────────────────────────────\n// renderEditBody 가 제공됐을 때 FormProvider 컨텍스트에서 methods 를 꺼내 주입\n\ninterface EditBodyBridgeProps<TFieldValues extends FieldValues, S extends z.ZodTypeAny> {\n data: TFieldValues;\n render: (ctx: DetailEditBodyContext<TFieldValues, S>) => ReactNode;\n}\n\nfunction EditBodyBridge<TFieldValues extends FieldValues, S extends z.ZodTypeAny>(\n props: EditBodyBridgeProps<TFieldValues, S>,\n) {\n const { data, render } = props;\n const methods = useFormContext<z.infer<S>>() as UseFormReturn<z.infer<S>>;\n return <>{render({ methods, data })}</>;\n}\n\n// ─── DetailEditView ───────────────────────────────────────────────────────────\n\ninterface DetailEditViewProps<T, S extends z.ZodTypeAny> {\n data: T;\n schema: S;\n fields: Array<FormFieldConfig<z.infer<S>>>;\n formId: string;\n onDirtyChange: (dirty: boolean) => void;\n onSave: (data: z.infer<S>) => Promise<void>;\n /** 저장 시작/완료 시 controller 에 알림 */\n onSaveStart: () => void;\n onSaveEnd: () => void;\n /** 저장 성공 후 read 모드로 전환 */\n onSaveDone: () => void;\n /** Body 전면 교체 — 커스텀 필드가 RHF 에 합류해야 할 때 */\n renderBody?: (ctx: DetailEditBodyContext<z.infer<S>, S>) => ReactNode;\n}\n\nexport default function DetailEditView<T, S extends z.ZodTypeAny>(props: DetailEditViewProps<T, S>) {\n const {\n data,\n schema,\n fields,\n formId,\n onDirtyChange,\n onSave,\n onSaveStart,\n onSaveEnd,\n onSaveDone,\n renderBody,\n } = props;\n\n const methodsRef = useRef<UseFormReturn<z.infer<S>> | null>(null);\n\n const handleSubmit = useCallback(\n async (formData: z.infer<S>) => {\n onSaveStart();\n try {\n await onSave(formData);\n // 저장 성공 후 dirty 상태 초기화\n methodsRef.current?.reset(formData as Parameters<typeof methodsRef.current.reset>[0]);\n onSaveDone();\n } finally {\n onSaveEnd();\n }\n },\n [onSave, onSaveStart, onSaveEnd, onSaveDone],\n );\n\n return (\n <SubmitForm formId={formId} schema={schema} defaultValues={data as z.input<S>} onSubmit={handleSubmit}>\n {/* dirty 상태를 controller 로 브릿지 */}\n <DirtyBridge onDirtyChange={onDirtyChange} />\n\n {renderBody ? (\n <EditBodyBridge<z.infer<S>, S> data={data as z.infer<S>} render={renderBody} />\n ) : (\n fields.map((config) => <FormField key={String(config.name)} config={config} />)\n )}\n </SubmitForm>\n );\n}\n","import type { BadgeTone } from \"../../model/types\";\n\nconst BADGE_TONE_CLASS: Record<BadgeTone, string> = {\n success: \"bg-green-100 text-green-800\",\n warning: \"bg-amber-100 text-amber-800\",\n error: \"bg-red-100 text-red-800\",\n info: \"bg-blue-100 text-blue-800\",\n default: \"bg-gray-100 text-gray-800\",\n};\n\ninterface BadgeRendererProps {\n value: unknown;\n tone: BadgeTone;\n}\n\nexport default function BadgeRenderer(props: BadgeRendererProps) {\n const { value, tone } = props;\n return (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${BADGE_TONE_CLASS[tone]}`}\n >\n {String(value ?? \"-\")}\n </span>\n );\n}\n","interface BooleanRendererProps {\n value: unknown;\n}\n\nexport default function BooleanRenderer(props: BooleanRendererProps) {\n const { value } = props;\n return (\n <span className={`text-sm font-medium ${value ? \"text-green-600\" : \"text-gray-500\"}`}>\n {value ? \"예\" : \"아니오\"}\n </span>\n );\n}\n","interface ImageRendererProps {\n value: unknown;\n}\n\nexport default function ImageRenderer(props: ImageRendererProps) {\n const { value } = props;\n if (!value) return <span className=\"text-gray-400 text-sm\">-</span>;\n return (\n <img src={String(value)} alt=\"\" className=\"h-16 w-16 rounded-md object-cover border border-gray-200\" />\n );\n}\n","interface LinkRendererProps {\n value: unknown;\n}\n\nexport default function LinkRenderer(props: LinkRendererProps) {\n const { value } = props;\n if (!value) return <span className=\"text-gray-400 text-sm\">-</span>;\n return (\n <a\n href={String(value)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 underline-offset-4 hover:underline text-sm break-all\"\n >\n {String(value)}\n </a>\n );\n}\n","interface TagListRendererProps {\n value: unknown;\n}\n\nexport default function TagListRenderer(props: TagListRendererProps) {\n const { value } = props;\n const items = Array.isArray(value) ? value : [];\n if (items.length === 0) return <span className=\"text-gray-400 text-sm\">-</span>;\n return (\n <div className=\"flex flex-wrap gap-1\">\n {items.map((item, i) => (\n <span\n key={i}\n className=\"inline-flex items-center rounded-md bg-gray-100 px-2 py-0.5 text-xs text-gray-700\"\n >\n {String(item)}\n </span>\n ))}\n </div>\n );\n}\n","interface TextRendererProps {\n value: unknown;\n}\n\nexport default function TextRenderer(props: TextRendererProps) {\n const { value } = props;\n const text = value !== null && value !== undefined && String(value) !== \"\" ? String(value) : \"-\";\n return <span className=\"text-sm text-gray-900 break-all\">{text}</span>;\n}\n","import type { ReactNode } from \"react\";\n\nimport type { DetailField, DetailRenderContext } from \"../../model/types\";\nimport BadgeRenderer from \"./BadgeRenderer\";\nimport BooleanRenderer from \"./BooleanRenderer\";\nimport ImageRenderer from \"./ImageRenderer\";\nimport LinkRenderer from \"./LinkRenderer\";\nimport TagListRenderer from \"./TagListRenderer\";\nimport TextRenderer from \"./TextRenderer\";\n\nexport function renderDetailFieldValue<T>(field: DetailField<T>, ctx: DetailRenderContext<T>): ReactNode {\n if (field.render) {\n return field.render(ctx);\n }\n\n const { value } = ctx;\n\n switch (field.type) {\n case \"badge\": {\n const tone = field.tone ? field.tone(value) : \"default\";\n return <BadgeRenderer value={value} tone={tone} />;\n }\n case \"tag\":\n return <TagListRenderer value={value} />;\n case \"link\":\n return <LinkRenderer value={value} />;\n case \"image\":\n return <ImageRenderer value={value} />;\n case \"boolean\":\n return <BooleanRenderer value={value} />;\n case \"date\":\n case \"number\":\n case \"text\":\n default:\n return <TextRenderer value={value} />;\n }\n}\n","import type { ReactNode } from \"react\";\n\nimport {\n ROW_LABEL_CLASS,\n ROW_LABEL_TEXT_CLASS,\n ROW_VALUE_CELL_CLASS,\n ROW_VALUE_INNER_CLASS,\n} from \"../../SubmitForm/config/styles\";\nimport { COL_SPAN_CLASS } from \"../../SubmitForm/config/utils\";\n\nimport type { DetailField, DetailFieldOrSection, DetailMode, DetailSection } from \"../model/types\";\nimport { renderDetailFieldValue } from \"./fieldRenderers\";\n\ninterface DetailReadViewProps<T> {\n data: T;\n mode: DetailMode;\n fields: Array<DetailFieldOrSection<T>>;\n /** 3단 escape: body 전면 커스텀 */\n renderBody?: (ctx: { data: T }) => ReactNode;\n}\n\nfunction isSection<T>(item: DetailFieldOrSection<T>): item is DetailSection<T> {\n return item.kind === \"section\";\n}\n\nfunction FieldRow<T>(props: { field: DetailField<T>; data: T; mode: DetailMode }) {\n const { field, data, mode } = props;\n const value = data[field.key as keyof T];\n const ctx = { value: value as T[keyof T], row: data, mode };\n\n const isFullWidth = field.colspan === 2;\n const valueColClass = isFullWidth ? COL_SPAN_CLASS[10] : COL_SPAN_CLASS[4];\n\n return (\n <>\n <dt className={ROW_LABEL_CLASS}>\n <p className={ROW_LABEL_TEXT_CLASS}>{field.label}</p>\n </dt>\n <dd className={`${valueColClass} ${ROW_VALUE_CELL_CLASS}`}>\n <div className={ROW_VALUE_INNER_CLASS}>{renderDetailFieldValue(field, ctx)}</div>\n </dd>\n </>\n );\n}\n\nfunction SectionRow<T>(props: { section: DetailSection<T>; data: T; mode: DetailMode }) {\n const { section, data, mode } = props;\n const colSpanClass = section.colspan === 1 ? COL_SPAN_CLASS[6] : COL_SPAN_CLASS[12];\n\n return <div className={colSpanClass}>{section.render({ data, mode })}</div>;\n}\n\nexport default function DetailReadView<T>(props: DetailReadViewProps<T>) {\n const { data, mode, fields, renderBody } = props;\n\n if (renderBody) {\n return <div className=\"p-4\">{renderBody({ data })}</div>;\n }\n\n return (\n <dl className=\"grid grid-cols-12 items-stretch gap-0\">\n {fields.map((item, index) => {\n if (isSection(item)) {\n return <SectionRow key={index} section={item} data={data} mode={mode} />;\n }\n return <FieldRow key={item.key} field={item} data={data} mode={mode} />;\n })}\n </dl>\n );\n}\n","import type { z } from \"zod\";\n\nimport { cn } from \"../../../lib/variants\";\n\nimport type { DetailContentProps } from \"../model/types\";\nimport DetailEditView from \"./DetailEditView\";\nimport DetailReadView from \"./DetailReadView\";\n\nexport default function DetailContent<T, S extends z.ZodTypeAny = z.ZodTypeAny>(props: DetailContentProps<T, S>) {\n const {\n controller,\n data,\n readFields,\n editSchema,\n editFields,\n onSave,\n renderReadBody,\n renderEditBody,\n layout = \"compact\",\n className,\n } = props;\n\n const containerClass =\n layout === \"none\"\n ? cn(className)\n : cn(\"overflow-y-auto\", layout === \"compact\" ? \"max-h-[60vh]\" : \"min-h-0 flex-1\", className);\n\n if (!data) {\n return (\n <div className={cn(containerClass, \"flex items-center justify-center p-8\")}>\n <p className=\"text-sm text-gray-400\">데이터를 불러오는 중...</p>\n </div>\n );\n }\n\n if (controller.mode === \"edit\" && editSchema && (editFields || renderEditBody)) {\n return (\n <div className={containerClass}>\n <DetailEditView\n data={data}\n schema={editSchema}\n fields={editFields ?? []}\n formId={controller.formId}\n onDirtyChange={controller.handleDirtyChange}\n onSave={onSave ?? (() => Promise.resolve())}\n onSaveStart={controller.handleSaveStart}\n onSaveEnd={controller.handleSaveEnd}\n onSaveDone={controller.toRead}\n renderBody={renderEditBody}\n />\n </div>\n );\n }\n\n return (\n <div className={containerClass}>\n <DetailReadView data={data} mode={controller.mode} fields={readFields} renderBody={renderReadBody} />\n </div>\n );\n}\n","import { useCallback, useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { z } from \"zod\";\n\nimport Button from \"../../Button\";\nimport Modal, { ModalBody, ModalFooter, ModalHeader } from \"../../Modal\";\nimport { cn } from \"../../../lib/variants\";\nimport { confirmModal } from \"../../Confirm\";\nimport type { FormFieldConfig } from \"../../SubmitForm/config/types\";\n\nimport type { DetailContentProps, DetailFieldOrSection, UseDetailControllerParams } from \"../model/types\";\nimport { useDetailController } from \"../model/useDetailController\";\nimport DetailContent from \"../ui/DetailContent\";\n\ninterface DetailModalFrameProps<T, S extends z.ZodTypeAny = z.ZodTypeAny> {\n open: boolean;\n title: string;\n data: T | undefined;\n readFields: Array<DetailFieldOrSection<T>>;\n editSchema?: S;\n editFields?: Array<FormFieldConfig<z.infer<S>>>;\n onSave?: (data: z.infer<S>) => Promise<void>;\n onDone: () => void;\n renderReadBody?: DetailContentProps<T, S>[\"renderReadBody\"];\n renderEditBody?: DetailContentProps<T, S>[\"renderEditBody\"];\n /** controlled mode 주입 (URL query 등으로 외부에서 mode 관리 시) */\n mode?: UseDetailControllerParams[\"mode\"];\n onModeChange?: UseDetailControllerParams[\"onModeChange\"];\n contentClassName?: string;\n /** ModalBody 내 DetailContent 하단 추가 컨텐츠 (프로필 사진 등) */\n renderExtraContent?: (ctx: { isEditMode: boolean }) => ReactNode;\n /** read 모드 footer 추가 버튼 — 닫기 앞에 삽입 */\n renderFooterExtra?: ReactNode;\n /** isDirty 상태 외부 노출 — 라우터 blocker 등에서 활용 */\n onDirtyChange?: (isDirty: boolean) => void;\n}\n\nexport default function DetailModalFrame<T, S extends z.ZodTypeAny = z.ZodTypeAny>(props: DetailModalFrameProps<T, S>) {\n const {\n open,\n title,\n data,\n readFields,\n editSchema,\n editFields,\n onSave,\n onDone,\n renderReadBody,\n renderEditBody,\n mode,\n onModeChange,\n contentClassName,\n renderExtraContent,\n renderFooterExtra,\n onDirtyChange,\n } = props;\n\n const controller = useDetailController({ mode, onModeChange });\n\n useEffect(() => {\n onDirtyChange?.(controller.isDirty);\n }, [controller.isDirty, onDirtyChange]);\n\n const handleClose = useCallback(async () => {\n if (controller.isDirty) {\n const confirmed = await new Promise<boolean>((resolve) => {\n confirmModal({\n content: \"저장하지 않은 변경사항이 있습니다. 닫으시겠습니까?\",\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!confirmed) return;\n }\n controller.toRead();\n onDone();\n }, [controller, onDone]);\n\n const handleEdit = useCallback(() => {\n controller.toEdit();\n }, [controller]);\n\n const handleCancelEdit = useCallback(async () => {\n if (controller.isDirty) {\n const confirmed = await new Promise<boolean>((resolve) => {\n confirmModal({\n content: \"변경사항을 저장하지 않고 조회 화면으로 돌아가시겠습니까?\",\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!confirmed) return;\n }\n controller.toRead();\n }, [controller]);\n\n const isEditMode = controller.mode === \"edit\";\n const canEdit = Boolean(editSchema && (editFields || renderEditBody));\n\n return (\n <Modal isOpen={open} onClose={handleClose} contentClassName={cn(\"max-w-2xl\", contentClassName)}>\n <ModalHeader className=\"flex flex-row items-center justify-between\">\n <span className=\"text-base font-semibold text-gray-900\">{title}</span>\n </ModalHeader>\n\n <ModalBody className=\"flex-1 min-h-0 overflow-hidden p-0 flex flex-col\">\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n <DetailContent<T, S>\n controller={controller}\n data={data}\n readFields={readFields}\n editSchema={editSchema}\n editFields={editFields}\n onSave={onSave}\n renderReadBody={renderReadBody}\n renderEditBody={renderEditBody}\n layout=\"none\"\n />\n </div>\n {renderExtraContent?.({ isEditMode })}\n </ModalBody>\n\n <ModalFooter className=\"flex justify-end\">\n {isEditMode ? (\n <>\n <Button variant=\"outline\" onClick={handleCancelEdit} disabled={controller.isSaving}>\n 취소\n </Button>\n <Button type=\"submit\" form={controller.formId} variant=\"save\" disabled={controller.isSaving}>\n 저장\n </Button>\n </>\n ) : (\n <>\n {canEdit && (\n <Button variant=\"outline\" onClick={handleEdit}>\n 수정\n </Button>\n )}\n {renderFooterExtra}\n <Button variant=\"outline\" onClick={handleClose}>\n 닫기\n </Button>\n </>\n )}\n </ModalFooter>\n </Modal>\n );\n}\n","import { useCallback, useRef } from \"react\";\n\nimport { confirmModal } from \"../components/Confirm\";\n\ninterface BlockModalConfirmOptions {\n content?: string;\n onOk?: () => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n okText?: string;\n cancelText?: string;\n}\n\nexport function useBlockModalConfirm() {\n const blockCalledRef = useRef(false);\n\n const promiseConfirm = useCallback((options: BlockModalConfirmOptions): Promise<boolean> => {\n if (blockCalledRef.current) {\n return Promise.resolve(false);\n }\n\n blockCalledRef.current = true;\n return new Promise<boolean>((res) => {\n confirmModal({\n content: options.content || \"\",\n onOk: async () => {\n blockCalledRef.current = false;\n res(true);\n if (options.onOk) {\n await options.onOk();\n }\n },\n onCancel: async () => {\n blockCalledRef.current = false;\n res(false);\n if (options.onCancel) {\n await options.onCancel();\n }\n },\n okText: \"예\",\n cancelText: \"아니요\",\n });\n });\n }, []);\n\n return { promiseConfirm };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useBlocker, useLocation } from \"react-router\";\nimport type { Location } from \"react-router\";\n\nexport interface ConfirmArgs {\n currentLocation: Location;\n nextLocation: Location;\n}\n\nexport interface UseCustomBlockerOptions {\n enabled: boolean;\n isDirty: boolean;\n bypass?: boolean;\n message?: string;\n confirm?: (args: ConfirmArgs) => boolean | Promise<boolean>;\n excludedPaths?: Array<string>;\n}\n\nexport type CustomBlockerState = \"idle\" | \"blocked\" | \"confirming\";\n\ninterface UseCustomBlockerResult {\n proceed: () => void;\n reset: () => void;\n state: CustomBlockerState;\n}\n\nconst DEFAULT_MESSAGE = \"변경사항이 저장되지 않습니다. 페이지를 이동하시겠습니까?\";\nconst DEFAULT_EXCLUDED_PATHS = [\"/login\"];\n\nexport function useCustomBlocker(options: UseCustomBlockerOptions): UseCustomBlockerResult {\n const enabledRef = useRef(options.enabled);\n const isDirtyRef = useRef(options.isDirty);\n const bypassRef = useRef(options.bypass ?? false);\n const messageRef = useRef(options.message ?? DEFAULT_MESSAGE);\n const confirmRef = useRef(options.confirm);\n\n enabledRef.current = options.enabled;\n isDirtyRef.current = options.isDirty;\n bypassRef.current = options.bypass ?? false;\n messageRef.current = options.message ?? DEFAULT_MESSAGE;\n confirmRef.current = options.confirm;\n\n const excludedPathsRef = useRef(options.excludedPaths ?? []);\n excludedPathsRef.current = options.excludedPaths ?? [];\n\n const confirmingRef = useRef(false);\n const mountedRef = useRef(true);\n const abortedRef = useRef(false);\n\n const [state, setState] = useState<CustomBlockerState>(\"idle\");\n\n const location = useLocation();\n const locationRef = useRef(location);\n locationRef.current = location;\n\n // shouldBlock은 ref로 최신 옵션을 읽으므로 stable reference 유지 (blocker 재생성 방지)\n const shouldBlock = useCallback(\n ({ currentLocation, nextLocation }: { currentLocation: Location; nextLocation: Location }): boolean => {\n if (bypassRef.current) return false;\n if (!enabledRef.current) return false;\n if (!isDirtyRef.current) return false;\n if (currentLocation.pathname === nextLocation.pathname) return false;\n if (\n DEFAULT_EXCLUDED_PATHS.some(\n (path) => nextLocation.pathname === path || nextLocation.pathname.startsWith(`${path}/`),\n )\n )\n return false;\n if (\n excludedPathsRef.current.some(\n (path) => nextLocation.pathname === path || nextLocation.pathname.startsWith(`${path}/`),\n )\n )\n return false;\n return true;\n },\n [],\n );\n\n const blocker = useBlocker(shouldBlock);\n const blockerRef = useRef(blocker);\n blockerRef.current = blocker;\n\n // bypass가 true가 되면 pending transition을 자동으로 proceed\n useEffect(() => {\n if (!options.bypass || blocker.state !== \"blocked\") return;\n abortedRef.current = true;\n confirmingRef.current = false;\n setState(\"idle\");\n blockerRef.current?.proceed?.();\n }, [options.bypass, blocker.state]);\n\n // navigation이 blocked되면 자동으로 confirm 트리거\n useEffect(() => {\n if (blocker.state !== \"blocked\") {\n setState(\"idle\");\n return;\n }\n if (bypassRef.current) return;\n if (confirmingRef.current) return;\n\n setState(\"blocked\");\n\n const runConfirm = async () => {\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state !== \"blocked\") return;\n\n abortedRef.current = false;\n const capturedCurrentLocation = locationRef.current;\n const nextLocation = currentBlocker.location;\n\n confirmingRef.current = true;\n setState(\"confirming\");\n\n try {\n let confirmed: boolean;\n\n if (confirmRef.current) {\n confirmed = await confirmRef.current({\n currentLocation: capturedCurrentLocation,\n nextLocation,\n });\n } else {\n confirmed = typeof window !== \"undefined\" ? window.confirm(messageRef.current) : false;\n }\n\n if (!mountedRef.current || abortedRef.current) return;\n\n const latestBlocker = blockerRef.current;\n if (latestBlocker.state !== \"blocked\") return;\n\n if (confirmed) {\n latestBlocker.proceed();\n } else {\n latestBlocker.reset();\n }\n } catch {\n if (mountedRef.current && !abortedRef.current) {\n const latestBlocker = blockerRef.current;\n if (latestBlocker.state === \"blocked\") {\n latestBlocker.reset();\n }\n }\n } finally {\n confirmingRef.current = false;\n if (mountedRef.current) setState(\"idle\");\n }\n };\n\n runConfirm();\n // blockerRef로 최신 blocker에 접근하므로 blocker 객체는 dep에서 제외\n }, [blocker.state]);\n\n useEffect(() => {\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n if (!enabledRef.current || !isDirtyRef.current || bypassRef.current) return;\n event.preventDefault();\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state === \"blocked\") {\n currentBlocker.reset();\n }\n };\n }, []);\n\n const proceed = useCallback(() => {\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state === \"blocked\") {\n abortedRef.current = true;\n confirmingRef.current = false;\n currentBlocker.proceed();\n }\n setState(\"idle\");\n }, []);\n\n const reset = useCallback(() => {\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state === \"blocked\") {\n abortedRef.current = true;\n confirmingRef.current = false;\n currentBlocker.reset();\n }\n setState(\"idle\");\n }, []);\n\n return { proceed, reset, state };\n}\n","import { useCallback } from \"react\";\nimport type { z } from \"zod\";\n\nimport Button from \"../../Button\";\nimport { cn } from \"../../../lib/variants\";\nimport { useBlockModalConfirm } from \"../../../hooks/useBlockModalConfirm\";\nimport { useCustomBlocker } from \"../../../hooks/useCustomBlocker\";\nimport type { FormFieldConfig } from \"../../SubmitForm/config/types\";\n\nimport type { DetailContentProps, DetailFieldOrSection, UseDetailControllerParams } from \"../model/types\";\nimport { useDetailController } from \"../model/useDetailController\";\nimport DetailContent from \"../ui/DetailContent\";\n\ninterface DetailPageFrameProps<T, S extends z.ZodTypeAny = z.ZodTypeAny> {\n data: T | undefined;\n readFields: Array<DetailFieldOrSection<T>>;\n editSchema?: S;\n editFields?: Array<FormFieldConfig<z.infer<S>>>;\n onSave?: (data: z.infer<S>) => Promise<void>;\n /** 닫기/뒤로가기 — navigate(-1) 또는 라우터 이동 */\n onDone: () => void;\n renderReadBody?: DetailContentProps<T, S>[\"renderReadBody\"];\n renderEditBody?: DetailContentProps<T, S>[\"renderEditBody\"];\n /** controlled mode 주입 (URL ?mode=edit 등) */\n mode?: UseDetailControllerParams[\"mode\"];\n onModeChange?: UseDetailControllerParams[\"onModeChange\"];\n className?: string;\n}\n\nexport default function DetailPageFrame<T, S extends z.ZodTypeAny = z.ZodTypeAny>(\n props: DetailPageFrameProps<T, S>,\n) {\n const {\n data,\n readFields,\n editSchema,\n editFields,\n onSave,\n onDone,\n renderReadBody,\n renderEditBody,\n mode,\n onModeChange,\n className,\n } = props;\n\n const controller = useDetailController({ mode, onModeChange });\n const { promiseConfirm } = useBlockModalConfirm();\n\n // 라우터 이탈 방지 — edit 모드 + dirty 일 때만 활성\n useCustomBlocker({\n enabled: controller.mode === \"edit\",\n isDirty: controller.isDirty,\n confirm: () =>\n promiseConfirm({\n content: \"저장하지 않은 변경사항이 있습니다. 페이지를 이동하시겠습니까?\",\n }),\n });\n\n const handleEdit = useCallback(() => {\n controller.toEdit();\n }, [controller]);\n\n const handleCancelEdit = useCallback(async () => {\n if (controller.isDirty) {\n const ok = await promiseConfirm({\n content: \"변경사항을 저장하지 않고 조회 화면으로 돌아가시겠습니까?\",\n });\n if (!ok) return;\n }\n controller.toRead();\n }, [controller, promiseConfirm]);\n\n const isEditMode = controller.mode === \"edit\";\n const canEdit = Boolean(editSchema && (editFields || renderEditBody));\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {/* 액션 바 */}\n <div className=\"flex items-center justify-between\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onDone}>\n ← 목록으로\n </Button>\n\n <div className=\"flex gap-2\">\n {isEditMode ? (\n <>\n <Button variant=\"outline\" onClick={handleCancelEdit} disabled={controller.isSaving}>\n 취소\n </Button>\n <Button type=\"submit\" form={controller.formId} variant=\"save\" disabled={controller.isSaving}>\n {controller.isSaving ? \"저장 중...\" : \"저장\"}\n </Button>\n </>\n ) : (\n canEdit && (\n <Button variant=\"outline\" onClick={handleEdit}>\n 수정\n </Button>\n )\n )}\n </div>\n </div>\n\n {/* 컨텐츠 */}\n <div className=\"rounded-lg border border-gray-200 bg-white shadow-sm\">\n <DetailContent<T, S>\n controller={controller}\n data={data}\n readFields={readFields}\n editSchema={editSchema}\n editFields={editFields}\n onSave={onSave}\n renderReadBody={renderReadBody}\n renderEditBody={renderEditBody}\n layout=\"full\"\n />\n </div>\n </div>\n );\n}\n","import { useCallback } from \"react\";\n\nimport { useSearchParams } from \"react-router\";\n\n/**\n * URL query parameter를 사용하여 모달을 관리하는 hook\n * @param modalKey - URL query parameter에 사용될 키 (예: \"modal\", \"dialog\")\n * @returns { isOpen, openModal, closeModal }\n * 모달 open 시 URL query parameter에 modalKey를 true로 설정 닫을 시 삭제\n */\nexport function useModal(modalKey: string = \"modal\") {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const isOpen = searchParams.get(modalKey) === \"true\";\n\n const openModal = useCallback(() => {\n setSearchParams((prev) => {\n const newParams = new URLSearchParams(prev);\n newParams.set(modalKey, \"true\");\n return newParams;\n });\n }, [modalKey, setSearchParams]);\n\n const closeModal = useCallback(() => {\n setSearchParams((prev) => {\n const newParams = new URLSearchParams(prev);\n newParams.delete(modalKey);\n return newParams;\n });\n }, [modalKey, setSearchParams]);\n\n return {\n isOpen,\n openModal,\n closeModal,\n };\n}\n","import { useCallback } from \"react\";\n\n/**\n * 스크롤을 맨 위로 이동시키는 함수를 반환하는 hook\n * @param containerId - 스크롤할 컨테이너의 id (없으면 window 스크롤)\n * @returns scrollToTop - 호출 시 스크롤을 맨 위로 이동\n *\n * @example\n * // window 스크롤\n * const scrollToTop = useScrollToTop();\n *\n * // 특정 컨테이너 스크롤\n * const scrollToTop = useScrollToTop(\"doc-scroll-container\");\n *\n * // 버튼 클릭 시 스크롤 이동\n * <button onClick={scrollToTop}>맨 위로</button>\n *\n * // 또는 함수 내에서 직접 호출\n * const handleSubmit = () => {\n * // ... 로직\n * scrollToTop();\n * }\n */\nexport function useScrollToTop(containerId?: string) {\n const scrollToTop = useCallback(() => {\n if (containerId) {\n const container = document.getElementById(containerId);\n if (container) {\n container.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n }\n } else {\n window.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n }\n }, [containerId]);\n\n return scrollToTop;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/variants.ts","../src/components/Badge/index.tsx","../src/components/Tooltip/ui/tooltip.tsx","../src/config/zIndex.ts","../src/components/Tooltip/index.tsx","../src/components/Button/index.tsx","../src/components/Checkbox/config/default.ts","../src/components/Checkbox/index.tsx","../src/components/Input/ui/input.tsx","../src/components/Input/index.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/config/switchTypes.ts","../src/components/Switch/ui/BaseSwitch.tsx","../src/components/Switch/index.tsx","../src/components/Slider/index.tsx","../src/components/Skeleton/index.tsx","../src/components/ScrollArea/index.tsx","../src/components/Select/ui/select.tsx","../src/components/Select/config/default.ts","../src/components/Select/index.tsx","../src/components/SelectGroup/index.tsx","../src/components/Radio/config/default.ts","../src/components/Radio/index.tsx","../src/components/Popover/ui/popover.tsx","../src/components/Popover/index.tsx","../src/components/Spinner/index.tsx","../src/components/LoadingOverlay/index.tsx","../src/components/Loading/index.tsx","../src/components/Pagination/index.tsx","../src/components/BreadCrumb/config/utils.ts","../src/components/BreadCrumb/ui/BreadCrumbLink.tsx","../src/components/BreadCrumb/index.tsx","../src/components/BreadCrumb/config/buildItems.ts","../src/components/BreadCrumb/hooks/useBreadCrumbItems.ts","../src/components/Toast/ToastCore.ts","../src/components/Toast/index.tsx","../src/components/DatePicker/config/utils.ts","../src/components/DatePicker/calendar/config/default.ts","../src/components/DatePicker/calendar/config/calendar.ts","../src/components/DatePicker/calendar/Index.tsx","../src/components/DatePicker/calendar/hooks/useCalendarState.ts","../src/components/DatePicker/calendar/hooks/useFloatingCalendarPosition.ts","../src/components/DatePicker/ui/CalendarPortal.tsx","../src/components/DatePicker/config/styles.ts","../src/components/DatePicker/ui/DatePickerRange.tsx","../src/components/DatePicker/ui/DatePickerSingle.tsx","../src/components/DatePicker/index.tsx","../src/components/SearchBar/index.tsx","../src/components/DebouncedButton/index.tsx","../src/components/Tab/ui/ChildTabButton.tsx","../src/components/Tab/index.tsx","../src/components/Empty/config/style.ts","../src/components/Empty/ui/EmptyContent.tsx","../src/components/Empty/index.tsx","../src/components/Modal/ui/modalStack.ts","../src/components/Modal/ui/ModalContent.tsx","../src/components/Modal/ui/ModalOverlay.tsx","../src/components/Modal/ui/ModalBody.tsx","../src/components/Modal/ui/ModalFooter.tsx","../src/components/Modal/ui/ModalHeader.tsx","../src/components/Modal/ui/ModalIconHeader.tsx","../src/components/Modal/index.tsx","../src/components/Confirm/ui/ConfirmModal.tsx","../src/components/Confirm/model/confirmModal.tsx","../src/components/Table/component/TableFooter.tsx","../src/components/Table/hooks/useTableFixed.ts","../src/components/Table/component/ui/ArrowIcon.tsx","../src/components/Table/component/TableHeader.tsx","../src/components/Table/component/ui/SkeletonTd.tsx","../src/components/Table/component/ui/TableDataRow.tsx","../src/components/Table/component/ui/TableEmpty.tsx","../src/components/Table/component/ui/TableCellContent.tsx","../src/components/Table/config/utils.ts","../src/components/Table/component/Table.tsx","../src/components/Carousel/ui/carousel.tsx","../src/components/Carousel/index.tsx","../src/components/FilePreviewViewer/config/default.ts","../src/components/FilePreviewViewer/config/stableImageSrc.ts","../src/components/FilePreviewViewer/config/utils.ts","../src/components/FilePreviewViewer/hooks/useStableImageSrc.ts","../src/components/FilePreviewViewer/ui/FilePreviewViewerContent.tsx","../src/components/FilePreviewViewer/ui/FilePreviewViewerFooter.tsx","../src/components/FilePreviewViewer/ui/FilePreviewViewerNavigation.tsx","../src/components/FilePreviewViewer/ui/FilePreviewViewerTop.tsx","../src/components/FilePreviewViewer/FilePreviewViewerSession.tsx","../src/components/FilePreviewViewer/index.tsx","../src/components/SubmitForm/validation/context.ts","../src/components/SubmitForm/validation/useSubmitFormValidation.ts","../src/components/SubmitForm/config/utils.ts","../src/components/SubmitForm/config/styles.ts","../src/components/SubmitForm/ui/FormFieldControlStack.tsx","../src/components/SubmitForm/validation/zod.ts","../src/components/SubmitForm/components/FormTable.tsx","../src/components/SearchAddress/index.tsx","../src/components/SubmitForm/components/fields/AddressField.tsx","../src/components/SubmitForm/lib/cascadingSelectUtils.ts","../src/components/SubmitForm/lib/resolveSelectClassNameProp.ts","../src/components/SubmitForm/components/fields/CascadingSelectField.tsx","../src/components/SubmitForm/components/fields/CheckboxField.tsx","../src/components/SubmitForm/components/fields/DateField.tsx","../src/components/SubmitForm/components/fields/InputField.tsx","../src/components/SubmitForm/components/fields/InputWithButtonField.tsx","../src/components/SubmitForm/components/fields/NumberField.tsx","../src/components/SubmitForm/components/fields/PhoneField.tsx","../src/components/SubmitForm/components/fields/RadioField.tsx","../src/components/SubmitForm/components/fields/SelectField.tsx","../src/components/SubmitForm/lib/selectWithInputUtils.ts","../src/components/SubmitForm/components/fields/SelectWithInputField.tsx","../src/components/SubmitForm/components/fields/SwitchField.tsx","../src/components/SubmitForm/components/fields/TextareaField.tsx","../src/components/SubmitForm/ui/RequireIcon.tsx","../src/components/SubmitForm/validation/useBlurValidation.ts","../src/components/SubmitForm/components/FormField.tsx","../src/components/SubmitForm/config/rowPropsToFieldConfig.ts","../src/components/SubmitForm/components/SubmitFormRow.tsx","../src/components/SubmitForm/validation/seedHadValue.ts","../src/components/SubmitForm/validation/SubmitFormValidationProvider.tsx","../src/components/SubmitForm/index.tsx","../src/components/PageFilter/ui/LabeledFilterOption.tsx","../src/components/PageFilter/index.tsx","../src/components/MultiTab/index.tsx","../src/stores/multiTabStore.ts","../src/components/ScrollBar/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/lib/dateUtils.ts","../src/components/Uploader/BaseUploader.tsx","../src/components/Uploader/ExcelUploader.tsx","../src/components/FilePreviewViewer/hooks/useFilePreviewViewer.ts","../src/components/Uploader/FileUploader.tsx","../src/components/Sidebar/index.tsx","../src/components/DetailView/model/useDetailController.ts","../src/components/DetailView/ui/DetailEditView.tsx","../src/components/DetailView/ui/fieldRenderers/BadgeRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/BooleanRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/ImageRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/LinkRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/TagListRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/TextRenderer.tsx","../src/components/DetailView/ui/fieldRenderers/index.tsx","../src/components/DetailView/ui/DetailReadView.tsx","../src/components/DetailView/ui/DetailContent.tsx","../src/components/DetailView/frames/DetailModalFrame.tsx","../src/hooks/useBlockModalConfirm.ts","../src/hooks/useCustomBlocker.ts","../src/components/DetailView/frames/DetailPageFrame.tsx","../src/hooks/useModal.ts","../src/hooks/useScrollToTop.ts","../src/hooks/useParams/config/utils.ts","../src/hooks/useParams/useParams.ts"],"names":["twMerge","clsx","cva","jsxs","jsx","TooltipPrimitive","Tooltip","size","Slot","useId","Minus","Check","Input","useState","EyeOff","Eye","SwitchPrimitive","RadixSlider","forwardRef","SelectPrimitive","CircleX","ChevronDown","ChevronUp","Select","SelectGroup","RadioGroupPrimitive","CircleIcon","PopoverPrimitive","useEffect","useCallback","useMemo","ChevronFirst","ChevronLeft","ChevronRight","ChevronLast","Link","root","useLocation","setToasts","toast","useRef","createPortal","Fragment","isOpen","useLayoutEffect","Calendar","Search","debounce","container","FileSearch2","BadgePlus","Pencil","Info","Trash2","TriangleAlert","Icon","X","createRoot","getAlignStyle","mainGroups","subGroups","useDeferredValue","useVirtualizer","useReactTable","getCoreRowModel","React6","useEmblaCarousel","api","Carousel","useImperativeHandle","React","FileText","memo","ZoomIn","ZoomOut","RotateCcw","RotateCw","Download","isImageFile","createContext","useContext","cn","dayjs","customParseFormat","useFormContext","useFormState","useFieldArray","useWatch","column","Plus","useDaumPostcodePopup","value","toSelectOptions","Controller","useForm","zodResolver","FormProvider","rowGap","createJSONStorage","create","persist","uuidv4","Upload","heic2any","FileUp","VARIANT_STYLES","useNavigate","PanelRightClose","PanelLeftClose","useBlocker","useSearchParams"],"mappings":"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","file":"index.cjs","sourcesContent":["import { cva } from \"class-variance-authority\";\nimport clsx from \"clsx\";\nimport type { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: Array<ClassValue>) {\n return twMerge(clsx(inputs));\n}\n\nexport const buttonVariants = cva(\n \"inline-flex items-center justify-center font-medium rounded-sm transition-colors duration-200 cursor-pointer focus:outline-none disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed\",\n {\n variants: {\n variant: {\n outline: \"bg-white border border-sub-lightgray-2 text-sub-darkgray hover:bg-gray-100 hover:text-black min-w-22\",\n save: \"bg-main border-none text-white opacity-100 hover:opacity-90 min-w-22\",\n delete:\n \"bg-white border border-sub-red text-main-red hover:bg-red-50 disabled:bg-light-gray disabled:border-sub-lightgray-2 disabled:text-sub-lightgray-2 font-bold min-w-22\",\n reset: \"bg-white border border-sub-lightgray-2 text-sub-darkgray hover:bg-gray-100 hover:text-black\",\n search: \"bg-main-blue border-none text-white hover:bg-main-blue/90\",\n file: \"bg-btn-file text-white hover:bg-btn-file/90\",\n carousel: \"bg-white border border-gray-300 hover:bg-gray-100 hover:text-black rounded-full\",\n accent: \"btn-grad text-white rounded-full\",\n metal: \"btn-metal text-white min-w-22\",\n ghost: \"p-1 h-auto rounded-sm bg-transparent hover:bg-sub-lightgray text-sub-darkgray hover:bg-inherit\",\n link: \"bg-transparent border-none text-main-blue underline-offset-4 hover:underline h-auto p-0\",\n },\n size: {\n default: \"h-8 px-4 font-semibold\",\n sm: \"h-7 px-2.5 text-sm min-w-auto\",\n lg: \"h-10 px-5 text-base font-semibold\",\n icon: \"size-8 p-0 min-w-auto\",\n link: \"m-0 p-0 text-sm\",\n \"icon-sm\": \"size-7 p-0 min-w-auto\",\n \"icon-lg\": \"size-10 p-0 min-w-auto\",\n },\n },\n defaultVariants: {\n variant: \"outline\",\n size: \"default\",\n },\n },\n);\n\nexport const textVariants = cva(\"leading-tight break-all\", {\n variants: {\n variant: {\n default: \"text-gray-900\",\n muted: \"text-gray-500\",\n danger: \"text-red-600\",\n success: \"text-green-600\",\n info: \"text-blue-600\",\n },\n size: {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n xl: \"text-xl\",\n \"2xl\": \"text-2xl\",\n \"3xl\": \"text-3xl\",\n \"4xl\": \"text-4xl\",\n \"5xl\": \"text-5xl\",\n \"6xl\": \"text-6xl\",\n \"7xl\": \"text-7xl\",\n \"8xl\": \"text-8xl\",\n },\n weight: {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n },\n color: {\n main: \"text-main\",\n lightGray: \"text-light-gray\",\n basicGray: \"text-basic-gray\",\n darkGray: \"text-dark-gray\",\n white: \"text-white\",\n black: \"text-black\",\n gray: \"text-gray-500\",\n brown: \"text-amber-700\",\n orange: \"text-orange-500\",\n yellow: \"text-yellow-500\",\n green: \"text-green-500\",\n blue: \"text-blue-500\",\n purple: \"text-purple-500\",\n pink: \"text-pink-500\",\n red: \"text-red-500\",\n inherit: \"text-inherit\",\n default: \"text-inherit\",\n },\n textLine: {\n underline: \"underline decoration-solid\",\n strikethrough: \"line-through\",\n },\n },\n});\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport interface BadgeProps {\n text?: string;\n children?: ReactNode;\n className?: string;\n textClassName?: string;\n badgeCount?: number;\n badgeCountClassName?: string;\n maxCount?: number;\n}\n\nexport default function Badge(props: BadgeProps) {\n const { text, children, className, textClassName, badgeCount, badgeCountClassName, maxCount = 99 } = props;\n\n return (\n <span\n className={cn(\n \"relative inline-flex items-center gap-1.5\",\n \"px-2.5 py-1\",\n \"text-xs font-medium\",\n \"rounded-full\",\n \"bg-gray-100 text-gray-800\",\n \"border border-gray-200\",\n className,\n )}\n >\n {children || <span className={cn(textClassName)}>{text}</span>}\n\n {badgeCount !== undefined && badgeCount !== null && (\n <span\n className={cn(\n \"absolute -top-3 -right-1\",\n \"flex items-center justify-center\",\n \"min-w-[18px] h-[18px]\",\n \"px-1\",\n \"text-[10px] font-bold\",\n \"rounded-full\",\n \"bg-red-500 text-white\",\n badgeCountClassName,\n )}\n >\n {badgeCount > maxCount ? `${maxCount}+` : badgeCount}\n </span>\n )}\n </span>\n );\n}\n","import * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"../../../lib/variants\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n arrowClassName,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content> & {\n arrowClassName?: string;\n}) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-full origin-(--radix-tooltip-content-transform-origin) rounded-md text-xs\",\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow\n className={cn(\n \"z-50 w-2.5 h-2.5 translate-y-[calc(-50%_-_0px)] rotate-45 rounded-[2px]\",\n arrowClassName,\n )}\n style={{ fill: \"currentColor\" }}\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","export const Z_INDEX = {\n TABLE_COL_STICKY: 1,\n TABLE_FIXED_CELL: 5,\n TABLE_FIXED_HEADER_CELL: 10,\n LOCAL_OVERLAY: 10,\n LAYOUT_HEADER: 20,\n DROPDOWN_LOCAL: 20,\n SIDEBAR_CONTAINER: 30,\n SIDEBAR_BACKDROP: 40,\n SIDEBAR: 50,\n DROPDOWN: 50,\n CALENDAR_ANCHORED: 50,\n LOADING_OVERLAY_DEFAULT: 50,\n DRAWING_CANVAS_1: 51,\n DRAWING_CANVAS_2: 52,\n DRAWING: 53,\n MODAL_OVERLAY: 54,\n MODAL: 55,\n CALENDAR_PORTAL: 60,\n TOOLTIP: 70,\n SELECT_CONTENT: 100,\n TOP: 9999,\n MODAL_Z_STEP: 10,\n} as const;\n\nexport type ZIndexKey = keyof typeof Z_INDEX;\n","import type { CSSProperties, ReactNode } from \"react\";\n\nimport { Tooltip as TooltipBase, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\nimport { Z_INDEX } from \"../../config/zIndex\";\n\nexport interface TooltipProps {\n children: ReactNode;\n text?: ReactNode;\n content: ReactNode;\n position?: \"top\" | \"bottom\";\n className?: string;\n triggerClassName?: string;\n arrowClassName?: string;\n contentClassName?: string;\n contentStyle?: CSSProperties;\n containerStyle?: CSSProperties;\n offsetX?: number;\n offsetY?: number;\n delayDuration?: number;\n asChild?: boolean;\n disableHoverableContent?: boolean;\n sideOffset?: number;\n}\n\nexport default function Tooltip(props: TooltipProps) {\n const {\n children,\n text,\n content,\n position = \"bottom\",\n className = \"\",\n triggerClassName = \"\",\n arrowClassName = \"\",\n contentClassName = \"\",\n contentStyle = {},\n containerStyle,\n offsetX = 0,\n offsetY = 2,\n delayDuration = 0,\n asChild = false,\n disableHoverableContent = false,\n sideOffset = 0,\n } = props;\n\n const translateY = position === \"top\" ? -offsetY : offsetY;\n\n return (\n <TooltipBase delayDuration={delayDuration} disableHoverableContent={disableHoverableContent}>\n <TooltipTrigger className={triggerClassName} asChild={asChild}>\n {children}\n </TooltipTrigger>\n <TooltipContent\n className={`bg-neutral-700 font-medium text-white text-sm ${className}`}\n arrowClassName={`bg-neutral-700 !fill-neutral-700 ${arrowClassName}`}\n side={position}\n sideOffset={sideOffset}\n collisionPadding={8}\n style={{\n zIndex: Z_INDEX.TOOLTIP,\n transform: `translateX(${offsetX}px) translateY(${translateY}px)`,\n ...containerStyle,\n }}\n >\n <div className=\"px-3 py-[5px] break-words whitespace-normal\" style={contentStyle}>\n <p className={contentClassName}>\n {content && <span>{content}</span>}\n {text}\n </p>\n </div>\n </TooltipContent>\n </TooltipBase>\n );\n}\n","import { type ButtonHTMLAttributes, type ReactNode, type Ref } from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport Tooltip from \"../Tooltip\";\nimport { buttonVariants, cn } from \"../../lib/variants\";\n\nexport type ButtonVariant =\n | \"outline\"\n | \"save\"\n | \"delete\"\n | \"reset\"\n | \"search\"\n | \"file\"\n | \"carousel\"\n | \"accent\"\n | \"ghost\"\n | \"link\"\n | \"metal\";\n\nexport type ButtonSize = \"default\" | \"sm\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\" | \"link\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n tooltip?: ReactNode;\n tooltipPosition?: \"top\" | \"bottom\";\n tooltipClassName?: string;\n tooltipContentClassName?: string;\n}\n\nexport default function Button(props: ButtonProps) {\n const {\n ref,\n asChild = false,\n variant = \"outline\",\n size = \"default\",\n type = \"button\",\n className,\n tooltip,\n tooltipPosition = \"bottom\",\n tooltipClassName,\n tooltipContentClassName,\n disabled,\n ...rest\n } = props;\n\n const Comp = asChild ? Slot : \"button\";\n const mergedClassName = cn(buttonVariants({ variant, size }), className);\n const buttonElement = <Comp ref={ref} type={type} className={mergedClassName} disabled={disabled} {...rest} />;\n\n if (tooltip) {\n if (disabled) {\n return (\n <Tooltip\n content={tooltip}\n position={tooltipPosition}\n className={tooltipClassName}\n contentClassName={tooltipContentClassName}\n asChild={true}\n >\n <span className=\"inline-block\">{buttonElement}</span>\n </Tooltip>\n );\n }\n\n return (\n <Tooltip\n content={tooltip}\n position={tooltipPosition}\n className={tooltipClassName}\n contentClassName={tooltipContentClassName}\n asChild={true}\n >\n {buttonElement}\n </Tooltip>\n );\n }\n\n return buttonElement;\n}\n","export const DEFAULT_CHECKED_CLASS = \"border-0 bg-[#009fe3]\";\nexport const DEFAULT_UNCHECKED_CLASS = \"border-neutral-300 bg-white hover:border-[#009fe3]\";\nexport const DEFAULT_DISABLED_CHECKED_CLASS = \"border-0 bg-[#009fe3]/40\";\nexport const DEFAULT_DISABLED_UNCHECKED_CLASS = \"border-neutral-300 bg-black/10\";\nexport const DEFAULT_ICON_CLASS = \"text-white\";\n","import { useId } from \"react\";\nimport type { Ref } from \"react\";\n\nimport { Check, Minus } from \"lucide-react\";\n\nimport { cn } from \"../../lib/variants\";\nimport Tooltip, { type TooltipProps } from \"../Tooltip\";\nimport {\n DEFAULT_CHECKED_CLASS,\n DEFAULT_DISABLED_CHECKED_CLASS,\n DEFAULT_DISABLED_UNCHECKED_CLASS,\n DEFAULT_ICON_CLASS,\n DEFAULT_UNCHECKED_CLASS,\n} from \"./config/default\";\n\nexport interface CheckboxProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"defaultChecked\" | \"checked\"\n> {\n checked: boolean;\n label?: string;\n indeterminate?: boolean;\n ref?: Ref<HTMLDivElement>;\n onChange?: (checked: boolean) => void;\n tooltipConfig?: Pick<TooltipProps, \"content\" | \"position\">;\n wrapperClassName?: string;\n labelClassName?: string;\n iconClassName?: string;\n checkedClassName?: string;\n uncheckedClassName?: string;\n disabledCheckedClassName?: string;\n disabledUncheckedClassName?: string;\n}\n\nexport default function Checkbox(props: CheckboxProps) {\n const {\n onChange,\n checked,\n disabled,\n className,\n id,\n label,\n indeterminate = false,\n ref,\n tooltipConfig,\n wrapperClassName,\n labelClassName,\n iconClassName,\n checkedClassName = DEFAULT_CHECKED_CLASS,\n uncheckedClassName = DEFAULT_UNCHECKED_CLASS,\n disabledCheckedClassName = DEFAULT_DISABLED_CHECKED_CLASS,\n disabledUncheckedClassName = DEFAULT_DISABLED_UNCHECKED_CLASS,\n ...rest\n } = props;\n\n const generatedId = useId();\n const checkboxId = id ?? `checkbox-${generatedId}`;\n\n const isActive = checked || indeterminate;\n\n const handleToggle = () => {\n if (disabled) return;\n onChange?.(!checked);\n };\n\n const checkboxBox = (\n <div\n id={checkboxId}\n ref={ref}\n role=\"checkbox\"\n aria-checked={indeterminate ? \"mixed\" : checked}\n aria-disabled={disabled}\n className={cn(\n \"size-4 shrink-0 rounded-[3px] border flex items-center justify-center transition-colors\",\n disabled\n ? cn(\"cursor-not-allowed\", isActive ? disabledCheckedClassName : disabledUncheckedClassName)\n : cn(\"cursor-pointer\", isActive ? checkedClassName : uncheckedClassName),\n className,\n )}\n onClick={handleToggle}\n >\n {indeterminate && <Minus strokeWidth={3} className={cn(\"size-3\", DEFAULT_ICON_CLASS, iconClassName)} />}\n {!indeterminate && checked && (\n <Check strokeWidth={3} className={cn(\"size-3\", DEFAULT_ICON_CLASS, iconClassName)} />\n )}\n </div>\n );\n\n const checkboxBoxWithTooltip =\n tooltipConfig && disabled ? (\n <Tooltip {...tooltipConfig}>\n <span className=\"inline-flex\">{checkboxBox}</span>\n </Tooltip>\n ) : (\n checkboxBox\n );\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-1.5\", wrapperClassName)}\n onClick={(e) => e.stopPropagation()}\n {...rest}\n >\n {checkboxBoxWithTooltip}\n {label && label.length > 0 && (\n <label\n htmlFor={checkboxId}\n className={cn(\n \"text-sm select-none\",\n disabled ? \"cursor-not-allowed text-neutral-400\" : \"cursor-pointer\",\n labelClassName,\n )}\n onClick={handleToggle}\n >\n {label}\n </label>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input border-gray-300 flex h-8 w-full min-w-0 rounded-sm border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[1px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","import {\n useId,\n useState,\n type ChangeEventHandler,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport { Eye, EyeOff } from \"lucide-react\";\n\nimport { Input as InputPrimitive } from \"./ui/input\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n placeholder?: string;\n disabled?: boolean;\n status?: \"default\" | \"success\" | \"error\";\n message?: string;\n label?: string;\n bare?: boolean;\n type?: \"text\" | \"number\" | \"date\" | \"password\" | \"email\" | \"money\";\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n showPasswordToggle?: boolean;\n}\n\nexport default function Input(props: InputProps) {\n const {\n ref,\n className,\n placeholder,\n disabled,\n status = \"default\",\n message,\n label,\n bare = false,\n type = \"text\",\n id,\n leftIcon,\n rightIcon,\n showPasswordToggle = true,\n onChange,\n ...rest\n } = props;\n\n const randomId = useId();\n const inputId = id || `input-${randomId}`;\n const [showPassword, setShowPassword] = useState(false);\n\n const getStatusStyles = () => {\n switch (status) {\n case \"success\":\n return \"border-green-500 focus-visible:ring-green-500\";\n case \"error\":\n return \"border-red-600 focus-visible:ring-red-600\";\n default:\n return \"\";\n }\n };\n\n const getMessageStyles = () => {\n switch (status) {\n case \"success\":\n return \"text-green-600\";\n case \"error\":\n return \"text-red-500\";\n default:\n return \"text-muted-foreground\";\n }\n };\n\n const shouldShowPasswordToggle = type === \"password\" && showPasswordToggle;\n const actualType = type === \"password\" && showPassword ? \"text\" : type;\n\n const handlePasswordToggle = () => setShowPassword((prev) => !prev);\n\n const finalRightIcon =\n rightIcon ||\n (shouldShowPasswordToggle ? (\n <button\n type=\"button\"\n onClick={handlePasswordToggle}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer transition-colors\"\n disabled={disabled}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n ) : null);\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n const { value } = event.target;\n\n if (type === \"number\" || type === \"money\") {\n let sanitized = value.replace(/[^0-9.]/g, \"\");\n\n const parts = sanitized.split(\".\");\n if (parts.length > 2) {\n sanitized = parts[0] + \".\" + parts.slice(1).join(\"\");\n }\n\n if (type === \"money\") {\n const digitsOnly = sanitized.replace(/\\D/g, \"\");\n if (digitsOnly.length === 0) {\n event.target.value = \"\";\n } else {\n const withCommas = digitsOnly.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n event.target.value = withCommas;\n }\n } else {\n event.target.value = sanitized;\n }\n }\n\n if (onChange) {\n onChange(event);\n }\n };\n\n const inputBlock = (\n <div className=\"relative m-0\">\n {leftIcon && (\n <div className=\"text-muted-foreground absolute top-1/2 left-3 -translate-y-1/2 transform\">\n {leftIcon}\n </div>\n )}\n <InputPrimitive\n id={inputId}\n type={actualType === \"money\" || actualType === \"number\" ? \"text\" : actualType}\n className={cn(\"w-full\", leftIcon && \"pl-10\", finalRightIcon && \"pr-10\", getStatusStyles(), className)}\n placeholder={placeholder}\n disabled={disabled}\n ref={ref}\n onChange={handleChange}\n {...rest}\n />\n {finalRightIcon && (\n <div className=\"text-muted-foreground absolute top-1/2 right-3 flex -translate-y-1/2 transform\">\n {finalRightIcon}\n </div>\n )}\n </div>\n );\n\n if (bare) {\n return inputBlock;\n }\n\n return (\n <div className=\"w-full space-y-2\">\n {label && <p className=\"text-foreground text-sm font-medium\">{label}</p>}\n {inputBlock}\n {message && <p className={cn(\"mt-1 text-[12px]\", getMessageStyles())}>{message}</p>}\n </div>\n );\n}\n","import { useId, type Ref, type TextareaHTMLAttributes } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n ref?: Ref<HTMLTextAreaElement>;\n status?: \"default\" | \"success\" | \"error\";\n message?: string;\n label?: string;\n bare?: boolean;\n}\n\nexport default function Textarea(props: TextareaProps) {\n const {\n ref,\n className,\n placeholder,\n disabled,\n readOnly,\n status = \"default\",\n message,\n label,\n bare = false,\n id,\n rows = 4,\n ...rest\n } = props;\n\n const randomId = useId();\n const textareaId = id || `textarea-${randomId}`;\n\n const getStatusStyles = () => {\n switch (status) {\n case \"success\":\n return \"border-green-500 focus-visible:ring-green-500\";\n case \"error\":\n return \"border-red-600 focus:border-main focus-visible:border-main focus-visible:ring-main/30\";\n default:\n return \"\";\n }\n };\n\n const getMessageStyles = () => {\n switch (status) {\n case \"success\":\n return \"text-green-600\";\n case \"error\":\n return \"text-red-500\";\n default:\n return \"text-muted-foreground\";\n }\n };\n\n const textareaEl = (\n <textarea\n id={textareaId}\n ref={ref}\n rows={rows}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n className={cn(\n \"placeholder:text-muted-foreground custom-view-scrollbar border-input flex w-full min-w-0 resize-y rounded-md border border-gray-300 bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[1px]\",\n \"aria-invalid:ring-destructive/20 aria-invalid:border-destructive\",\n getStatusStyles(),\n className,\n )}\n {...rest}\n />\n );\n\n if (bare) {\n return textareaEl;\n }\n\n return (\n <div className=\"w-full space-y-2\">\n {label ? <p className=\"text-foreground text-sm font-medium\">{label}</p> : null}\n {textareaEl}\n {message ? <p className={cn(\"mt-1 text-[12px]\", getMessageStyles())}>{message}</p> : null}\n </div>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type SwitchTrackSize = {\n width: string | number;\n height: string | number;\n dotSize: string | number;\n};\n\nexport type SwitchTrackSizeInput = Partial<SwitchTrackSize>;\n\nexport const switchTrackSizes = {\n sm: { width: \"1.75rem\", height: \"1rem\", dotSize: \"0.75rem\" },\n md: { width: \"2rem\", height: \"1.15rem\", dotSize: \"1rem\" },\n lg: { width: \"2.75rem\", height: \"1.5rem\", dotSize: \"1.25rem\" },\n} as const satisfies Record<string, SwitchTrackSizeInput>;\n\nconst DEFAULT_TRACK_SIZE: SwitchTrackSize = switchTrackSizes.md;\n\nconst toCssSize = (value: string | number) => (typeof value === \"number\" ? `${value}px` : value);\n\nexport function resolveTrackSizeStyle(trackSize?: SwitchTrackSizeInput): CSSProperties {\n const resolved = { ...DEFAULT_TRACK_SIZE, ...trackSize };\n\n return {\n \"--switch-width\": toCssSize(resolved.width),\n \"--switch-height\": toCssSize(resolved.height),\n \"--switch-thumb-size\": toCssSize(resolved.dotSize),\n } as CSSProperties;\n}\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"../../../lib/variants\";\nimport { resolveTrackSizeStyle, type SwitchTrackSizeInput } from \"../config/switchTypes\";\n\ninterface BaseSwitchProps extends React.ComponentProps<typeof SwitchPrimitive.Root> {\n activeColor?: string;\n dotColor?: string;\n trackSize?: SwitchTrackSizeInput;\n}\n\nfunction BaseSwitch({\n className,\n activeColor = \"rgb(38, 117, 226)\",\n dotColor = \"rgb(255 255 255)\",\n trackSize,\n style,\n ...props\n}: BaseSwitchProps) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex h-(--switch-height) w-(--switch-width) shrink-0 items-center rounded-full border border-gray-200 bg-gray-300 shadow-xs outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 data-[state=checked]:bg-(--switch-active-bg) disabled:cursor-not-allowed disabled:opacity-50 dark:data-[state=unchecked]:bg-input/80\",\n !props.disabled && \"cursor-pointer\",\n className,\n )}\n style={\n {\n ...resolveTrackSizeStyle(trackSize),\n \"--switch-active-bg\": activeColor,\n ...style,\n } as React.CSSProperties\n }\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block size-(--switch-thumb-size) rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(var(--switch-width)-var(--switch-thumb-size)-2px)] data-[state=unchecked]:translate-x-0\",\n )}\n style={{ backgroundColor: dotColor }}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { BaseSwitch };\nexport type { BaseSwitchProps };\n","import { useId, type ComponentProps } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport { BaseSwitch } from \"./ui/BaseSwitch\";\nimport type { SwitchTrackSizeInput } from \"./config/switchTypes\";\n\nexport type { SwitchTrackSizeInput } from \"./config/switchTypes\";\nexport { switchTrackSizes } from \"./config/switchTypes\";\n\nexport interface SwitchProps extends ComponentProps<typeof BaseSwitch> {\n label?: string;\n labelClassName?: string;\n contentClassName?: string;\n activeColor?: string;\n dotColor?: string;\n trackSize?: SwitchTrackSizeInput;\n}\n\nexport default function Switch(props: SwitchProps) {\n const generatedId = useId();\n\n const {\n id,\n label,\n labelClassName,\n contentClassName,\n className,\n disabled = false,\n activeColor,\n dotColor,\n trackSize,\n ...switchProps\n } = props;\n const switchId = id ?? generatedId;\n\n return (\n <div className={cn(\"flex items-center space-x-2\", contentClassName)}>\n <BaseSwitch\n id={switchId}\n disabled={disabled}\n activeColor={activeColor}\n dotColor={dotColor}\n trackSize={trackSize}\n className={className}\n {...switchProps}\n />\n {label && (\n <label\n htmlFor={switchId}\n className={`${disabled ? \"cursor-default\" : \"cursor-pointer\"} ${labelClassName ?? \"\"}`}\n >\n {label}\n </label>\n )}\n </div>\n );\n}\n","import * as RadixSlider from \"@radix-ui/react-slider\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport interface SliderProps {\n value?: Array<number>;\n defaultValue?: Array<number>;\n onValueChange?: (value: Array<number>) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n trackClassName?: string;\n rangeClassName?: string;\n thumbClassName?: string;\n ariaLabel?: string;\n name?: string;\n}\n\nexport default function Slider(props: SliderProps) {\n const {\n value,\n defaultValue = [50],\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n orientation = \"horizontal\",\n className,\n trackClassName,\n rangeClassName,\n thumbClassName,\n ariaLabel = \"Volume\",\n name,\n } = props;\n\n return (\n <RadixSlider.Root\n className={cn(\n \"relative flex h-5 w-full touch-none select-none items-center\",\n orientation === \"vertical\" && \"h-full w-5 flex-col\",\n className,\n )}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n orientation={orientation}\n name={name}\n >\n <RadixSlider.Track\n className={cn(\n \"relative h-[3px] grow rounded-full bg-blackA7\",\n orientation === \"vertical\" && \"w-[3px] h-full\",\n trackClassName,\n )}\n >\n <RadixSlider.Range\n className={cn(\n \"absolute h-full rounded-full bg-white\",\n orientation === \"vertical\" && \"w-full\",\n rangeClassName,\n )}\n />\n </RadixSlider.Track>\n <RadixSlider.Thumb\n className={cn(\n \"block size-5 rounded-[10px] bg-white shadow-[0_2px_10px] shadow-blackA4 hover:bg-violet3 focus:shadow-[0_0_0_5px] focus:shadow-blackA5 focus:outline-none\",\n disabled && \"cursor-not-allowed opacity-50\",\n thumbClassName,\n )}\n aria-label={ariaLabel}\n />\n </RadixSlider.Root>\n );\n}\n","import type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\nexport type SkeletonProps = ComponentProps<\"div\">;\n\nexport default function Skeleton(props: SkeletonProps) {\n const { className, ...rest } = props;\n\n return (\n <div\n data-slot=\"skeleton\"\n aria-hidden\n className={cn(\"animate-pulse rounded-md bg-neutral-200/80\", className)}\n {...rest}\n />\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\n\ninterface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n height?: string | number;\n maxHeight?: string | number;\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n}\n\nconst ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ children, height, maxHeight, orientation = \"vertical\", className, style, ...props }, ref) => {\n const overflowStyle: CSSProperties = {\n overflowY: orientation === \"horizontal\" ? \"hidden\" : \"auto\",\n overflowX: orientation === \"vertical\" ? \"hidden\" : \"auto\",\n height,\n maxHeight,\n };\n\n return (\n <div\n ref={ref}\n className={`custom-view-scrollbar${className ? ` ${className}` : \"\"}`}\n style={{ ...overflowStyle, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nScrollArea.displayName = \"ScrollArea\";\n\nexport default ScrollArea;\n","import * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { ChevronDown, ChevronUp, CircleX } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n value = \"\",\n resetValue,\n canReset = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\";\n value?: string;\n canReset?: boolean;\n resetValue: () => void;\n}) {\n return (\n <div className=\"relative m-0 w-full min-w-0\">\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input cursor-pointer data-placeholder:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-full items-center justify-between gap-2 rounded-sm border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-gray-100 data-[size=default]:h-8 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"inline-block text-left w-full mr-3 ellipsis-1-line\">{children}</span>\n </SelectPrimitive.Trigger>\n <SelectPrimitive.Icon asChild className=\"absolute top-1/2 right-1.5 translate-y-[-50%]\">\n {value && canReset ? (\n <CircleX\n className=\"pl-0.5 size-4 opacity-60 cursor-pointer hover:stroke-main\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n resetValue();\n }}\n />\n ) : (\n <ChevronDown size={14} className=\"opacity-50 pointer-events-none \" />\n )}\n </SelectPrimitive.Icon>\n </div>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n disableScrollButtonEvents = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & {\n disableScrollButtonEvents?: boolean;\n}) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-100 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton className={disableScrollButtonEvents ? \"pointer-events-none\" : \"\"} />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton className={disableScrollButtonEvents ? \"pointer-events-none\" : \"\"} />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n `focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground \n relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden \n select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none\n [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center\n *:[span]:last:gap-2 data-[state=checked]:bg-blue-100 data-[state=checked]:text-blue-900\n *:data-[slot=item-text]:flex-1 *:data-[slot=item-text]:min-w-0`,\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText data-slot=\"item-text\">{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronUp size={14} />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronDown size={14} />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","export const SELECT_BORDER_COLORS = {\n default: \"border-gray-300\",\n open: \"border-blue-600\",\n} as const;\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport {\n Select as SelectPrimitive,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { SELECT_BORDER_COLORS } from \"./config/default\";\nimport type { SelectOptionType } from \"./config/type\";\n\nexport type { SelectOptionType } from \"./config/type\";\nexport {\n Select as SelectBase,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\n\nexport interface SelectProps<T extends SelectOptionType = SelectOptionType> extends Omit<\n React.ComponentProps<typeof SelectPrimitive>,\n \"onValueChange\" | \"value\" | \"defaultValue\"\n> {\n value: string;\n onChange: (value: string) => void;\n containerClassName?: string;\n options: Array<T>;\n placeholder?: string;\n triggerClassName?: string;\n contentClassName?: string;\n itemClassName?: string;\n disabledItemClassName?: string;\n label?: ReactNode | string;\n labelClassName?: string;\n disabled?: boolean;\n className?: string;\n hasError?: boolean;\n canReset?: boolean;\n disableScrollButtonEvents?: boolean;\n onReset?: () => void;\n}\n\nexport default function Select<T extends SelectOptionType = SelectOptionType>(props: SelectProps<T>) {\n const {\n containerClassName,\n options,\n placeholder = \"선택해 주세요\",\n triggerClassName,\n contentClassName,\n itemClassName,\n disabledItemClassName,\n label,\n labelClassName,\n disabled,\n className,\n hasError = false,\n value,\n canReset = false,\n disableScrollButtonEvents = false,\n onChange,\n onReset,\n onOpenChange,\n ...rest\n } = props;\n\n const [isSelectOptionOpen, setIsSelectOptionOpen] = useState(false);\n\n const handleSelectOptionOpenChange = (open: boolean) => {\n setIsSelectOptionOpen(open);\n onOpenChange?.(open);\n };\n\n const borderClass = hasError\n ? \"border-red-600\"\n : isSelectOptionOpen\n ? SELECT_BORDER_COLORS.open\n : SELECT_BORDER_COLORS.default;\n\n const resetValue = () => {\n onChange(\"\");\n onReset?.();\n };\n\n return (\n <div className={cn(\"space-y-0.5\", containerClassName ?? \"w-30\")}>\n {label && (\n <label\n className={cn(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 select-none\",\n labelClassName,\n )}\n >\n {label}\n </label>\n )}\n <SelectPrimitive\n value={value}\n disabled={disabled}\n onValueChange={onChange}\n onOpenChange={handleSelectOptionOpenChange}\n {...rest}\n >\n <SelectTrigger\n className={cn(\n \"w-full h-8 px-2 py-1 select-none border rounded-0.5 bg-white text-gray-900 focus:outline-none transition-colors\",\n triggerClassName,\n borderClass,\n className,\n )}\n value={value}\n resetValue={resetValue}\n canReset={canReset}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent\n className={cn(\n \"bg-white border border-gray-300 rounded-sm shadow-lg py-1 mt-0.25 w-full min-w-0 max-h-120\",\n contentClassName,\n )}\n disableScrollButtonEvents={disableScrollButtonEvents}\n >\n <SelectGroup>\n {options.map((option) => (\n <SelectItem\n key={String(option.value)}\n value={String(option.value)}\n disabled={option.disabled ?? false}\n className={cn(\n \"px-1 py-1.5 text-sm text-gray-900 cursor-pointer hover:bg-blue-50 focus:bg-neutral-100 rounded transition w-full\",\n itemClassName,\n option.disabled && cn(\"opacity-50 cursor-not-allowed text-gray-300 bg-white\", disabledItemClassName),\n )}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </SelectPrimitive>\n </div>\n );\n}\n","import type { ComponentProps, ReactNode } from \"react\";\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\n\nimport { Select as SelectBase, SelectLabel } from \"../Select/ui/select\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface SelectGroupProps extends ComponentProps<typeof SelectPrimitive.Root> {\n children: ReactNode;\n className?: string;\n label?: string;\n labelClassName?: string;\n}\n\nexport default function SelectGroup(props: SelectGroupProps) {\n const { children, label, labelClassName, ...rest } = props;\n\n return (\n <div className=\"space-y-0.5\">\n {label && (\n <SelectLabel className={cn(\"text-sm font-medium leading-none\", labelClassName)}>{label}</SelectLabel>\n )}\n <SelectBase {...rest}>{children}</SelectBase>\n </div>\n );\n}\n","export const DEFAULT_CHECK_COLOR = \"#009FE3\";\nexport const DEFAULT_UNCHECK_COLOR = \"#C6CCCE\";\n","import { cn } from \"../../lib/variants\";\nimport type { CSSProperties, ReactNode } from \"react\";\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { CircleIcon } from \"lucide-react\";\n\nimport { DEFAULT_CHECK_COLOR, DEFAULT_UNCHECK_COLOR } from \"./config/default\";\nimport type { RadioOptionType } from \"./config/type\";\nimport Tooltip from \"../Tooltip/index\";\n\nexport type { RadioOptionType } from \"./config/type\";\n\nexport interface RadioProps<T extends string = string> {\n name: string;\n value: T;\n label: ReactNode;\n checked?: boolean;\n onChange?: (value: T) => void;\n disabled?: boolean;\n disabledMessage?: string;\n checkColor?: string;\n unCheckColor?: string;\n labelClassName?: string;\n indicatorClassName?: string;\n wrapperClassName?: string;\n}\n\nexport function Radio<T extends string = string>(props: RadioProps<T>) {\n const {\n name,\n value,\n label,\n checked,\n onChange,\n disabled = false,\n disabledMessage,\n checkColor = DEFAULT_CHECK_COLOR,\n unCheckColor = DEFAULT_UNCHECK_COLOR,\n labelClassName,\n indicatorClassName,\n wrapperClassName,\n } = props;\n\n const inputId = `${name}-${value}`;\n\n const colorVars = {\n \"--radio-checked\": checkColor,\n \"--radio-unchecked\": unCheckColor,\n } as CSSProperties;\n\n const control = (\n <div className={cn(\"flex items-center gap-1.5\", wrapperClassName)} style={colorVars}>\n <RadioGroupPrimitive.Item\n value={value}\n disabled={disabled}\n id={inputId}\n className={cn(\n \"group relative size-4 shrink-0 rounded-full border box-border transition-colors duration-200 outline-none\",\n \"border-(--radio-unchecked) data-[state=checked]:border-(--radio-checked)\",\n \"data-[state=unchecked]:hover:opacity-80\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n )}\n >\n <RadioGroupPrimitive.Indicator className=\"relative flex items-center justify-center\">\n <CircleIcon\n className={cn(\n \"absolute top-1/2 left-1/2 size-2.5 -translate-x-1/2 -translate-y-1/2 fill-(--radio-checked) text-(--radio-checked) transition-opacity duration-200\",\n indicatorClassName,\n )}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n <label\n htmlFor={inputId}\n className={cn(\n \"text-sm font-medium cursor-pointer text-black select-none\",\n disabled && \"cursor-not-allowed text-gray-400 opacity-50\",\n labelClassName,\n )}\n >\n {label}\n </label>\n </div>\n );\n\n const withTooltip = (node: ReactNode) => {\n if (!disabled || !disabledMessage) return node;\n return (\n <Tooltip content={disabledMessage} position=\"bottom\" asChild sideOffset={4}>\n <span className=\"inline-flex\">{node}</span>\n </Tooltip>\n );\n };\n\n if (onChange !== undefined && checked !== undefined) {\n return withTooltip(\n <RadioGroupPrimitive.Root\n name={name}\n value={checked ? value : \"\"}\n onValueChange={(newValue) => {\n if (newValue === value) {\n onChange(value);\n }\n }}\n disabled={disabled}\n >\n {control}\n </RadioGroupPrimitive.Root>,\n );\n }\n\n return withTooltip(control);\n}\n\nexport interface RadioGroupProps<T extends string = string> {\n name: string;\n value: T;\n onChange: (value: T) => void;\n options: Array<RadioOptionType<T>>;\n direction?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n checkColor?: string;\n unCheckColor?: string;\n containerClassName?: string;\n labelClassName?: string;\n indicatorClassName?: string;\n wrapperClassName?: string;\n}\n\nexport function RadioGroup<T extends string = string>(props: RadioGroupProps<T>) {\n const {\n name,\n value,\n onChange,\n options,\n direction = \"horizontal\",\n disabled = false,\n checkColor = \"#009FE3\",\n unCheckColor = \"#C6CCCE\",\n containerClassName,\n labelClassName,\n indicatorClassName,\n wrapperClassName,\n } = props;\n\n return (\n <RadioGroupPrimitive.Root\n name={name}\n value={value}\n onValueChange={(newValue) => onChange(newValue as T)}\n disabled={disabled}\n className={cn(\n \"flex flex-wrap gap-3\",\n direction === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n containerClassName,\n )}\n >\n {options.map((option) => (\n <Radio\n key={option.value}\n name={name}\n value={option.value}\n label={option.label}\n disabled={disabled || option.disabled}\n disabledMessage={option.disabled ? option.disabledMessage : undefined}\n checkColor={checkColor}\n unCheckColor={unCheckColor}\n labelClassName={labelClassName}\n indicatorClassName={indicatorClassName}\n wrapperClassName={wrapperClassName}\n />\n ))}\n </RadioGroupPrimitive.Root>\n );\n}\n\nexport default RadioGroup;\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"../../../lib/variants\";\n\ntype PopoverContentPrimitiveProps = React.ComponentProps<typeof PopoverPrimitive.Content>;\n\nexport type PopoverAlign = NonNullable<PopoverContentPrimitiveProps[\"align\"]>;\nexport type PopoverPosition = NonNullable<PopoverContentPrimitiveProps[\"side\"]>;\n\nexport type PopoverContentProps = Omit<PopoverContentPrimitiveProps, \"side\"> & {\n position?: PopoverPosition;\n};\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nfunction PopoverContent({\n className,\n align = \"center\",\n position = \"bottom\",\n sideOffset = 4,\n ...props\n}: PopoverContentProps) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n side={position}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border border-neutral-200 bg-white p-4 text-neutral-950 shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div data-slot=\"popover-header\" className={cn(\"mb-3 space-y-1.5\", className)} {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n data-slot=\"popover-title\"\n className={cn(\"text-base font-semibold leading-none text-neutral-950\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p data-slot=\"popover-description\" className={cn(\"text-sm text-neutral-600\", className)} {...props} />\n );\n}\n\nfunction PopoverFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"popover-footer\"\n className={cn(\"mt-4 flex items-center justify-end gap-2 [&_button]:w-auto [&_button]:shrink-0\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverClose({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Close>) {\n return (\n <PopoverPrimitive.Close\n data-slot=\"popover-close\"\n className={cn(\n \"absolute right-3 top-3 rounded-sm p-1 text-neutral-500 opacity-70 transition-colors\",\n \"outline-none hover:bg-neutral-100 hover:text-neutral-700 hover:opacity-100\",\n \"focus:outline-none focus:ring-0\",\n \"focus-visible:ring-2 focus-visible:ring-neutral-300 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverAnchor,\n PopoverContent,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n PopoverFooter,\n PopoverClose,\n};\n","import type { ReactNode } from \"react\";\n\nimport {\n Popover as PopoverRoot,\n PopoverTrigger,\n PopoverContent,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n} from \"./ui/popover\";\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverAnchor,\n PopoverContent,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n PopoverFooter,\n PopoverClose,\n Popover as default,\n} from \"./ui/popover\";\n\nexport type { PopoverContentProps, PopoverAlign, PopoverPosition } from \"./ui/popover\";\n\nexport interface SimplePopoverProps {\n trigger: ReactNode;\n title?: string;\n description?: string;\n children?: ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n position?: \"top\" | \"right\" | \"bottom\" | \"left\";\n className?: string;\n contentClassName?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function SimplePopover(props: SimplePopoverProps) {\n const {\n trigger,\n title,\n description,\n children,\n align = \"center\",\n position = \"bottom\",\n className,\n contentClassName,\n open,\n onOpenChange,\n } = props;\n\n return (\n <PopoverRoot open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n <PopoverContent align={align} position={position} className={contentClassName}>\n {(title || description) && (\n <PopoverHeader className={className}>\n {title && <PopoverTitle>{title}</PopoverTitle>}\n {description && <PopoverDescription>{description}</PopoverDescription>}\n </PopoverHeader>\n )}\n {children}\n </PopoverContent>\n </PopoverRoot>\n );\n}\n","import { cn } from \"../../lib/variants\";\n\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type SpinnerColor = \"blue\" | \"purple\" | \"green\" | \"red\";\n\nexport interface SpinnerProps {\n className?: string;\n size?: SpinnerSize;\n color?: SpinnerColor;\n ariaLabel?: string;\n}\n\nconst SIZE_CLASSES: Record<SpinnerSize, string> = {\n sm: \"w-4 h-4\",\n md: \"w-8 h-8\",\n lg: \"w-12 h-12\",\n xl: \"w-16 h-16\",\n};\n\nconst SIZE_PX: Record<SpinnerSize, number> = {\n sm: 16,\n md: 32,\n lg: 48,\n xl: 64,\n};\n\nconst RING_INSET_PX: Record<SpinnerSize, number> = {\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n};\n\nconst RING_INNER_RADIUS_PX: Record<SpinnerSize, number> = {\n sm: SIZE_PX.sm / 2 - RING_INSET_PX.sm,\n md: SIZE_PX.md / 2 - RING_INSET_PX.md,\n lg: SIZE_PX.lg / 2 - RING_INSET_PX.lg,\n xl: SIZE_PX.xl / 2 - RING_INSET_PX.xl,\n};\n\nconst COLOR_HEX: Record<SpinnerColor, string> = {\n blue: \"#3b82f6\",\n purple: \"#a855f7\",\n green: \"#22c55e\",\n red: \"#ef4444\",\n};\n\nexport default function Spinner(props: SpinnerProps) {\n const { className, size = \"md\", color = \"blue\", ariaLabel = \"로딩 중\" } = props;\n const hex = COLOR_HEX[color];\n const innerRadius = RING_INNER_RADIUS_PX[size];\n const maskValue = `radial-gradient(circle, transparent ${innerRadius}px, #000 ${innerRadius}px)`;\n\n return (\n <div\n role=\"status\"\n aria-label={ariaLabel}\n className={cn(\"rounded-full animate-spin\", SIZE_CLASSES[size], className)}\n style={{\n background: `conic-gradient(transparent, ${hex})`,\n mask: maskValue,\n WebkitMask: maskValue,\n }}\n />\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Z_INDEX } from \"../../config/zIndex\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface LoadingOverlayProps {\n isVisible: boolean;\n children: ReactNode;\n fullScreen?: boolean;\n blur?: boolean;\n opacity?: number;\n backdropColor?: \"white\" | \"black\";\n zIndex?: number;\n}\n\nexport default function LoadingOverlay(props: LoadingOverlayProps) {\n const {\n isVisible,\n children,\n fullScreen = false,\n blur = false,\n opacity = 70,\n backdropColor = \"white\",\n zIndex = Z_INDEX.LOADING_OVERLAY_DEFAULT,\n } = props;\n\n if (!isVisible) return null;\n\n const bgRgb = backdropColor === \"white\" ? \"255,255,255\" : \"0,0,0\";\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center\",\n fullScreen ? \"fixed inset-0\" : \"absolute inset-0\",\n blur && \"backdrop-blur-sm\",\n )}\n style={{ backgroundColor: `rgba(${bgRgb},${opacity / 100})`, zIndex }}\n >\n {children}\n </div>\n );\n}\n","import { cn, textVariants } from \"../../lib/variants\";\nimport Spinner, { type SpinnerColor, type SpinnerSize } from \"../Spinner\";\nimport LoadingOverlay, { type LoadingOverlayProps } from \"../LoadingOverlay\";\n\nexport type LoadingSize = SpinnerSize;\nexport type LoadingColor = SpinnerColor;\nexport type LoadingTextSize = \"xs\" | \"sm\" | \"md\";\nexport type LoadingOverlayConfig = Omit<LoadingOverlayProps, \"children\">;\n\nexport interface LoadingProps {\n size?: LoadingSize;\n color?: LoadingColor;\n label?: string;\n className?: string;\n ariaLabel?: string;\n overlayConfig?: LoadingOverlayConfig;\n}\n\nconst TEXT_SIZE_BY_LOADING_SIZE: Record<LoadingSize, LoadingTextSize> = {\n sm: \"xs\",\n md: \"xs\",\n lg: \"sm\",\n xl: \"md\",\n};\n\nexport default function Loading(props: LoadingProps) {\n const { size = \"md\", color = \"blue\", label, className, ariaLabel, overlayConfig } = props;\n\n if (overlayConfig !== undefined) {\n const { isVisible, fullScreen, blur, opacity, backdropColor = \"white\", zIndex } = overlayConfig;\n\n return (\n <LoadingOverlay\n isVisible={isVisible}\n fullScreen={fullScreen}\n blur={blur}\n opacity={opacity}\n backdropColor={backdropColor}\n zIndex={zIndex}\n >\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size={size} color={color} ariaLabel={ariaLabel} />\n {label && (\n <p\n className={cn(\n backdropColor === \"black\"\n ? textVariants({ size: TEXT_SIZE_BY_LOADING_SIZE[size], color: \"white\" })\n : textVariants({ size: TEXT_SIZE_BY_LOADING_SIZE[size], variant: \"muted\" }),\n )}\n >\n {label}\n </p>\n )}\n </div>\n </LoadingOverlay>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col items-center gap-2\", className)}>\n <Spinner size={size} color={color} ariaLabel={ariaLabel} />\n {label && (\n <p className={cn(textVariants({ size: TEXT_SIZE_BY_LOADING_SIZE[size], variant: \"muted\" }))}>\n {label}\n </p>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport { ChevronLeft, ChevronRight, ChevronLast, ChevronFirst } from \"lucide-react\";\n\nimport { cn } from \"../../lib/variants\";\n\nconst MAX_VISIBLE_PAGES = 10;\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange?: (page: number) => void;\n showTotalCount?: boolean;\n}\n\nfunction getVisiblePageRange(currentPage: number, totalPages: number) {\n if (totalPages <= MAX_VISIBLE_PAGES) {\n return { start: 0, end: totalPages - 1 };\n }\n\n let start = currentPage - Math.floor(MAX_VISIBLE_PAGES / 2);\n let end = start + MAX_VISIBLE_PAGES - 1;\n\n if (start < 0) {\n start = 0;\n end = MAX_VISIBLE_PAGES - 1;\n } else if (end >= totalPages) {\n end = totalPages - 1;\n start = end - MAX_VISIBLE_PAGES + 1;\n }\n\n return { start, end };\n}\n\nexport default function Pagination(props: PaginationProps) {\n const { page = 0, totalPages = 50, onPageChange } = props;\n\n const [displayPage, setDisplayPage] = useState(page);\n\n useEffect(() => {\n setDisplayPage(page);\n }, [page]);\n\n const handlePageChange = useCallback(\n (newPage: number) => {\n setDisplayPage(newPage);\n onPageChange?.(newPage);\n },\n [onPageChange],\n );\n\n const pageButtons = useMemo(() => {\n const { start, end } = getVisiblePageRange(displayPage, totalPages);\n const buttons = [];\n\n for (let pageIndex = start; pageIndex <= end; pageIndex++) {\n const displayPageNumber = pageIndex + 1;\n const isActive = displayPage === pageIndex;\n\n buttons.push(\n <button\n key={`page-${pageIndex}`}\n type=\"button\"\n className={cn(\n \"min-w-7 min-h-7 rounded-[4px] text-[14px] px-[5px] font-medium cursor-pointer\",\n isActive\n ? \"bg-[#2675e2] text-white font-bold\"\n : \"bg-white text-[#000000] font-normal hover:bg-gray-50\",\n )}\n onClick={() => handlePageChange(pageIndex)}\n >\n {displayPageNumber}\n </button>,\n );\n }\n\n return buttons;\n }, [displayPage, totalPages, handlePageChange]);\n\n const isFirstDisabled = displayPage <= 0;\n const isPreviousDisabled = displayPage <= 0;\n const isNextDisabled = displayPage >= totalPages - 1;\n const isLastDisabled = displayPage >= totalPages - 1;\n\n const navButtonClass = (disabled: boolean) =>\n cn(\n \"w-7 h-7 rounded-[4px] bg-white flex items-center justify-center cursor-pointer\",\n disabled ? \"opacity-30 cursor-default\" : \"hover:bg-gray-50\",\n );\n\n const renderNavButton = (\n onClick: () => void,\n disabled: boolean,\n ariaLabel: string,\n children: ReactNode,\n ) => (\n <button\n type=\"button\"\n className={navButtonClass(disabled)}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n\n if (!totalPages || totalPages === 0) {\n return null;\n }\n\n return (\n <div className=\"flex flex-row items-center gap-1.5\">\n {renderNavButton(\n () => handlePageChange(0),\n isFirstDisabled,\n \"첫 페이지\",\n <ChevronFirst className=\"h-4.5 w-4.5 text-[#000000]\" strokeWidth={2} />,\n )}\n {renderNavButton(\n () => handlePageChange(displayPage - 1),\n isPreviousDisabled,\n \"이전 페이지\",\n <ChevronLeft className=\"w-4.5 h-4.5 text-[#000000]\" />,\n )}\n\n {pageButtons}\n\n {renderNavButton(\n () => handlePageChange(displayPage + 1),\n isNextDisabled,\n \"다음 페이지\",\n <ChevronRight className=\"w-4.5 h-4.5 text-[#000000]\" />,\n )}\n {renderNavButton(\n () => handlePageChange(totalPages - 1),\n isLastDisabled,\n \"마지막 페이지\",\n <ChevronLast className=\"h-4.5 w-4.5 text-[#000000]\" strokeWidth={2} />,\n )}\n </div>\n );\n}\n","import type {\n BreadCrumbItem,\n BreadCrumbHrefItem,\n BreadCrumbOnClickItem,\n BreadCrumbToItem,\n} from \"./type\";\n\nexport function isBreadCrumbToItem(item: BreadCrumbItem): item is BreadCrumbToItem {\n return \"to\" in item;\n}\n\nexport function isBreadCrumbHrefItem(item: BreadCrumbItem): item is BreadCrumbHrefItem {\n return \"href\" in item;\n}\n\nexport function isBreadCrumbOnClickItem(item: BreadCrumbItem): item is BreadCrumbOnClickItem {\n return \"onClick\" in item;\n}\n","import { Link } from \"react-router\";\n\nimport { cn } from \"../../../lib/variants\";\n\nimport {\n isBreadCrumbHrefItem,\n isBreadCrumbOnClickItem,\n isBreadCrumbToItem,\n} from \"../config/utils\";\nimport type { BreadCrumbItem } from \"../config/type\";\n\ninterface BreadCrumbLinkProps {\n item: BreadCrumbItem;\n className?: string;\n}\n\nexport default function BreadCrumbLink(props: BreadCrumbLinkProps) {\n const { item, className } = props;\n\n const linkClass = cn(\"text-[#666666] hover:text-[#333333] transition-colors\", className);\n\n // item 타입 to 일떄 Link 컴포넌트 반환\n if (isBreadCrumbToItem(item)) {\n return (\n <Link to={item.to} className={linkClass} onClick={item.onClick}>\n {item.label}\n </Link>\n );\n }\n\n // item 타입 href 일떄 a 컴포넌트 반환\n if (isBreadCrumbHrefItem(item)) {\n return (\n <a href={item.href} className={linkClass} onClick={item.onClick}>\n {item.label}\n </a>\n );\n }\n\n // item 타입 onClick 일떄 button 컴포넌트 반환\n if (isBreadCrumbOnClickItem(item)) {\n return (\n <button type=\"button\" className={cn(linkClass, \"cursor-pointer\")} onClick={item.onClick}>\n {item.label}\n </button>\n );\n }\n\n return <span className={linkClass}>{item.label}</span>;\n}\n","import type { ReactNode } from \"react\";\nimport type { BreadCrumbItem } from \"./config/type\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../lib/variants\";\nimport BreadCrumbLink from \"./ui/BreadCrumbLink\";\n\nexport interface BreadCrumbProps<T extends BreadCrumbItem = BreadCrumbItem> {\n items: Array<T>;\n separator?: ReactNode;\n className?: string;\n listClassName?: string;\n itemClassName?: string;\n linkClassName?: string;\n activeItemClassName?: string;\n separatorClassName?: string;\n}\n\nexport default function BreadCrumb<T extends BreadCrumbItem = BreadCrumbItem>(props: BreadCrumbProps<T>) {\n const {\n items,\n separator,\n className,\n listClassName,\n itemClassName,\n linkClassName,\n activeItemClassName,\n separatorClassName,\n } = props;\n\n if (!items.length) {\n return null;\n }\n\n const defaultSeparator = (\n <ChevronRight className={cn(\"size-4 shrink-0 text-[#999999]\", separatorClassName)} aria-hidden />\n );\n\n return (\n <nav aria-label=\"breadcrumb\" className={className}>\n <ol className={cn(\"flex flex-wrap items-center gap-1.5 text-sm\", listClassName)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li\n key={`${item.label}-${index}`}\n className={cn(\"inline-flex items-center gap-1.5\", itemClassName)}\n >\n {index > 0 && (separator ?? defaultSeparator)}\n {isLast ? (\n <span aria-current=\"page\" className={cn(\"font-medium text-[#333333]\", activeItemClassName)}>\n {item.label}\n </span>\n ) : (\n <BreadCrumbLink item={item} className={linkClassName} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import type {\n BreadCrumbItem,\n BreadCrumbMenuItem,\n BreadCrumbRoot,\n BuildBreadCrumbItemsParams,\n} from \"./type\";\n\n//\nfunction matchesPath(pathname: string, prefix: string) {\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n}\n\nfunction findRootKey(pathname: string, config: Record<string, BreadCrumbRoot>) {\n let best: { key: string; length: number } | undefined;\n\n for (const [key, root] of Object.entries(config)) {\n for (const prefix of [root.basePath, ...root.pathPrefixes]) {\n if (matchesPath(pathname, prefix) && (!best || prefix.length > best.length)) {\n best = { key, length: prefix.length };\n }\n }\n }\n\n return best?.key;\n}\n\nexport function findParentMenuItem(pathname: string, menuList: BreadCrumbMenuItem[]) {\n let parentItem: BreadCrumbMenuItem | undefined;\n\n const walk = (items: BreadCrumbMenuItem[]): boolean => {\n for (const item of items) {\n if (item.children?.length) {\n if (item.children.some((child) => child.path && matchesPath(pathname, child.path))) {\n parentItem = item;\n return true;\n }\n\n if (walk(item.children)) {\n return true;\n }\n\n continue;\n }\n\n if (item.path && matchesPath(pathname, item.path)) {\n return true;\n }\n }\n\n return false;\n };\n\n walk(menuList);\n return parentItem;\n}\n\nexport function findParentMenuName(pathname: string, menuList: BreadCrumbMenuItem[]) {\n return findParentMenuItem(pathname, menuList)?.label;\n}\n\nexport function buildBreadCrumbItems({\n pathname,\n title,\n rootConfig,\n rootKey,\n menuList,\n}: BuildBreadCrumbItemsParams): BreadCrumbItem[] {\n const items: BreadCrumbItem[] = [];\n\n const key = rootKey ?? (rootConfig ? findRootKey(pathname, rootConfig) : undefined);\n const root = key && rootConfig ? rootConfig[key] : undefined;\n\n if (root) {\n items.push({ label: root.displayName, to: root.basePath });\n }\n\n const parentMenu = menuList ? findParentMenuItem(pathname, menuList) : undefined;\n if (parentMenu) {\n if (parentMenu.path) {\n items.push({ label: parentMenu.label, to: parentMenu.path });\n } else {\n items.push({ label: parentMenu.label });\n }\n }\n\n items.push({ label: title });\n return items;\n}\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router\";\n\nimport { buildBreadCrumbItems } from \"../config/buildItems\";\nimport type { BuildBreadCrumbItemsParams } from \"../config/type\";\n\n// 현재 URL과 메뉴·루트 설정, 페이지 제목만으로 BreadCrumb에 넘길 items 배열을 자동 해주는 훅\nexport function useBreadCrumbItems(\n params: Omit<BuildBreadCrumbItemsParams, \"pathname\"> & { pathname?: string },\n) {\n const { pathname: currentPathname } = useLocation();\n const pathname = params.pathname ?? currentPathname;\n const { title, rootConfig, rootKey, menuList } = params;\n\n return useMemo(\n () => buildBreadCrumbItems({ pathname, title, rootConfig, rootKey, menuList }),\n [pathname, title, rootConfig, rootKey, menuList],\n );\n}\n","import { useRef, type ReactNode } from \"react\";\n\nexport type ToastPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type ToastType = \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\n\nexport interface ToastProps {\n toast: string;\n id?: string;\n type?: ToastType;\n position?: ToastPosition;\n duration?: number;\n showCloseButton?: boolean;\n className?: string;\n icon?: ReactNode;\n onClose?: () => void;\n onClick?: () => void;\n}\n\nexport interface ToastHookReturn {\n showToast: (props: ToastProps) => string;\n dismissToast: (toastId: string) => void;\n dismissAllToast: () => void;\n dismissAllExcept: (type: ToastType) => void;\n}\n\n// 토스트 아이템 인터페이스\nexport interface ToastItem {\n id: string;\n props: ToastProps;\n visible: boolean;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n// 전역 토스트 관리자\nexport class ToastManager {\n private static instance: ToastManager;\n private containers: Map<ToastPosition, (toasts: Array<ToastItem>) => void> = new Map();\n private toasts: Map<ToastPosition, Array<ToastItem>> = new Map();\n\n static getInstance(): ToastManager {\n if (!ToastManager.instance) {\n ToastManager.instance = new ToastManager();\n }\n return ToastManager.instance;\n }\n\n registerContainer(position: ToastPosition, setToasts: (toasts: Array<ToastItem>) => void) {\n this.containers.set(position, setToasts);\n // 기존 토스트가 있으면 즉시 표시\n const existingToasts = this.toasts.get(position) || [];\n if (existingToasts.length > 0) {\n setToasts([...existingToasts]);\n } else {\n setToasts([]);\n }\n }\n\n addToast(props: ToastProps): string {\n const position = props.position || \"top-center\";\n const duration = props.duration !== undefined ? props.duration : 1500;\n\n // id가 지정된 경우 모든 위치에서 동일 id의 기존 토스트 제거 (중복 방지)\n if (props.id) {\n for (const [pos, toasts] of this.toasts.entries()) {\n const existing = toasts.find((t) => t.id === props.id);\n if (existing) {\n if (existing.timer) clearTimeout(existing.timer);\n const updated = toasts.filter((t) => t.id !== props.id);\n this.toasts.set(pos, updated);\n const setToasts = this.containers.get(pos);\n if (setToasts) setToasts([...updated]);\n break;\n }\n }\n }\n\n // 같은 위치에 토스트가 이미 있으면 모두 삭제\n const positionToasts = this.toasts.get(position) || [];\n if (positionToasts.length > 0) {\n positionToasts.forEach((toast) => {\n if (toast.timer) clearTimeout(toast.timer);\n });\n this.toasts.set(position, []);\n const setToasts = this.containers.get(position);\n if (setToasts) setToasts([]);\n }\n\n const id = props.id ?? `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const newToast: ToastItem = {\n id,\n props,\n visible: true,\n };\n\n // 토스트를 먼저 저장 (컨테이너가 아직 등록되지 않았을 수 있음)\n const updatedToasts = [newToast];\n this.toasts.set(position, updatedToasts);\n\n // 컨테이너가 등록되어 있으면 즉시 UI 업데이트\n const setToasts = this.containers.get(position);\n if (setToasts) {\n setToasts([...updatedToasts]);\n }\n\n if (duration !== Infinity) {\n const timer = setTimeout(() => {\n this.removeToast(id);\n }, duration);\n\n newToast.timer = timer;\n }\n\n return id;\n }\n\n removeToast(id: string) {\n for (const [position, toasts] of this.toasts.entries()) {\n const toast = toasts.find((t) => t.id === id);\n if (toast) {\n if (toast.timer) {\n clearTimeout(toast.timer);\n }\n\n const updatedToasts = toasts.filter((t) => t.id !== id);\n this.toasts.set(position, updatedToasts);\n\n const setToasts = this.containers.get(position);\n if (setToasts) {\n setToasts(updatedToasts);\n }\n break;\n }\n }\n }\n\n removeAllToasts() {\n for (const toasts of this.toasts.values()) {\n toasts.forEach((toast) => {\n if (toast.timer) {\n clearTimeout(toast.timer);\n }\n });\n }\n\n this.toasts.clear();\n\n for (const [, setToasts] of this.containers.entries()) {\n setToasts([]);\n }\n }\n\n removeAllToastsExcept(type: ToastType) {\n for (const [position, toasts] of this.toasts.entries()) {\n const toKeep = toasts.filter((t) => t.props.type === type);\n const toRemove = toasts.filter((t) => t.props.type !== type);\n\n toRemove.forEach((toast) => {\n if (toast.timer) clearTimeout(toast.timer);\n });\n\n this.toasts.set(position, toKeep);\n const setToasts = this.containers.get(position);\n if (setToasts) setToasts([...toKeep]);\n }\n }\n}\n\nexport const useToast = (): ToastHookReturn => {\n const managerRef = useRef(ToastManager.getInstance());\n\n const showToast = (props: ToastProps): string => {\n return managerRef.current.addToast(props);\n };\n\n const dismissToast = (toastId: string) => {\n managerRef.current.removeToast(toastId);\n };\n\n const dismissAllToast = () => {\n managerRef.current.removeAllToasts();\n };\n\n const dismissAllExcept = (type: ToastType) => {\n managerRef.current.removeAllToastsExcept(type);\n };\n\n return {\n showToast,\n dismissToast,\n dismissAllToast,\n dismissAllExcept,\n };\n};\n\n// 편의 함수들\nexport const toast = {\n success: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"success\",\n ...options,\n });\n },\n error: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"error\",\n ...options,\n });\n },\n warning: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"warning\",\n ...options,\n });\n },\n info: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"info\",\n ...options,\n });\n },\n loading: (toast: string, options?: Omit<ToastProps, \"toast\" | \"type\">) => {\n return ToastManager.getInstance().addToast({\n toast,\n type: \"loading\",\n ...options,\n });\n },\n dismissToast: (toastId: string) => {\n ToastManager.getInstance().removeToast(toastId);\n },\n dismissAllToast: () => {\n ToastManager.getInstance().removeAllToasts();\n },\n dismissAllExcept: (type: ToastType) => {\n ToastManager.getInstance().removeAllToastsExcept(type);\n },\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport type { CSSProperties, MouseEvent, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Z_INDEX } from \"../../config/zIndex\";\nimport {\n ToastManager,\n type ToastItem,\n type ToastPosition,\n type ToastType,\n} from \"./ToastCore\";\n\ninterface ToastContainerProps {\n position: ToastPosition;\n}\n\nfunction ToastContainer(props: ToastContainerProps) {\n const { position } = props;\n const [toasts, setToasts] = useState<Array<ToastItem>>([]);\n const managerRef = useRef(ToastManager.getInstance());\n\n useEffect(() => {\n managerRef.current.registerContainer(position, setToasts);\n }, [position]);\n\n const getContainerStyles = (): CSSProperties => {\n const baseStyles: CSSProperties = {\n position: \"fixed\",\n zIndex: Z_INDEX.TOP,\n pointerEvents: \"none\",\n };\n\n const positionStyles = {\n \"top-left\": { top: \"1rem\", left: \"1rem\" },\n \"top-center\": { top: \"1rem\", left: \"50%\", transform: \"translateX(-50%)\" },\n \"top-right\": { top: \"1rem\", right: \"1rem\" },\n \"middle-left\": {\n top: \"50%\",\n left: \"1rem\",\n transform: \"translateY(-50%)\",\n },\n \"bottom-left\": { bottom: \"1rem\", left: \"1rem\" },\n \"bottom-center\": {\n bottom: \"1rem\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n },\n \"bottom-right\": { bottom: \"1rem\", right: \"1rem\" },\n };\n\n return { ...baseStyles, ...positionStyles[position] };\n };\n\n return createPortal(\n <div style={getContainerStyles()}>\n {toasts.map((toast) => (\n <ToastItemCard key={toast.id} toast={toast} onRemove={(id) => managerRef.current.removeToast(id)} />\n ))}\n </div>,\n document.body,\n );\n}\n\ninterface ToastItemCardProps {\n toast: ToastItem;\n onRemove: (id: string) => void;\n}\n\nfunction ToastItemCard(props: ToastItemCardProps) {\n const { toast, onRemove } = props;\n const [isVisible, setIsVisible] = useState(true);\n const removeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const duration = toast.props.duration ?? 1500;\n if (duration !== Infinity && duration > 300) {\n const fadeOutTime = Math.max(0, duration - 300);\n const fadeOutTimer = setTimeout(() => {\n setIsVisible(false);\n removeTimeoutRef.current = setTimeout(() => {\n onRemove(toast.id);\n }, 300);\n }, fadeOutTime);\n\n return () => {\n clearTimeout(fadeOutTimer);\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n }\n };\n }\n return undefined;\n }, [toast.props.duration, toast.id, onRemove]);\n\n const handleClick = () => {\n toast.props.onClick?.();\n };\n\n const handleClose = () => {\n setIsVisible(false);\n if (removeTimeoutRef.current) {\n clearTimeout(removeTimeoutRef.current);\n }\n removeTimeoutRef.current = setTimeout(() => {\n onRemove(toast.id);\n }, 300);\n };\n\n const handleCloseClick = (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n handleClose();\n };\n\n const getTypeStyles = (type: ToastType): string => {\n const baseStyles =\n \"px-4 py-3 rounded-lg shadow-lg border flex items-center gap-3 min-w-[300px] max-w-[500px] pointer-events-auto\";\n\n const typeStyles = {\n success: \"bg-green-50 border-green-200 text-green-800\",\n error: \"bg-red-50 border-red-200 text-red-800\",\n warning: \"bg-yellow-50 border-yellow-200 text-yellow-800\",\n info: \"bg-blue-50 border-blue-200 text-blue-800\",\n loading: \"bg-gray-50 border-gray-200 text-gray-800\",\n };\n\n return `${baseStyles} ${typeStyles[type]}`;\n };\n\n const getDefaultIcon = (type: ToastType): ReactNode => {\n const icons = {\n success: \"✓\",\n error: \"✕\",\n warning: \"⚠\",\n info: \"ℹ\",\n loading: \"⟳\",\n };\n\n return <span className={`text-lg ${type === \"loading\" ? \"animate-spin\" : \"\"}`}>{icons[type]}</span>;\n };\n\n const getCloseButtonStyles = (type: ToastType): string => {\n const baseStyles =\n \"w-6 h-6 rounded-full flex items-center justify-center transition-all duration-200 cursor-pointer focus:outline-none focus:ring-2 focus:ring-offset-1\";\n\n const typeStyles = {\n success:\n \"text-green-500 hover:text-green-700 hover:bg-green-100 active:bg-green-200 focus:ring-green-300\",\n error: \"text-red-500 hover:text-red-700 hover:bg-red-100 active:bg-red-200 focus:ring-red-300\",\n warning:\n \"text-yellow-500 hover:text-yellow-700 hover:bg-yellow-100 active:bg-yellow-200 focus:ring-yellow-300\",\n info: \"text-blue-500 hover:text-blue-700 hover:bg-blue-100 active:bg-blue-200 focus:ring-blue-300\",\n loading: \"text-gray-500 hover:text-gray-700 hover:bg-gray-100 active:bg-gray-200 focus:ring-gray-300\",\n };\n\n return `${baseStyles} ${typeStyles[type]}`;\n };\n\n return (\n <div\n className={`${getTypeStyles(toast.props.type || \"info\")} transition-all duration-300 ${\n isVisible\n ? \"animate-in slide-in-from-top-2 fade-in-0 duration-300 opacity-100\"\n : \"animate-out slide-out-to-top-2 fade-out-0 duration-300 opacity-0\"\n } mb-2 cursor-pointer`}\n onClick={handleClick}\n >\n {toast.props.icon || getDefaultIcon(toast.props.type || \"info\")}\n <span className=\"flex-1 text-sm font-medium\">{toast.props.toast}</span>\n {toast.props.showCloseButton !== false && (\n <button\n onClick={handleCloseClick}\n className={getCloseButtonStyles(toast.props.type || \"info\")}\n title=\"닫기\"\n aria-label=\"메시지 닫기\"\n >\n <span className=\"text-sm font-medium\">✕</span>\n </button>\n )}\n </div>\n );\n}\n\nconst TOAST_POSITIONS: Array<ToastPosition> = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n];\n\nexport default function ToastProvider() {\n return (\n <>\n {TOAST_POSITIONS.map((position) => (\n <ToastContainer key={position} position={position} />\n ))}\n </>\n );\n}\n","import type { YmdDateString } from \"./type\";\n\n// new Date(0~99, ...) 는 JS가 1900~1999년으로 처리하므로 setFullYear로 우회\nexport function makeLocalDate(year: number, monthIndex: number, day: number): Date {\n const d = new Date(0);\n d.setFullYear(year, monthIndex, day);\n return d;\n}\n\n// `YYYY-MM-DD` → 로컬 자정 기준 Date (유효하지 않으면 null)\nexport function parseLocalYmd(ymd: string): Date | null {\n const m = ymd.trim().match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const d = Number(m[3]);\n const dt = makeLocalDate(y, mo, d);\n if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d) return null;\n return dt;\n}\n\nexport interface CanSelectTodayOptions {\n maxDate?: YmdDateString;\n range?: boolean;\n isSelectingEnd?: boolean;\n rangeStart?: string;\n rangeEnd?: string;\n // 테스트·고정 시각용 (기본: 현재 시각)\n now?: Date;\n}\n\n// Today 버튼으로 오늘 날짜를 선택할 수 있는지\nexport function canSelectToday(options: CanSelectTodayOptions): boolean {\n const today = options.now ?? new Date();\n const todayYmd = formatDate(today);\n\n if (options.maxDate && isCalendarDayAfterMax(today, options.maxDate)) {\n return false;\n }\n\n if (!options.range) {\n return true;\n }\n\n if (options.isSelectingEnd) {\n const start = options.rangeStart?.trim() ?? \"\";\n if (start.length === 10 && todayYmd < start) {\n return false;\n }\n return true;\n }\n\n const end = options.rangeEnd?.trim() ?? \"\";\n if (end.length === 10 && todayYmd > end) {\n return false;\n }\n\n return true;\n}\n\n// 달력상 `date`의 날짜가 `maxYmd`(YYYY-MM-DD)의 날짜보다 이후인지\nexport function isCalendarDayAfterMax(date: Date, maxYmd: YmdDateString): boolean {\n const max = parseLocalYmd(maxYmd);\n if (!max) return false;\n const ax = date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\n const bx = max.getFullYear() * 10000 + (max.getMonth() + 1) * 100 + max.getDate();\n return ax > bx;\n}\n\n// 날짜 포맷팅 함수\nexport function formatDate(date: Date): YmdDateString {\n const year = String(date.getFullYear()).padStart(4, \"0\");\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}` as YmdDateString;\n}\n\n// 날짜가 범위 내에 있는지 확인\nexport function isDateInRange(date: Date, range: boolean, rangeStart: string, rangeEnd: string): boolean {\n if (!range || !rangeStart) return false;\n\n const formatted = formatDate(date);\n if (!rangeEnd) return formatted === rangeStart;\n\n const startDate = parseLocalYmd(rangeStart);\n const endDate = parseLocalYmd(rangeEnd);\n if (!startDate || !endDate) return false;\n\n return date >= startDate && date <= endDate;\n}\n\n// 입력값 검증 및 포맷팅\nexport function validateAndFormatInput(input: string): string {\n const numbers = input.replace(/\\D/g, \"\");\n\n if (numbers.length === 0) return \"\";\n\n const clampYear = (raw: string): string => {\n const n = parseInt(raw, 10);\n if (n > 9999) return \"9999\";\n return raw;\n };\n\n const clampMonth = (raw: string): string => {\n if (raw.length < 2) return raw;\n const n = parseInt(raw, 10);\n if (n < 1) return \"01\";\n if (n > 12) return \"12\";\n return raw;\n };\n\n if (numbers.length <= 4) {\n return clampYear(numbers);\n }\n\n const year = clampYear(numbers.slice(0, 4));\n const month = clampMonth(numbers.slice(4, 6));\n\n if (numbers.length <= 6) {\n return `${year}-${month}`;\n }\n\n const dayRaw = numbers.slice(6, 8);\n let day = dayRaw;\n\n if (day.length === 2) {\n const dayNum = parseInt(day, 10);\n const lastDayOfMonth = makeLocalDate(parseInt(year, 10), parseInt(month, 10), 0).getDate();\n if (dayNum < 1) day = \"01\";\n else if (dayNum > lastDayOfMonth) day = lastDayOfMonth.toString().padStart(2, \"0\");\n }\n\n return `${year}-${month}-${day}`;\n}\n","// calendarYearRange 미지정 시 연도 목록은 기준연도(올해) ± 이 값\nexport const DEFAULT_CALENDAR_YEAR_HALF_SPAN = 50;\n\nexport const CALENDAR_WEEKDAY_LABELS = [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"] as const;\n\nexport const CALENDAR_RANGE_HINT = {\n start: \"시작 날짜를 선택하세요\",\n end: \"종료 날짜를 선택하세요\",\n} as const;\n\nimport { Z_INDEX } from \"../../../../config/zIndex\";\n\n// body 포털 달력 — @/shared/config/zIndex → Z_INDEX.CALENDAR_PORTAL\nexport const CALENDAR_PORTAL_Z_INDEX = Z_INDEX.CALENDAR_PORTAL;\n\nexport const CALENDAR_SELECT_CLASSNAMES = {\n containerClass: \"w-20 shrink-0\",\n triggerClassName: \"h-8 px-2 py-1 text-sm cursor-pointer\",\n contentClassName: \"min-w-[5rem]\",\n} as const;\n\nexport const CALENDAR_PANEL_BASE_CLASS = \"bg-white border border-gray-300 rounded-lg shadow-lg p-3 min-w-[280px]\";\n\n// 인라인(absolute) 앵커 — Tailwind z-50 = Z_INDEX.CALENDAR_ANCHORED\nexport const CALENDAR_PANEL_ANCHORED_CLASS = `${CALENDAR_PANEL_BASE_CLASS} absolute z-50`;\n\n/** @deprecated CALENDAR_PANEL_ANCHORED_CLASS 사용 */\nexport const CALENDAR_PANEL_CLASS = CALENDAR_PANEL_ANCHORED_CLASS;\n\nexport const YEAR_SELECT_CONTENT_EXTRA_CLASS = \"year-select-content custom-view-scrollbar max-h-50 overflow-y-auto\";\n\nexport const YEAR_SELECT_OPEN_CONTENT_SELECTOR = \".year-select-content[data-state='open']\";\nexport const SELECT_ITEM_CHECKED_SELECTOR = \"[data-slot='select-item'][data-state='checked']\";\n","import type { CalendarYearRange } from \"./type\";\nimport type { YmdDateString } from \"../../config/type\";\nimport {\n DEFAULT_CALENDAR_YEAR_HALF_SPAN,\n SELECT_ITEM_CHECKED_SELECTOR,\n YEAR_SELECT_OPEN_CONTENT_SELECTOR,\n} from \"./default\";\nimport { isCalendarDayAfterMax, makeLocalDate, parseLocalYmd } from \"../../config/utils\";\n\n// 연도·월 Select 한 줄 옵션에 쓰는 값·라벨·비활성 여부\ntype CalendarSelectOption = { value: string; label: string; disabled?: boolean };\n\n// `YYYY-MM-DD`(길이 10) 문자열을 로컬 Date로 변환 (유효하지 않으면 null)\nexport function parseYmdDateString(value: string): Date | null {\n if (value.length !== 10) return null;\n return parseLocalYmd(value);\n}\n\n// 설정값 또는 기본(기준연도 ± 간격)을 반영해 연도 선택 가능 구간을 숫자 min/max로 만들기\nexport function resolveCalendarYearBounds(\n anchorYear: number,\n calendarYearRange: CalendarYearRange | undefined,\n): { minYear: number; maxYear: number } {\n const fallbackMin = Math.max(0, anchorYear - DEFAULT_CALENDAR_YEAR_HALF_SPAN);\n const fallbackMax = anchorYear + DEFAULT_CALENDAR_YEAR_HALF_SPAN;\n\n const rawMin = calendarYearRange?.minYear?.trim();\n const rawMax = calendarYearRange?.maxYear?.trim();\n\n if (rawMin === undefined || rawMin === \"\" || rawMax === undefined || rawMax === \"\") {\n return { minYear: fallbackMin, maxYear: fallbackMax };\n }\n\n const minParsed = Number.parseInt(rawMin, 10);\n const maxParsed = Number.parseInt(rawMax, 10);\n\n if (Number.isNaN(minParsed) || Number.isNaN(maxParsed) || minParsed > maxParsed) {\n return { minYear: fallbackMin, maxYear: fallbackMax };\n }\n\n return { minYear: Math.max(0, minParsed), maxYear: maxParsed };\n}\n\n// 달력 헤더 연도 Select에 넣을 옵션 배열을 만들고(maxDate·연도 범위에 맞춰) 넘길 수 없는 연도는 비활성 처리\nexport function buildCalendarYearSelectOptions(\n maxDate: YmdDateString | undefined,\n anchorYear = new Date().getFullYear(),\n calendarYearRange?: CalendarYearRange,\n): Array<CalendarSelectOption> {\n const { minYear, maxYear } = resolveCalendarYearBounds(anchorYear, calendarYearRange);\n const maxSelectableYear = maxDate ? (parseLocalYmd(maxDate)?.getFullYear() ?? null) : null;\n const options: Array<CalendarSelectOption> = [];\n for (let y = maxYear; y >= minYear; y--) {\n options.push({\n value: String(y),\n label: `${String(y).padStart(4, \"0\")}년`,\n disabled: maxSelectableYear !== null && y > maxSelectableYear,\n });\n }\n return options;\n}\n\n// 보고 있는 연도 기준으로 월 Select 옵션을 만들고, maxDate가 있는 해에서는 그 이후 월은 비활성 처리\nexport function buildCalendarMonthSelectOptions(\n viewYear: number,\n maxDate: YmdDateString | undefined,\n): Array<CalendarSelectOption> {\n const maxDateParsed = maxDate ? parseLocalYmd(maxDate) : null;\n const maxYear = maxDateParsed?.getFullYear() ?? null;\n const maxMonth =\n maxDateParsed !== null && maxDateParsed !== undefined ? maxDateParsed.getMonth() + 1 : null;\n const isMaxYear = maxYear !== null && viewYear === maxYear;\n\n const options: Array<CalendarSelectOption> = [];\n for (let m = 1; m <= 12; m++) {\n options.push({\n value: String(m),\n label: `${m}월`,\n disabled: isMaxYear && maxMonth !== null && m > maxMonth,\n });\n }\n return options;\n}\n\n// 해당 월 달력 그리드(7열)를 채울 때 앞·뒤 빈 칸 수와 이번 달 일수를 계산\nexport function getCalendarMonthGrid(\n year: number,\n monthIndex: number,\n): {\n leadingEmpty: number;\n daysInMonth: number;\n trailingEmpty: number;\n} {\n const firstDay = makeLocalDate(year, monthIndex, 1);\n const daysInMonth = makeLocalDate(year, monthIndex + 1, 0).getDate();\n const leadingEmpty = firstDay.getDay();\n const totalCells = leadingEmpty + daysInMonth;\n const trailingEmpty = totalCells % 7 === 0 ? 0 : 7 - (totalCells % 7);\n return { leadingEmpty, daysInMonth, trailingEmpty };\n}\n\n// 「다음 달」로 넘어가면 maxDate보다 뒤가 되는지 검사해 월 이동 버튼(다음)을 비활성할지 결정\nexport function disableNextCalendarMonth(\n year: number,\n monthIndex: number,\n maxDate: YmdDateString | undefined,\n) {\n if (maxDate === undefined) return false;\n return isCalendarDayAfterMax(makeLocalDate(year, monthIndex + 1, 1), maxDate);\n}\n\n// 연도 Select를 열었을 때 현재 선택 연도 항목이 스크롤 영역 안에 보이도록 맞추기\nexport function scrollOpenYearSelectCheckedIntoView(): void {\n requestAnimationFrame(() => {\n const root = document.querySelector(YEAR_SELECT_OPEN_CONTENT_SELECTOR);\n if (!(root instanceof HTMLElement)) return;\n\n const checkedItem = root.querySelector(SELECT_ITEM_CHECKED_SELECTOR);\n if (!(checkedItem instanceof HTMLElement)) return;\n\n checkedItem.scrollIntoView({ block: \"start\" });\n });\n}\n\n// 날짜 UI 상태(오늘·단일 선택·범위·구간 비활성 등)에 맞는 style 지정\nexport function dayCellButtonClass(opts: {\n isToday: boolean;\n isSelected: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n interactiveDisabled: boolean;\n}): string {\n const { isToday, isSelected, isInRange, isRangeStart, isRangeEnd, interactiveDisabled } = opts;\n\n const parts = [\"w-8 h-8 text-sm flex items-center justify-center rounded-2xl transition-colors\"];\n // 오늘일때\n if (isToday) parts.push(\"bg-gray-100\");\n // 선택된 날짜이고 오늘이 아닐때\n if (isSelected && !isToday) parts.push(\"bg-neutral-200 text-gray-700\");\n // 범위 내에 있고 오늘이 아닐때\n if (isInRange && !isToday) parts.push(\"bg-gray-100/90\");\n // 범위 시작 또는 끝일때 오늘이 아닐때\n if ((isRangeStart || isRangeEnd) && !isToday) parts.push(\"bg-neutral-300 text-gray-700 opacity-100\");\n // 비활성 상태일때\n parts.push(interactiveDisabled ? \"opacity-20 cursor-not-allowed\" : \"hover:bg-blue-100 cursor-pointer\");\n\n return parts.filter(Boolean).join(\" \").trim();\n}\n","import type { MouseEvent } from \"react\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/variants\";\nimport Select from \"../../Select\";\nimport { canSelectToday, formatDate, isCalendarDayAfterMax, isDateInRange, makeLocalDate } from \"../config/utils\";\nimport {\n buildCalendarMonthSelectOptions,\n buildCalendarYearSelectOptions,\n dayCellButtonClass,\n disableNextCalendarMonth,\n getCalendarMonthGrid,\n scrollOpenYearSelectCheckedIntoView,\n} from \"./config/calendar\";\nimport {\n CALENDAR_PANEL_ANCHORED_CLASS,\n CALENDAR_PANEL_BASE_CLASS,\n CALENDAR_RANGE_HINT,\n CALENDAR_SELECT_CLASSNAMES,\n CALENDAR_WEEKDAY_LABELS,\n YEAR_SELECT_CONTENT_EXTRA_CLASS,\n} from \"./config/default\";\nimport type { CalendarYearRange } from \"./config/type\";\nimport type { YmdDateString } from \"../config/type\";\n\nexport interface RenderCalendarProps {\n currentDate: Date;\n range: boolean;\n rangeStart: string;\n rangeEnd: string;\n isSelectingEnd: boolean;\n handleDateSelect: (date: Date) => void;\n inputValue: string;\n calendarPosition: \"start\" | \"end\";\n goToPreviousMonth: () => void;\n goToNextMonth: () => void;\n onYearChange: (year: number) => void;\n onMonthChange: (month: number) => void;\n onSelectOpenChange?: (open: boolean) => void;\n editDateSelect?: boolean;\n datePosition?: \"top\" | \"bottom\";\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n floating?: boolean;\n showTodayButton?: boolean;\n}\n\nexport default function RenderCalendar(props: RenderCalendarProps) {\n const {\n currentDate,\n range,\n rangeStart,\n rangeEnd,\n isSelectingEnd,\n handleDateSelect,\n inputValue,\n calendarPosition,\n goToPreviousMonth,\n goToNextMonth,\n onYearChange,\n onMonthChange,\n onSelectOpenChange,\n editDateSelect = true,\n datePosition = \"bottom\",\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n floating = false,\n showTodayButton = true,\n } = props;\n\n const year = currentDate.getFullYear();\n const monthIndex = currentDate.getMonth();\n const anchorYear = year;\n\n const disableNextMonth = disableNextCalendarMonth(year, monthIndex, maxDate);\n const { leadingEmpty, daysInMonth, trailingEmpty } = getCalendarMonthGrid(year, monthIndex);\n\n const yearOptions = buildCalendarYearSelectOptions(maxDate, anchorYear, calendarYearRange);\n const monthOptions = buildCalendarMonthSelectOptions(year, maxDate);\n\n const todayFormatted = formatDate(new Date());\n const selectedSingleYmd = range ? null : inputValue;\n\n const rangeStartYmd = rangeStart.trim();\n const rangeEndYmd = rangeEnd.trim();\n\n const days: React.ReactNode[] = [];\n\n for (let i = 0; i < leadingEmpty; i++) {\n days.push(<div key={`lead-${i}`} className=\"size-8\" aria-hidden />);\n }\n\n for (let d = 1; d <= daysInMonth; d++) {\n const date = makeLocalDate(year, monthIndex, d);\n const dateFormatted = formatDate(date);\n\n const isToday = dateFormatted === todayFormatted;\n const isSelected = dateFormatted === selectedSingleYmd;\n const isInRange = isDateInRange(date, range, rangeStart, rangeEnd);\n const isRangeStartFlag = Boolean(range && dateFormatted === rangeStart);\n const isRangeEndFlag = Boolean(range && dateFormatted === rangeEnd);\n\n const isBeforeRangeStart =\n range && isSelectingEnd && rangeStartYmd.length === 10 && dateFormatted < rangeStartYmd;\n const isAfterRangeEnd =\n range && !isSelectingEnd && rangeEndYmd.length === 10 && dateFormatted > rangeEndYmd;\n const isGreyedForRange = Boolean(isBeforeRangeStart || isAfterRangeEnd);\n const isPastMax = maxDate ? isCalendarDayAfterMax(date, maxDate) : false;\n\n days.push(\n <button\n key={d}\n type=\"button\"\n onClick={() => handleDateSelect(date)}\n disabled={isGreyedForRange || isPastMax}\n className={dayCellButtonClass({\n isToday,\n isSelected: Boolean(isSelected),\n isInRange,\n isRangeStart: isRangeStartFlag,\n isRangeEnd: isRangeEndFlag,\n interactiveDisabled: isGreyedForRange || isPastMax,\n })}\n >\n {d}\n </button>,\n );\n }\n\n for (let i = 0; i < trailingEmpty; i++) {\n days.push(<div key={`trail-${i}`} className=\"size-8\" aria-hidden />);\n }\n\n const calendarPositionClass =\n !floating && range && calendarPosition === \"end\" ? \"right-0\" : !floating ? \"left-0\" : \"\";\n const datePositionClass = floating ? \"\" : datePosition === \"top\" ? \"bottom-full mb-1\" : \"top-full mt-1\";\n const panelClass = floating\n ? CALENDAR_PANEL_BASE_CLASS\n : cn(CALENDAR_PANEL_ANCHORED_CLASS, datePositionClass, calendarPositionClass);\n\n const handleYearSelectOpenChange = (open: boolean) => {\n onSelectOpenChange?.(open);\n if (open) scrollOpenYearSelectCheckedIntoView();\n };\n\n const sel = CALENDAR_SELECT_CLASSNAMES;\n const containerClass = cn(sel.containerClass, calendarSelectContainerClass);\n\n const stopBubble = (e: MouseEvent) => e.stopPropagation();\n\n const isTodaySelectable = canSelectToday({\n maxDate,\n range,\n isSelectingEnd,\n rangeStart,\n rangeEnd,\n });\n\n return (\n <div className={panelClass} onClick={stopBubble} onMouseDown={stopBubble}>\n <div className=\"mb-1 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={goToPreviousMonth}\n className=\"cursor-pointer rounded p-1 hover:bg-gray-100\"\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n\n {editDateSelect ? (\n <div\n role=\"presentation\"\n className=\"flex items-center gap-2\"\n onClick={stopBubble}\n onMouseDown={stopBubble}\n >\n <Select\n value={year.toString()}\n options={yearOptions}\n onChange={(value) => onYearChange(Number.parseInt(value, 10))}\n containerClassName={containerClass}\n triggerClassName={sel.triggerClassName}\n contentClassName={cn(YEAR_SELECT_CONTENT_EXTRA_CLASS, sel.contentClassName)}\n disableScrollButtonEvents\n onOpenChange={handleYearSelectOpenChange}\n />\n <Select\n value={(monthIndex + 1).toString()}\n options={monthOptions}\n onChange={(value) => onMonthChange(Number.parseInt(value, 10) - 1)}\n containerClassName={containerClass}\n triggerClassName={sel.triggerClassName}\n contentClassName={sel.contentClassName}\n onOpenChange={(open) => onSelectOpenChange?.(open)}\n />\n </div>\n ) : (\n <h3 className=\"text-lg font-semibold\">\n {String(year).padStart(4, \"0\")}년 {monthIndex + 1}월\n </h3>\n )}\n\n <button\n type=\"button\"\n onClick={goToNextMonth}\n disabled={disableNextMonth}\n className={cn(\n \"rounded p-1\",\n disableNextMonth ? \"cursor-not-allowed opacity-30\" : \"cursor-pointer hover:bg-gray-100\",\n )}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {CALENDAR_WEEKDAY_LABELS.map((day) => (\n <div key={day} className=\"py-2 text-center text-sm font-medium text-gray-500\">\n {day}\n </div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7 gap-2\">{days}</div>\n\n {range && (\n <div className=\"mt-3 text-sm text-gray-600\">\n <p className=\"text-center\">\n {isSelectingEnd ? CALENDAR_RANGE_HINT.end : CALENDAR_RANGE_HINT.start}\n </p>\n </div>\n )}\n\n {showTodayButton && isTodaySelectable && (\n <div className=\"-mx-3 -mb-3 mt-3 flex items-center justify-center border-t border-gray-200 py-2\">\n <button\n type=\"button\"\n onClick={() => handleDateSelect(new Date())}\n className=\"cursor-pointer text-sm text-gray-800 hover:text-main\"\n >\n Today\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect, type RefObject } from \"react\";\nimport { parseYmdDateString } from \"../config/calendar\";\nimport { makeLocalDate } from \"../../config/utils\";\n\ninterface UseCalendarStateProps {\n datePosition?: \"top\" | \"bottom\";\n disabled?: boolean;\n // body 포털로 렌더된 달력 래퍼 — outside click 판별용\n calendarRef?: RefObject<HTMLElement | null>;\n}\n\nexport function useCalendarState(props: UseCalendarStateProps) {\n const { datePosition = \"bottom\", disabled = false, calendarRef } = props;\n\n const [isCalendarOpen, setIsCalendarOpen] = useState(false);\n const [currentDate, setCurrentDate] = useState(new Date());\n const [autoDatePosition, setAutoDatePosition] = useState<\"top\" | \"bottom\">(datePosition);\n\n const isSelectOpenRef = useRef(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 년/월 Select 열림 상태 추적\n const handleSelectOpenChange = (open: boolean) => {\n if (open) {\n isSelectOpenRef.current = true;\n } else {\n setTimeout(() => {\n isSelectOpenRef.current = false;\n }, 0);\n }\n };\n\n // 외부 클릭 시 달력 닫기\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current?.contains(target) ||\n calendarRef?.current?.contains(target) ||\n isSelectOpenRef.current\n ) {\n return;\n }\n setIsCalendarOpen(false);\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [calendarRef]);\n\n // 달력 열기/닫기 토글\n const toggleCalendar = (initialDateValue?: string) => {\n if (disabled) return;\n\n // 캘린더를 열 때 viewport 공간을 계산하여 위/아래 방향 자동 결정\n if (!isCalendarOpen && containerRef.current) {\n const CALENDAR_HEIGHT = 320;\n const rect = containerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n setAutoDatePosition(spaceBelow >= CALENDAR_HEIGHT || spaceBelow >= spaceAbove ? \"bottom\" : \"top\");\n\n // currentDate는 달력 그리드에 표시할 년·월용(선택 값과 별개).\n // 열 때 입력값(initialDateValue) 기준으로 맞추지 않으면 오늘/이전에 넘겨 둔 달이 그대로 보일 수 있음.\n const parsed = initialDateValue ? parseYmdDateString(initialDateValue) : null;\n if (parsed) setCurrentDate(parsed);\n }\n\n setIsCalendarOpen(!isCalendarOpen);\n };\n\n // 팝업을 닫지 않고 표시 월만 변경 (범위 선택: 시작일 선택 후 종료일 달로 전환 등)\n const navigateToDateValue = (initialDateValue?: string) => {\n const parsed = initialDateValue ? parseYmdDateString(initialDateValue) : null;\n if (parsed) setCurrentDate(parsed);\n };\n\n const closeCalendar = () => {\n setIsCalendarOpen(false);\n };\n\n // 달력 네비게이션\n const goToPreviousMonth = () => {\n setCurrentDate(makeLocalDate(currentDate.getFullYear(), currentDate.getMonth() - 1, 1));\n };\n\n const goToNextMonth = () => {\n setCurrentDate(makeLocalDate(currentDate.getFullYear(), currentDate.getMonth() + 1, 1));\n };\n\n const handleYearChange = (year: number) => {\n setCurrentDate(makeLocalDate(year, currentDate.getMonth(), 1));\n };\n\n const handleMonthChange = (month: number) => {\n setCurrentDate(makeLocalDate(currentDate.getFullYear(), month, 1));\n };\n\n return {\n isCalendarOpen,\n currentDate,\n autoDatePosition,\n containerRef,\n toggleCalendar,\n navigateToDateValue,\n closeCalendar,\n goToPreviousMonth,\n goToNextMonth,\n handleYearChange,\n handleMonthChange,\n handleSelectOpenChange,\n };\n}\n","import { useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\n\nimport { CALENDAR_PORTAL_Z_INDEX } from \"../config/default\";\n\nconst CALENDAR_GAP = 4;\nconst CALENDAR_MIN_WIDTH = 280;\n\nexport function useFloatingCalendarPosition(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n placement: \"top\" | \"bottom\",\n align: \"start\" | \"end\" = \"start\",\n) {\n const [style, setStyle] = useState<CSSProperties>({ visibility: \"hidden\" });\n\n useLayoutEffect(() => {\n if (!isOpen || !anchorRef.current) return;\n\n const update = () => {\n const rect = anchorRef.current!.getBoundingClientRect();\n const left = align === \"end\" ? Math.max(8, rect.right - CALENDAR_MIN_WIDTH) : rect.left;\n\n const base: CSSProperties = {\n position: \"fixed\",\n left,\n zIndex: CALENDAR_PORTAL_Z_INDEX,\n minWidth: CALENDAR_MIN_WIDTH,\n visibility: \"visible\",\n };\n\n if (placement === \"top\") {\n setStyle({ ...base, bottom: window.innerHeight - rect.top + CALENDAR_GAP });\n } else {\n setStyle({ ...base, top: rect.bottom + CALENDAR_GAP });\n }\n };\n\n const handleScroll = (e: Event) => {\n // 연/월 셀렉트 드롭다운 내부 스크롤은 포지션 재계산 대상 아님\n if ((e.target as Element | null)?.closest?.('[data-slot=\"select-content\"]')) return;\n update();\n };\n\n update();\n window.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [isOpen, placement, align, anchorRef]);\n\n return style;\n}\n","import { createPortal } from \"react-dom\";\nimport type { ReactNode, RefObject } from \"react\";\n\nimport { useFloatingCalendarPosition } from \"../calendar/hooks/useFloatingCalendarPosition\";\n\nexport function CalendarPortal({\n anchorRef,\n calendarRef,\n isOpen,\n placement,\n align = \"start\",\n children,\n}: {\n anchorRef: RefObject<HTMLElement | null>;\n calendarRef: RefObject<HTMLDivElement | null>;\n isOpen: boolean;\n placement: \"top\" | \"bottom\";\n align?: \"start\" | \"end\";\n children: ReactNode;\n}) {\n const style = useFloatingCalendarPosition(anchorRef, isOpen, placement, align);\n\n if (!isOpen) return null;\n\n return createPortal(\n <div ref={calendarRef} style={style}>\n {children}\n </div>,\n document.body,\n );\n}\n","export const DATE_PICKER_FIELD_DISABLED_CLASS =\n \"cursor-not-allowed opacity-50 bg-gray-100 text-neutral-400 pointer-events-none\";\n\nexport const DATE_PICKER_ICON_DISABLED_CLASS = \"pointer-events-none cursor-not-allowed\";\nexport const DATE_PICKER_ICON_ENABLED_CLASS = \"cursor-pointer hover:bg-gray-100\";\n","import { Calendar } from \"lucide-react\";\nimport { type ChangeEvent, useEffect, useRef, useState } from \"react\";\nimport { toast } from \"../../Toast/ToastCore\";\n\nimport { cn } from \"../../../lib/variants\";\nimport RenderCalendar from \"../calendar/Index\";\nimport { useCalendarState } from \"../calendar/hooks/useCalendarState\";\nimport { CalendarPortal } from \"./CalendarPortal\";\n\nimport type { CalendarYearRange } from \"../../calendar/config/type\";\nimport type { YmdDateString } from \"../config/type\";\nimport {\n DATE_PICKER_FIELD_DISABLED_CLASS,\n DATE_PICKER_ICON_DISABLED_CLASS,\n DATE_PICKER_ICON_ENABLED_CLASS,\n} from \"../config/styles\";\nimport { formatDate, isCalendarDayAfterMax, validateAndFormatInput } from \"../config/utils\";\n\nexport interface DatePickerRangeProps {\n startValue?: string;\n endValue?: string;\n onRangeChange?: (startDate: string, endDate: string) => void;\n className?: string;\n editDateSelect?: boolean;\n onKeyDownEnter?: () => void;\n datePosition?: \"top\" | \"bottom\";\n disabled?: boolean;\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n showTodayButton?: boolean;\n}\n\nexport default function DatePickerRange(props: DatePickerRangeProps) {\n const {\n startValue = \"\",\n endValue = \"\",\n onRangeChange,\n className = \"\",\n editDateSelect = true,\n onKeyDownEnter,\n datePosition = \"bottom\",\n disabled = false,\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n showTodayButton = true,\n } = props;\n\n const [inputs, setInputs] = useState({ start: startValue, end: endValue });\n const startInputValue = inputs.start;\n const endInputValue = inputs.end;\n\n const [isSelectingEnd, setIsSelectingEnd] = useState(false);\n const [calendarPosition, setCalendarPosition] = useState<\"start\" | \"end\">(\"start\");\n const calendarRef = useRef<HTMLDivElement>(null);\n const startAnchorRef = useRef<HTMLDivElement>(null);\n const endAnchorRef = useRef<HTMLDivElement>(null);\n const calendarAnchorRef = calendarPosition === \"end\" ? endAnchorRef : startAnchorRef;\n\n const {\n isCalendarOpen,\n currentDate,\n autoDatePosition,\n containerRef,\n toggleCalendar,\n // 시작일을 캘린더에서 선택하면 종료일 캘린더가 열리게\n navigateToDateValue,\n closeCalendar,\n goToPreviousMonth,\n goToNextMonth,\n handleYearChange,\n handleMonthChange,\n handleSelectOpenChange,\n } = useCalendarState({ datePosition, disabled, calendarRef });\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- controlled props 변경 시 로컬 draft와 맞춤\n setInputs({ start: startValue, end: endValue });\n }, [startValue, endValue]);\n\n const handleRangeInputChange = (e: ChangeEvent<HTMLInputElement>, isStart: boolean) => {\n const formatted = validateAndFormatInput(e.target.value);\n\n if (isStart) {\n setInputs((prev) => ({ ...prev, start: formatted }));\n if (formatted.length === 10) {\n if (endInputValue.length === 10 && formatted > endInputValue) {\n toast.error(\"시작 날짜는 종료 날짜보다 빠를 수 없습니다.\");\n setInputs((prev) => ({ ...prev, end: \"\" }));\n onRangeChange?.(\"\", \"\");\n return;\n }\n onRangeChange?.(formatted, endInputValue);\n if (isCalendarOpen && calendarPosition === \"start\") navigateToDateValue(formatted);\n } else if (formatted.length === 0) {\n onRangeChange?.(formatted, endInputValue);\n }\n } else {\n setInputs((prev) => ({ ...prev, end: formatted }));\n if (formatted.length === 10) {\n if (startInputValue.length === 10 && startInputValue > formatted) {\n toast.error(\"종료 날짜는 시작 날짜보다 빠를 수 없습니다.\");\n setInputs({ start: \"\", end: \"\" });\n onRangeChange?.(\"\", \"\");\n return;\n }\n onRangeChange?.(startInputValue, formatted);\n if (isCalendarOpen && calendarPosition === \"end\") navigateToDateValue(formatted);\n } else if (formatted.length === 0) {\n onRangeChange?.(startInputValue, formatted);\n }\n }\n };\n\n const handleDateSelect = (date: Date) => {\n const formatted = formatDate(date);\n\n if (maxDate && isCalendarDayAfterMax(date, maxDate)) {\n toast.error(\"미래 일자는 선택할 수 없습니다.\");\n return;\n }\n\n if (isSelectingEnd) {\n const currentStartValue = startInputValue;\n if (currentStartValue.length === 10 && formatted < currentStartValue) {\n toast.error(\"종료 날짜는 시작 날짜보다 빠를 수 없습니다.\");\n return;\n }\n setInputs((prev) => ({ ...prev, end: formatted }));\n onRangeChange?.(currentStartValue, formatted);\n setIsSelectingEnd(false);\n closeCalendar();\n } else {\n const currentEndValue = endInputValue;\n if (currentEndValue.length === 10 && formatted > currentEndValue) {\n toast.error(\"시작 날짜는 종료 날짜보다 늦을 수 없습니다.\");\n return;\n }\n setInputs((prev) => ({ ...prev, start: formatted }));\n onRangeChange?.(formatted, currentEndValue);\n setCalendarPosition(\"end\");\n setIsSelectingEnd(true);\n navigateToDateValue(currentEndValue.length === 10 ? currentEndValue : formatted);\n }\n };\n\n const handleCalendarIconClick = (position: \"start\" | \"end\") => {\n setCalendarPosition(position);\n setIsSelectingEnd(position === \"end\");\n\n const dateToShow =\n position === \"end\" ? endInputValue || startInputValue : startInputValue || endInputValue;\n\n toggleCalendar(dateToShow);\n };\n\n const handleFieldEnter = () => {\n onKeyDownEnter?.();\n closeCalendar();\n };\n\n const inputClassName = cn(\n \"w-full px-2 py-1.25 border border-gray-300 shadow-xs outline-none text-sm rounded-sm pr-7 transition-colors\",\n disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : \"bg-white text-gray-900 focus:border-blue-600\",\n );\n\n const iconWrapperClassName = cn(\n \"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-1\",\n disabled ? DATE_PICKER_ICON_DISABLED_CLASS : DATE_PICKER_ICON_ENABLED_CLASS,\n );\n\n const iconClassName = cn(\"size-[15px]\", disabled ? \"text-neutral-400 opacity-50\" : \"text-gray-600\");\n\n const calendarNode = (\n <CalendarPortal\n anchorRef={calendarAnchorRef}\n calendarRef={calendarRef}\n isOpen={isCalendarOpen}\n placement={autoDatePosition}\n align={calendarPosition === \"end\" ? \"end\" : \"start\"}\n >\n <RenderCalendar\n floating\n currentDate={currentDate}\n range={true}\n rangeStart={startInputValue}\n rangeEnd={endInputValue}\n isSelectingEnd={isSelectingEnd}\n handleDateSelect={handleDateSelect}\n inputValue=\"\"\n calendarPosition={calendarPosition}\n goToPreviousMonth={goToPreviousMonth}\n goToNextMonth={goToNextMonth}\n onYearChange={handleYearChange}\n onMonthChange={handleMonthChange}\n onSelectOpenChange={handleSelectOpenChange}\n editDateSelect={editDateSelect}\n datePosition={autoDatePosition}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n />\n </CalendarPortal>\n );\n\n return (\n <div ref={containerRef} className={cn(\"relative w-64 h-8\", className)} aria-disabled={disabled}>\n <div className=\"flex items-center space-x-1\">\n <div ref={startAnchorRef} className=\"relative flex-1\">\n <input\n type=\"text\"\n value={startInputValue}\n onChange={(e) => handleRangeInputChange(e, true)}\n placeholder=\"시작 날짜\"\n disabled={disabled}\n className={inputClassName}\n maxLength={10}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleFieldEnter();\n }}\n />\n <div\n onClick={() => {\n if (!disabled) handleCalendarIconClick(\"start\");\n }}\n className={iconWrapperClassName}\n >\n <Calendar size={15} className={iconClassName} />\n </div>\n </div>\n <div className={cn(\"text-sm w-2 text-center\", disabled && \"text-neutral-400 opacity-50\")}>~</div>\n <div ref={endAnchorRef} className=\"relative flex-1\">\n <input\n type=\"text\"\n value={endInputValue}\n onChange={(e) => handleRangeInputChange(e, false)}\n placeholder=\"종료 날짜\"\n disabled={disabled}\n className={inputClassName}\n maxLength={10}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleFieldEnter();\n }}\n />\n <div\n onClick={() => {\n if (!disabled) handleCalendarIconClick(\"end\");\n }}\n className={iconWrapperClassName}\n >\n <Calendar size={15} className={iconClassName} />\n </div>\n </div>\n </div>\n {calendarNode}\n </div>\n );\n}\n","import { Calendar } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { toast } from \"../../Toast/ToastCore\";\n\nimport { cn } from \"../../../lib/variants\";\nimport RenderCalendar from \"../calendar/Index\";\nimport { useCalendarState } from \"../calendar/hooks/useCalendarState\";\nimport { CalendarPortal } from \"./CalendarPortal\";\n\nimport {\n DATE_PICKER_FIELD_DISABLED_CLASS,\n DATE_PICKER_ICON_DISABLED_CLASS,\n DATE_PICKER_ICON_ENABLED_CLASS,\n} from \"../config/styles\";\n\nimport { formatDate, isCalendarDayAfterMax, makeLocalDate, validateAndFormatInput } from \"../config/utils\";\n\nimport type { CalendarYearRange } from \"../../calendar/config/type\";\nimport type { YmdDateString } from \"../config/type\";\nimport type { ChangeEvent } from \"react\";\n\nexport interface DatePickerSingleProps {\n value?: string;\n onChange?: (date: string) => void;\n placeholder?: string;\n className?: string;\n editDateSelect?: boolean;\n onKeyDownEnter?: () => void;\n datePosition?: \"top\" | \"bottom\";\n validation?: boolean;\n disabled?: boolean;\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n onBlur?: (value: string) => void;\n showTodayButton?: boolean;\n}\n\nexport default function DatePickerSingle(props: DatePickerSingleProps) {\n const {\n value = \"\",\n onChange,\n placeholder = \"날짜 선택\",\n className = \"\",\n editDateSelect = true,\n onKeyDownEnter,\n datePosition = \"bottom\",\n validation = false,\n disabled = false,\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n onBlur,\n showTodayButton = true,\n } = props;\n\n const [inputValue, setInputValue] = useState(value);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n const {\n isCalendarOpen,\n currentDate,\n autoDatePosition,\n containerRef,\n toggleCalendar,\n navigateToDateValue,\n closeCalendar,\n goToPreviousMonth,\n goToNextMonth,\n handleYearChange,\n handleMonthChange,\n handleSelectOpenChange,\n } = useCalendarState({ datePosition, disabled, calendarRef });\n\n useEffect(() => {\n setInputValue(value);\n }, [value]);\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const formatted = validateAndFormatInput(e.target.value);\n setInputValue(formatted);\n\n if (formatted.length === 10) {\n const dateMatch = formatted.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (dateMatch) {\n const [, year, month, day] = dateMatch;\n const date = makeLocalDate(\n Number.parseInt(year, 10),\n Number.parseInt(month, 10) - 1,\n Number.parseInt(day, 10),\n );\n\n if (\n date.getFullYear() === Number.parseInt(year, 10) &&\n date.getMonth() === Number.parseInt(month, 10) - 1 &&\n date.getDate() === Number.parseInt(day, 10)\n ) {\n if (maxDate && formatted > maxDate) {\n toast.error(\"미래 일자는 선택할 수 없습니다.\");\n setInputValue(value);\n return;\n }\n onChange?.(formatted);\n if (isCalendarOpen) navigateToDateValue(formatted);\n }\n }\n } else {\n onChange?.(formatted);\n }\n };\n\n const handleInputBlur = useCallback(() => {\n onBlur?.(inputValue);\n }, [onBlur, inputValue]);\n\n const handleDateSelect = (date: Date) => {\n const formatted = formatDate(date);\n\n if (maxDate && isCalendarDayAfterMax(date, maxDate)) {\n toast.error(\"미래 일자는 선택할 수 없습니다.\");\n return;\n }\n\n setInputValue(formatted);\n onChange?.(formatted);\n onBlur?.(formatted);\n closeCalendar();\n };\n\n const handleFieldEnter = () => {\n onKeyDownEnter?.();\n closeCalendar();\n };\n\n const calendarNode = (\n <CalendarPortal\n anchorRef={containerRef}\n calendarRef={calendarRef}\n isOpen={isCalendarOpen}\n placement={autoDatePosition}\n >\n <RenderCalendar\n floating\n currentDate={currentDate}\n range={false}\n rangeStart=\"\"\n rangeEnd=\"\"\n isSelectingEnd={false}\n handleDateSelect={handleDateSelect}\n inputValue={inputValue}\n calendarPosition=\"start\"\n goToPreviousMonth={goToPreviousMonth}\n goToNextMonth={goToNextMonth}\n onYearChange={handleYearChange}\n onMonthChange={handleMonthChange}\n onSelectOpenChange={handleSelectOpenChange}\n editDateSelect={editDateSelect}\n datePosition={autoDatePosition}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n />\n </CalendarPortal>\n );\n\n return (\n <div ref={containerRef} className={cn(\"relative w-30 h-8\", className)} aria-disabled={disabled}>\n <div className=\"relative\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={() => onBlur && handleInputBlur()}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n \"w-full px-2 py-1.25 border text-sm rounded-sm outline-none shadow-xs transition-colors\",\n validation\n ? \"border-red-600 focus:border-main focus-visible:border-main focus-visible:ring-1 focus-visible:ring-main/30 focus-visible:outline-none\"\n : \"border-gray-300 focus:border-main focus-visible:border-main focus-visible:ring-1 focus-visible:ring-main/30 focus-visible:outline-none\",\n disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : \"bg-white text-gray-900\",\n )}\n maxLength={10}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleFieldEnter();\n }}\n data-date-input=\"true\"\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-hidden={disabled}\n onClick={() => {\n if (!disabled) toggleCalendar(inputValue);\n }}\n className={cn(\n \"absolute right-1 top-1/2 -translate-y-1/2 rounded-full p-1\",\n disabled ? DATE_PICKER_ICON_DISABLED_CLASS : DATE_PICKER_ICON_ENABLED_CLASS,\n )}\n >\n <Calendar size={15} className={cn(disabled ? \"text-neutral-400 opacity-50\" : \"text-gray-600\")} />\n </div>\n </div>\n {calendarNode}\n </div>\n );\n}\n","import DatePickerRange from \"./ui/DatePickerRange\";\nimport DatePickerSingle from \"./ui/DatePickerSingle\";\n\nimport type { CalendarYearRange } from \"./calendar/config/type\";\nimport type { YmdDateString } from \"./config/type\";\n\nexport type { CalendarYearRange } from \"./calendar/config/type\";\nexport type { YmdDateString } from \"./config/type\";\n\ntype DatePickerBaseProps = {\n className?: string;\n editDateSelect?: boolean;\n onKeyDownEnter?: () => void;\n datePosition?: \"top\" | \"bottom\";\n disabled?: boolean;\n maxDate?: YmdDateString;\n calendarYearRange?: CalendarYearRange;\n calendarSelectContainerClass?: string;\n showTodayButton?: boolean;\n};\n\ntype DatePickerSingleMode = DatePickerBaseProps & {\n isRange?: false;\n value?: string;\n onChange?: (date: string) => void;\n placeholder?: string;\n validation?: boolean;\n onBlur?: (value: string) => void;\n};\n\ntype DatePickerRangeMode = DatePickerBaseProps & {\n isRange: true;\n startValue?: string;\n endValue?: string;\n onRangeChange?: (startDate: string, endDate: string) => void;\n};\n\nexport type CalendarInputProps = DatePickerSingleMode | DatePickerRangeMode;\n\nexport default function DatePicker(props: CalendarInputProps) {\n const {\n isRange,\n className,\n editDateSelect,\n onKeyDownEnter,\n datePosition,\n disabled,\n maxDate,\n calendarYearRange,\n calendarSelectContainerClass,\n showTodayButton,\n } = props;\n\n if (isRange) {\n const { startValue, endValue, onRangeChange } = props;\n return (\n <DatePickerRange\n startValue={startValue}\n endValue={endValue}\n onRangeChange={onRangeChange}\n className={className}\n editDateSelect={editDateSelect}\n onKeyDownEnter={onKeyDownEnter}\n datePosition={datePosition}\n disabled={disabled}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n />\n );\n }\n\n const { value, onChange, placeholder, validation, onBlur } = props;\n return (\n <DatePickerSingle\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n className={className}\n editDateSelect={editDateSelect}\n onKeyDownEnter={onKeyDownEnter}\n datePosition={datePosition}\n validation={validation}\n disabled={disabled}\n maxDate={maxDate}\n calendarYearRange={calendarYearRange}\n calendarSelectContainerClass={calendarSelectContainerClass}\n showTodayButton={showTodayButton}\n onBlur={onBlur}\n />\n );\n}\n","import { useState, type ChangeEvent, type InputHTMLAttributes, type KeyboardEvent, type Ref } from \"react\";\n\nimport { Search } from \"lucide-react\";\n\nimport { Input as InputPrimitive } from \"../Input/ui/input\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onSearch\"> {\n ref?: Ref<HTMLInputElement>;\n placeholder?: string;\n onSearch?: (value: string) => void;\n className?: string;\n value?: string;\n defaultValue?: string;\n}\n\nexport default function SearchBar(props: SearchBarProps) {\n const {\n ref,\n placeholder = \"검색어를 입력하세요\",\n onSearch,\n className,\n value: controlledValue,\n defaultValue,\n onChange,\n ...rest\n } = props;\n\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? \"\");\n\n const isControlled = controlledValue !== undefined;\n const searchValue = isControlled ? controlledValue : uncontrolledValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n if (onChange) {\n onChange(e);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && onSearch) {\n onSearch(searchValue);\n }\n };\n\n const handleSearchClick = () => {\n if (onSearch) {\n onSearch(searchValue);\n }\n };\n\n return (\n <div className={cn(\"relative w-full\", className)}>\n <div className=\"text-muted-foreground absolute top-1/2 left-3 -translate-y-1/2 transform\">\n <Search className=\"h-4 w-4\" />\n </div>\n <InputPrimitive\n ref={ref}\n type=\"text\"\n placeholder={placeholder}\n value={searchValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n className={cn(\"w-full pl-10 pr-10\", className)}\n {...rest}\n />\n {searchValue && (\n <button\n type=\"button\"\n onClick={handleSearchClick}\n className=\"text-muted-foreground hover:text-foreground absolute top-1/2 right-3 -translate-y-1/2 transform cursor-pointer transition-colors\"\n aria-label=\"검색\"\n >\n <Search className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n );\n}\n","import { type MouseEvent, useEffect, useMemo, useState } from \"react\";\n\nimport { debounce } from \"es-toolkit\";\n\nimport Button, { type ButtonProps } from \"../Button\";\nimport { cn } from \"../../lib/variants\";\n\nexport interface DebouncedButtonProps extends ButtonProps {\n debounceDelay?: number;\n}\n\nexport default function DebouncedButton(props: DebouncedButtonProps) {\n const { debounceDelay = 300, onClick, className, ...rest } = props;\n const [isDebouncing, setIsDebouncing] = useState(false);\n\n const debouncedOnClick = useMemo(() => {\n if (!onClick) return undefined;\n\n return debounce((event: MouseEvent<HTMLButtonElement>) => {\n setIsDebouncing(false);\n onClick(event);\n }, debounceDelay);\n }, [debounceDelay, onClick]);\n\n useEffect(() => {\n return () => {\n debouncedOnClick?.cancel();\n setIsDebouncing(false);\n };\n }, [debouncedOnClick]);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (debouncedOnClick) {\n setIsDebouncing(true);\n debouncedOnClick(event);\n } else {\n onClick?.(event);\n }\n };\n\n return (\n <Button\n {...rest}\n onClick={handleClick}\n className={cn(\"transition-opacity duration-150\", isDebouncing && \"opacity-50\", className)}\n />\n );\n}\n","import type { MouseEvent } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nimport type { TabItem } from \"../config/type\";\n\ninterface ChildTabButtonProps {\n childTab: TabItem;\n isActive: boolean;\n className?: string;\n onRef: (el: HTMLButtonElement | null) => void;\n onClick: (e: MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport default function ChildTabButton(props: ChildTabButtonProps) {\n const { childTab, isActive, className, onRef, onClick } = props;\n\n return (\n <button\n ref={onRef}\n onClick={onClick}\n className={cn(\n \"inline-flex w-full items-center gap-2\",\n childTab.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n className,\n )}\n disabled={childTab.disabled}\n aria-current={isActive ? \"page\" : undefined}\n >\n {childTab.icon && <span className=\"shrink-0\">{childTab.icon}</span>}\n <span>{childTab.label}</span>\n </button>\n );\n}\n","import { type MouseEvent, useRef, useEffect, useState, useCallback, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { ChevronDown } from \"lucide-react\";\n\nimport { cn } from \"../../lib/variants\";\n\nimport ChildTabButton from \"./ui/ChildTabButton\";\n\nimport type { TabItem } from \"./config/type\";\nexport type { TabItem };\n\nexport interface TabProps {\n tabs: TabItem[];\n activeTab: string;\n onChange: (value: string) => void;\n direction?: \"row\" | \"col\";\n className?: string;\n tabListClassName?: string;\n tabClassName?: string;\n childTabListClassName?: string;\n childTabClassName?: string;\n contentClassName?: string;\n showContent?: boolean;\n showIndicator?: boolean;\n indicatorClassName?: string;\n children?: ReactNode;\n}\n\nexport default function Tab(props: TabProps) {\n const {\n tabs,\n activeTab,\n onChange,\n direction = \"row\",\n className,\n tabListClassName,\n tabClassName,\n childTabListClassName,\n childTabClassName,\n contentClassName,\n showContent = true,\n showIndicator = false,\n indicatorClassName,\n children,\n } = props;\n\n const [indicatorStyle, setIndicatorStyle] = useState<{\n left: number;\n width: number;\n top: number;\n height: number;\n } | null>(null);\n const [expandedTabs, setExpandedTabs] = useState<Set<string>>(new Set());\n const tabRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const containerRef = useRef<HTMLUListElement | null>(null);\n\n const isTabOrChildActive = useCallback(\n (tab: TabItem): boolean => {\n if (tab.value === activeTab) return true;\n return tab.children?.some((child) => child.value === activeTab) ?? false;\n },\n [activeTab],\n );\n\n const toggleExpand = useCallback((tabValue: string, e: MouseEvent) => {\n e.stopPropagation();\n setExpandedTabs((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(tabValue)) {\n newSet.delete(tabValue);\n } else {\n newSet.add(tabValue);\n }\n return newSet;\n });\n }, []);\n\n const effectiveExpandedTabs = useMemo(() => {\n const result = new Set(expandedTabs);\n tabs.forEach((tab) => {\n if (tab.children && isTabOrChildActive(tab)) result.add(tab.value);\n });\n return result;\n }, [expandedTabs, tabs, isTabOrChildActive]);\n\n useEffect(() => {\n const allValues = new Set(\n tabs.flatMap((tab) => [tab.value, ...(tab.children?.map((c) => c.value) ?? [])]),\n );\n Object.keys(tabRefs.current).forEach((key) => {\n if (!allValues.has(key)) delete tabRefs.current[key];\n });\n }, [tabs]);\n\n const handleTabClick = useCallback(\n (e: MouseEvent, value: string, disabled?: boolean) => {\n e.preventDefault();\n if (!disabled) onChange(value);\n },\n [onChange],\n );\n\n const updateIndicator = useCallback(() => {\n let activeKey = activeTab;\n\n if (direction === \"row\") {\n for (const tab of tabs) {\n if (tab.children?.some((child) => child.value === activeTab)) {\n activeKey = tab.value;\n break;\n }\n }\n }\n\n const activeButton = tabRefs.current[activeKey];\n const container = containerRef.current;\n\n if (activeButton && container) {\n const containerRect = container.getBoundingClientRect();\n const buttonRect = activeButton.getBoundingClientRect();\n\n if (direction === \"col\") {\n setIndicatorStyle({\n left: 0,\n width: 2,\n top: buttonRect.top - containerRect.top,\n height: buttonRect.height,\n });\n } else {\n setIndicatorStyle({\n left: buttonRect.left - containerRect.left,\n width: buttonRect.width,\n top: 0,\n height: 2,\n });\n }\n }\n }, [activeTab, direction, tabs]);\n\n useEffect(() => {\n updateIndicator();\n }, [updateIndicator]);\n\n useEffect(() => {\n window.addEventListener(\"resize\", updateIndicator);\n return () => window.removeEventListener(\"resize\", updateIndicator);\n }, [updateIndicator]);\n\n const activeTabContent = useMemo((): ReactNode => {\n for (const tab of tabs) {\n if (tab.value === activeTab) return tab.content;\n if (tab.children) {\n const childTab = tab.children.find((child) => child.value === activeTab);\n if (childTab) return childTab.content;\n }\n }\n return null;\n }, [tabs, activeTab]);\n\n const isRow = direction === \"row\";\n const isCol = direction === \"col\";\n\n return (\n <div className={cn(\"w-full\", isCol && \"flex gap-4\", className)}>\n <div className={cn(\"relative\", isCol && \"shrink-0\")}>\n <ul\n ref={containerRef}\n className={cn(\n \"flex text-sm font-medium\",\n isRow && \"flex-row flex-wrap\",\n isCol && \"flex-col\",\n tabListClassName,\n )}\n >\n {tabs.map((tab) => {\n const isActive = activeTab === tab.value;\n const hasActiveChild = isTabOrChildActive(tab) && !isActive;\n const hasChildren = tab.children && tab.children.length > 0;\n const isExpanded = effectiveExpandedTabs.has(tab.value);\n\n return (\n <li key={tab.value} className={cn(isCol && \"w-full\")}>\n <div className={cn(\"relative\", isRow && hasChildren && \"group\")}>\n <div className={cn(isCol && hasChildren && \"flex w-full items-center\")}>\n <button\n ref={(el) => {\n tabRefs.current[tab.value] = el;\n }}\n onClick={(e: MouseEvent<HTMLButtonElement>) =>\n handleTabClick(e, tab.value, tab.disabled)\n }\n className={cn(\n \"inline-flex items-center gap-2 transition-all duration-300 ease-in-out\",\n isCol\n ? hasChildren\n ? \"flex-1 justify-start\"\n : \"w-full justify-start\"\n : \"justify-center\",\n tab.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n tabClassName,\n )}\n disabled={tab.disabled}\n aria-current={isActive ? \"page\" : undefined}\n data-active-child={hasActiveChild || undefined}\n >\n {tab.icon && <span className=\"shrink-0\">{tab.icon}</span>}\n <span className={cn(isCol && \"text-left\")}>{tab.label}</span>\n {isRow && hasChildren && (\n <ChevronDown className=\"w-3.5 h-3.5 shrink-0 transition-transform duration-300 ease-in-out group-hover:rotate-180\" />\n )}\n </button>\n {isCol && hasChildren && (\n <button\n onClick={(e) => toggleExpand(tab.value, e)}\n className=\"p-1 hover:bg-gray-100 rounded transition-colors shrink-0\"\n aria-label={isExpanded ? \"접기\" : \"펼치기\"}\n >\n <ChevronDown\n className={cn(\n \"w-4 h-4 transition-transform duration-300 ease-in-out\",\n isExpanded ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </button>\n )}\n </div>\n\n {isRow && hasChildren && (\n <div className=\"absolute top-full left-0 z-50 hidden group-hover:block pt-1\">\n <div className=\"min-w-35 overflow-hidden rounded-base border border-default bg-white py-1 shadow-lg\">\n {(tab.children ?? []).map((childTab) => {\n const isChildActive = activeTab === childTab.value;\n return (\n <ChildTabButton\n key={childTab.value}\n childTab={childTab}\n isActive={isChildActive}\n className={cn(\n \"px-3 py-2 text-left text-sm transition-colors\",\n !childTab.disabled && \"hover:bg-gray-50\",\n isChildActive && \"bg-blue-50 text-blue-500\",\n childTabClassName,\n )}\n onRef={(el) => {\n tabRefs.current[childTab.value] = el;\n }}\n onClick={(e) => handleTabClick(e, childTab.value, childTab.disabled)}\n />\n );\n })}\n </div>\n </div>\n )}\n\n {isCol && hasChildren && (\n <div\n className={cn(\n \"overflow-hidden transition-all duration-300 ease-in-out\",\n isExpanded ? \"max-h-250 opacity-100\" : \"max-h-0 opacity-0\",\n )}\n >\n <ul className={cn(\"flex flex-col\", childTabListClassName)}>\n {(tab.children ?? []).map((childTab) => {\n const isChildActive = activeTab === childTab.value;\n return (\n <li key={childTab.value} className=\"w-full\">\n <ChildTabButton\n childTab={childTab}\n isActive={isChildActive}\n className={cn(\"transition-all duration-300 ease-in-out\", childTabClassName)}\n onRef={(el) => {\n tabRefs.current[childTab.value] = el;\n }}\n onClick={(e) => handleTabClick(e, childTab.value, childTab.disabled)}\n />\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n {showIndicator && indicatorStyle && (\n <div\n className={cn(\n \"absolute transition-all duration-300 ease-in-out\",\n isRow && \"bottom-0\",\n isCol && \"left-0\",\n indicatorClassName,\n )}\n style={{\n left: `${indicatorStyle.left}px`,\n width: `${indicatorStyle.width}px`,\n top: isCol ? `${indicatorStyle.top}px` : undefined,\n height: `${indicatorStyle.height}px`,\n }}\n />\n )}\n </div>\n\n {isCol && children && <div className=\"flex-1\">{children}</div>}\n\n {isRow && showContent && activeTabContent && (\n <div className={cn(\"mt-4\", contentClassName)}>{activeTabContent}</div>\n )}\n </div>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// defaultUI 루트 — panel: 카드·폼 안 / page: 에러·404 단독 카드\nexport const emptyRootVariants = cva(\"flex flex-col items-center text-center text-balance\", {\n variants: {\n layout: {\n panel: \"min-w-0 flex-1 justify-center gap-6 p-6 md:p-12\",\n page: \"w-125 gap-6 pb-6 shadow-lg rounded-lg bg-gray-50\",\n },\n },\n});\n\nexport type EmptyLayout = NonNullable<VariantProps<typeof emptyRootVariants>[\"layout\"]>;\n\n// defaultUI 아이콘 영역\nexport const emptyIconVariants = cva(\n \"flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n iconVariant: {\n plain: \"\",\n boxed: \"size-10 rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n iconVariant: \"plain\",\n },\n },\n);\n\nexport type EmptyIconVariant = NonNullable<VariantProps<typeof emptyIconVariants>[\"iconVariant\"]>;\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\nimport { emptyIconVariants } from \"../config/style\";\nimport type { EmptyLayout, EmptyIconVariant } from \"../config/style\";\n\ninterface EmptyContentProps {\n layout: EmptyLayout;\n icon?: ReactNode;\n iconVariant: EmptyIconVariant;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n titleClassName?: string;\n descriptionClassName?: string;\n iconClassName?: string;\n actionClassName?: string;\n}\n\nexport default function EmptyContent(props: EmptyContentProps) {\n const {\n layout,\n icon,\n iconVariant,\n title,\n description,\n action,\n titleClassName,\n descriptionClassName,\n iconClassName,\n actionClassName,\n } = props;\n\n const hasHeader = icon || title || description;\n const isPage = layout === \"page\";\n\n return (\n <>\n {hasHeader && (\n <div className={cn(\"flex flex-col items-center gap-2\", isPage && \"mt-14 mb-10 gap-3\", !isPage && \"max-w-sm\")}>\n {icon && <div className={cn(emptyIconVariants({ iconVariant }), iconClassName)}>{icon}</div>}\n {title && (\n <div\n className={cn(\n isPage && \"text-2xl font-bold\",\n !isPage && \"text-lg font-medium tracking-tight text-foreground\",\n titleClassName,\n )}\n >\n {title}\n </div>\n )}\n {description && (\n <p\n className={cn(\n isPage && \"text-lg text-gray-500\",\n !isPage && \"text-sm leading-relaxed text-muted-foreground\",\n descriptionClassName,\n )}\n >\n {description}\n </p>\n )}\n </div>\n )}\n {action && (\n <div\n className={cn(\n isPage && \"flex items-center justify-center w-full\",\n !isPage && \"flex w-full max-w-sm flex-col items-center gap-3\",\n actionClassName,\n )}\n >\n {isPage ? <div className=\"flex w-full justify-center gap-3\">{action}</div> : action}\n </div>\n )}\n </>\n );\n}\n","import type { ComponentProps, ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport { emptyRootVariants } from \"./config/style\";\nimport type { EmptyLayout, EmptyIconVariant } from \"./config/style\";\nimport EmptyContent from \"./ui/EmptyContent\";\n\nexport type EmptyProps = Omit<ComponentProps<\"div\">, \"title\"> & {\n // true: 기본 UI / false·미지정: children 자유 구성\n defaultUI?: boolean;\n icon?: ReactNode;\n iconVariant?: EmptyIconVariant;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n titleClassName?: string;\n descriptionClassName?: string;\n iconClassName?: string;\n actionClassName?: string;\n // defaultUI일 때만 의미 있음. true: 전체 화면 중앙(page) / 생략·false: 패널(panel)\n fullScreen?: boolean;\n};\n\nexport default function Empty(props: EmptyProps) {\n const {\n defaultUI,\n icon,\n iconVariant: iconVariantProp,\n title,\n description,\n action,\n className,\n titleClassName,\n descriptionClassName,\n iconClassName,\n actionClassName,\n fullScreen,\n children,\n ...rest\n } = props;\n\n const useFullScreen = Boolean(defaultUI && fullScreen);\n const layout: EmptyLayout = useFullScreen ? \"page\" : \"panel\";\n const iconVariant = iconVariantProp ?? (icon ? \"boxed\" : \"plain\");\n const content = defaultUI ? (\n <EmptyContent\n layout={layout}\n icon={icon}\n iconVariant={iconVariant}\n title={title}\n description={description}\n action={action}\n titleClassName={titleClassName}\n descriptionClassName={descriptionClassName}\n iconClassName={iconClassName}\n actionClassName={actionClassName}\n />\n ) : (\n children\n );\n\n const root = (\n <div\n data-slot=\"empty\"\n data-default-ui={defaultUI || undefined}\n data-full-screen={useFullScreen || undefined}\n className={cn(\n \"flex flex-col items-center text-center text-balance\",\n defaultUI ? emptyRootVariants({ layout }) : \"w-full justify-center gap-3\",\n className,\n )}\n {...rest}\n >\n {content}\n </div>\n );\n\n if (useFullScreen) {\n return <div className=\"min-h-screen flex items-center justify-center\">{root}</div>;\n }\n\n return root;\n}\n","// 모달 중첩 스택 레지스트리 (모듈 스코프 — React state 불필요)\n// 역할: topmost 판별, z-index depth 계산, scroll-lock 해제 시점 결정\nlet stack: Array<symbol> = [];\n\nfunction push(id: symbol): number {\n stack = [...stack, id];\n return stack.length;\n}\n\nfunction pop(id: symbol): void {\n stack = stack.filter((s) => s !== id);\n}\n\nfunction isTop(id: symbol): boolean {\n return stack.at(-1) === id;\n}\n\nfunction size(): number {\n return stack.length;\n}\n\nexport const modalStack = { push, pop, isTop, size };\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalContentProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n zIndex?: number;\n}\n\nexport default function ModalContent(props: ModalContentProps) {\n const { ref, children, className, zIndex, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] max-h-[85vh] z-55 flex flex-col w-full max-w-lg translate-x-[-50%] translate-y-[-50%] bg-white rounded-lg overflow-hidden shadow-xl\",\n className,\n )}\n style={zIndex !== undefined ? { zIndex } : undefined}\n data-modal-content\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type { MouseEvent, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalOverlayProps {\n ref?: Ref<HTMLDivElement>;\n isOpen: boolean;\n onClose?: () => void;\n className?: string;\n closeOnOverlayClick?: boolean;\n zIndex?: number;\n}\n\nexport default function ModalOverlay(props: ModalOverlayProps) {\n const { ref, isOpen, onClose, className, closeOnOverlayClick = true, zIndex } = props;\n\n if (!isOpen) return null;\n\n const handleOverlayClick = (e: MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose?.();\n }\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"fixed inset-0 z-54 bg-black/50\",\n \"animate-in fade-in-0 duration-150\",\n className,\n )}\n style={zIndex !== undefined ? { zIndex } : undefined}\n onClick={handleOverlayClick}\n />\n );\n}\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalBodyProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalBody(props: ModalBodyProps) {\n const { ref, children, className, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\"p-6 text-sm text-gray-700 leading-relaxed overflow-y-auto\", className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalFooterProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalFooter(props: ModalFooterProps) {\n const { ref, children, className, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 border-t border-slate-200 p-4\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode, Ref } from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\n\nexport interface ModalHeaderProps {\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n className?: string;\n}\n\nexport default function ModalHeader(props: ModalHeaderProps) {\n const { ref, children, className, ...rest } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col space-y-1.5 p-6 pb-4 text-center sm:text-left border-b border-gray-200\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import {\n BadgePlus,\n FileSearch2,\n Info,\n Pencil,\n Search,\n Trash2,\n TriangleAlert,\n X,\n type LucideIcon,\n} from \"lucide-react\";\n\nimport ModalHeader from \"./ModalHeader\";\nimport { cn } from \"../../../lib/variants\";\n\nexport type ModalType = \"detail\" | \"create\" | \"edit\" | \"search\" | \"info\" | \"delete\" | \"warning\";\n\nconst MODAL_ICONS: Record<ModalType, LucideIcon> = {\n detail: FileSearch2,\n create: BadgePlus,\n edit: Pencil,\n search: Search,\n info: Info,\n delete: Trash2,\n warning: TriangleAlert,\n};\n\nexport interface ModalIconHeaderProps {\n type: ModalType;\n title: string;\n description?: string;\n onClose: () => void;\n className?: string;\n}\n\nexport default function ModalIconHeader(props: ModalIconHeaderProps) {\n const { type, title, description, onClose, className } = props;\n const Icon = MODAL_ICONS[type];\n\n return (\n <ModalHeader\n className={cn(\n \"bg-gradient-to-r from-blue-50 to-indigo-50 border-blue-100 p-0 text-left space-y-0\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between px-6 py-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-10 h-10 bg-blue-100 rounded-full shrink-0\">\n <Icon size={20} className=\"text-main\" />\n </div>\n <div>\n <h2 className=\"text-xl font-bold text-gray-900\">{title}</h2>\n {description && <p className=\"text-sm text-gray-600 mt-0.5\">{description}</p>}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flex items-center justify-center w-10 h-10 rounded-full transition-colors group cursor-pointer hover:bg-black/5 shrink-0\"\n >\n <X size={20} className=\"text-gray-400 group-hover:text-gray-600 transition-colors\" />\n </button>\n </div>\n </ModalHeader>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { Z_INDEX } from \"../../config/zIndex\";\nimport { cn } from \"../../lib/variants\";\nimport { modalStack } from \"./ui/modalStack\";\nimport ModalContent from \"./ui/ModalContent\";\nimport ModalOverlay from \"./ui/ModalOverlay\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose?: () => void;\n children: ReactNode;\n overlayClassName?: string;\n contentClassName?: string;\n closeOnOverlayClick?: boolean;\n closeOnEscape?: boolean;\n}\n\nexport default function Modal(props: ModalProps) {\n const {\n isOpen,\n onClose,\n children,\n overlayClassName,\n contentClassName,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n } = props;\n\n const idRef = useRef<symbol>(Symbol(\"modal\"));\n const [depth, setDepth] = useState(0);\n\n // useLayoutEffect: 브라우저 페인트 전에 depth를 확정 → 두 번째 모달 overlay(z=54)가\n // 첫 번째 모달 content(z=55)보다 낮은 채로 한 프레임 그려지는 현상 방지\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n const id = idRef.current;\n const d = modalStack.push(id);\n setDepth(d);\n document.body.style.overflow = \"hidden\";\n\n return () => {\n modalStack.pop(id);\n if (modalStack.size() === 0) {\n document.body.style.overflow = \"unset\";\n }\n setDepth(0);\n };\n }, [isOpen]);\n\n // Escape는 topmost 모달만 처리\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !closeOnEscape) return;\n if (!modalStack.isTop(idRef.current)) return;\n\n const activeElement = document.activeElement;\n const isInputActive =\n activeElement?.tagName === \"INPUT\" ||\n activeElement?.tagName === \"TEXTAREA\" ||\n activeElement?.tagName === \"SELECT\" ||\n activeElement?.getAttribute(\"contenteditable\") === \"true\";\n\n if (!isInputActive) {\n onClose?.();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen, onClose, closeOnEscape]);\n\n if (!isOpen) return null;\n\n const overlayZ = Z_INDEX.MODAL_OVERLAY + Math.max(0, depth - 1) * Z_INDEX.MODAL_Z_STEP;\n const contentZ = Z_INDEX.MODAL + Math.max(0, depth - 1) * Z_INDEX.MODAL_Z_STEP;\n\n return (\n <>\n <ModalOverlay\n isOpen={isOpen}\n onClose={onClose}\n className={cn(overlayClassName, depth > 1 && \"bg-black/20\")}\n closeOnOverlayClick={closeOnOverlayClick}\n zIndex={overlayZ}\n />\n <ModalContent\n className={cn(\n contentClassName,\n depth > 1 && \"shadow-[0_0_0_1px_rgba(255,255,255,0.12),0_20px_50px_-5px_rgba(0,0,0,0.4)]\",\n )}\n zIndex={contentZ}\n >\n {children}\n </ModalContent>\n </>\n );\n}\n\nexport { default as ModalBody } from \"./ui/ModalBody\";\nexport { default as ModalContent } from \"./ui/ModalContent\";\nexport { default as ModalFooter } from \"./ui/ModalFooter\";\nexport { default as ModalHeader } from \"./ui/ModalHeader\";\nexport { default as ModalIconHeader } from \"./ui/ModalIconHeader\";\nexport { default as ModalOverlay } from \"./ui/ModalOverlay\";\nexport type { ModalIconHeaderProps, ModalType } from \"./ui/ModalIconHeader\";\n","import { useEffect, useRef } from \"react\";\nimport { Info } from \"lucide-react\";\n\nimport Button from \"../../Button\";\nimport Modal from \"../../Modal\";\nimport DebouncedButton from \"../../DebouncedButton\";\n\ninterface ConfirmModalProps<T = void> {\n isOpen: boolean;\n onClose: () => void;\n onOk: (data?: T) => void;\n content: string;\n data?: T;\n title?: string;\n okText?: string;\n cancelText?: string;\n subContent?: string;\n className?: string;\n contentClassName?: string;\n isHideOkButton?: boolean;\n isHideCancelButton?: boolean;\n}\n\n/**\n * 키보드 동작\n * - Tab / Shift+Tab : 버튼 간 포커스 순환 (모달 밖으로 이동하지 않음)\n * - ← → : '예' ↔ '아니오' 포커스 전환\n * - Enter : 버튼에 포커스된 경우 해당 버튼 클릭, 미포커스(컨테이너) 시 '예' 동작\n * - Escape : 모달 닫힘 (다른 모달로 이벤트 전파 차단)\n *\n * 초기 포커스 ('예' 버튼이 표시될 때)\n * - 키보드 트리거 (Input/Textarea에서 Enter로 모달 오픈): '예' 버튼에 포커스\n * - 마우스 트리거 (버튼 클릭 등): 컨테이너에 포커스 → Enter 입력 시 '예' 동작\n *\n * 초기 포커스 (isHideOkButton=true)\n * - '아니오' 버튼에 포커스\n */\nexport default function ConfirmModal<T = void>(props: ConfirmModalProps<T>) {\n const {\n isOpen,\n onClose,\n onOk,\n content,\n subContent,\n data,\n okText = \"예\",\n cancelText = \"아니오\",\n className,\n isHideOkButton = false,\n isHideCancelButton = false,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const okButtonRef = useRef<HTMLButtonElement>(null);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n\n // 모달 열릴 때 초기 포커스 설정\n // setTimeout(0) defer: Enter keydown으로 모달이 열린 경우 해당 이벤트가 완전히\n // 처리된 뒤 포커스를 이동해 '예' 버튼이 즉시 클릭되는 현상 방지\n useEffect(() => {\n if (!isOpen) return;\n const timer = setTimeout(() => {\n if (!isHideOkButton) {\n const activeEl = document.activeElement;\n const isKeyboardTrigger =\n activeEl instanceof HTMLInputElement || activeEl instanceof HTMLTextAreaElement;\n if (isKeyboardTrigger) {\n okButtonRef.current?.focus();\n } else {\n containerRef.current?.focus();\n }\n } else {\n const target =\n cancelButtonRef.current ??\n containerRef.current?.querySelector<HTMLElement>(\"button:not([disabled])\");\n target?.focus();\n }\n }, 0);\n return () => clearTimeout(timer);\n }, [isOpen, isHideOkButton]);\n\n const handleOkClick = async () => {\n await onOk(data);\n onClose();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n if (e.key === \"Escape\") {\n onClose();\n return;\n }\n\n // 컨테이너에 포커스된 상태(마우스 트리거)에서 Enter → '예' 동작\n if (e.key === \"Enter\" && document.activeElement === containerRef.current) {\n e.preventDefault();\n handleOkClick();\n return;\n }\n\n // ← → 로 버튼 간 포커스 이동\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n const active = document.activeElement;\n if (active === okButtonRef.current) {\n cancelButtonRef.current?.focus();\n } else if (active === cancelButtonRef.current) {\n okButtonRef.current?.focus();\n } else {\n containerRef.current?.querySelector<HTMLElement>(\"button:not([disabled])\")?.focus();\n }\n return;\n }\n\n // Tab 포커스 트랩\n if (e.key !== \"Tab\") return;\n const focusable = Array.from(\n containerRef.current?.querySelectorAll<HTMLElement>(\"button:not([disabled])\") ?? [],\n );\n if (focusable.length === 0) return;\n const first = focusable[0] as HTMLElement;\n const last = focusable[focusable.length - 1] as HTMLElement;\n if (e.shiftKey) {\n if (document.activeElement === first || document.activeElement === containerRef.current) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n contentClassName={`confirm-modal-flag bg-white px-6 py-3.5 ${className} top-[20%]`}\n >\n <div ref={containerRef} tabIndex={-1} className=\"flex flex-col outline-none\" onKeyDown={handleKeyDown}>\n <div className=\"flex py-2.5\">\n <div className=\"flex items-start pt-1\">\n <Info className=\"size-6 flex-shrink-0 rounded-full bg-blue-400 text-white\" />\n </div>\n <p className=\"font-sebang w-full pt-0.75 pl-2.5 whitespace-pre-line\">\n {content}\n <br />\n {subContent && (\n <span className=\"font-sebang text-sm whitespace-pre-line text-gray-600\">{subContent}</span>\n )}\n </p>\n </div>\n\n <div className=\"flex h-8 items-center justify-end gap-2\">\n {!isHideOkButton && (\n <DebouncedButton\n ref={okButtonRef}\n debounceDelay={500}\n variant=\"outline\"\n onClick={handleOkClick}\n className=\"focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-1\"\n >\n {okText}\n </DebouncedButton>\n )}\n {!isHideCancelButton && (\n <Button\n ref={cancelButtonRef}\n variant=\"outline\"\n onClick={onClose}\n className=\"focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-1\"\n >\n {cancelText}\n </Button>\n )}\n </div>\n </div>\n </Modal>\n );\n}\n","import { createRoot, type Root } from \"react-dom/client\";\n\nimport ConfirmModal from \"../ui/ConfirmModal\";\n\nlet container: HTMLElement | null = null;\nlet root: Root | null = null;\nlet currentResolve: ((v: unknown) => void) | null = null;\nlet isOpen = false;\n\nfunction ensureRoot() {\n if (!container) {\n container = document.createElement(\"div\");\n container.id = \"confirm-modal-portal\";\n document.body.appendChild(container);\n }\n if (!root) {\n root = createRoot(container);\n }\n}\n\nexport interface ConfirmOptions<T = void> {\n content: string;\n title?: string;\n okText?: string;\n cancelText?: string;\n subContent?: string;\n variant?: \"danger\" | \"warning\" | \"info\" | \"success\";\n data?: T;\n onOk?: (data?: T) => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n isHideOkButton?: boolean;\n isHideCancelButton?: boolean;\n className?: string;\n}\n\nexport function confirmModal<T = void>(options: ConfirmOptions<T>): Promise<T | undefined> {\n if (isOpen && currentResolve) return Promise.resolve(undefined);\n\n ensureRoot();\n\n isOpen = true;\n\n const promise = new Promise<T | undefined>((resolve) => {\n currentResolve = resolve as unknown as null;\n });\n\n const cleanup = async (value?: T, kind: \"ok\" | \"cancel\" = \"cancel\") => {\n try {\n root!.render(null);\n isOpen = false;\n\n if (kind === \"ok\") {\n await options.onOk?.(value);\n } else {\n await options.onCancel?.();\n }\n } finally {\n currentResolve?.(value);\n currentResolve = null;\n }\n };\n\n const handleOk = (data?: T) => cleanup(data, \"ok\");\n const handleCloseOrCancel = () => cleanup(undefined, \"cancel\");\n\n root!.render(\n <ConfirmModal\n isOpen\n onOk={handleOk}\n onClose={handleCloseOrCancel}\n className={options.className}\n {...options}\n />,\n );\n\n return promise;\n}\n","import type { ReactNode } from \"react\";\n\nimport Pagination from \"../../Pagination\";\nimport type { PaginationProps } from \"../../Pagination\";\n\nexport interface TableFooterProps {\n paginationInfo?: PaginationProps;\n renderLeft?: ReactNode;\n renderRight?: ReactNode;\n}\n\nexport default function TableFooter(props: TableFooterProps) {\n const { paginationInfo, renderLeft, renderRight } = props;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-center justify-between py-4 min-h-16\">\n <div className=\"flex justify-start flex-1 min-w-0\">{renderLeft}</div>\n {paginationInfo && (\n <div className=\"px-5\">\n <Pagination {...paginationInfo} />\n </div>\n )}\n <div className=\"flex justify-end flex-1 min-w-0\">{renderRight}</div>\n </div>\n </div>\n );\n}\n","/* eslint-disable react-hooks/set-state-in-effect */\nimport type { CSSProperties } from \"react\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nimport { Z_INDEX } from \"../../../config/zIndex\";\nimport type { Column } from \"../config/type\";\n\ntype TableFixed = \"left\" | \"right\";\n\nfunction calculateFixedPositions<T>(columns: Array<Column<T>>, isHeader: boolean = false) {\n const leftFixed: Record<string, string> = {};\n const rightFixed: Record<string, string> = {};\n let leftOffset = 0;\n let rightOffset = 0;\n\n columns.forEach((column) => {\n if (column.fixed === \"left\") {\n leftFixed[column.key] = `${leftOffset}px`;\n const targetNode = document.getElementById(`${column.key}${isHeader ? \"-header\" : \"-body\"}`);\n const width = targetNode?.getBoundingClientRect().width ?? 0;\n leftOffset += width;\n }\n });\n\n const rightFixedColumns = columns.filter((col) => col.fixed === \"right\").reverse();\n rightFixedColumns.forEach((column) => {\n rightFixed[column.key] = `${rightOffset}px`;\n const targetNode = document.getElementById(`${column.key}${isHeader ? \"-header\" : \"-body\"}`);\n const width = targetNode?.getBoundingClientRect().width ?? 0;\n rightOffset += width;\n });\n\n return { leftFixed, rightFixed };\n}\n\nfunction getFixedStyle<T>(\n column: Column<T>,\n leftFixed: Record<string, string>,\n rightFixed: Record<string, string>,\n isHeader = false,\n isCurrentFixed = false,\n) {\n const baseStyle: CSSProperties = {};\n if (!column.fixed) return;\n\n baseStyle.position = \"sticky\";\n baseStyle.zIndex = isHeader ? Z_INDEX.TABLE_FIXED_HEADER_CELL : Z_INDEX.TABLE_FIXED_CELL;\n\n if (column.fixed === \"left\") {\n baseStyle.left = leftFixed[column.key];\n if (isCurrentFixed) {\n baseStyle.boxShadow = \"3px 0 4px rgba(0, 0, 0, 0.06)\";\n }\n }\n\n if (column.fixed === \"right\") {\n baseStyle.right = rightFixed[column.key];\n if (isCurrentFixed) {\n baseStyle.boxShadow = \"-3px 0 4px rgba(0, 0, 0, 0.06)\";\n }\n }\n\n return baseStyle;\n}\n\nfunction getAbsoluteWidths<T>(columns: Array<Column<T>>) {\n return columns.reduce<Record<string, string>>((acc, col) => {\n const targetNode = document.getElementById(`${col.key}-body`);\n const width = targetNode?.getBoundingClientRect().width ?? 0;\n acc[col.key] = `${width}px`;\n return acc;\n }, {});\n}\n\ninterface Cell {\n targetKey: string;\n startWidth: string;\n position: TableFixed;\n}\n\ntype TableInfo = Record<string, string>;\ntype TableFixedInfo = Record<TableFixed, TableInfo>;\ntype FixedGroups = Record<TableFixed, Array<Cell>>;\n\nexport default function useTableFixed<T>(columns: Array<Column<T>>, isHeader: boolean = false) {\n const [tableFixedInfo, setTableFixedInfo] = useState<TableFixedInfo>({\n left: {},\n right: {},\n });\n const [currentFixedGroup, setCurrentFixedGroup] = useState<Array<Cell> | null>(null);\n const [absoluteWidths, setAbsoluteWidths] = useState<TableInfo>({});\n\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const mutationObserverRef = useRef<MutationObserver | null>(null);\n\n const tableRef = document.querySelector(\"#table-layout\");\n\n const handleResize = useCallback(() => {\n const nextAbsoluteWidths = getAbsoluteWidths(columns);\n const { leftFixed, rightFixed } = calculateFixedPositions(columns, isHeader);\n setTableFixedInfo({ left: leftFixed, right: rightFixed });\n setAbsoluteWidths(nextAbsoluteWidths);\n }, [columns, isHeader]);\n\n const processFixedGroup = useCallback(\n (targetColumns: Array<Column<T>>, position: TableFixed, maxScrollLeft?: number): Array<Cell> => {\n const fixedCells: Array<Cell> = [];\n let accumulatedWidth = 0;\n let currentGroup: Cell | null = null;\n\n const columnsByDirection = position === \"right\" ? [...targetColumns].reverse() : targetColumns;\n\n columnsByDirection.forEach((cur) => {\n const columnWidth = Number(absoluteWidths[cur.key]?.replace(\"px\", \"\")) || 0;\n\n if (cur.fixed === position) {\n const startWidth =\n position === \"right\" && maxScrollLeft !== undefined\n ? `${Math.max(0, maxScrollLeft - accumulatedWidth)}px`\n : `${accumulatedWidth}px`;\n\n if (!currentGroup || currentGroup.position !== position) {\n currentGroup = {\n position,\n startWidth,\n targetKey: cur.key,\n };\n fixedCells.push({\n position,\n startWidth,\n targetKey: cur.key,\n });\n } else {\n currentGroup.targetKey = cur.key;\n fixedCells[fixedCells.length - 1].targetKey = cur.key;\n }\n } else {\n accumulatedWidth += columnWidth;\n currentGroup = null;\n }\n });\n\n return position === \"right\" ? fixedCells.reverse() : fixedCells;\n },\n [absoluteWidths],\n );\n\n const getFixedGroup = useCallback((): FixedGroups => {\n const tableContainer = document.querySelector(\"#table-layout\");\n if (!tableContainer) {\n return { left: [], right: [] };\n }\n\n const tableWidth = tableContainer.scrollWidth;\n const containerWidth = tableContainer.clientWidth;\n const maxScrollLeft = Math.max(0, tableWidth - containerWidth);\n\n return {\n left: processFixedGroup(columns, \"left\"),\n right: processFixedGroup(columns, \"right\", maxScrollLeft),\n };\n }, [columns, processFixedGroup]);\n\n const getCurrentFixedGroup = useCallback(\n (scrollLeft: number, fixedTargetGroup: FixedGroups): Array<Cell> => {\n const result: Array<Cell> = [];\n\n const leftFixedCell = [...fixedTargetGroup.left]\n .reverse()\n .find((cell) => Number(cell.startWidth.replace(\"px\", \"\")) < scrollLeft);\n const rightFixedCell = fixedTargetGroup.right.find(\n (cell) => Number(cell.startWidth.replace(\"px\", \"\")) > scrollLeft,\n );\n\n if (leftFixedCell) {\n result.push(leftFixedCell);\n }\n if (rightFixedCell) {\n result.push(rightFixedCell);\n }\n\n return result;\n },\n [],\n );\n\n const handleScrollTable = useCallback(() => {\n const fixedGroup = getFixedGroup();\n const scrollLeft = tableRef instanceof HTMLElement ? tableRef.scrollLeft : 0;\n const nextCurrentFixedGroup = getCurrentFixedGroup(scrollLeft, fixedGroup);\n setCurrentFixedGroup(nextCurrentFixedGroup);\n }, [getCurrentFixedGroup, getFixedGroup, tableRef]);\n\n useEffect(() => {\n if (!(tableRef instanceof HTMLElement)) {\n return;\n }\n\n tableRef.addEventListener(\"scroll\", handleScrollTable);\n return () => {\n tableRef.removeEventListener(\"scroll\", handleScrollTable);\n };\n }, [handleScrollTable, tableRef]);\n\n useLayoutEffect(() => {\n handleResize();\n\n const onResize = () => {\n handleResize();\n };\n window.addEventListener(\"resize\", onResize);\n\n const firstKey = columns[0]?.key;\n const cell = firstKey ? document.getElementById(`${firstKey}${isHeader ? \"-header\" : \"-body\"}`) : null;\n\n const tableEl =\n (cell?.closest(\"table\") as HTMLElement | null) ||\n (document.querySelector(\"table.table-fixed\") as HTMLElement | null);\n\n if (tableEl && \"ResizeObserver\" in window) {\n resizeObserverRef.current = new ResizeObserver(handleResize);\n resizeObserverRef.current.observe(tableEl);\n }\n\n const tbodyEl = tableEl?.querySelector(\"tbody\");\n if (tbodyEl) {\n mutationObserverRef.current = new MutationObserver(handleResize);\n mutationObserverRef.current.observe(tbodyEl, {\n childList: true,\n subtree: true,\n });\n }\n\n return () => {\n window.removeEventListener(\"resize\", onResize);\n resizeObserverRef.current?.disconnect();\n mutationObserverRef.current?.disconnect();\n };\n }, [columns, handleResize, isHeader]);\n\n const isColumnFixed = useCallback(\n (columnKey: string) => {\n if (!currentFixedGroup?.length) {\n return false;\n }\n return currentFixedGroup.some((cell) => cell.targetKey === columnKey);\n },\n [currentFixedGroup],\n );\n\n const getColumnFixedStyle = (column: Column<T>) => {\n const isCurrentFixed = isColumnFixed(column.key);\n return getFixedStyle(column, tableFixedInfo.left, tableFixedInfo.right, isHeader, isCurrentFixed);\n };\n\n return { getColumnFixedStyle };\n}\n","import type { SVGProps } from \"react\";\n\ninterface ArrowIconProps extends SVGProps<SVGSVGElement> {\n direction?: \"up\" | \"down\";\n}\n\nexport default function ArrowIcon(props: ArrowIconProps) {\n const { direction = \"down\", style, ...reset } = props;\n\n const rotation = direction === \"up\" ? \"rotate(180deg)\" : undefined;\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 640 640\"\n fill=\"currentColor\"\n style={{\n transform: rotation,\n ...style,\n }}\n {...reset}\n >\n <path d=\"M297.4 566.6C309.9 579.1 330.2 579.1 342.7 566.6L502.7 406.6C515.2 394.1 515.2 373.8 502.7 361.3C490.2 348.8 469.9 348.8 457.4 361.3L352 466.7L352 96C352 78.3 337.7 64 320 64C302.3 64 288 78.3 288 96L288 466.7L182.6 361.3C170.1 348.8 149.8 348.8 137.3 361.3C124.8 373.8 124.8 394.1 137.3 406.6L297.3 566.6z\" />\n </svg>\n );\n}\n","import { useMemo, useState, type DragEvent } from \"react\";\nimport type { Column, SortOption, SortOrder } from \"../config/type\";\nimport useTableFixed from \"../hooks/useTableFixed\";\nimport ArrowIcon from \"./ui/ArrowIcon\";\n\nconst DEFAULT_SORT_KEY = \"\";\nconst DEFAULT_SORT_ORDER: SortOrder = \"asc\";\nconst DEFAULT_SORT_OPTIONS: SortOption = {\n visibleType: \"always\",\n sortKey: \"\",\n sortOrder: \"asc\",\n};\ninterface TableHeaderProps<T> {\n columns: Array<Column<T>>;\n getAlignStyle: (align: string) => string;\n sortOption?: SortOption;\n onSortChange?: (sortKey: string, sortOrder: SortOrder) => void;\n onColumnDragStartCapture?: (columnKey: string) => void;\n onColumnDragStart?: (columnKey: string, event: DragEvent<HTMLTableCellElement>) => void;\n onColumnDrop?: (columnKey: string) => void;\n onColumnDragEnd?: () => void;\n onColumnDragOver?: (event: DragEvent<HTMLTableCellElement>) => void;\n isColumnDraggable?: (columnKey: string) => boolean;\n}\n\nexport default function TableHeader<T>(props: TableHeaderProps<T>) {\n const {\n columns: customColumns,\n getAlignStyle,\n sortOption = DEFAULT_SORT_OPTIONS,\n onSortChange,\n onColumnDragStartCapture,\n onColumnDragStart,\n onColumnDrop,\n onColumnDragEnd,\n onColumnDragOver,\n isColumnDraggable,\n } = props;\n\n const [internalSortState, setInternalSortState] = useState<{\n columnKey: string | null;\n order: \"asc\" | \"desc\" | null;\n }>({\n columnKey: null,\n order: null,\n });\n\n const [hoveredColumn, setHoveredColumn] = useState<string | null>(null);\n\n const sortState = useMemo(\n () => ({\n columnKey: sortOption?.sortKey ?? internalSortState.columnKey,\n order: sortOption?.sortOrder ?? internalSortState.order,\n }),\n [internalSortState.columnKey, internalSortState.order, sortOption?.sortKey, sortOption?.sortOrder],\n );\n\n const columns = useMemo(() => {\n return customColumns.map((column) => {\n const { key } = column;\n const isCheckbox = key === \"__checkbox__\";\n\n return {\n ...column,\n width: isCheckbox ? \"40px\" : column.width,\n minWidth: isCheckbox ? \"40px\" : (column.minWidth ?? column.width),\n maxWidth: isCheckbox ? \"40px\" : column.maxWidth,\n align: isCheckbox ? (\"center\" as const) : ((column.align ?? \"left\") as \"left\" | \"center\" | \"right\"),\n };\n });\n }, [customColumns]);\n\n const { getColumnFixedStyle } = useTableFixed<T>(columns, true);\n\n const handleSort = (columnKey: string) => {\n if (onSortChange) {\n const isActive = sortOption?.sortKey === columnKey;\n const currentOrder = sortOption?.sortOrder;\n\n if (isActive) {\n if (currentOrder === \"desc\") {\n onSortChange(columnKey, \"asc\");\n } else if (currentOrder === \"asc\") {\n onSortChange(DEFAULT_SORT_KEY, DEFAULT_SORT_ORDER);\n } else {\n onSortChange(columnKey, \"desc\");\n }\n } else {\n onSortChange(columnKey, \"desc\");\n }\n return;\n }\n\n setInternalSortState((prev) => {\n if (prev.columnKey !== columnKey) {\n return { columnKey, order: \"desc\" };\n }\n if (prev.order === \"desc\") {\n return { columnKey, order: \"asc\" };\n }\n return { columnKey: null, order: null };\n });\n };\n\n const renderSortIcon = (columnKey: string) => {\n const isActive = sortState.columnKey === columnKey;\n const isHovered = hoveredColumn === columnKey;\n const currentOrder = sortState.order;\n\n if (isActive && currentOrder === \"asc\") {\n return <ArrowIcon direction=\"up\" className=\"size-4 text-gray-800 pt-[0.5px]\" />;\n }\n\n if (isActive && currentOrder === \"desc\") {\n return <ArrowIcon direction=\"down\" className=\"size-4 text-gray-800 pt-[0.5px]\" />;\n }\n\n const visibleType = sortOption?.visibleType ?? \"always\";\n const shouldShowInactive = visibleType === \"always\" || isHovered;\n if (shouldShowInactive) {\n return <ArrowIcon direction=\"down\" className=\"size-4 text-gray-400 pt-[0.5px]\" />;\n }\n\n return null;\n };\n\n const getDragProps = (column: Column<T>) => {\n const draggable = isColumnDraggable?.(column.key) ?? false;\n if (!draggable) {\n return {\n draggable: false as const,\n \"data-col-key\": column.key,\n };\n }\n return {\n draggable: true as const,\n \"data-col-key\": column.key,\n onDragStartCapture: () => onColumnDragStartCapture?.(column.key),\n onDragStart: (event: DragEvent<HTMLTableCellElement>) => onColumnDragStart?.(column.key, event),\n onDragEnd: onColumnDragEnd,\n onDragOver: onColumnDragOver,\n onDrop: () => onColumnDrop?.(column.key),\n };\n };\n\n const renderColumnTitle = (column: Column<T>, isClickableHead: string) => {\n const baseClasses = \"pt-0.5 select-none\";\n const subTitleClasses =\n column.key === \"subTitle\"\n ? \"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-800\"\n : \"\";\n\n if (column.align === \"left\") {\n return (\n <div className=\"flex item-center w-full\">\n <div className=\"flex items-center justify-center\">\n <span className={`pl-3 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>{column.title}</span>\n </div>\n {column.sortable && (\n <div\n className={`w-5 flex flex-col gap-[1.5px] items-center justify-center cursor-pointer ${isClickableHead}`}\n >\n {renderSortIcon(column.key)}\n </div>\n )}\n </div>\n );\n }\n\n if (column.align === \"center\") {\n return (\n <div className=\"flex justify-center w-full\">\n <div className={`flex items-center justify-center ${column.sortable ? \"pl-5\" : \"\"}`}>\n <span className={`whitespace-nowrap ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>\n {column.title}\n </span>\n </div>\n {column.sortable && (\n <div\n className={`w-5 flex flex-col gap-[1.5px] items-center justify-center cursor-pointer ${isClickableHead}`}\n >\n {renderSortIcon(column.key)}\n </div>\n )}\n </div>\n );\n }\n\n if (column.align === \"right\") {\n return (\n <div className=\"flex justify-end w-full\">\n {column.sortable && (\n <div\n className={`w-5 flex flex-col gap-[1.5px] items-center justify-center cursor-pointer ${isClickableHead}`}\n >\n {renderSortIcon(column.key)}\n </div>\n )}\n <div className=\"flex items-center justify-center\">\n <span className={`pr-3 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>{column.title}</span>\n </div>\n </div>\n );\n }\n\n return (\n <span className={`px-1.5 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`}>{column.title}</span>\n );\n };\n\n const createGroupHeaders = () => {\n const mainGroups: Record<string, Record<string, Array<Column<T>>>> = {};\n const subGroups: Record<string, Array<Column<T>>> = {};\n\n const ensureMainGroup = (mainTitle: string) => {\n if (!mainGroups[mainTitle]) {\n mainGroups[mainTitle] = {};\n }\n return mainGroups[mainTitle];\n };\n\n const ensureSubGroupInMain = (mainTitle: string, subTitle: string) => {\n const mainGroup = ensureMainGroup(mainTitle);\n if (!mainGroup[subTitle]) {\n mainGroup[subTitle] = [];\n }\n return mainGroup[subTitle];\n };\n\n const ensureSubGroup = (subTitle: string) => {\n if (!subGroups[subTitle]) {\n subGroups[subTitle] = [];\n }\n return subGroups[subTitle];\n };\n\n columns.forEach((column) => {\n if (column.mainTitle && column.subTitle) {\n ensureSubGroupInMain(column.mainTitle, column.subTitle).push(column);\n } else if (column.subTitle) {\n ensureSubGroup(column.subTitle).push(column);\n }\n });\n\n return { mainGroups, subGroups };\n };\n\n const { mainGroups, subGroups } = createGroupHeaders();\n const hasMainGroups = Object.keys(mainGroups).length > 0;\n const hasSubGroups = Object.keys(subGroups).length > 0;\n\n if (!hasMainGroups && !hasSubGroups) {\n return (\n <thead className=\"w-full sticky top-0 z-10\">\n <tr className=\"w-full h-10\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n return (\n <th\n id={`${column.key}-header`}\n key={`${column.key}-${idx}`}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-2 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden last:border-r-0 transition-all ${isClickableHead}`}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n onMouseEnter={() => column.sortable && setHoveredColumn(column.key)}\n onMouseLeave={() => column.sortable && setHoveredColumn(null)}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n <div\n className=\"w-full\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: getAlignStyle(column.align ?? \"\"),\n }}\n >\n {column.key === \"__checkbox__\" ? (\n <div className=\"px-1.5 pt-0.5 truncate select-none\">{column.title}</div>\n ) : (\n <div className=\"flex items-center w-full\">{renderColumnTitle(column, isClickableHead)}</div>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n }\n\n if (hasMainGroups) {\n return (\n <thead className=\"w-full sticky top-0 z-10\">\n <tr className=\"w-full h-8\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const fixedStyle = getColumnFixedStyle(column);\n\n if (column.mainTitle && column.subTitle) {\n const mainGroup = mainGroups[column.mainTitle];\n if (!mainGroup) {\n return null;\n }\n const mainGroupColumns = Object.values(mainGroup).flat();\n const isFirstInMainGroup = mainGroupColumns[0] === column;\n const mainGroupSpan = mainGroupColumns.length;\n const mainTitleRowSpan = (column as Column<T> & { mainTitleRowSpan?: number }).mainTitleRowSpan;\n\n if (isFirstInMainGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`main-group-${column.mainTitle}-${idx}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={mainGroupSpan}\n rowSpan={mainTitleRowSpan ?? 1}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.mainTitle}\n </th>\n );\n }\n\n return null;\n }\n\n if (column.subTitle) {\n const groupColumns = subGroups[column.subTitle];\n if (!groupColumns) {\n return null;\n }\n const isFirstInGroup = groupColumns[0] === column;\n const groupSpan = groupColumns.length;\n\n if (isFirstInGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`sub-group-${column.subTitle}-${idx}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={groupSpan}\n rowSpan={2}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.subTitle}\n </th>\n );\n }\n\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={`${column.key}-${idx}`}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all ${column.sortable ? \"cursor-pointer\" : \"\"}`}\n rowSpan={3}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n {renderColumnTitle(column, column.sortable ? \"cursor-pointer\" : \"\")}\n </th>\n );\n })}\n </tr>\n\n <tr className=\"w-full h-8\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const fixedStyle = getColumnFixedStyle(column);\n\n if (!column.mainTitle || !column.subTitle) {\n return null;\n }\n\n const mainGroup = mainGroups[column.mainTitle];\n if (!mainGroup) {\n return null;\n }\n\n const mainGroupFirstColumn = Object.values(mainGroup).flat()[0];\n const firstRowSpan = (mainGroupFirstColumn as Column<T> & { mainTitleRowSpan?: number }).mainTitleRowSpan;\n if (firstRowSpan && firstRowSpan >= 2) {\n return null;\n }\n\n const subGroup = mainGroup[column.subTitle];\n if (!subGroup) {\n return null;\n }\n const isFirstInSubGroup = subGroup[0] === column;\n const subGroupSpan = subGroup.length;\n\n if (isFirstInSubGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`sub-group-${column.mainTitle}-${column.subTitle}-${idx}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={subGroupSpan}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.subTitle}\n </th>\n );\n }\n\n return null;\n })}\n </tr>\n\n <tr className=\"w-full h-8\">\n {columns.map((column, idx) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n if (!column.mainTitle && !column.subTitle) {\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={`${column.key}-${idx}`}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden transition-all ${isClickableHead}`}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n <div\n className=\"w-full\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: getAlignStyle(column.align ?? \"\"),\n }}\n >\n <div className=\"flex items-center w-full\">{renderColumnTitle(column, isClickableHead)}</div>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n }\n\n return (\n <thead className=\"w-full sticky top-0 z-10\">\n <tr className=\"w-full h-8 \">\n {columns.map((column) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n if (column.subTitle) {\n const groupColumns = subGroups[column.subTitle];\n if (!groupColumns) {\n return null;\n }\n const isFirstInGroup = groupColumns[0] === column;\n const groupSpan = groupColumns.length;\n\n if (isFirstInGroup) {\n return (\n <th\n id={`${column.key}-header`}\n key={`group-${column.subTitle}`}\n {...getDragProps(column)}\n className=\"bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all\"\n colSpan={groupSpan}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n ...fixedStyle,\n }}\n >\n {column.subTitle}\n </th>\n );\n }\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={column.key}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-center font-semibold text-gray-700 text-sm tracking-wider transition-all ${column.sortable ? \"cursor-pointer\" : \"\"}`}\n rowSpan={2}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n {renderColumnTitle(column, isClickableHead)}\n </th>\n );\n })}\n </tr>\n\n <tr className=\"w-full h-8\">\n {columns.map((column) => {\n const width = column.width as string;\n const minWidth = column.minWidth as string;\n const maxWidth = column.maxWidth as string;\n const isClickableHead = column.sortable ? \"cursor-pointer\" : \"\";\n const fixedStyle = getColumnFixedStyle(column);\n\n if (!column.subTitle) {\n return null;\n }\n\n return (\n <th\n id={`${column.key}-header`}\n key={column.key}\n {...getDragProps(column)}\n className={`bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden transition-all ${isClickableHead}`}\n onClick={() => {\n if (column.sortable) {\n handleSort(column.key);\n }\n }}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: maxWidth || width,\n whiteSpace: \"nowrap\",\n ...fixedStyle,\n }}\n >\n <div\n className=\"w-full\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: getAlignStyle(column.align ?? \"\"),\n }}\n >\n {column.key === \"__checkbox__\" ? (\n <div className=\"px-1.5 pt-0.5 truncate select-none\">{column.title}</div>\n ) : (\n <div className=\"flex items-center w-full\">{renderColumnTitle(column, isClickableHead)}</div>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n}\n","import Skeleton from \"../../../Skeleton\";\n\nimport type { Column } from \"../config/type\";\n\ninterface SkeletonTdProps<T> {\n col: Column<T>;\n showSquare?: boolean;\n}\n\nexport default function SkeletonTd<T>(props: SkeletonTdProps<T>) {\n const { col, showSquare = false } = props;\n\n return (\n <td\n className={`${col.key === \"__checkbox__\" ? \"p-0\" : \"px-2 py-4\"} whitespace-nowrap text-sm border-r border-b border-gray-200/70 last:border-r-0`}\n style={{\n width: col.width as string,\n minWidth: (col.minWidth as string) || (col.width as string),\n maxWidth: col.key === \"__checkbox__\" ? ((col.maxWidth as string) || (col.width as string)) : undefined,\n }}\n >\n <div className=\"flex items-center justify-center min-h-4\">\n {showSquare ? (\n <Skeleton className=\"size-4 rounded-xs\" />\n ) : (\n <Skeleton className=\"h-1.5 rounded-sm\" style={{ width: \"calc(100% - 20px)\" }} />\n )}\n </div>\n </td>\n );\n}\n","import type { DragEvent, ReactNode } from \"react\";\n\ninterface TableDataRowProps {\n record: Record<string, unknown>;\n rowIdx: number;\n rowId: string;\n leftColspan: number;\n rightColspan: number;\n draggable?: boolean;\n onDragStart?: (rowId: string, event: DragEvent<HTMLTableRowElement>) => void;\n onDragOver?: (event: DragEvent<HTMLTableRowElement>) => void;\n onDrop?: (rowId: string) => void;\n onDragEnd?: () => void;\n renderLeadingPinnedCols: (record: Record<string, unknown>, rowIdx: number) => ReactNode;\n renderVisibleGroupCols: (record: Record<string, unknown>, rowIdx: number) => ReactNode;\n renderTrailingPinnedCols: (record: Record<string, unknown>, rowIdx: number) => ReactNode;\n}\n\nexport default function TableDataRow(props: TableDataRowProps) {\n const {\n record,\n rowIdx,\n rowId,\n leftColspan,\n rightColspan,\n draggable = false,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n renderLeadingPinnedCols,\n renderVisibleGroupCols,\n renderTrailingPinnedCols,\n } = props;\n\n return (\n <tr\n className=\"group bg-white hover:bg-gray-100\"\n draggable={draggable}\n onDragStart={(event) => onDragStart?.(rowId, event)}\n onDragOver={onDragOver}\n onDrop={() => onDrop?.(rowId)}\n onDragEnd={onDragEnd}\n >\n {renderLeadingPinnedCols(record, rowIdx)}\n {leftColspan > 0 && <td colSpan={leftColspan} style={{ padding: 0, border: \"none\" }} />}\n {renderVisibleGroupCols(record, rowIdx)}\n {rightColspan > 0 && <td colSpan={rightColspan} style={{ padding: 0, border: \"none\" }} />}\n {renderTrailingPinnedCols(record, rowIdx)}\n </tr>\n );\n}\n","import { TriangleAlert } from \"lucide-react\";\n\nimport Empty from \"../../../Empty\";\n\ninterface TableEmptyProps {\n columnCount: number;\n}\n\nexport default function TableEmpty(props: TableEmptyProps) {\n const { columnCount } = props;\n\n return (\n <tr>\n <td colSpan={columnCount} className=\"border-none bg-white p-0 align-middle\">\n <Empty className=\"flex min-h-72 w-full flex-col items-center justify-center gap-1\">\n <TriangleAlert className=\"size-8 shrink-0 text-gray-400\" strokeWidth={1.5} />\n <span className=\"text-lg text-gray-500\">등록된 데이터가 없습니다.</span>\n </Empty>\n </td>\n </tr>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport Tooltip from \"../../../Tooltip\";\n\ninterface TableCellContentProps {\n cellContent: ReactNode;\n tooltipText: string;\n align: string;\n tooltipConfig: \"always\" | \"overflow\" | false;\n onCellClick?: () => void;\n}\n\nexport default function TableCellContent(props: TableCellContentProps) {\n const { cellContent, tooltipText, align, tooltipConfig, onCellClick } = props;\n const textRef = useRef<HTMLDivElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useEffect(() => {\n if (tooltipConfig !== \"overflow\") return;\n const el = textRef.current;\n if (!el) return;\n const check = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\n check();\n const observer = new ResizeObserver(check);\n observer.observe(el);\n return () => observer.disconnect();\n }, [tooltipConfig]);\n\n const shouldShowTooltip = tooltipConfig === \"always\" || (tooltipConfig === \"overflow\" && isOverflowing);\n\n const textAlign = align === \"center\" ? \"center\" : align === \"right\" ? \"right\" : (\"left\" as const);\n\n return (\n <div\n ref={textRef}\n className={`ellipsis-1-line table-item w-full min-w-0 ${onCellClick ? \"hover:text-main cursor-pointer\" : \"cursor-default\"}`}\n style={{ textAlign }}\n onClick={onCellClick}\n >\n {shouldShowTooltip ? (\n <Tooltip content={tooltipText} position=\"bottom\" asChild>\n <span>{cellContent}</span>\n </Tooltip>\n ) : (\n cellContent\n )}\n </div>\n );\n}\n","import type { ColumnDef } from \"@tanstack/react-table\";\n\nimport { Z_INDEX } from \"../../../config/zIndex\";\nimport type { Column } from \"../config/type\";\n\nexport interface ColumnDragOverlayItem {\n element: HTMLElement;\n top: number;\n width: number;\n height: number;\n}\n\nexport function getAlignStyle(align: string) {\n return align === \"left\" ? \"flex-start\" : align === \"center\" ? \"center\" : \"flex-end\";\n}\n\nexport function applyColDefaults<T>(col: Column<T>): Column<T> {\n const width = col.key === \"__checkbox__\" ? \"40px\" : (col.width ?? col.minWidth);\n const align =\n col.key === \"__checkbox__\" ? (\"center\" as const) : ((col.align ?? \"left\") as \"left\" | \"center\" | \"right\");\n return { ...col, width, align };\n}\n\nexport function parseColPx<T>(col: Column<T>): number {\n const w = col.width ?? col.minWidth;\n if (typeof w === \"string\") {\n const px = parseFloat(w);\n return Number.isNaN(px) ? 100 : px;\n }\n return typeof w === \"number\" ? w : 100;\n}\n\nexport function buildColumnDefs<T>(columns: Array<Column<T>>): Array<ColumnDef<T>> {\n return columns.map(\n (col): ColumnDef<T> => ({\n id: col.key,\n accessorFn: (row) => row[col.key as keyof T],\n enableSorting: col.sortable ?? false,\n size: parseColPx(col),\n meta: { column: col },\n }),\n );\n}\n\nexport function createColumnDragGhost(items: Array<ColumnDragOverlayItem>) {\n const ghost = document.createElement(\"div\");\n ghost.style.position = \"fixed\";\n ghost.style.pointerEvents = \"none\";\n ghost.style.zIndex = String(Z_INDEX.TOP);\n ghost.style.overflow = \"hidden\";\n ghost.style.boxSizing = \"border-box\";\n\n const rects = items.map((item) => item.element.getBoundingClientRect());\n const unionLeft = Math.min(...rects.map((r) => r.left));\n const unionTop = Math.min(...rects.map((r) => r.top));\n const unionRight = Math.max(...rects.map((r) => r.right));\n const unionBottom = Math.max(...rects.map((r) => r.bottom));\n\n const ghostWidth = Math.max(unionRight - unionLeft, 1);\n const ghostHeight = Math.max(unionBottom - unionTop, 1);\n\n ghost.style.left = `${unionLeft}px`;\n ghost.style.top = `${unionTop}px`;\n ghost.style.width = `${ghostWidth}px`;\n ghost.style.height = `${ghostHeight}px`;\n\n items.forEach((item, index) => {\n const rect = rects[index];\n const cloned = item.element.cloneNode(true) as HTMLElement;\n const style = window.getComputedStyle(item.element);\n\n cloned.setAttribute(\"class\", \"\");\n cloned.setAttribute(\"style\", \"\");\n\n cloned.style.position = \"absolute\";\n cloned.style.left = `${rect.left - unionLeft}px`;\n cloned.style.top = `${rect.top - unionTop}px`;\n cloned.style.width = `${item.width}px`;\n cloned.style.height = `${item.height}px`;\n cloned.style.margin = \"0\";\n cloned.style.padding = style.padding;\n cloned.style.boxSizing = \"border-box\";\n cloned.style.background = style.background;\n cloned.style.color = style.color;\n cloned.style.font = style.font;\n cloned.style.border = style.border;\n cloned.style.borderRadius = style.borderRadius;\n cloned.style.display = style.display;\n cloned.style.alignItems = style.alignItems;\n cloned.style.justifyContent = style.justifyContent;\n cloned.style.whiteSpace = style.whiteSpace;\n cloned.style.overflow = \"hidden\";\n cloned.style.textOverflow = style.textOverflow;\n cloned.style.boxShadow = index === 0 ? \"0 1px 2px rgba(0, 0, 0, 0.08)\" : style.boxShadow;\n\n const allChildren = cloned.querySelectorAll(\"*\");\n allChildren.forEach((child) => {\n const childEl = child as HTMLElement;\n childEl.setAttribute(\"class\", \"\");\n childEl.style.width = \"100%\";\n childEl.style.height = \"100%\";\n });\n\n ghost.appendChild(cloned);\n });\n\n document.body.appendChild(ghost);\n\n return ghost;\n}\n","import { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport {\n useCallback,\n useDeferredValue,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n} from \"react\";\n\nimport Checkbox from \"../../Checkbox\";\nimport TableFooter, { type TableFooterProps } from \"./TableFooter\";\nimport TableHeader from \"./TableHeader\";\nimport useTableFixed from \"../hooks/useTableFixed\";\nimport SkeletonTd from \"./ui/SkeletonTd\";\nimport TableDataRow from \"./ui/TableDataRow\";\nimport TableEmpty from \"./ui/TableEmpty\";\nimport TableCellContent from \"./ui/TableCellContent\";\nimport { applyColDefaults, buildColumnDefs, createColumnDragGhost, getAlignStyle, parseColPx } from \"../config/utils\";\n\nimport type { Column } from \"../config/type\";\nimport type { PaginationProps } from \"../../Pagination\";\nimport type { ColumnDragOverlayItem } from \"../config/utils\";\nimport type { SortOption } from \"../config/type\";\nimport type { SortOrder } from \"../../../config/params\";\ninterface CheckboxInfo {\n selectedKeys: Array<string | number>;\n onSelectionChange: (keys: Array<string | number>) => void;\n fixed?: boolean;\n}\n\ntype DragEndResult = {\n type: \"row\" | \"column\";\n order: Array<string>;\n movedKey: string;\n targetKey: string;\n};\nexport interface TableProps<T> {\n columns: Array<Column<T>>;\n data: Array<T>;\n isLoading?: boolean;\n onRowClick?: (record: T, index: number) => void;\n rowKey?: keyof T | ((record: T, index: number) => string | number);\n\n sortOption?: SortOption; // 정렬 상태\n onSortChange?: (sortKey: string, sortOrder: SortOrder) => void; // 정렬 변경 시 호출\n\n paginationInfo?: PaginationProps; // pagination 정보\n checkboxInfo?: CheckboxInfo; // checkbox 정보\n renderFooter?: Pick<TableFooterProps, \"renderLeft\" | \"renderRight\">;\n\n rowDraggable?: boolean; // row 드래그 가능 여부\n columnDraggable?: boolean; // column 드래그 가능 여부\n onRowDragEnd?: (result: DragEndResult) => void;\n onColumnDragEnd?: (result: DragEndResult) => void;\n tooltipConfig?: \"always\" | \"overflow\" | false;\n\n isDynamicHeight?: boolean; // true일 경우 화면 높이에 테이블 높이를 맞춤\n}\n\nfunction reorderList(list: Array<string>, fromKey: string, toKey: string) {\n const fromIndex = list.indexOf(fromKey);\n const toIndex = list.indexOf(toKey);\n if (fromIndex < 0 || toIndex < 0 || fromIndex === toIndex) return list;\n\n const next = [...list];\n const moved = next.splice(fromIndex, 1)[0];\n if (moved === undefined) return list;\n next.splice(toIndex, 0, moved);\n return next;\n}\n\nexport default function Table<T>(props: TableProps<T>) {\n const {\n columns,\n data: currentData,\n isLoading = false,\n onRowClick,\n checkboxInfo,\n rowKey,\n sortOption,\n onSortChange,\n rowDraggable = false,\n columnDraggable = false,\n onRowDragEnd,\n onColumnDragEnd,\n paginationInfo,\n renderFooter,\n tooltipConfig = \"overflow\",\n isDynamicHeight = true,\n } = props;\n const { fixed = false, onSelectionChange, selectedKeys = [] } = checkboxInfo ?? {};\n const scrollRef = useRef<HTMLDivElement>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const [tableHeight, setTableHeight] = useState<number>(500);\n const [columnOrder, setColumnOrder] = useState<Array<string>>([]);\n const [draggingColumnKey, setDraggingColumnKey] = useState<string | null>(null);\n const [rowOrder, setRowOrder] = useState<Array<string>>([]);\n const [draggingRowId, setDraggingRowId] = useState<string | null>(null);\n const columnDragOverlayItemsRef = useRef<Array<ColumnDragOverlayItem>>([]);\n const columnDragGhostRef = useRef<HTMLDivElement | null>(null);\n\n const data = useDeferredValue(currentData);\n const showSkeleton = isLoading;\n const showEmpty = !isLoading && currentData.length === 0;\n\n useLayoutEffect(() => {\n if (!isDynamicHeight) return;\n const el = scrollRef.current;\n if (!el) return;\n const update = () => {\n const top = el.getBoundingClientRect().top;\n const footerH = footerRef.current?.getBoundingClientRect().height ?? 0;\n setTableHeight(window.innerHeight - top - footerH - 24);\n };\n update();\n window.addEventListener(\"resize\", update);\n const observer = new ResizeObserver(update);\n const pageContainer = el.parentElement?.parentElement;\n if (pageContainer) observer.observe(pageContainer);\n const footer = footerRef.current;\n if (footer) observer.observe(footer);\n return () => {\n window.removeEventListener(\"resize\", update);\n observer.disconnect();\n };\n }, []);\n\n useLayoutEffect(() => {\n if (!isDynamicHeight) return;\n const el = scrollRef.current;\n if (!el) return;\n const top = el.getBoundingClientRect().top;\n const footerH = footerRef.current?.getBoundingClientRect().height ?? 0;\n setTableHeight(window.innerHeight - top - footerH - 24);\n }, [showSkeleton, showEmpty]);\n\n const isAllSelected = data.length > 0 && selectedKeys.length === data.length;\n\n const selectedKeysRef = useRef(selectedKeys);\n selectedKeysRef.current = selectedKeys;\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n const dataRef = useRef(data);\n dataRef.current = data;\n const onRowClickRef = useRef(onRowClick);\n onRowClickRef.current = onRowClick;\n\n const getRowKey = useCallback(\n (record: T, index: number): string | number => {\n if (typeof rowKey === \"function\") {\n return rowKey(record, index);\n }\n const key = (rowKey ?? (\"id\" as keyof T)) as keyof T;\n return record[key] as string | number;\n },\n [rowKey],\n );\n\n const allColumns = useMemo<Array<Column<T>>>(() => {\n const checkboxCol: Column<T> = {\n key: \"__checkbox__\",\n width: \"40px\",\n minWidth: \"40px\",\n maxWidth: \"40px\",\n align: \"center\",\n fixed: fixed ? \"left\" : undefined,\n title: (\n <Checkbox\n checked={isAllSelected}\n onChange={() => {\n if (!onSelectionChangeRef.current) return;\n const allKeys = dataRef.current.map((record, index) => getRowKey(record, index));\n onSelectionChangeRef.current(isAllSelected ? [] : allKeys);\n }}\n />\n ),\n render: (_value, record, rowIdx) => {\n const key = getRowKey(record, rowIdx);\n return (\n <div className=\"flex h-full w-full items-center justify-center\">\n <Checkbox\n checked={selectedKeysRef.current.includes(key)}\n onChange={() => {\n if (!onSelectionChangeRef.current) return;\n const cur = selectedKeysRef.current;\n const next = cur.includes(key) ? cur.filter((k) => k !== key) : [...cur, key];\n onSelectionChangeRef.current(next);\n }}\n />\n </div>\n );\n },\n };\n const raw = checkboxInfo ? [checkboxCol, ...columns] : columns;\n return raw.map(applyColDefaults);\n }, [fixed, isAllSelected, checkboxInfo, columns, getRowKey]);\n\n const effectiveColumnOrder = useMemo(() => {\n const keys = allColumns.map((column) => column.key);\n if (columnOrder.length !== keys.length) return keys;\n if (!columnOrder.every((key) => keys.includes(key))) return keys;\n return columnOrder;\n }, [allColumns, columnOrder]);\n\n const orderedColumns = useMemo(() => {\n const columnMap = new Map(allColumns.map((column) => [column.key, column]));\n const ordered = effectiveColumnOrder\n .map((key) => columnMap.get(key))\n .filter((column): column is Column<T> => Boolean(column));\n const rest = allColumns.filter((column) => !effectiveColumnOrder.includes(column.key));\n return [...ordered, ...rest];\n }, [allColumns, effectiveColumnOrder]);\n\n const { leadingPinnedCols, groupCols, trailingPinnedCols } = useMemo(() => {\n const firstGroupIdx = orderedColumns.findIndex((c) => c.mainTitle || c.subTitle);\n if (firstGroupIdx === -1) {\n return {\n leadingPinnedCols: orderedColumns,\n groupCols: [] as Array<Column<T>>,\n trailingPinnedCols: [] as Array<Column<T>>,\n };\n }\n let lastGroupIdx = firstGroupIdx;\n for (let i = orderedColumns.length - 1; i >= firstGroupIdx; i--) {\n if (orderedColumns[i]?.mainTitle || orderedColumns[i]?.subTitle) {\n lastGroupIdx = i;\n break;\n }\n }\n return {\n leadingPinnedCols: orderedColumns.slice(0, firstGroupIdx),\n groupCols: orderedColumns.slice(firstGroupIdx, lastGroupIdx + 1),\n trailingPinnedCols: orderedColumns.slice(lastGroupIdx + 1),\n };\n }, [orderedColumns]);\n\n const segmentByKey = useMemo(() => {\n const map = new Map<string, \"leading\" | \"group\" | \"trailing\">();\n leadingPinnedCols.forEach((c) => map.set(c.key, \"leading\"));\n groupCols.forEach((c) => map.set(c.key, \"group\"));\n trailingPinnedCols.forEach((c) => map.set(c.key, \"trailing\"));\n return map;\n }, [leadingPinnedCols, groupCols, trailingPinnedCols]);\n\n const isColumnDraggable = useCallback(\n (columnKey: string) => columnDraggable && groupCols.length === 0 && columnKey !== \"__checkbox__\",\n [columnDraggable, groupCols],\n );\n\n const handleColumnDragStartCapture = useCallback(\n (columnKey: string) => {\n if (!columnDraggable) return;\n\n const containerEl = scrollRef.current;\n if (!containerEl) return;\n\n const containerRect = containerEl.getBoundingClientRect();\n const cellEls = Array.from(containerEl.querySelectorAll<HTMLElement>(`[data-col-key=\"${columnKey}\"]`));\n\n const items = cellEls.map((cellEl) => {\n const cellRect = cellEl.getBoundingClientRect();\n return {\n element: cellEl,\n top: cellRect.top - containerRect.top + containerEl.scrollTop,\n width: cellRect.width,\n height: cellRect.height,\n };\n });\n\n columnDragOverlayItemsRef.current = items;\n },\n [columnDraggable],\n );\n\n const handleColumnDragStart = useCallback(\n (columnKey: string, event: DragEvent<HTMLTableCellElement>) => {\n if (!columnDraggable) return;\n\n const items = columnDragOverlayItemsRef.current;\n if (items.length > 0 && event.dataTransfer) {\n const ghost = createColumnDragGhost(items);\n columnDragGhostRef.current = ghost;\n event.dataTransfer.effectAllowed = \"move\";\n const ghostRect = ghost.getBoundingClientRect();\n const rawX = event.clientX - ghostRect.left;\n const rawY = event.clientY - ghostRect.top;\n const offsetX = Math.min(Math.max(0, rawX), ghostRect.width);\n const offsetY = Math.min(Math.max(0, rawY), ghostRect.height);\n event.dataTransfer.setDragImage(ghost, offsetX, offsetY);\n ghost.style.left = \"-9999px\";\n ghost.style.top = \"-9999px\";\n }\n\n setDraggingColumnKey(columnKey);\n },\n [columnDraggable],\n );\n\n const handleColumnDragEnd = useCallback(() => {\n setDraggingColumnKey(null);\n columnDragOverlayItemsRef.current = [];\n if (columnDragGhostRef.current) {\n columnDragGhostRef.current.remove();\n columnDragGhostRef.current = null;\n }\n }, []);\n\n const handleColumnDragOver = useCallback((event: DragEvent<HTMLTableCellElement>) => {\n event.preventDefault();\n }, []);\n\n const handleColumnDrop = useCallback(\n (targetColumnKey: string) => {\n if (!draggingColumnKey) return;\n if (!columnDraggable) return;\n if (!isColumnDraggable(draggingColumnKey) || !isColumnDraggable(targetColumnKey)) {\n setDraggingColumnKey(null);\n return;\n }\n // Drag is allowed only within the same segment (leading / group / trailing).\n // Cross-segment drag would silently break virtualization and header alignment.\n if (segmentByKey.get(draggingColumnKey) !== segmentByKey.get(targetColumnKey)) {\n setDraggingColumnKey(null);\n return;\n }\n const keys =\n columnOrder.length === orderedColumns.length ? columnOrder : orderedColumns.map((column) => column.key);\n const nextOrder = reorderList(keys, draggingColumnKey, targetColumnKey);\n setColumnOrder(nextOrder);\n onColumnDragEnd?.({\n type: \"column\",\n order: nextOrder,\n movedKey: draggingColumnKey,\n targetKey: targetColumnKey,\n });\n setDraggingColumnKey(null);\n columnDragOverlayItemsRef.current = [];\n if (columnDragGhostRef.current) {\n columnDragGhostRef.current.remove();\n columnDragGhostRef.current = null;\n }\n },\n [columnDraggable, columnOrder, draggingColumnKey, isColumnDraggable, onColumnDragEnd, orderedColumns, segmentByKey],\n );\n\n // Dev-only structural validation. Helps catch column-definition mistakes that would\n // otherwise silently misalign header colSpans against virtualized body cells.\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return;\n\n const mainTitleEnded = new Map<string, boolean>();\n const subTitleEnded = new Map<string, boolean>();\n let prevMain: string | undefined;\n let prevSub: string | undefined;\n\n for (const col of orderedColumns) {\n if (col.mainTitle !== prevMain) {\n if (prevMain !== undefined) mainTitleEnded.set(prevMain, true);\n if (col.mainTitle) {\n if (mainTitleEnded.get(col.mainTitle)) {\n console.warn(\n `[Table] Non-contiguous mainTitle \"${col.mainTitle}\" at column \"${col.key}\". ` +\n `Group header colSpan and body cell positions will misalign.`,\n );\n } else if (!mainTitleEnded.has(col.mainTitle)) {\n mainTitleEnded.set(col.mainTitle, false);\n }\n }\n prevMain = col.mainTitle;\n }\n if (col.subTitle !== prevSub) {\n if (prevSub !== undefined) subTitleEnded.set(prevSub, true);\n if (col.subTitle) {\n if (subTitleEnded.get(col.subTitle)) {\n console.warn(\n `[Table] Non-contiguous subTitle \"${col.subTitle}\" at column \"${col.key}\". ` +\n `Sub-group header colSpan will not match body cell layout.`,\n );\n } else if (!subTitleEnded.has(col.subTitle)) {\n subTitleEnded.set(col.subTitle, false);\n }\n }\n prevSub = col.subTitle;\n }\n }\n\n const firstGroupIdx = orderedColumns.findIndex((c) => c.mainTitle || c.subTitle);\n if (firstGroupIdx !== -1) {\n let lastGroupIdx = firstGroupIdx;\n for (let i = orderedColumns.length - 1; i >= firstGroupIdx; i--) {\n if (orderedColumns[i]?.mainTitle || orderedColumns[i]?.subTitle) {\n lastGroupIdx = i;\n break;\n }\n }\n for (let i = firstGroupIdx; i <= lastGroupIdx; i++) {\n const col = orderedColumns[i];\n if (col && !col.mainTitle && !col.subTitle) {\n console.warn(\n `[Table] Plain column \"${col.key}\" sits inside the grouped-header range. ` +\n `It will be virtualized and its \"fixed\" property will be ignored.`,\n );\n }\n }\n }\n }, [orderedColumns]);\n\n const estimatedLeadingPinnedWidth = useMemo(\n () => leadingPinnedCols.reduce((sum, col) => sum + parseColPx(col), 0),\n [leadingPinnedCols],\n );\n // Sticky-right trailing only — non-sticky trailing flows with horizontal scroll\n // and shares the virtualized viewport, so it must NOT be subtracted from width.\n const estimatedStickyTrailingPinnedWidth = useMemo(\n () => trailingPinnedCols.filter((c) => c.fixed === \"right\").reduce((sum, col) => sum + parseColPx(col), 0),\n [trailingPinnedCols],\n );\n\n const columnVirtualizer = useVirtualizer({\n count: groupCols.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: (i) => parseColPx(groupCols[i] ?? ({} as Column<T>)),\n horizontal: true,\n overscan: 5,\n scrollMargin: estimatedLeadingPinnedWidth,\n initialRect: {\n width: Math.max(0, window.innerWidth - estimatedLeadingPinnedWidth - estimatedStickyTrailingPinnedWidth),\n height: 600,\n },\n });\n\n const virtualItems = columnVirtualizer.getVirtualItems();\n const startIdx = virtualItems[0]?.index ?? 0;\n const endIdx = virtualItems.length > 0 ? (virtualItems[virtualItems.length - 1]?.index ?? 0) + 1 : 0;\n const leftColspan = startIdx;\n const rightColspan = groupCols.length - endIdx;\n\n // Pass full visual order so left/right offsets accumulate in the same order users see.\n // useTableFixed only accumulates width for cols with `fixed` set, so non-fixed cols are no-op.\n const { getColumnFixedStyle } = useTableFixed<T>(orderedColumns, false);\n\n const getColumnFixedStyleRef = useRef(getColumnFixedStyle);\n getColumnFixedStyleRef.current = getColumnFixedStyle;\n const leadingPinnedColsRef = useRef(leadingPinnedCols);\n leadingPinnedColsRef.current = leadingPinnedCols;\n const trailingPinnedColsRef = useRef(trailingPinnedCols);\n trailingPinnedColsRef.current = trailingPinnedCols;\n const groupColsRef = useRef(groupCols);\n groupColsRef.current = groupCols;\n const virtualItemsRef = useRef(virtualItems);\n virtualItemsRef.current = virtualItems;\n\n const rowSelection = useMemo(() => Object.fromEntries(selectedKeys.map((k) => [String(k), true])), [selectedKeys]);\n\n const tanstackCols = useMemo(() => buildColumnDefs<T>(orderedColumns), [orderedColumns]);\n\n const table = useReactTable({\n data,\n columns: tanstackCols,\n getCoreRowModel: getCoreRowModel(),\n enableRowSelection: !!checkboxInfo,\n getRowId: (row, index) => String(getRowKey(row, index)),\n state: { rowSelection },\n onRowSelectionChange: (updater) => {\n if (isLoading) return;\n const next = typeof updater === \"function\" ? updater(rowSelection) : updater;\n const newKeys: Array<string | number> = Object.keys(next)\n .filter((k) => next[k])\n .map((k) => {\n const n = Number(k);\n return Number.isNaN(n) ? k : n;\n });\n onSelectionChangeRef.current?.(newKeys);\n },\n manualSorting: true,\n manualPagination: true,\n });\n\n const renderTd = useCallback(\n (col: Column<T>, record: Record<string, unknown>, rowIdx: number, colIdx: number, isPinned: boolean) => {\n const { width, minWidth, maxWidth, align } = col;\n const fixedStyle = isPinned ? getColumnFixedStyleRef.current(col) : undefined;\n const cellContent = col.render ? col.render(record[col.key], record as T, rowIdx) : String(record[col.key] ?? \"\");\n\n const isCheckbox = col.key === \"__checkbox__\";\n return (\n <td\n key={`${col.key}-${colIdx}`}\n id={`${col.key}-body`}\n data-row-cell=\"true\"\n data-col-key={col.key}\n className={`${isCheckbox ? \"p-0\" : \"px-2 py-3\"} whitespace-nowrap text-sm text-gray-900 border-r border-b border-gray-200 last:border-r-0 bg-inherit group-hover:bg-gray-100 transition-all`}\n style={{\n width,\n minWidth: minWidth || width,\n maxWidth: isCheckbox ? maxWidth || width : undefined,\n ...fixedStyle,\n }}\n onClick={(event) => {\n if (col.key === \"__checkbox__\") event.stopPropagation();\n }}\n >\n <div className=\"flex\" style={{ justifyContent: getAlignStyle(align ?? \"\") }}>\n <TableCellContent\n cellContent={cellContent}\n tooltipText={String(record[col.key] ?? \"\")}\n align={align ?? \"\"}\n tooltipConfig={col.key === \"__checkbox__\" ? false : tooltipConfig}\n onCellClick={\n col.key !== \"__checkbox__\" && onRowClickRef.current\n ? () => onRowClickRef.current?.(record as T, rowIdx)\n : undefined\n }\n />\n </div>\n </td>\n );\n },\n [tooltipConfig],\n );\n\n const renderLeadingPinnedCols = useCallback(\n (record: Record<string, unknown>, rowIdx: number) =>\n leadingPinnedColsRef.current.map((col, idx) => renderTd(col, record, rowIdx, idx, true)),\n [renderTd],\n );\n\n const renderTrailingPinnedCols = useCallback(\n (record: Record<string, unknown>, rowIdx: number) =>\n trailingPinnedColsRef.current.map((col, idx) => renderTd(col, record, rowIdx, idx, true)),\n [renderTd],\n );\n\n const renderVisibleGroupCols = useCallback(\n (record: Record<string, unknown>, rowIdx: number) =>\n virtualItemsRef.current.map((vc) => {\n const col = groupColsRef.current[vc.index];\n if (!col) return null;\n return renderTd(col, record, rowIdx, vc.index, false);\n }),\n [renderTd],\n );\n\n const baseRows = table.getRowModel().rows;\n\n const effectiveRowOrder = useMemo(() => {\n const ids = baseRows.map((row) => String(getRowKey(row.original, row.index)));\n if (rowOrder.length !== ids.length) return ids;\n if (!rowOrder.every((id) => ids.includes(id))) return ids;\n return rowOrder;\n }, [baseRows, getRowKey, rowOrder]);\n\n const handleRowDragStart = useCallback(\n (rowId: string, event: DragEvent<HTMLTableRowElement>) => {\n if (!rowDraggable) return;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", rowId);\n }\n setDraggingRowId(rowId);\n },\n [rowDraggable],\n );\n\n const handleRowDragEnd = useCallback(() => {\n setDraggingRowId(null);\n }, []);\n\n const handleRowDragOver = useCallback((event: DragEvent<HTMLTableRowElement>) => {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"move\";\n }\n }, []);\n\n const handleRowDrop = useCallback(\n (targetRowId: string) => {\n if (!draggingRowId) return;\n if (!rowDraggable) return;\n\n const ids =\n rowOrder.length === effectiveRowOrder.length\n ? rowOrder\n : baseRows.map((row) => String(getRowKey(row.original, row.index)));\n const nextOrder = reorderList(ids, draggingRowId, targetRowId);\n setRowOrder(nextOrder);\n onRowDragEnd?.({\n type: \"row\",\n order: nextOrder,\n movedKey: draggingRowId,\n targetKey: targetRowId,\n });\n setDraggingRowId(null);\n },\n [baseRows, draggingRowId, effectiveRowOrder.length, getRowKey, onRowDragEnd, rowDraggable, rowOrder],\n );\n\n const rows = useMemo(() => {\n const rowMap = new Map(baseRows.map((row) => [String(getRowKey(row.original, row.index)), row]));\n const ordered = effectiveRowOrder\n .map((id) => rowMap.get(id))\n .filter((row): row is (typeof baseRows)[number] => Boolean(row));\n const rest = baseRows.filter((row) => !effectiveRowOrder.includes(String(getRowKey(row.original, row.index))));\n return [...ordered, ...rest];\n }, [baseRows, effectiveRowOrder, getRowKey]);\n\n return (\n <div className=\"bg-white rounded shadow-panel\">\n <div\n id=\"table-layout\"\n ref={scrollRef}\n className=\"relative w-full overflow-y-auto overflow-x-auto custom-view-scrollbar bg-white\"\n style={{ height: `${tableHeight}px` }}\n >\n <table className=\"w-full table-fixed\">\n <TableHeader\n columns={orderedColumns}\n getAlignStyle={getAlignStyle}\n sortOption={sortOption}\n onSortChange={onSortChange}\n onColumnDragStartCapture={handleColumnDragStartCapture}\n onColumnDragStart={handleColumnDragStart}\n onColumnDrop={handleColumnDrop}\n onColumnDragEnd={handleColumnDragEnd}\n onColumnDragOver={handleColumnDragOver}\n isColumnDraggable={isColumnDraggable}\n />\n <tbody className=\"w-full h-full\">\n {showSkeleton ? (\n Array.from({ length: 3 }).map((_, rowIdx) => (\n <tr key={rowIdx} className=\"hover:bg-gray-50\">\n {leadingPinnedCols.map((col, idx) => (\n <SkeletonTd key={`leading-${idx}`} col={col} showSquare={idx === 0 && !!checkboxInfo} />\n ))}\n {leftColspan > 0 && <td colSpan={leftColspan} style={{ padding: 0, border: \"none\" }} />}\n {virtualItems.map((vc) => (\n <SkeletonTd key={`group-${vc.index}`} col={groupCols[vc.index]} />\n ))}\n {rightColspan > 0 && <td colSpan={rightColspan} style={{ padding: 0, border: \"none\" }} />}\n {trailingPinnedCols.map((col, idx) => (\n <SkeletonTd key={`trailing-${idx}`} col={col} />\n ))}\n </tr>\n ))\n ) : showEmpty ? (\n <TableEmpty columnCount={allColumns.length} />\n ) : (\n rows.map((row) => {\n const rowId = String(getRowKey(row.original, row.index));\n return (\n <TableDataRow\n key={row.id}\n record={row.original as Record<string, unknown>}\n rowIdx={row.index}\n rowId={rowId}\n draggable={rowDraggable && !showSkeleton}\n onDragStart={handleRowDragStart}\n onDragOver={handleRowDragOver}\n onDrop={handleRowDrop}\n onDragEnd={handleRowDragEnd}\n leftColspan={leftColspan}\n rightColspan={rightColspan}\n renderLeadingPinnedCols={renderLeadingPinnedCols}\n renderVisibleGroupCols={renderVisibleGroupCols}\n renderTrailingPinnedCols={renderTrailingPinnedCols}\n />\n );\n })\n )}\n </tbody>\n </table>\n </div>\n {!showEmpty && !showSkeleton && (paginationInfo || renderFooter?.renderLeft || renderFooter?.renderRight) && (\n <div ref={footerRef}>\n <TableFooter\n paginationInfo={paginationInfo}\n renderLeft={renderFooter?.renderLeft}\n renderRight={renderFooter?.renderRight}\n />\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../../lib/variants\";\nimport useEmblaCarousel, { type UseEmblaCarouselType } from \"embla-carousel-react\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport Button from \"../../Button\";\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: \"horizontal\" | \"vertical\";\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext],\n );\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n className={cn(\"flex\", orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"carousel\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-12 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <div>\n <ChevronLeft className=\"text-black\" />\n </div>\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\nfunction CarouselNext({\n className,\n variant = \"carousel\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-12 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <div>\n <ChevronRight />\n </div>\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport { type CarouselApi, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext };\n","import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\nimport {\n type CarouselApi,\n Carousel as CarouselBase,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"./ui/carousel\";\n\nexport interface CarouselRef {\n /** 현재 선택된 슬라이드 인덱스 */\n currentIndex: number;\n /** Embla Carousel API 인스턴스 */\n api: CarouselApi | undefined;\n /** 특정 인덱스로 이동 */\n scrollTo: (index: number) => void;\n /** 이전 슬라이드로 이동 */\n scrollPrev: () => void;\n /** 다음 슬라이드로 이동 */\n scrollNext: () => void;\n /** 이전 슬라이드로 이동 가능한지 여부 */\n canScrollPrev: boolean;\n /** 다음 슬라이드로 이동 가능한지 여부 */\n canScrollNext: boolean;\n}\n\nexport interface CarouselProps {\n /** 캐러셀에 표시할 아이템들 */\n children: React.ReactNode;\n /** 화살표 버튼 표시 여부 (기본: true) */\n showArrows?: boolean;\n /** 인디케이터(도트) 표시 여부 (기본: false) */\n showDots?: boolean;\n /** 자동 재생 여부 (기본: false) 3000ms 마다 자동 재생 */\n autoPlay?: boolean;\n /** 자동 재생 간격 (ms, 기본: 3000) */\n autoPlayInterval?: number;\n /** 무한 루프 여부 (기본: false) */\n loop?: boolean;\n /** 아이템 간격 (px, 기본: 16) */\n spacing?: number;\n /** 화살표 버튼 위치 (기본: \"outside\") */\n arrowsPosition?: \"inside\" | \"outside\";\n /** 커스텀 이전 버튼 (제공하지 않으면 기본 버튼 사용) */\n previousButton?: React.ReactNode;\n /** 커스텀 다음 버튼 (제공하지 않으면 기본 버튼 사용) */\n nextButton?: React.ReactNode;\n /** 슬라이드 변경 시 호출되는 콜백 */\n onSlideChange?: (index: number) => void;\n /** 초기 슬라이드 인덱스 (기본: 0) */\n initialSlide?: number;\n /** 컨테이너 커스텀 클래스 */\n containerClassName?: string;\n /** 컨텐츠 영역 커스텀 클래스 */\n contentClassName?: string;\n /** 아이템 커스텀 클래스 */\n itemClassName?: string;\n /** 인디케이터 커스텀 클래스 */\n dotsClassName?: string;\n /** 인디케이터 활성화 상태 커스텀 클래스 */\n dotActiveClassName?: string;\n /** Embla 캐러셀 옵션 */\n carouselOptions?: Parameters<typeof CarouselBase>[0][\"opts\"];\n /** Embla 캐러셀 플러그인 */\n plugins?: Parameters<typeof CarouselBase>[0][\"plugins\"];\n}\n\nconst Carousel = forwardRef<CarouselRef, CarouselProps>(function Carousel(props, ref) {\n const {\n children,\n showArrows = true,\n showDots = false,\n autoPlay = false,\n autoPlayInterval = 3000,\n loop = false,\n spacing = 16,\n arrowsPosition = \"inside\",\n previousButton,\n nextButton,\n onSlideChange,\n initialSlide = 0,\n containerClassName,\n contentClassName,\n itemClassName,\n dotsClassName,\n dotActiveClassName,\n carouselOptions,\n plugins,\n } = props;\n const [api, setApi] = useState<CarouselApi>();\n const [selectedIndex, setSelectedIndex] = useState(initialSlide);\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n const [pauseToken, setPauseToken] = useState<symbol | null>(null);\n const autoPlayTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // 초기 슬라이드 설정\n useEffect(() => {\n if (!api || initialSlide === 0) return;\n api.scrollTo(initialSlide);\n }, [api, initialSlide]);\n\n // 슬라이드 변경 감지 및 버튼 상태 업데이트\n useEffect(() => {\n if (!api) return;\n\n const onSelect = () => {\n const index = api.selectedScrollSnap();\n setSelectedIndex(index);\n\n // loop가 false일 때 버튼 disabled 상태 업데이트\n if (!loop) {\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n } else {\n // loop가 true일 때는 항상 스크롤 가능\n setCanScrollPrev(true);\n setCanScrollNext(true);\n }\n\n onSlideChange?.(index);\n };\n\n api.on(\"select\", onSelect);\n api.on(\"reInit\", onSelect);\n onSelect();\n\n return () => {\n api.off(\"select\", onSelect);\n api.off(\"reInit\", onSelect);\n };\n }, [api, onSlideChange, loop]);\n\n // ref를 통해 부모 컴포넌트에 현재 상태 노출\n useImperativeHandle(\n ref,\n () => ({\n currentIndex: selectedIndex,\n api,\n scrollTo: (index: number) => api?.scrollTo(index),\n scrollPrev: () => api?.scrollPrev(),\n scrollNext: () => api?.scrollNext(),\n canScrollPrev,\n canScrollNext,\n }),\n [selectedIndex, api, canScrollPrev, canScrollNext],\n );\n\n // 자동 재생 (pauseToken이 null이 아니면 일시 정지)\n useEffect(() => {\n if (!autoPlay || !api || pauseToken !== null) {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n autoPlayTimerRef.current = null;\n }\n return;\n }\n\n autoPlayTimerRef.current = setInterval(() => {\n if (api.canScrollNext()) {\n api.scrollNext();\n } else if (loop) {\n api.scrollTo(0);\n } else {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n autoPlayTimerRef.current = null;\n }\n }\n }, autoPlayInterval);\n\n return () => {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n autoPlayTimerRef.current = null;\n }\n };\n }, [autoPlay, api, autoPlayInterval, loop, pauseToken]);\n\n // pauseToken이 있으면 대기 후 재개 (재클릭 시 새 symbol로 타이머 리셋)\n useEffect(() => {\n if (!autoPlay || pauseToken === null) return;\n const timer = setTimeout(() => setPauseToken(null), autoPlayInterval);\n return () => clearTimeout(timer);\n }, [pauseToken, autoPlay, autoPlayInterval]);\n\n // 수동 조작 시 자동 재생 일시 정지 — Symbol()로 고유 토큰 발행, ref 접근 없음\n const pauseAutoPlay = useCallback(() => {\n if (!autoPlay) return;\n setPauseToken(Symbol());\n }, [autoPlay]);\n\n // children을 배열로 변환\n const childrenArray = React.Children.toArray(children);\n const totalSlides = childrenArray.length;\n\n // 인디케이터 클릭 핸들러\n const handleDotClick = (index: number) => {\n pauseAutoPlay();\n api?.scrollTo(index);\n };\n\n // 커스텀 버튼에 onClick 핸들러와 disabled 상태 주입\n const enhanceButton = (button: React.ReactNode, onClickHandler: () => void, disabled: boolean) => {\n if (!button || !React.isValidElement(button)) return null;\n\n const buttonElement = button as React.ReactElement<React.ButtonHTMLAttributes<HTMLButtonElement>>;\n const existingProps = buttonElement.props || {};\n\n return React.cloneElement(buttonElement, {\n ...existingProps,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n if (existingProps.onClick) {\n existingProps.onClick(e);\n }\n onClickHandler();\n },\n disabled: disabled || existingProps.disabled,\n });\n };\n\n return (\n <CarouselBase\n orientation=\"horizontal\"\n opts={{\n loop,\n align: \"start\",\n slidesToScroll: 1,\n ...carouselOptions,\n }}\n plugins={plugins}\n setApi={setApi}\n className={cn(\"relative w-full\", containerClassName)}\n >\n <CarouselContent\n className={cn(\"-ml-4\", contentClassName)}\n style={{\n gap: `${spacing}px`,\n }}\n >\n {childrenArray.map((child, index) => (\n <CarouselItem\n key={index}\n className={cn(\"basis-full\", itemClassName)}\n style={{\n paddingLeft: `${spacing}px`,\n }}\n >\n {child}\n </CarouselItem>\n ))}\n </CarouselContent>\n\n {showArrows && (\n <>\n {previousButton ? (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 z-10\",\n arrowsPosition === \"inside\" ? \"left-4\" : \"-left-12\",\n )}\n >\n {enhanceButton(\n previousButton,\n () => {\n pauseAutoPlay();\n api?.scrollPrev();\n },\n !loop && !canScrollPrev,\n )}\n </div>\n ) : (\n <CarouselPrevious\n className={cn(\n \"disabled:opacity-50 disabled:cursor-not-allowed text-black disabled:bg-gray-100\",\n arrowsPosition === \"inside\" ? \"left-4 -translate-x-0\" : \"\",\n )}\n disabled={!loop && !canScrollPrev}\n onClick={() => {\n pauseAutoPlay();\n api?.scrollPrev();\n }}\n />\n )}\n {nextButton ? (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 z-10\",\n arrowsPosition === \"inside\" ? \"right-4\" : \"-right-12\",\n )}\n >\n {enhanceButton(\n nextButton,\n () => {\n pauseAutoPlay();\n api?.scrollNext();\n },\n !loop && !canScrollNext,\n )}\n </div>\n ) : (\n <CarouselNext\n className={cn(\n \"disabled:opacity-50 disabled:cursor-not-allowed text-black disabled:bg-gray-100\",\n arrowsPosition === \"inside\" ? \"right-4 -translate-x-0\" : \"\",\n )}\n disabled={!loop && !canScrollNext}\n onClick={() => {\n pauseAutoPlay();\n api?.scrollNext();\n }}\n />\n )}\n </>\n )}\n\n {showDots && totalSlides > 1 && (\n <div className={cn(\"flex justify-center items-center gap-2 mt-4\", dotsClassName)}>\n {Array.from({ length: totalSlides }).map((_, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleDotClick(index)}\n className={cn(\n \"w-2 h-2 rounded-full transition-all\",\n selectedIndex === index\n ? cn(\"bg-gray-900 w-6\", dotActiveClassName)\n : \"bg-gray-300 hover:bg-gray-400\",\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n )}\n </CarouselBase>\n );\n});\n\nexport default Carousel;\n","import type { FilePreviewViewerFeatures } from \"./type\";\n\nexport const DEFAULT_FEATURES: Required<FilePreviewViewerFeatures> = {\n zoom: true,\n rotate: true,\n download: true,\n navigation: true,\n};\n","import { getPreviewFileType } from \"./utils\";\n\ninterface CacheEntry {\n blobUrl: string;\n refCount: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\n/** 요청마다 다른 이미지가 내려오는 URL을 안정적인 키로 변환 */\nexport function normalizeImagePreviewKey(src: string): string {\n try {\n const url = new URL(src, window.location.origin);\n if (!url.hostname.includes(\"picsum.photos\")) return src;\n\n const random = url.searchParams.get(\"random\");\n const hasStablePath = url.pathname.includes(\"/id/\") || url.pathname.includes(\"/seed/\");\n\n if (random && !hasStablePath) {\n const segments = url.pathname.split(\"/\").filter(Boolean);\n const width = segments[0] ?? \"800\";\n const height = segments[1] ?? \"600\";\n return `https://picsum.photos/seed/preview-${random}/${width}/${height}`;\n }\n } catch {\n // ignore\n }\n\n return src;\n}\n\nexport async function resolveStableImageSrc(src: string): Promise<string> {\n if (getPreviewFileType(src) !== \"image\") return src;\n if (src.startsWith(\"blob:\") || src.startsWith(\"data:\")) return src;\n\n const key = normalizeImagePreviewKey(src);\n const cached = cache.get(key);\n if (cached) {\n cached.refCount += 1;\n return cached.blobUrl;\n }\n\n try {\n const response = await fetch(key, { mode: \"cors\" });\n if (!response.ok) throw new Error(\"Failed to fetch image\");\n\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n cache.set(key, { blobUrl, refCount: 1 });\n return blobUrl;\n } catch {\n return key;\n }\n}\n\nexport function releaseStableImageSrc(src: string): void {\n if (getPreviewFileType(src) !== \"image\") return;\n if (src.startsWith(\"blob:\") || src.startsWith(\"data:\")) return;\n\n const key = normalizeImagePreviewKey(src);\n const entry = cache.get(key);\n if (!entry) return;\n\n entry.refCount -= 1;\n if (entry.refCount <= 0) {\n URL.revokeObjectURL(entry.blobUrl);\n cache.delete(key);\n }\n}\n","import type { PreviewFileType } from \"./type\";\nimport { resolveStableImageSrc } from \"./stableImageSrc\";\n\nconst IMAGE_EXTENSIONS = new Set([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\", \"bmp\", \"avif\", \"heic\", \"heif\"]);\n\nconst PDF_EXTENSIONS = new Set([\"pdf\"]);\n\nconst MIME_FILE_TYPES: Array<{ pattern: RegExp; type: PreviewFileType }> = [\n { pattern: /^data:image\\//i, type: \"image\" },\n { pattern: /^data:application\\/pdf/i, type: \"pdf\" },\n];\n\nfunction normalizeExtension(ext: string): string {\n const lower = ext.replace(/^\\./, \"\").toLowerCase();\n if (lower === \"jpeg\") return \"jpg\";\n if (lower === \"svg+xml\") return \"svg\";\n return lower.split(\"+\")[0] || \"\";\n}\n\nfunction getExtensionFromPathname(pathname: string): string | null {\n const segments = pathname.split(\"/\");\n for (let i = segments.length - 1; i >= 0; i -= 1) {\n const segment = segments[i];\n const dotIndex = segment?.lastIndexOf(\".\") ?? -1;\n if (dotIndex <= 0) continue;\n return segment?.slice(dotIndex + 1).toLowerCase() ?? \"\";\n }\n return null;\n}\n\nexport function getExtensionFromSrc(src: string): string | null {\n for (const { pattern, type } of MIME_FILE_TYPES) {\n if (!pattern.test(src)) continue;\n if (type === \"image\") {\n const dataUrlMatch = src.match(/^data:image\\/([a-zA-Z0-9+.-]+)/i);\n return dataUrlMatch ? normalizeExtension(dataUrlMatch[1] ?? \"\") : \"jpg\";\n }\n if (type === \"pdf\") return \"pdf\";\n }\n\n try {\n const url = new URL(src, window.location.origin);\n const fromQuery = url.searchParams.get(\"format\") ?? url.searchParams.get(\"ext\");\n if (fromQuery) return normalizeExtension(fromQuery);\n\n const fromPath = getExtensionFromPathname(url.pathname);\n if (fromPath) return normalizeExtension(fromPath);\n } catch {\n // blob URL 등\n }\n\n return null;\n}\n\nfunction inferTypeFromUrl(src: string): PreviewFileType | null {\n if (src.startsWith(\"blob:\")) return null; // blob URL만으로는 타입 판별 불가 — 호출자가 별도 제공해야 함\n\n try {\n const url = new URL(src, window.location.origin);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return null;\n\n const pathname = url.pathname.toLowerCase();\n const contentType = url.searchParams.get(\"content-type\")?.toLowerCase();\n\n if (contentType?.includes(\"pdf\")) return \"pdf\";\n if (contentType?.startsWith(\"image/\")) return \"image\";\n\n if (pathname.includes(\".pdf\") || /\\/pdf(?:\\/|$)/i.test(pathname)) {\n return \"pdf\";\n }\n\n return \"image\";\n } catch {\n return null;\n }\n}\n\nexport function getPreviewFileType(src: string): PreviewFileType {\n const extension = getExtensionFromSrc(src);\n\n if (extension) {\n if (PDF_EXTENSIONS.has(extension)) return \"pdf\";\n if (IMAGE_EXTENSIONS.has(extension)) return \"image\";\n }\n\n for (const { pattern, type } of MIME_FILE_TYPES) {\n if (pattern.test(src)) return type;\n }\n\n const inferred = inferTypeFromUrl(src);\n if (inferred) return inferred;\n\n return \"unsupported\";\n}\n\nfunction hasKnownExtension(filename: string): boolean {\n const dotIndex = filename.lastIndexOf(\".\");\n if (dotIndex <= 0) return false;\n const ext = filename.slice(dotIndex + 1).toLowerCase();\n return IMAGE_EXTENSIONS.has(ext) || PDF_EXTENSIONS.has(ext);\n}\n\nfunction defaultExtensionForType(fileType: PreviewFileType): string {\n return fileType === \"pdf\" ? \"pdf\" : \"jpg\";\n}\n\nfunction withExtension(name: string, extension: string | null, fileType: PreviewFileType): string {\n if (extension && name.toLowerCase().endsWith(`.${extension}`)) return name;\n const ext = extension ?? defaultExtensionForType(fileType);\n return `${name}.${ext}`;\n}\n\nexport function getFileLabel(src: string, index: number, fileTypeOverride?: PreviewFileType): string {\n const fileType = fileTypeOverride ?? getPreviewFileType(src);\n const extension = getExtensionFromSrc(src);\n\n try {\n const pathname = new URL(src, window.location.origin).pathname;\n const filename = pathname.split(\"/\").pop();\n if (filename && hasKnownExtension(decodeURIComponent(filename))) {\n return decodeURIComponent(filename);\n }\n if (filename && /[a-zA-Z]/.test(filename) && !/^\\d+$/.test(filename)) {\n return withExtension(decodeURIComponent(filename), extension, fileType);\n }\n } catch {\n // blob URL 등은 파일명 추출 불가\n }\n\n const labelPrefix = fileType === \"pdf\" ? \"PDF\" : \"Image\";\n\n return withExtension(`${labelPrefix} ${index + 1}`, extension, fileType);\n}\n\nexport function getFileDisplayParts(src: string, index = 0): { name: string; extension: string } {\n const label = getFileLabel(src, index);\n const lastDot = label.lastIndexOf(\".\");\n\n if (lastDot > 0) {\n return {\n name: label.slice(0, lastDot),\n extension: label.slice(lastDot + 1),\n };\n }\n\n return {\n name: label,\n extension: getExtensionFromSrc(src) ?? \"\",\n };\n}\n\nexport function getAdjacentIndexes(currentIndex: number, length: number): [number, number] {\n if (length <= 1) return [currentIndex, currentIndex];\n const prev = (currentIndex - 1 + length) % length;\n const next = (currentIndex + 1) % length;\n return [prev, next];\n}\n\nexport function preloadPreviewImages<T extends string>(urls: Array<T>): void {\n urls.forEach((url) => {\n if (getPreviewFileType(url) !== \"image\") return;\n void resolveStableImageSrc(url);\n });\n}\n","import { useEffect, useState } from \"react\";\n\nimport {\n releaseStableImageSrc,\n resolveStableImageSrc,\n} from \"../config/stableImageSrc\";\n\n/** 썸네일·모달이 동일한 이미지 픽셀을 쓰도록 blob URL 캐시 */\nexport function useStableImageSrc(src: string | undefined): string {\n const [displaySrc, setDisplaySrc] = useState(src ?? \"\");\n const [prevSrc, setPrevSrc] = useState(src);\n\n if (src !== prevSrc) {\n setPrevSrc(src);\n if (src) setDisplaySrc(src);\n }\n\n useEffect(() => {\n if (!src) return;\n\n let active = true;\n\n resolveStableImageSrc(src).then((resolved) => {\n if (active) setDisplaySrc(resolved);\n });\n\n return () => {\n active = false;\n releaseStableImageSrc(src);\n };\n }, [src]);\n\n if (!src) return \"\";\n\n return displaySrc;\n}\n","import { FileText } from \"lucide-react\";\nimport { memo } from \"react\";\n\nimport type { PreviewFileType } from \"../config/type\";\nimport { useStableImageSrc } from \"../hooks/useStableImageSrc\";\n\ninterface FilePreviewViewerContentProps {\n src: string;\n alt: string;\n fileType: PreviewFileType;\n zoom: number;\n rotation: number;\n enableTransform: boolean;\n}\n\nfunction FilePreviewViewerContent(props: FilePreviewViewerContentProps) {\n const { src, alt, fileType, zoom, rotation, enableTransform } = props;\n const imageSrc = useStableImageSrc(fileType === \"image\" ? src : undefined);\n\n if (fileType === \"pdf\") {\n return (\n <div className=\"preview-viewer-container w-[90vw] h-[85vh] max-w-[90vw] max-h-[85vh] flex items-center justify-center\">\n <iframe src={src} title={alt} className=\"w-full h-full rounded bg-white border-0\" />\n </div>\n );\n }\n\n if (fileType === \"unsupported\") {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 max-w-md px-6 py-10 text-center\">\n <FileText className=\"size-12 text-gray-300\" />\n <p className=\"text-lg font-medium text-white\">지원하지 않는 파일 형식</p>\n <p className=\"text-sm text-gray-300 leading-relaxed\">이미지, PDF 형식만 미리보기할 수 있습니다.</p>\n </div>\n );\n }\n\n return (\n <div className=\"relative max-w-[85vw] max-h-[85vh] w-full h-full flex items-center justify-center\">\n <div className=\"preview-viewer-container flex items-center justify-center w-full h-full overflow-hidden\">\n <img\n src={imageSrc}\n alt={alt}\n decoding=\"async\"\n fetchPriority=\"high\"\n className=\"max-w-full max-h-full object-contain transition-transform duration-200\"\n style={\n enableTransform\n ? {\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\n transformOrigin: \"center center\",\n }\n : undefined\n }\n />\n </div>\n </div>\n );\n}\n\nexport default memo(FilePreviewViewerContent);\n","import { RotateCcw, RotateCw, ZoomIn, ZoomOut } from \"lucide-react\";\nimport { memo } from \"react\";\n\ninterface FilePreviewViewerFooterProps {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onRotateLeft: () => void;\n onRotateRight: () => void;\n showZoom: boolean;\n showRotate: boolean;\n}\n\nfunction FilePreviewViewerFooter(props: FilePreviewViewerFooterProps) {\n const { zoom, onZoomIn, onZoomOut, onRotateLeft, onRotateRight, showZoom, showRotate } = props;\n\n if (!showZoom && !showRotate) return null;\n\n const zoomPercentage = Math.round(zoom * 100);\n\n return (\n <>\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 flex items-center gap-1 shadow-2xl overflow-hidden\">\n {showZoom && (\n <>\n <button\n onClick={onZoomIn}\n disabled={zoom >= 3}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n aria-label=\"확대\"\n >\n <ZoomIn className=\"size-6 text-gray-200\" />\n </button>\n <button\n onClick={onZoomOut}\n disabled={zoom <= 0.5}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n aria-label=\"축소\"\n >\n <ZoomOut className=\"size-6 text-gray-200\" />\n </button>\n </>\n )}\n\n {showRotate && (\n <>\n <button\n onClick={onRotateLeft}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors\"\n aria-label=\"왼쪽 회전\"\n >\n <RotateCcw className=\"size-6 text-gray-200\" />\n </button>\n <button\n onClick={onRotateRight}\n className=\"px-3 py-2 rounded-lg cursor-pointer hover:bg-white/10 transition-colors\"\n aria-label=\"오른쪽 회전\"\n >\n <RotateCw className=\"size-6 text-gray-200\" />\n </button>\n </>\n )}\n </div>\n\n {showZoom && (\n <div className=\"absolute bottom-3 right-6 bg-gray-900/90 backdrop-blur-sm shadow-2xl rounded-lg border border-gray-700/50 px-3 py-1.5\">\n <span className=\"text-sm font-medium text-gray-100\">{zoomPercentage}%</span>\n </div>\n )}\n </>\n );\n}\n\nexport default memo(FilePreviewViewerFooter);\n","import { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { memo } from \"react\";\n\ninterface FilePreviewViewerNavigationProps {\n onPrevious: () => void;\n onNext: () => void;\n}\n\nfunction FilePreviewViewerNavigation(props: FilePreviewViewerNavigationProps) {\n const { onPrevious, onNext } = props;\n\n const handleClick = (handler: () => void) => (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n handler();\n };\n\n return (\n <>\n <button\n type=\"button\"\n onClick={handleClick(onPrevious)}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 bg-black/60 text-white rounded-full p-3 hover:bg-black/80 transition-colors z-10 cursor-pointer\"\n aria-label=\"이전 이미지\"\n >\n <ChevronLeft size={26} />\n </button>\n <button\n type=\"button\"\n onClick={handleClick(onNext)}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 bg-black/60 text-white rounded-full p-3 hover:bg-black/80 transition-colors z-10 cursor-pointer\"\n aria-label=\"다음 이미지\"\n >\n <ChevronRight size={26} />\n </button>\n </>\n );\n}\n\nexport default memo(FilePreviewViewerNavigation);\n","import { Download, X } from \"lucide-react\";\nimport { memo } from \"react\";\n\ninterface FilePreviewViewerTopProps {\n currentIndex: number;\n totalCount: number;\n fileLabel: string;\n onDownload: () => void;\n onClose: () => void;\n showDownload: boolean;\n showCounter: boolean;\n}\n\nfunction FilePreviewViewerTop(props: FilePreviewViewerTopProps) {\n const { currentIndex, totalCount, fileLabel, onDownload, onClose, showDownload, showCounter } = props;\n\n return (\n <div className=\"absolute top-6 left-0 w-full z-20 px-10\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-white text-sm min-w-16\">\n {showCounter ? `${currentIndex + 1} / ${totalCount}` : null}\n </div>\n\n <div className=\"bg-black/60 text-white px-4 py-2 rounded-lg text-sm max-w-md truncate\">\n {fileLabel}\n </div>\n\n <div className=\"flex items-center gap-3 min-w-16 justify-end\">\n {showDownload && (\n <button\n onClick={onDownload}\n className=\"text-white hover:text-gray-300 transition-colors cursor-pointer\"\n aria-label=\"다운로드\"\n >\n <Download size={28} />\n </button>\n )}\n\n <button\n onClick={onClose}\n className=\"text-white hover:text-gray-300 transition-colors cursor-pointer\"\n aria-label=\"닫기\"\n >\n <X size={32} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default memo(FilePreviewViewerTop);\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { DEFAULT_FEATURES } from \"./config/default\";\nimport type { PreviewFileType, FilePreviewViewerFeatures } from \"./config/type\";\nimport {\n getAdjacentIndexes,\n getFileLabel,\n getPreviewFileType,\n preloadPreviewImages,\n} from \"./config/utils\";\nimport FilePreviewViewerContent from \"./ui/FilePreviewViewerContent\";\nimport FilePreviewViewerFooter from \"./ui/FilePreviewViewerFooter\";\nimport FilePreviewViewerNavigation from \"./ui/FilePreviewViewerNavigation\";\nimport FilePreviewViewerTop from \"./ui/FilePreviewViewerTop\";\n\ninterface FilePreviewViewerSessionProps<T extends string = string> {\n fileArray: Array<T>;\n fileTypes?: Array<PreviewFileType>;\n fileNames?: Array<string>;\n initialIndex: number;\n features?: Partial<FilePreviewViewerFeatures>;\n onClose: () => void;\n}\n\nexport default function FilePreviewViewerSession<T extends string = string>(\n props: FilePreviewViewerSessionProps<T>,\n) {\n const { fileArray, fileTypes, fileNames, initialIndex, features: featuresProp, onClose } = props;\n\n const features = useMemo(() => ({ ...DEFAULT_FEATURES, ...featuresProp }), [featuresProp]);\n\n const [currentIndex, setCurrentIndex] = useState(initialIndex);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n\n const currentFile = fileArray[currentIndex];\n const isMultipleFiles = fileArray.length > 1;\n const showNavigation = isMultipleFiles && features.navigation;\n\n const fileType = useMemo(\n () => fileTypes?.[currentIndex] ?? (currentFile ? getPreviewFileType(currentFile) : \"unsupported\"),\n [fileTypes, currentIndex, currentFile],\n );\n\n const isImageFile = fileType === \"image\";\n\n const fileLabel = useMemo(\n () =>\n fileNames?.[currentIndex] ??\n (currentFile ? getFileLabel(currentFile, currentIndex, fileTypes?.[currentIndex]) : \"\"),\n [currentFile, currentIndex, fileTypes, fileNames],\n );\n\n const resetTransform = useCallback(() => {\n setZoom(1);\n setRotation(0);\n }, []);\n\n const handlePrevious = useCallback(() => {\n setCurrentIndex((prev) => (prev > 0 ? prev - 1 : fileArray.length - 1));\n resetTransform();\n }, [fileArray.length, resetTransform]);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prev) => (prev < fileArray.length - 1 ? prev + 1 : 0));\n resetTransform();\n }, [fileArray.length, resetTransform]);\n\n const handleDownload = useCallback(async () => {\n if (!currentFile || !isImageFile) return;\n\n try {\n const response = await fetch(currentFile);\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileLabel;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n } catch (error) {\n console.error(\"파일 다운로드 실패:\", error);\n }\n }, [currentFile, fileLabel, isImageFile]);\n\n const handleZoomIn = useCallback(() => {\n setZoom((prev) => Math.min(prev + 0.25, 3));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom((prev) => Math.max(prev - 0.25, 0.5));\n }, []);\n\n const handleRotateRight = useCallback(() => {\n setRotation((prev) => prev + 90);\n }, []);\n\n const handleRotateLeft = useCallback(() => {\n setRotation((prev) => prev - 90);\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowLeft\":\n if (showNavigation) {\n event.preventDefault();\n event.stopPropagation();\n handlePrevious();\n }\n break;\n case \"ArrowRight\":\n if (showNavigation) {\n event.preventDefault();\n event.stopPropagation();\n handleNext();\n }\n break;\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n onClose();\n break;\n }\n },\n [showNavigation, handlePrevious, handleNext, onClose],\n );\n\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n },\n [onClose],\n );\n\n useEffect(() => {\n if (!showNavigation) return;\n\n const [prevIndex, nextIndex] = getAdjacentIndexes(currentIndex, fileArray.length);\n const urlsToPreload = [prevIndex, nextIndex]\n .filter((idx) => idx !== currentIndex)\n .map((idx) => fileArray[idx]);\n\n preloadPreviewImages(urlsToPreload);\n }, [showNavigation, currentIndex, fileArray]);\n\n useEffect(() => {\n if (!features.zoom || !isImageFile) return;\n\n const handleWheel = (e: WheelEvent) => {\n const target = e.target as HTMLElement;\n const isImageOrContainer = target.tagName === \"IMG\" || target.closest(\".preview-viewer-container\");\n\n if (!isImageOrContainer) return;\n\n e.preventDefault();\n\n const zoomStep = 0.1;\n setZoom((prev) => (e.deltaY < 0 ? Math.min(prev + zoomStep, 3) : Math.max(prev - zoomStep, 0.5)));\n };\n\n window.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => window.removeEventListener(\"wheel\", handleWheel);\n }, [features.zoom, isImageFile]);\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = \"unset\";\n };\n }, [handleKeyDown]);\n\n if (!currentFile) return null;\n\n const showZoom = features.zoom && isImageFile;\n const showRotate = features.rotate && isImageFile;\n const showDownload = features.download && isImageFile;\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/80 flex items-center justify-center\"\n onClick={handleBackdropClick}\n >\n <FilePreviewViewerTop\n currentIndex={currentIndex}\n totalCount={fileArray.length}\n fileLabel={fileLabel}\n onDownload={handleDownload}\n onClose={onClose}\n showDownload={showDownload}\n showCounter={isMultipleFiles}\n />\n\n <div className=\"relative max-w-[90vw] max-h-[90vh] w-full h-full flex items-center justify-center\">\n <FilePreviewViewerContent\n src={currentFile}\n alt={fileLabel}\n fileType={fileType}\n zoom={zoom}\n rotation={rotation}\n enableTransform={isImageFile}\n />\n\n {showNavigation && <FilePreviewViewerNavigation onPrevious={handlePrevious} onNext={handleNext} />}\n </div>\n\n <FilePreviewViewerFooter\n zoom={zoom}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onRotateLeft={handleRotateLeft}\n onRotateRight={handleRotateRight}\n showZoom={showZoom}\n showRotate={showRotate}\n />\n </div>\n );\n}\n","import { useMemo } from \"react\";\n\nimport FilePreviewViewerSession from \"./FilePreviewViewerSession\";\nimport type { PreviewFileType, FilePreviewViewerFeatures } from \"./config/type\";\n\nexport interface FilePreviewViewerProps<T extends string = string> {\n isOpen: boolean;\n onClose: () => void;\n files: T | Array<T>;\n /** 각 파일의 타입을 명시적으로 지정합니다. blob URL처럼 URL에서 타입을 추론할 수 없을 때 사용합니다. */\n fileTypes?: Array<PreviewFileType>;\n /** 각 파일의 원본 파일명을 지정합니다. blob URL처럼 URL에서 파일명을 추출할 수 없을 때 사용합니다. */\n fileNames?: Array<string>;\n initialIndex?: number;\n features?: Partial<FilePreviewViewerFeatures>;\n}\n\nexport default function FilePreviewViewer<T extends string = string>(props: FilePreviewViewerProps<T>) {\n const { isOpen, onClose, files, fileTypes, fileNames, initialIndex = 0, features } = props;\n\n const fileArray = useMemo((): Array<T> => (Array.isArray(files) ? files : [files]), [files]);\n\n const sessionKey = useMemo(() => `${isOpen}-${initialIndex}`, [isOpen, initialIndex]);\n\n if (!isOpen) return null;\n\n return (\n <FilePreviewViewerSession\n key={sessionKey}\n fileArray={fileArray}\n fileTypes={fileTypes}\n fileNames={fileNames}\n initialIndex={initialIndex}\n features={features}\n onClose={onClose}\n />\n );\n}\n","import { createContext } from \"react\";\n\nexport interface SubmitFormValidationContextValue {\n markFieldHadValue: (name: string) => void;\n hadFieldValue: (name: string) => boolean;\n}\n\nexport const SubmitFormValidationContext = createContext<SubmitFormValidationContextValue | null>(null);\n","import { useContext } from \"react\";\n\nimport {\n SubmitFormValidationContext,\n type SubmitFormValidationContextValue,\n} from \"../validation/context\";\n\nexport function useSubmitFormValidation(): SubmitFormValidationContextValue | null {\n return useContext(SubmitFormValidationContext);\n}\n","/** Tailwind: 동적 col-span-* 는 빌드에 포함되지 않으므로 고정 맵 (gg-livestock getColspan) */\nexport const COL_SPAN_CLASS = {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n 7: \"col-span-7\",\n 8: \"col-span-8\",\n 9: \"col-span-9\",\n 10: \"col-span-10\",\n 11: \"col-span-11\",\n 12: \"col-span-12\",\n} as const;\n\nexport type ColSpanKey = keyof typeof COL_SPAN_CLASS;\n\n/** 값 영역 col-span — gg-livestock RowItem colspan (기본 10) */\nexport function resolveValueColSpan(colspan?: number): string {\n const span = colspan ?? 10;\n return COL_SPAN_CLASS[span as ColSpanKey] ?? COL_SPAN_CLASS[10];\n}\n\nconst THREE_DIGIT_AREA_CODES = new Set([\n \"031\",\n \"032\",\n \"033\",\n \"041\",\n \"042\",\n \"043\",\n \"051\",\n \"052\",\n \"053\",\n \"054\",\n \"055\",\n \"061\",\n \"062\",\n \"063\",\n]);\n\nexport function formatPhoneNumber(value: string): string {\n let digits = value.replace(/\\D/g, \"\");\n\n if (digits.startsWith(\"02\")) {\n if (digits.length > 2 && digits.length <= 6) {\n return `${digits.slice(0, 2)}-${digits.slice(2)}`;\n }\n if (digits.length > 6) {\n return `${digits.slice(0, 2)}-${digits.slice(2, 6)}-${digits.slice(6)}`;\n }\n } else if (THREE_DIGIT_AREA_CODES.has(digits.slice(0, 3))) {\n if (digits.length > 3 && digits.length <= 6) {\n return `${digits.slice(0, 3)}-${digits.slice(3)}`;\n }\n if (digits.length > 6) {\n return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}`;\n }\n } else {\n if (digits.length > 3 && digits.length <= 7) {\n return `${digits.slice(0, 3)}-${digits.slice(3)}`;\n }\n if (digits.length > 7) {\n return `${digits.slice(0, 3)}-${digits.slice(3, 7)}-${digits.slice(7)}`;\n }\n }\n\n return digits;\n}\n\nexport function resolvePhoneMaxLength(formattedValue: string): number {\n if (formattedValue.startsWith(\"02\") || THREE_DIGIT_AREA_CODES.has(formattedValue.slice(0, 3))) {\n return 12;\n }\n return 13;\n}\n\nexport function formatNumberWithCommas(value: string | number): string {\n const numStr = String(value).replace(/,/g, \"\");\n const parts = numStr.split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n}\n\nexport function removeNonNumeric(value: string, allowDecimal = false): string {\n if (allowDecimal) {\n return value.replace(/[^\\d.]/g, \"\").replace(/(\\..*?)\\./g, \"$1\");\n }\n return value.replace(/\\D/g, \"\");\n}\n\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function toSelectOptions(options: Array<{ label: string; value: string | number }> = []) {\n return options.map((opt) => ({\n label: opt.label,\n value: String(opt.value),\n }));\n}\n","/** gg-livestock RowItem / TableItem 레이아웃 (widgets/rowItem/index.tsx) */\n\nimport { cn } from \"../config/utils\";\n\nexport const SUBMIT_FORM_CLASS = \"bg-white\";\n\n/** form 밖 submit 버튼 영역 (구 SubmitFormActions 대체) */\nexport const SUBMIT_FORM_FOOTER_CLASS =\n \"flex justify-end gap-3 border-t border-gray-200 bg-neutral-50 px-6 py-4\";\n\n/** RowItem 라벨 셀 — col-span-2 고정 */\nexport const ROW_LABEL_CLASS =\n \"col-span-2 flex items-center px-5 bg-th border-b border-gray-200 transition-all duration-150 ease-in-out py-4.5 h-full\";\n\nexport const ROW_LABEL_TEXT_CLASS = \"text-sm font-semibold text-gray-800\";\n\nexport const TABLE_ROW_LABEL_CLASS = ROW_LABEL_CLASS;\n\n/** RowItem 값 셀 외곽 (FormInput 등) */\nexport const ROW_VALUE_CELL_CLASS = \"flex h-full w-full items-center border-b border-gray-200 bg-white\";\n\n/** 값 셀 내부 래퍼 (gg relative w-full + pt-3 px-2.5) */\nexport const ROW_VALUE_INNER_CLASS = \"relative w-full px-2.5 py-3\";\n\n/** 필드 한 줄 */\nexport const ROW_VALUE_FIELD_ROW_CLASS = \"flex w-full items-center\";\n\n/** textarea 래퍼 */\nexport const ROW_VALUE_TEXTAREA_WRAPPER_CLASS = \"w-full p-2\";\n\n/** validation 에러 시 border (focus 시 main으로 덮음) */\nexport const FORM_FIELD_ERROR_BORDER_CLASS = \"border-red-600\";\n\n/** focus — main blue (에러 border보다 우선) */\nexport const FORM_CONTROL_FOCUS_CLASS =\n \"focus:border-main focus-visible:border-main focus-visible:ring-1 focus-visible:ring-main/30 focus-visible:outline-none\";\n\nexport const FORM_FIELD_ERROR_MESSAGE_CLASS = \"mt-0.5 text-xs leading-tight text-red-600\";\n\nexport type FormFieldContentAlign = \"left\" | \"center\" | \"right\";\n\n/** 입력 + 에러 문구를 한 덩어리로 묶는 flex-col (에러는 항상 컨트롤 바로 아래) */\nexport const FORM_FIELD_CONTROL_STACK_CLASS = \"flex min-w-0 flex-col\";\n\nexport function formFieldControlStackClass(align: FormFieldContentAlign = \"left\") {\n return cn(\n FORM_FIELD_CONTROL_STACK_CLASS,\n align === \"left\" && \"w-full items-stretch\",\n align === \"center\" && \"w-full max-w-full items-center\",\n align === \"right\" && \"w-full max-w-full items-end\",\n );\n}\n\nexport function formFieldControlRowClass(align: FormFieldContentAlign = \"left\") {\n return cn(\n ROW_VALUE_FIELD_ROW_CLASS,\n align === \"center\" && \"justify-center\",\n align === \"right\" && \"justify-end\",\n );\n}\n\nexport function formFieldErrorMessageClass(align: FormFieldContentAlign = \"left\") {\n return cn(\n FORM_FIELD_ERROR_MESSAGE_CLASS,\n \"w-full shrink-0\",\n align === \"center\" && \"text-center\",\n align === \"right\" && \"text-right\",\n align === \"left\" && \"text-left\",\n );\n}\n\n/** RowItem getInputClass — input 영역 */\nexport const FORM_CONTROL_CLASS =\n\n \"h-8 w-full rounded border border-gray-300 bg-white px-2 py-1 text-sm shadow-none\";\n\nexport function formControlClass(hasError: boolean, extra?: string): string {\n return cn(FORM_CONTROL_CLASS, FORM_CONTROL_FOCUS_CLASS, hasError && FORM_FIELD_ERROR_BORDER_CLASS, extra);\n}\n\n/** readOnly 필드 — border·컨트롤 없이 텍스트만 표시 */\nexport const FIELD_READONLY_TEXT_CLASS = \"text-sm text-gray-800 leading-tight\";\n\n/** Row 필드 — className은 wrapper 너비, 내부 컨트롤은 w-full */\nexport function fieldControlWrapClass(className?: string): string {\n return className ? cn(\"min-w-0 shrink-0\", className) : \"min-w-0 w-full\";\n}\n\nexport const TABLE_HEADER_BASE_CLASS =\n \"flex items-center justify-center border-b border-r border-gray-200 bg-th px-5 py-3 text-center text-sm font-semibold text-gray-800\";\n\n/** flex-col — 입력 아래에 validation 문구 배치 (gg ValidationNotice) */\nexport const TABLE_ROW_CELL_BASE_CLASS =\n \"flex min-h-8 flex-col items-stretch justify-center border-b border-r border-gray-200 bg-white px-2 py-1.5 text-sm\";\n\nexport const TABLE_ADD_HEADER_CLASS = \"cursor-pointer hover:text-primary\";\n\nexport const TABLE_DELETE_CELL_CLASS = \"flex cursor-pointer items-center justify-center hover:text-red-600\";\n","import type { ReactNode } from \"react\";\n\nimport {\n formFieldControlStackClass,\n formFieldErrorMessageClass,\n type FormFieldContentAlign,\n} from \"../config/styles\";\n\ntype FormFieldErrorMessageProps = {\n message?: string;\n align?: FormFieldContentAlign;\n};\n\nfunction FormFieldErrorMessage(props: FormFieldErrorMessageProps) {\n const { message, align = \"left\" } = props;\n if (!message) return null;\n return <p className={formFieldErrorMessageClass(align)}>{message}</p>;\n}\n\ntype FormFieldControlStackProps = {\n align?: FormFieldContentAlign;\n showError?: boolean;\n errorMessage?: string;\n children: ReactNode;\n};\n\nexport default function FormFieldControlStack(props: FormFieldControlStackProps) {\n const { align = \"left\", showError, errorMessage, children } = props;\n return (\n <div className={formFieldControlStackClass(align)}>\n {children}\n {showError ? <FormFieldErrorMessage message={errorMessage} align={align} /> : null}\n </div>\n );\n}\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport { z } from \"zod\";\n\ndayjs.extend(customParseFormat);\n\nconst DATE_YYYY_MM_DD_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** gg-livestock `checkEmptyWithRequired` / blur 정책과 동일한 빈 값 판별 */\n// NumberField 등이 number | undefined 로 넘길 때 zod string 스키마와 맞추기 위한 정규화\nexport function normalizeFormFieldString(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"number\") return Number.isNaN(value) ? \"\" : String(value);\n return String(value).trim();\n}\n\nexport function isEmptyFieldValue(value: unknown): boolean {\n if (value === undefined || value === null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (typeof value === \"number\") return Number.isNaN(value);\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"boolean\") return false;\n return false;\n}\n\n// 제출 시 빈 필수값 기본 메시지: `{label}을 입력해 주세요.\nexport function requiredFieldMessage(label: string): string {\n return `${label}을 입력해 주세요.`;\n}\n\n// select/라디오/날짜 등 선택형 필수값 기본 메시지: `{label}을 선택해 주세요.\nexport function requiredSelectMessage(label: string): string {\n return `${label}을 선택해 주세요.`;\n}\n\n// YYYY-MM-DD 형식 오류: `{label}을 올바르게 입력해 주세요.`\nexport function dateInvalidMessage(label: string): string {\n return `${label}을 올바르게 입력해 주세요.`;\n}\n\n// 오늘 이후 날짜 불가: `{label}은 현재 날짜 이후로 입력할 수 없습니다.`\nexport function dateFutureNotAllowedMessage(label: string): string {\n return `${label}은 현재 날짜 이후로 입력할 수 없습니다.`;\n}\n\nexport type ValidateDateOptions = {\n // true면 오늘 이후 날짜 허용 (기본 false)\n allowFuture?: boolean;\n};\n\n// 날짜 형식·미래일 검증 — 빈 값은 undefined (필수는 requiredZodDate가 처리)\nexport function validateDateString(\n value: string,\n label: string,\n options?: ValidateDateOptions,\n): string | undefined {\n if (isEmptyFieldValue(value)) return undefined;\n\n if (!DATE_YYYY_MM_DD_REGEX.test(value) || !dayjs(value, \"YYYY-MM-DD\", true).isValid()) {\n return dateInvalidMessage(label);\n }\n\n if (!options?.allowFuture) {\n const today = dayjs().startOf(\"day\");\n const parsed = dayjs(value, \"YYYY-MM-DD\", true).startOf(\"day\");\n if (parsed.isAfter(today)) {\n return dateFutureNotAllowedMessage(label);\n }\n }\n\n return undefined;\n}\n\n// 필수 날짜 — 빈 값은 선택 메시지, 값이 있으면 YYYY-MM-DD·미래일(옵션) 검증\nexport function requiredZodDate(label: string, options?: ValidateDateOptions) {\n return z\n .string()\n .trim()\n .min(1, requiredSelectMessage(label))\n .superRefine((val, ctx) => {\n const msg = validateDateString(val, label, options);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n });\n}\n\n// 필수 string — 빈 값이면 requiredFieldMessage만 (도메인 검증은 값이 있을 때만)\nexport function requiredZodString(label: string) {\n return z.string().trim().min(1, requiredFieldMessage(label));\n}\n\n// 필수 string + 값이 있을 때 추가 검증\nexport function requiredZodStringWith(label: string, validate: (value: string) => string | undefined) {\n return requiredZodString(label).superRefine((val, ctx) => {\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n });\n}\n\n// 필수 number — undefined / 0 / NaN 은 `{label}을 입력해 주세요.`\nexport function requiredZodNumber(label: string) {\n const message = requiredFieldMessage(label);\n return z.custom<number>(\n (val) => {\n if (val === undefined || val === null) return false;\n if (typeof val !== \"number\" || Number.isNaN(val)) return false;\n return val > 0;\n },\n { message },\n );\n}\n\n// 선택 string — 값이 있을 때만 검증\nexport function optionalZodStringWith(validate: (value: string) => string | undefined) {\n return z\n .string()\n .optional()\n .superRefine((val, ctx) => {\n if (!val?.trim()) return;\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n });\n}\n\n// 필수 string — NumberField(number) 입력을 string 스키마로 받음\nexport function requiredZodStringFromInput(label: string) {\n return z.preprocess(normalizeFormFieldString, z.string().min(1, requiredFieldMessage(label)));\n}\n\nexport function requiredZodStringFromInputWith(\n label: string,\n validate: (value: string) => string | undefined,\n) {\n return z.preprocess(\n normalizeFormFieldString,\n z\n .string()\n .min(1, requiredFieldMessage(label))\n .superRefine((val, ctx) => {\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n }),\n );\n}\n\n// 선택 string — NumberField(number) 입력을 string 스키마로 받음\nexport function optionalZodStringFromInput() {\n return z.preprocess(normalizeFormFieldString, z.string().optional());\n}\n\nexport function optionalZodStringFromInputWith(validate: (value: string) => string | undefined) {\n return z.preprocess(\n normalizeFormFieldString,\n z.string().superRefine((val, ctx) => {\n if (!val?.trim()) return;\n const msg = validate(val);\n if (msg) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });\n }\n }),\n );\n}\n","import { Plus, Trash2 } from \"lucide-react\";\nimport {\n useFieldArray,\n useFormContext,\n useFormState,\n useWatch,\n type FieldArrayPath,\n type FieldValues,\n type Path,\n} from \"react-hook-form\";\n\nimport Input from \"../../Input\";\n\nimport { useSubmitFormValidation } from \"../validation/useSubmitFormValidation\";\nimport {\n FORM_FIELD_ERROR_BORDER_CLASS,\n formControlClass,\n TABLE_ADD_HEADER_CLASS,\n TABLE_DELETE_CELL_CLASS,\n TABLE_HEADER_BASE_CLASS,\n TABLE_ROW_CELL_BASE_CLASS,\n TABLE_ROW_LABEL_CLASS,\n type FormFieldContentAlign,\n} from \"../config/styles\";\nimport FormFieldControlStack from \"../ui/FormFieldControlStack\";\nimport type {\n FormTableProps,\n SubmitTableColumn,\n TableCellRenderContext,\n} from \"../config/types\";\nimport { cn, resolveValueColSpan } from \"../config/utils\";\nimport { isEmptyFieldValue } from \"../validation/zod\";\n\nfunction getRowId(row: Record<string, unknown>, index: number): string {\n const id = row.id;\n if (typeof id === \"string\" || typeof id === \"number\") return String(id);\n return `row-${index}`;\n}\n\nfunction resolveCellAlign(column: SubmitTableColumn): FormFieldContentAlign {\n if (column.align) return column.align;\n if (column.cellType === \"number\") return \"center\";\n return \"left\";\n}\n\ntype DefaultTextCellProps = {\n ctx: TableCellRenderContext;\n maxLength?: number;\n placeholder?: string;\n align?: \"left\" | \"center\" | \"right\";\n};\n\nfunction DefaultTextCell(props: DefaultTextCellProps) {\n const { ctx, maxLength, placeholder, align = \"left\" } = props;\n return (\n <Input\n bare\n value={String(ctx.value ?? \"\")}\n placeholder={placeholder}\n maxLength={maxLength}\n status={ctx.hasError ? \"error\" : \"default\"}\n className={cn(\n formControlClass(ctx.hasError ?? false),\n align === \"center\" && \"text-center\",\n align === \"right\" && \"text-right\",\n )}\n onChange={(e) => ctx.onChange(e.target.value)}\n onBlur={ctx.onBlur}\n disabled={ctx.disabled}\n />\n );\n}\n\ntype TableCellFrameProps = {\n className?: string;\n align?: FormFieldContentAlign;\n errorMessage?: string;\n showError: boolean;\n children: React.ReactNode;\n};\n\nfunction TableCellFrame(props: TableCellFrameProps) {\n const { className, align = \"left\", errorMessage, showError, children } = props;\n return (\n <div className={cn(className, \"min-w-0\")}>\n <FormFieldControlStack align={align} showError={showError} errorMessage={errorMessage}>\n {children}\n </FormFieldControlStack>\n </div>\n );\n}\n\nexport default function FormTable<TFieldValues extends FieldValues = FieldValues>(\n props: FormTableProps<TFieldValues>,\n) {\n const {\n name: nameProp,\n formKey,\n label,\n columns: columnsProp,\n column,\n colspan = 10,\n isLabel = true,\n firstRowAppliesAll = false,\n containerClassName = \"\",\n minRows = 1,\n protectFirstRow = true,\n createEmptyRow,\n disabled = false,\n } = props;\n\n const name = (formKey ?? nameProp) as FieldArrayPath<TFieldValues>;\n const columns = column ?? columnsProp ?? [];\n\n if (!name) {\n throw new Error(\"SubmitForm.Table requires formKey or name.\");\n }\n\n const { control, setValue, getValues, trigger, clearErrors, getFieldState } =\n useFormContext<TFieldValues>();\n const formState = useFormState({ control });\n const { errors, isSubmitted } = formState;\n const validationCtx = useSubmitFormValidation();\n\n const fieldArrayName = name as FieldArrayPath<TFieldValues>;\n const { fields, append, remove } = useFieldArray({ control, name: fieldArrayName });\n /** setValue만으로는 fields가 갱신되지 않음 — 입력마다 구독해 controlled value 동기화 */\n const watchedRows = useWatch({\n control,\n name: name as Path<TFieldValues>,\n }) as Record<string, unknown>[] | undefined;\n\n const valueColSpan = resolveValueColSpan(colspan);\n const fullWidth = !isLabel;\n\n const handleAddRow = () => {\n append(createEmptyRow() as never);\n };\n\n const handleDeleteRow = (index: number) => {\n if (fields.length <= minRows) return;\n if (protectFirstRow && index === 0) return;\n remove(index);\n };\n\n const updateCell = (rowIndex: number, key: string, value: string) => {\n const path = `${name}.${rowIndex}.${key}` as Path<TFieldValues>;\n\n if (firstRowAppliesAll && rowIndex === 0) {\n fields.forEach((_, i) => {\n setValue(`${name}.${i}.${key}` as Path<TFieldValues>, value as never, {\n shouldDirty: true,\n });\n });\n return;\n }\n\n setValue(path, value as never, { shouldDirty: true });\n };\n\n const getRowData = (rowIndex: number): Record<string, unknown> => {\n const fromWatch = watchedRows?.[rowIndex];\n if (fromWatch && typeof fromWatch === \"object\") {\n return fromWatch as Record<string, unknown>;\n }\n return (getValues(`${name}.${rowIndex}` as Path<TFieldValues>) as Record<string, unknown>) ?? {};\n };\n\n const getCellError = (rowIndex: number, key: string): string | undefined => {\n const rowErrors = (errors as Record<string, unknown>)[name as string];\n if (!Array.isArray(rowErrors)) return undefined;\n const cell = rowErrors[rowIndex] as Record<string, { message?: string }> | undefined;\n return cell?.[key]?.message;\n };\n\n const renderCell = (column: SubmitTableColumn, rowIndex: number, rowData: Record<string, unknown>) => {\n const rowId = getRowId(rowData, rowIndex);\n const rawValue = column.key === \"id\" ? rowIndex + 1 : rowData[column.key];\n const displayValue =\n firstRowAppliesAll && rowIndex === 0 && column.key === \"id\" ? \"[전체반영]\" : rawValue;\n\n const cellPath = `${name}.${rowIndex}.${column.key}` as Path<TFieldValues>;\n const cellValue = rowData[column.key];\n const isCellRequired = Boolean(column.required);\n const errorMessage = getCellError(rowIndex, column.key);\n const showCellError = Boolean(errorMessage) && isSubmitted;\n const hasError = showCellError;\n\n const cellPathKey = String(cellPath);\n\n const shouldDeferEmptyRequiredBlur = () => {\n if (!isCellRequired || !isEmptyFieldValue(cellValue)) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(cellPathKey)) {\n return false;\n }\n\n const { isTouched, invalid } = getFieldState(cellPath, formState);\n if (isTouched || isSubmitted || invalid) {\n return false;\n }\n\n return true;\n };\n\n const shouldValidateEmptyOnChange = (value: string) => {\n if (!isCellRequired || !isEmptyFieldValue(value)) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(cellPathKey)) {\n return true;\n }\n\n const { isTouched, invalid } = getFieldState(cellPath, formState);\n return isTouched || isSubmitted || Boolean(invalid);\n };\n\n const handleCellBlur = () => {\n if (shouldDeferEmptyRequiredBlur()) {\n clearErrors(cellPath);\n return;\n }\n\n void trigger(cellPath);\n };\n\n const ctx: TableCellRenderContext = {\n value: displayValue,\n rowIndex,\n rowId,\n fieldKey: column.key,\n onChange: (value) => {\n if (!isEmptyFieldValue(value)) {\n validationCtx?.markFieldHadValue(cellPathKey);\n }\n updateCell(rowIndex, column.key, value);\n if (shouldValidateEmptyOnChange(value)) {\n void trigger(cellPath);\n }\n },\n onBlur: handleCellBlur,\n onDelete: () => handleDeleteRow(rowIndex),\n isFirstRow: rowIndex === 0,\n disabled,\n hasError,\n errorClassName: hasError ? FORM_FIELD_ERROR_BORDER_CLASS : \"\",\n errorMessage: showCellError ? errorMessage : undefined,\n };\n\n if (column.type === \"add\") {\n if (protectFirstRow && rowIndex === 0) {\n return <div className=\"min-h-8 w-full\" aria-hidden />;\n }\n return (\n <button\n type=\"button\"\n className={cn(\n TABLE_DELETE_CELL_CLASS,\n \"w-full min-h-8\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n onClick={() => !disabled && ctx.onDelete()}\n disabled={disabled || fields.length <= minRows}\n aria-label=\"행 삭제\"\n >\n <Trash2 size={16} />\n </button>\n );\n }\n\n if (column.render) {\n return column.render(ctx);\n }\n\n if (column.key === \"id\") {\n return (\n <div className=\"flex w-full items-center justify-center\">\n <span className=\"w-full text-center text-sm\">{String(displayValue ?? rowIndex + 1)}</span>\n </div>\n );\n }\n\n if (column.cellType === \"number\") {\n return (\n <DefaultTextCell\n ctx={ctx}\n maxLength={column.maxLength}\n placeholder={column.placeholder}\n align=\"center\"\n />\n );\n }\n\n return (\n <DefaultTextCell\n ctx={ctx}\n maxLength={column.maxLength}\n placeholder={column.placeholder}\n align={column.align ?? \"left\"}\n />\n );\n };\n\n const renderHeader = (column: SubmitTableColumn, index: number) => {\n const isAdd = column.type === \"add\";\n const headerClickable = isAdd && !disabled;\n\n return (\n <div\n key={`${column.key}-header-${index}`}\n className={cn(\n column.className ?? TABLE_HEADER_BASE_CLASS,\n isAdd && TABLE_ADD_HEADER_CLASS,\n headerClickable && \"cursor-pointer\",\n )}\n onClick={() => headerClickable && handleAddRow()}\n onKeyDown={(e) => {\n if (headerClickable && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleAddRow();\n }\n }}\n role={headerClickable ? \"button\" : undefined}\n tabIndex={headerClickable ? 0 : undefined}\n >\n {isAdd ? (\n <Plus size={16} className=\"mx-auto\" />\n ) : (\n <>\n {column.title}\n {column.required ? <span className=\"ml-0.5 text-red-500\">*</span> : null}\n </>\n )}\n </div>\n );\n };\n\n const rows = fields.map((field, rowIndex) => {\n const rowData = getRowData(rowIndex);\n const stickyClass = firstRowAppliesAll && rowIndex === 0 ? \"sticky z-20 top-[44px] bg-white\" : \"\";\n\n return (\n <div key={field.id} className={cn(\"relative flex text-sm\", stickyClass)}>\n {columns.map((column, colIndex) => {\n const cellClassName = column.rowClassName ?? TABLE_ROW_CELL_BASE_CLASS;\n const errorMessage = getCellError(rowIndex, column.key);\n const showCellError = Boolean(errorMessage) && isSubmitted;\n\n if (column.type === \"add\") {\n return (\n <div key={`${field.id}-${column.key}-${colIndex}`} className={cellClassName}>\n {renderCell(column, rowIndex, rowData ?? {})}\n </div>\n );\n }\n\n return (\n <TableCellFrame\n key={`${field.id}-${column.key}-${colIndex}`}\n className={cellClassName}\n align={resolveCellAlign(column)}\n errorMessage={errorMessage}\n showError={showCellError}\n >\n {renderCell(column, rowIndex, rowData ?? {})}\n </TableCellFrame>\n );\n })}\n </div>\n );\n });\n\n const tableBody = (\n <div className={cn(\"w-full\", containerClassName)}>\n <div className=\"sticky top-0 z-[1] flex text-sm\">{columns.map(renderHeader)}</div>\n {rows}\n </div>\n );\n\n if (fullWidth) {\n return <div className=\"col-span-12 w-full h-full\">{tableBody}</div>;\n }\n\n return (\n <>\n <div className={TABLE_ROW_LABEL_CLASS}>\n <p className=\"text-sm font-semibold text-gray-800\">{label}</p>\n </div>\n <div className={cn(valueColSpan, \"h-full w-full\", containerClassName)}>{tableBody}</div>\n </>\n );\n}\n","import { useRef, type Ref } from \"react\";\nimport { useDaumPostcodePopup, type Address } from \"react-daum-postcode\";\n\nimport Button from \"../Button\";\nimport { cn } from \"../../lib/variants\";\n\nexport type { Address };\n\nexport type SearchAddressProps = {\n ref?: Ref<HTMLButtonElement>;\n handleComplete: (data: Address) => void;\n disabled?: boolean;\n label?: string;\n buttonClassName?: string;\n};\n\nexport function SearchAddress(props: SearchAddressProps) {\n const { ref, handleComplete, disabled = false, label = \"주소찾기\", buttonClassName } = props;\n const isPopupOpenRef = useRef(false);\n\n const scriptUrl = \"//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js\";\n const open = useDaumPostcodePopup(scriptUrl);\n\n const handleClick = () => {\n if (isPopupOpenRef.current) return;\n\n isPopupOpenRef.current = true;\n open({\n onComplete: (data: Address) => {\n isPopupOpenRef.current = false;\n handleComplete(data);\n },\n onClose: () => {\n isPopupOpenRef.current = false;\n },\n });\n };\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n variant=\"search\"\n size=\"sm\"\n className={cn(\"ml-2 shrink-0\", buttonClassName)}\n disabled={disabled}\n onClick={(e) => {\n e.preventDefault();\n handleClick();\n }}\n >\n {label}\n </Button>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport type { FieldValues, Path } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\nimport { SearchAddress, type Address } from \"../../../SearchAddress\";\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function AddressField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"주소를 검색하세요\",\n disabled = false,\n readOnly = false,\n className = \"\",\n addressDetailKey,\n addressClassNames,\n } = config;\n\n const { setFocus } = useFormContext<TFieldValues>();\n const inputRef = useRef<HTMLInputElement>(null);\n const searchButtonRef = useRef<HTMLButtonElement>(null);\n const isAddressSelectedRef = useRef(false);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (isFocused && !isAddressSelectedRef.current) {\n searchButtonRef.current?.click();\n }\n }, [isFocused]);\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n const handleComplete = (data: Address) => {\n isAddressSelectedRef.current = true;\n const nextAddress = data.roadAddress || data.address;\n onChange(nextAddress);\n inputRef.current?.blur();\n setIsFocused(false);\n\n if (addressDetailKey) {\n setTimeout(() => {\n setFocus(addressDetailKey as Path<TFieldValues>);\n isAddressSelectedRef.current = false;\n }, 300);\n } else {\n setTimeout(() => {\n isAddressSelectedRef.current = false;\n }, 300);\n }\n };\n\n const handleInputClick = () => {\n searchButtonRef.current?.click();\n };\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div\n className={cn(\"flex w-full min-w-0 items-center\", addressClassNames?.controlClassName)}\n onClick={handleInputClick}\n >\n <Input\n ref={inputRef}\n id={String(name)}\n name={name}\n placeholder={placeholder}\n value={String(value ?? \"\")}\n readOnly\n disabled={disabled}\n bare\n className={cn(formControlClass(hasError), addressClassNames?.inputClassName)}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => {\n if (!isAddressSelectedRef.current) setIsFocused(true);\n }}\n onBlur={() => {\n if (!isAddressSelectedRef.current) {\n setIsFocused(false);\n onBlur();\n }\n }}\n />\n <SearchAddress\n ref={searchButtonRef}\n handleComplete={handleComplete}\n disabled={disabled}\n buttonClassName={addressClassNames?.buttonClassName}\n />\n </div>\n </div>\n );\n}\n","export function parseCascadingSelectValue(value: string, separator: string) {\n if (!value) return { primary: \"\", secondary: \"\" };\n const [primary, secondary] = value.split(separator);\n return { primary: primary ?? \"\", secondary: secondary ?? \"\" };\n}\n\nexport function createCascadingSelectValue(primary: string, secondary: string, separator: string) {\n if (!primary && !secondary) return \"\";\n if (!secondary) return primary;\n return `${primary}${separator}${secondary}`;\n}\n","import type {\n SubmitFormSelectClassNameProp,\n SubmitFormSelectClassNames,\n} from \"../config/types\";\nimport { cn } from \"../config/utils\";\n\n// 문자열이면 container·trigger에 공통 적용, 객체면 개별 병합\nexport function resolveSelectClassNameProp(\n value: SubmitFormSelectClassNameProp | undefined,\n defaults?: SubmitFormSelectClassNames,\n): SubmitFormSelectClassNames {\n if (!value) {\n return {\n containerClassName: defaults?.containerClassName,\n triggerClassName: defaults?.triggerClassName,\n };\n }\n\n if (typeof value === \"string\") {\n return {\n containerClassName: cn(defaults?.containerClassName, value),\n triggerClassName: cn(defaults?.triggerClassName, value),\n };\n }\n\n return {\n containerClassName: cn(defaults?.containerClassName, value.containerClassName),\n triggerClassName: cn(defaults?.triggerClassName, value.triggerClassName),\n };\n}\n","import { useLayoutEffect, useMemo } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Select from \"../../../Select\";\nimport {\n createCascadingSelectValue,\n parseCascadingSelectValue,\n} from \"../../lib/cascadingSelectUtils\";\nimport { resolveSelectClassNameProp } from \"../../lib/resolveSelectClassNameProp\";\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS, FORM_CONTROL_FOCUS_CLASS } from \"../../config/styles\";\nimport type { CascadingSelectFieldConfig, FieldComponentProps } from \"../../config/types\";\nimport { cn, toSelectOptions } from \"../../config/utils\";\n\nconst DEFAULT_TRIGGER_CLASS = \"h-8 w-full min-w-[7.5rem] rounded border bg-white px-2 text-sm shadow-none\";\n\nconst SELECT_CONTAINER_DEFAULT = \"min-w-[7.5rem]\";\n\nfunction resolveCascadingSelectState(\n formValue: string,\n separator: string,\n getSecondaryOptions: CascadingSelectFieldConfig[\"getSecondaryOptions\"],\n) {\n const parsed = parseCascadingSelectValue(formValue, separator);\n const secondaryOptions = parsed.primary ? getSecondaryOptions(parsed.primary) : [];\n const secondaryIsValid =\n !parsed.secondary || secondaryOptions.some((opt) => String(opt.value) === parsed.secondary);\n const secondary = secondaryIsValid ? parsed.secondary : \"\";\n\n return {\n primary: parsed.primary,\n secondary,\n secondaryOptions,\n normalizedFormValue: createCascadingSelectValue(parsed.primary, secondary, separator),\n };\n}\n\nexport default function CascadingSelectField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const { cascadingSelect } = props.config;\n\n if (!cascadingSelect) {\n return null;\n }\n\n return <CascadingSelectFieldInner {...props} cascadingSelect={cascadingSelect} />;\n}\n\ntype CascadingSelectFieldInnerProps<TFieldValues extends FieldValues> = FieldComponentProps<TFieldValues> & {\n cascadingSelect: CascadingSelectFieldConfig;\n};\n\nfunction CascadingSelectFieldInner<TFieldValues extends FieldValues = FieldValues>(\n props: CascadingSelectFieldInnerProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value },\n config,\n hasError = false,\n cascadingSelect,\n } = props;\n\n const { disabled = false, readOnly = false, className = \"\", cascadingSelectClassNames } = config;\n\n const {\n primaryOptions,\n getSecondaryOptions,\n primaryPlaceholder = \"1차 선택\",\n secondaryPlaceholder = \"2차 선택\",\n separator = \" \",\n } = cascadingSelect;\n\n const formValue = String(value ?? \"\");\n const { primary, secondary, secondaryOptions, normalizedFormValue } = useMemo(\n () => resolveCascadingSelectState(formValue, separator, getSecondaryOptions),\n [formValue, getSecondaryOptions, separator],\n );\n\n useLayoutEffect(() => {\n if (readOnly) return;\n if (normalizedFormValue !== formValue) {\n onChange(normalizedFormValue);\n }\n }, [formValue, normalizedFormValue, onChange, readOnly]);\n\n if (readOnly) {\n const primaryLabel = primaryOptions.find((o) => String(o.value) === primary)?.label ?? primary;\n const secondaryLabel = secondary\n ? (secondaryOptions.find((o) => String(o.value) === secondary)?.label ?? secondary)\n : \"\";\n const displayText = secondaryLabel ? `${primaryLabel} ${secondaryLabel}` : primaryLabel || \"—\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{displayText}</span>\n </div>\n );\n }\n\n const updateValue = (nextPrimary: string, nextSecondary: string) => {\n onChange(createCascadingSelectValue(nextPrimary, nextSecondary, separator));\n };\n\n const firstSelectClass = resolveSelectClassNameProp(cascadingSelectClassNames?.firstClassName, {\n containerClassName: SELECT_CONTAINER_DEFAULT,\n triggerClassName: cn(DEFAULT_TRIGGER_CLASS, FORM_CONTROL_FOCUS_CLASS),\n });\n const secondSelectClass = resolveSelectClassNameProp(cascadingSelectClassNames?.secondClassName, {\n containerClassName: SELECT_CONTAINER_DEFAULT,\n triggerClassName: cn(DEFAULT_TRIGGER_CLASS, FORM_CONTROL_FOCUS_CLASS),\n });\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div className={cn(\"flex flex-wrap gap-2\", cascadingSelectClassNames?.controlClassName)}>\n <Select\n value={primary}\n placeholder={primaryPlaceholder}\n disabled={disabled}\n hasError={hasError}\n options={toSelectOptions(primaryOptions)}\n containerClassName={firstSelectClass.containerClassName}\n triggerClassName={firstSelectClass.triggerClassName}\n canReset\n onChange={(nextPrimary) => {\n updateValue(nextPrimary, \"\");\n if (!nextPrimary) onBlur();\n }}\n />\n <Select\n value={secondary}\n placeholder={secondaryPlaceholder}\n disabled={disabled || !primary || secondaryOptions.length === 0}\n hasError={hasError}\n options={toSelectOptions(secondaryOptions)}\n containerClassName={secondSelectClass.containerClassName}\n triggerClassName={secondSelectClass.triggerClassName}\n canReset\n onChange={(nextSecondary) => {\n updateValue(primary, nextSecondary);\n onBlur();\n }}\n />\n </div>\n </div>\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport Checkbox from \"../../../Checkbox\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function CheckboxField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value },\n config,\n } = props;\n\n const { disabled = false, readOnly = false, checkboxLabel, className = \"\" } = config;\n\n if (readOnly) {\n const text = value ? (checkboxLabel ?? \"선택됨\") : \"—\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{text}</span>\n </div>\n );\n }\n\n return (\n <Checkbox\n checked={Boolean(value)}\n onChange={(checked) => onChange(!!checked)}\n disabled={disabled}\n label={checkboxLabel}\n wrapperClassName={cn(\"!justify-start !items-center\", fieldControlWrapClass(className))}\n />\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport DatePicker from \"../../../DatePicker\";\nimport { formatDate } from \"../../../DatePicker/config/utils\";\n\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport { cn } from \"../../config/utils\";\n\nexport default function DateField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"YYYY-MM-DD\",\n disabled = false,\n readOnly = false,\n className = \"w-40\",\n datePosition = \"bottom\",\n disableFutureDates = false,\n calendarSelectContainerClass = \"w-20\",\n } = config;\n\n const maxDate = disableFutureDates ? formatDate(new Date()) : undefined;\n\n if (readOnly) {\n return (\n <div className={cn(\"flex items-center\", fieldControlWrapClass(className))}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex items-center\", fieldControlWrapClass(className))}>\n <DatePicker\n value={String(value ?? \"\")}\n onChange={(date) => onChange(date)}\n onBlur={onBlur}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full\"\n validation={hasError}\n datePosition={datePosition}\n maxDate={maxDate}\n calendarSelectContainerClass={calendarSelectContainerClass}\n />\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\n\nimport type { FieldComponentProps } from \"../../config/types\";\n\nexport default function InputField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"\",\n disabled = false,\n readOnly = false,\n maxLength,\n className = \"\",\n type = \"input\",\n numbersOnly = false,\n autoComplete,\n } = config;\n\n const inputType = type === \"email\" ? \"email\" : type === \"password\" ? \"password\" : \"text\";\n\n if (readOnly) {\n const text = type === \"password\" ? (value ? \"**********\" : \"\") : String(value ?? \"\") || \"\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{text}</span>\n </div>\n );\n }\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const value = numbersOnly ? e.target.value.replace(/\\D/g, \"\") : e.target.value;\n onChange(value);\n };\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Input\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={String(value ?? \"\")}\n type={inputType}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n status=\"default\"\n className={formControlClass(hasError)}\n autoComplete={autoComplete}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","import type { MouseEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Button from \"../../../Button\";\nimport Input from \"../../../Input\";\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\n\nexport default function InputWithButtonField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onBlur, value },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"조회 버튼으로 선택\",\n disabled = false,\n className = \"\",\n readOnly = false,\n inputWithButton,\n onClickInputWithButton,\n } = config;\n\n const handleClick = (event: MouseEvent) => {\n event.preventDefault();\n if (disabled) return;\n onClickInputWithButton?.();\n };\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{String(value ?? \"\") || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div className=\"flex w-full min-w-0 items-center gap-2\">\n <Input\n placeholder={placeholder}\n value={String(value ?? \"\")}\n readOnly\n disabled={disabled}\n bare\n className={formControlClass(hasError)}\n onClick={handleClick}\n onBlur={onBlur}\n />\n <Button type=\"button\" variant=\"search\" size=\"sm\" disabled={disabled} onClick={handleClick}>\n {inputWithButton?.buttonLabel ?? \"조회\"}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\n\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { formatNumberWithCommas, removeNonNumeric } from \"../../config/utils\";\n\nexport default function NumberField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"\",\n disabled = false,\n readOnly = false,\n maxLength,\n className = \"\",\n allowDecimal = false,\n type = \"number\",\n } = config;\n\n const isMoney = type === \"money\";\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/,/g, \"\");\n const cleaned = removeNonNumeric(raw, allowDecimal && !isMoney);\n\n if (cleaned === \"\") {\n onChange(undefined);\n return;\n }\n\n const numValue = allowDecimal && !isMoney ? parseFloat(cleaned) : parseInt(cleaned, 10);\n if (!Number.isNaN(numValue)) {\n onChange(numValue);\n }\n };\n\n const displayValue =\n value != null && value !== \"\"\n ? isMoney\n ? formatNumberWithCommas(value as string | number)\n : String(value)\n : \"\";\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{displayValue || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Input\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={displayValue}\n type={isMoney ? \"money\" : \"number\"}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n status=\"default\"\n className={formControlClass(hasError)}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\n\nimport { fieldControlWrapClass, formControlClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { formatPhoneNumber, resolvePhoneMaxLength } from \"../../config/utils\";\n\nexport default function PhoneField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const { placeholder = \"010-0000-0000\", disabled = false, readOnly = false, className = \"\" } = config;\n\n const phoneValue = String(value ?? \"\");\n const phoneMaxLength = resolvePhoneMaxLength(phoneValue);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange(formatPhoneNumber(e.target.value));\n };\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{phoneValue || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Input\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={phoneValue}\n type=\"text\"\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={phoneMaxLength}\n status=\"default\"\n className={formControlClass(hasError)}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport { RadioGroup } from \"../../../Radio\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function RadioField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value, name },\n config,\n } = props;\n\n const { disabled = false, readOnly = false, options = [], className = \"\" } = config;\n\n if (readOnly) {\n const label = options.find((o) => String(o.value) === String(value ?? \"\"))?.label ?? String(value ?? \"\");\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{label || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <RadioGroup\n name={String(name)}\n value={String(value ?? \"\")}\n onChange={(nextValue) => onChange(nextValue)}\n direction=\"horizontal\"\n disabled={disabled}\n containerClassName={cn(\"justify-start\", fieldControlWrapClass(className))}\n options={options.map((option) => ({\n label: option.label,\n value: String(option.value),\n disabled: option.disabled,\n disabledMessage: option.disabledMessage,\n }))}\n />\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport Select from \"../../../Select\";\nimport type { SelectOptionType } from \"../../../Select/config/type\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS, FORM_CONTROL_FOCUS_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps, SelectOption } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nfunction toSelectOptions(options: SelectOption[] = []): SelectOptionType[] {\n return options.map((opt) => ({\n label: opt.label,\n value: String(opt.value),\n }));\n}\n\nexport default function SelectField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value },\n config,\n hasError = false,\n } = props;\n\n const {\n placeholder = \"선택하세요\",\n disabled = false,\n readOnly = false,\n options = [],\n className = \"\",\n canReset = false,\n } = config;\n\n const selectOptions = toSelectOptions(options);\n\n if (readOnly) {\n const label = selectOptions.find((o) => o.value === String(value ?? \"\"))?.label ?? String(value ?? \"\");\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{label || \"—\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Select\n value={String(value ?? \"\")}\n placeholder={placeholder}\n disabled={disabled}\n hasError={hasError}\n options={selectOptions}\n containerClassName=\"flex w-full min-w-0 max-w-full items-center\"\n className=\"w-full min-w-0\"\n triggerClassName={cn(\n \"h-8 w-full min-w-0 max-w-full rounded border bg-white px-2 py-1 text-sm shadow-none\",\n FORM_CONTROL_FOCUS_CLASS,\n )}\n canReset={canReset}\n onChange={(nextValue) => {\n if (nextValue === \"\") {\n onChange(undefined);\n return;\n }\n const option = options.find((opt) => String(opt.value) === nextValue);\n onChange(option?.value);\n }}\n />\n </div>\n );\n}\n","export function parseSelectWithInputValue(value: string, defaultPrefix: string) {\n if (!value) {\n return { prefix: defaultPrefix, input: \"\" };\n }\n\n const match = value.match(/^([A-Za-z]+)(.*)$/);\n if (!match) {\n return { prefix: defaultPrefix, input: value };\n }\n\n return {\n prefix: match[1] || defaultPrefix,\n input: match[2] ?? \"\",\n };\n}\n\nexport function combineSelectWithInputValue(prefix: string, input: string) {\n if (!input) return \"\";\n return `${prefix}${input}`;\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Input from \"../../../Input\";\nimport Select from \"../../../Select\";\nimport {\n combineSelectWithInputValue,\n parseSelectWithInputValue,\n} from \"../../lib/selectWithInputUtils\";\nimport { resolveSelectClassNameProp } from \"../../lib/resolveSelectClassNameProp\";\nimport {\n fieldControlWrapClass,\n formControlClass,\n FIELD_READONLY_TEXT_CLASS,\n FORM_CONTROL_FOCUS_CLASS,\n} from \"../../config/styles\";\nimport type { FieldComponentProps, SelectOption } from \"../../config/types\";\nimport { cn, toSelectOptions } from \"../../config/utils\";\nimport { useSubmitFormValidation } from \"../../validation/useSubmitFormValidation\";\n\nconst DEFAULT_SELECT_TRIGGER = \"h-8 rounded border bg-white px-2 text-sm shadow-none min-w-[5rem]\";\n\nexport default function SelectWithInputField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, onBlur, value },\n config,\n hasError = false,\n } = props;\n\n const {\n disabled = false,\n readOnly = false,\n options = [],\n maxLength,\n className = \"\",\n selectWithInput,\n selectWithInputClassNames,\n } = config;\n\n const validationCtx = useSubmitFormValidation();\n const numbersOnly = selectWithInput?.numbersOnly ?? selectWithInput?.inputMode !== \"text\";\n const defaultPrefix = String(options[0]?.value ?? \"\");\n const numberInputRef = useRef<HTMLInputElement>(null);\n\n const formValue = String(value ?? \"\");\n\n const { prefix, inputPart, normalizedFormValue } = useMemo(() => {\n const parsed = parseSelectWithInputValue(formValue, defaultPrefix);\n const validPrefixes = new Set((options as SelectOption[]).map((opt) => String(opt.value)));\n const resolvedPrefix = validPrefixes.has(parsed.prefix) ? parsed.prefix : defaultPrefix;\n return {\n prefix: resolvedPrefix,\n inputPart: parsed.input,\n normalizedFormValue: combineSelectWithInputValue(resolvedPrefix, parsed.input),\n };\n }, [defaultPrefix, formValue, options]);\n\n // select는 항상 값이 있어 form 값(\"\") 에서 prefix를 파싱할 수 없음.\n // selectedPrefix를 별도 상태로 관리해 input이 비어있어도 선택값을 유지.\n // useEffect 대신 React의 derived state 패턴으로 외부 변경(reset·prefill)만 동기화.\n const [selectedPrefix, setSelectedPrefix] = useState(prefix);\n const [prevFormValue, setPrevFormValue] = useState(formValue);\n\n if (prevFormValue !== formValue) {\n setPrevFormValue(formValue);\n // formValue가 외부에서 바뀔 때만 동기화 (select onChange는 formValue를 바꾸지 않으므로 제외됨)\n setSelectedPrefix(formValue ? prefix : defaultPrefix);\n }\n\n // 유효하지 않은 prefix 정규화 (formValue가 있을 때만 실행해 mount 시 자동 onChange 방지)\n useLayoutEffect(() => {\n if (readOnly) return;\n if (formValue && normalizedFormValue !== formValue) {\n onChange(normalizedFormValue);\n }\n }, [formValue, normalizedFormValue, onChange, readOnly]);\n\n if (readOnly) {\n const prefixLabel = (options as SelectOption[]).find((o) => String(o.value) === prefix)?.label ?? prefix;\n const displayText = inputPart ? `${prefixLabel} ${inputPart}` : prefix ? prefixLabel : \"—\";\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{displayText || \"—\"}</span>\n </div>\n );\n }\n\n const updateCombined = (nextPrefix: string, nextInput: string) => {\n onChange(combineSelectWithInputValue(nextPrefix, nextInput));\n };\n\n const normalizeInput = (raw: string) => {\n if (numbersOnly) return raw.replace(/\\D+/g, \"\");\n return raw;\n };\n\n const handleInputChange = (raw: string) => {\n const normalized = normalizeInput(raw.normalize(\"NFKC\"));\n if (normalized) {\n validationCtx?.markFieldHadValue(String(config.name));\n }\n updateCombined(selectedPrefix, normalized);\n };\n\n const selectClass = resolveSelectClassNameProp(selectWithInputClassNames?.selectClassName, {\n containerClassName: \"shrink-0\",\n triggerClassName: cn(DEFAULT_SELECT_TRIGGER, FORM_CONTROL_FOCUS_CLASS),\n });\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <div className={cn(\"flex items-center gap-2\", selectWithInputClassNames?.controlClassName)}>\n <Select\n value={selectedPrefix}\n placeholder=\"선택\"\n disabled={disabled}\n hasError={hasError}\n options={toSelectOptions(options)}\n containerClassName={selectClass.containerClassName}\n triggerClassName={selectClass.triggerClassName}\n onChange={(nextPrefix) => {\n setSelectedPrefix(nextPrefix);\n updateCombined(nextPrefix, inputPart);\n // select는 blur 이벤트가 없으므로 변경 시 직접 blur 처리\n onBlur();\n }}\n />\n <Input\n ref={numberInputRef}\n value={inputPart}\n disabled={disabled}\n maxLength={maxLength}\n bare\n className={cn(formControlClass(hasError), selectWithInputClassNames?.inputClassName, \"-ml-0.5\")}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n handleInputChange(e.target.value);\n }}\n onBlur={(e: ChangeEvent<HTMLInputElement>) => {\n const normalized = normalizeInput(e.target.value.normalize(\"NFKC\"));\n updateCombined(selectedPrefix, normalized);\n onBlur();\n }}\n />\n </div>\n </div>\n );\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport { BaseSwitch } from \"../../../Switch/ui/BaseSwitch\";\n\nimport { fieldControlWrapClass, FIELD_READONLY_TEXT_CLASS } from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\n\nexport default function SwitchField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { onChange, value },\n config,\n } = props;\n\n const { disabled = false, readOnly = false, className = \"\" } = config;\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={FIELD_READONLY_TEXT_CLASS}>{value ? \"켜짐\" : \"꺼짐\"}</span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <BaseSwitch checked={Boolean(value)} onCheckedChange={onChange} disabled={disabled} />\n </div>\n );\n}\n","import type { ChangeEvent } from \"react\";\nimport type { FieldValues } from \"react-hook-form\";\n\nimport Textarea from \"../../../Textarea\";\n\nimport {\n fieldControlWrapClass,\n FIELD_READONLY_TEXT_CLASS,\n FORM_CONTROL_FOCUS_CLASS,\n FORM_FIELD_ERROR_BORDER_CLASS,\n} from \"../../config/styles\";\nimport type { FieldComponentProps } from \"../../config/types\";\nimport { cn } from \"../../config/utils\";\n\nexport default function TextareaField<TFieldValues extends FieldValues = FieldValues>(\n props: FieldComponentProps<TFieldValues>,\n) {\n const {\n field: { ref, onChange, onBlur, value, name },\n config,\n hasError = false,\n } = props;\n\n const { placeholder = \"\", disabled = false, readOnly = false, maxLength, className = \"\" } = config;\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.target.value);\n };\n\n if (readOnly) {\n return (\n <div className={fieldControlWrapClass(className)}>\n <span className={cn(FIELD_READONLY_TEXT_CLASS, \"whitespace-pre-wrap\")}>\n {String(value ?? \"\") || \"—\"}\n </span>\n </div>\n );\n }\n\n return (\n <div className={fieldControlWrapClass(className)}>\n <Textarea\n name={name}\n ref={ref}\n onBlur={onBlur}\n value={String(value ?? \"\")}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n status=\"default\"\n className={cn(\n \"min-h-18 w-full rounded border border-gray-300 bg-white px-3 py-2 text-sm shadow-none resize-none\",\n FORM_CONTROL_FOCUS_CLASS,\n hasError && FORM_FIELD_ERROR_BORDER_CLASS,\n )}\n bare\n onChange={handleChange}\n />\n </div>\n );\n}\n","// gg-livestock shared/ui/RequireIcon\nexport default function SubmitFormRequireIcon() {\n return <span className=\"pl-0.5 text-main-red\">*</span>;\n}\n","import { useCallback } from \"react\";\nimport { useFormContext, useFormState, type FieldValues, type Path } from \"react-hook-form\";\n\nimport { useSubmitFormValidation } from \"../validation/useSubmitFormValidation\";\nimport { isEmptyFieldValue } from \"../validation/zod\";\n\nexport function useBlurValidation<TFieldValues extends FieldValues = FieldValues>(\n name: Path<TFieldValues>,\n options: {\n required?: boolean;\n // checkbox/radio/select/date 등 blur 없이 값이 바뀌는 필드 — 변경 시 재검증\n revalidateOnChange?: boolean;\n // 빈 값이 됐을 때 onChange에서도 즉시 재검증할지 여부 (타이핑 필드는 false)\n validateEmptyOnChange?: boolean;\n // 값 변경·blur 시 함께 trigger할 다른 필드 (연관 필드 zod 검증)\n revalidateFields?: Path<TFieldValues>[];\n },\n) {\n const { clearErrors, getValues, trigger, control, getFieldState } = useFormContext<TFieldValues>();\n const formState = useFormState({ control });\n const { isSubmitted } = formState;\n const validationCtx = useSubmitFormValidation();\n const fieldName = String(name);\n\n const triggerRelatedFields = useCallback(async () => {\n const fields = options.revalidateFields;\n if (!fields?.length) return;\n await trigger(fields);\n }, [options.revalidateFields, trigger]);\n\n // 최초 방문(비어 있음·미터치·미제출) blur만 검증 생략 — 값을 지운 경우 등은 필수 메시지 유지\n const shouldDeferEmptyRequiredBlur = useCallback(() => {\n if (!options.required || !isEmptyFieldValue(getValues(name))) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(fieldName)) {\n return false;\n }\n\n const { isTouched, invalid } = getFieldState(name, formState);\n if (isTouched || isSubmitted || invalid) {\n return false;\n }\n\n return true;\n }, [options.required, getValues, name, validationCtx, fieldName, getFieldState, formState, isSubmitted]);\n\n const shouldValidateEmptyOnChange = useCallback(\n (value: unknown) => {\n if (!options.required || !isEmptyFieldValue(value)) {\n return false;\n }\n\n if (validationCtx?.hadFieldValue(fieldName)) {\n return true;\n }\n\n const { isTouched, invalid } = getFieldState(name, formState);\n return isTouched || isSubmitted || Boolean(invalid);\n },\n [options.required, validationCtx, fieldName, getFieldState, name, formState, isSubmitted],\n );\n\n const handleBlur = useCallback(\n async (fieldOnBlur?: () => void) => {\n if (shouldDeferEmptyRequiredBlur()) {\n clearErrors(name);\n return;\n }\n\n fieldOnBlur?.();\n await trigger(name);\n await triggerRelatedFields();\n },\n [shouldDeferEmptyRequiredBlur, clearErrors, name, trigger, triggerRelatedFields],\n );\n\n const markHadValueIfFilled = useCallback(\n (value: unknown) => {\n if (!isEmptyFieldValue(value)) {\n validationCtx?.markFieldHadValue(fieldName);\n }\n },\n [validationCtx, fieldName],\n );\n\n const handleChange = useCallback(\n (value: unknown, fieldOnChange: (value: unknown) => void) => {\n markHadValueIfFilled(value);\n fieldOnChange(value);\n if (options.revalidateOnChange || (options.validateEmptyOnChange && shouldValidateEmptyOnChange(value))) {\n void trigger(name);\n }\n void triggerRelatedFields();\n },\n [\n markHadValueIfFilled,\n options.revalidateOnChange,\n options.validateEmptyOnChange,\n shouldValidateEmptyOnChange,\n trigger,\n name,\n triggerRelatedFields,\n ],\n );\n\n return { handleBlur, handleChange, markHadValueIfFilled, shouldDeferEmptyRequiredBlur };\n}\n","import { useEffect } from \"react\";\nimport { Controller, useFormContext, useFormState } from \"react-hook-form\";\nimport type { ControllerFieldState, ControllerRenderProps, FieldValues, Path } from \"react-hook-form\";\n\nimport AddressField from \"./fields/AddressField\";\nimport CascadingSelectField from \"./fields/CascadingSelectField\";\nimport CheckboxField from \"./fields/CheckboxField\";\nimport DateField from \"./fields/DateField\";\nimport InputField from \"./fields/InputField\";\nimport InputWithButtonField from \"./fields/InputWithButtonField\";\nimport NumberField from \"./fields/NumberField\";\nimport PhoneField from \"./fields/PhoneField\";\nimport RadioField from \"./fields/RadioField\";\nimport SelectField from \"./fields/SelectField\";\nimport SelectWithInputField from \"./fields/SelectWithInputField\";\nimport SwitchField from \"./fields/SwitchField\";\nimport TextareaField from \"./fields/TextareaField\";\nimport {\n formFieldControlRowClass,\n ROW_LABEL_CLASS,\n ROW_LABEL_TEXT_CLASS,\n ROW_VALUE_CELL_CLASS,\n ROW_VALUE_INNER_CLASS,\n ROW_VALUE_TEXTAREA_WRAPPER_CLASS,\n} from \"../config/styles\";\nimport FormFieldControlStack from \"../ui/FormFieldControlStack\";\nimport type { FormFieldConfig, FormFieldProps } from \"../config/types\";\nimport SubmitFormRequireIcon from \"../ui/RequireIcon\";\nimport { useBlurValidation } from \"../validation/useBlurValidation\";\nimport { cn, resolveValueColSpan } from \"../config/utils\";\n\nfunction wrapFieldHandlers<TFieldValues extends FieldValues>(\n field: ControllerRenderProps<TFieldValues>,\n options: {\n onBlur: () => void | Promise<void>;\n onChange: (value: unknown, fieldOnChange: (value: unknown) => void) => void;\n },\n): ControllerRenderProps<TFieldValues> {\n return {\n ...field,\n onBlur: options.onBlur,\n onChange: (value) => options.onChange(value, field.onChange),\n };\n}\n\n// 변경 시 재검증할 필드 타입 (blur 없이 값이 바뀌는 경우 포함)\n// date: 직접 타이핑 가능 + DatePickerSingle이 캘린더 선택 시 onBlur를 직접 호출하므로 제외\n// select-with-input: Input 서브필드에 실제 blur 이벤트가 있으므로 제외\nconst REVALIDATE_ON_CHANGE_TYPES = new Set<FormFieldConfig[\"type\"]>([\n \"checkbox\",\n \"radio\",\n \"switch\",\n \"select\",\n \"cascading-select\",\n \"input-with-button\",\n \"address\",\n]);\n\n// 빈 문자열로 초기화할 필드 타입\nconst AUTO_INIT_EMPTY_STRING_TYPES = new Set<FormFieldConfig[\"type\"]>([\n \"input\",\n \"email\",\n \"password\",\n \"phone\",\n \"textarea\",\n \"date\",\n \"address\",\n \"input-with-button\",\n \"cascading-select\",\n \"select-with-input\",\n]);\n\ntype FormFieldRowProps<TFieldValues extends FieldValues> = {\n field: ControllerRenderProps<TFieldValues, Path<TFieldValues>>;\n fieldState: ControllerFieldState;\n config: FormFieldConfig<TFieldValues>;\n valueColSpan: string;\n};\n\nfunction FormFieldRow<TFieldValues extends FieldValues>(props: FormFieldRowProps<TFieldValues>) {\n const { field, fieldState, config, valueColSpan } = props;\n const { control } = useFormContext<TFieldValues>();\n const { isSubmitted } = useFormState({ control });\n const { name, label, type = \"input\", required = false, renderCustomField, contentAlign = \"left\" } = config;\n\n const revalidateOnChange = REVALIDATE_ON_CHANGE_TYPES.has(type);\n const { handleBlur, handleChange } = useBlurValidation(name, {\n required,\n revalidateOnChange,\n validateEmptyOnChange: revalidateOnChange,\n revalidateFields: config.revalidateFields,\n });\n\n const showError = Boolean(fieldState.error?.message) && (isSubmitted || fieldState.isTouched);\n\n const isTextarea = type === \"textarea\";\n\n const wrappedField = wrapFieldHandlers(field, {\n onBlur: () => handleBlur(() => field.onBlur()),\n onChange: (value) => {\n handleChange(value, field.onChange);\n // datepicker 캘린더 선택은 blur 타이밍이 어긋날 수 있어 touched 처리\n if (revalidateOnChange) {\n field.onBlur();\n }\n },\n });\n\n const fieldProps = {\n field: wrappedField,\n config,\n fieldState,\n hasError: showError,\n };\n\n const fieldContent = renderCustomField ? (\n renderCustomField({ field: wrappedField, fieldState })\n ) : (\n <>\n {type === \"input\" || type === \"email\" || type === \"password\" ? <InputField {...fieldProps} /> : null}\n {type === \"number\" || type === \"money\" ? <NumberField {...fieldProps} /> : null}\n {type === \"phone\" ? <PhoneField {...fieldProps} /> : null}\n {type === \"textarea\" ? <TextareaField {...fieldProps} /> : null}\n {type === \"select\" ? <SelectField {...fieldProps} /> : null}\n {type === \"date\" ? <DateField {...fieldProps} /> : null}\n {type === \"radio\" ? <RadioField {...fieldProps} /> : null}\n {type === \"checkbox\" ? <CheckboxField {...fieldProps} /> : null}\n {type === \"switch\" ? <SwitchField {...fieldProps} /> : null}\n {type === \"address\" ? <AddressField {...fieldProps} /> : null}\n {type === \"input-with-button\" ? <InputWithButtonField {...fieldProps} /> : null}\n {type === \"cascading-select\" ? <CascadingSelectField {...fieldProps} /> : null}\n {type === \"select-with-input\" ? <SelectWithInputField {...fieldProps} /> : null}\n </>\n );\n\n return (\n <>\n <div className={ROW_LABEL_CLASS}>\n <p className={ROW_LABEL_TEXT_CLASS}>\n {label}\n {required ? <SubmitFormRequireIcon /> : null}\n </p>\n </div>\n\n <div className={cn(valueColSpan, ROW_VALUE_CELL_CLASS)}>\n {isTextarea ? (\n <div className={ROW_VALUE_TEXTAREA_WRAPPER_CLASS}>\n <FormFieldControlStack\n align={contentAlign}\n showError={showError}\n errorMessage={fieldState.error?.message}\n >\n {fieldContent}\n </FormFieldControlStack>\n </div>\n ) : (\n <div className={ROW_VALUE_INNER_CLASS}>\n <FormFieldControlStack\n align={contentAlign}\n showError={showError}\n errorMessage={fieldState.error?.message}\n >\n <div className={formFieldControlRowClass(contentAlign)}>{fieldContent}</div>\n </FormFieldControlStack>\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport default function FormField<TFieldValues extends FieldValues = FieldValues>(\n props: FormFieldProps<TFieldValues>,\n) {\n const { config } = props;\n const { control, getValues, setValue } = useFormContext<TFieldValues>();\n const valueColSpan = resolveValueColSpan(config.colspan);\n const fieldType = config.type ?? \"input\";\n\n useEffect(() => {\n if (!AUTO_INIT_EMPTY_STRING_TYPES.has(fieldType)) {\n return;\n }\n\n const currentValue = getValues(config.name);\n if (currentValue !== undefined) {\n return;\n }\n\n // defaultValues가 없어 undefined인 텍스트 필드는 빈 문자열로 초기화해\n // zod 기본 \"Required\" 대신 스키마의 min(1) 공통 메시지를 사용한다.\n setValue(config.name, \"\" as TFieldValues[Path<TFieldValues>], {\n // 초기값만 세팅(검증/dirty/touched 상태는 변경하지 않음)\n shouldDirty: false,\n shouldTouch: false,\n shouldValidate: false,\n });\n }, [fieldType, getValues, setValue, config.name]);\n\n return (\n <Controller\n name={config.name}\n control={control}\n render={({ field, fieldState }) => (\n <FormFieldRow field={field} fieldState={fieldState} config={config} valueColSpan={valueColSpan} />\n )}\n />\n );\n}\n","import type { FieldValues, Path } from \"react-hook-form\";\n\nimport type { FormFieldConfig, FormFieldType } from \"../config/types\";\n\nexport type SubmitFormRowProps<TFieldValues extends FieldValues = FieldValues> = Omit<\n FormFieldConfig<TFieldValues>,\n \"name\" | \"type\"\n> & {\n formKey: Path<TFieldValues>;\n name?: Path<TFieldValues>;\n formType?: FormFieldType;\n type?: FormFieldType;\n};\n\nexport function rowPropsToFieldConfig<TFieldValues extends FieldValues>(\n props: SubmitFormRowProps<TFieldValues>,\n): FormFieldConfig<TFieldValues> {\n const {\n formKey,\n name,\n formType,\n type,\n label,\n required,\n placeholder,\n disabled,\n readOnly,\n maxLength,\n options,\n className,\n allowDecimal,\n numbersOnly,\n canReset,\n datePosition,\n disableFutureDates,\n calendarSelectContainerClass,\n revalidateFields,\n renderCustomField,\n colspan,\n checkboxLabel,\n contentAlign,\n addressDetailKey,\n addressClassNames,\n cascadingSelect,\n cascadingSelectClassNames,\n selectWithInput,\n selectWithInputClassNames,\n inputWithButton,\n onClickInputWithButton,\n } = props;\n\n return {\n name: (name ?? formKey) as Path<TFieldValues>,\n label,\n type: formType ?? type ?? \"input\",\n placeholder,\n required,\n disabled,\n readOnly,\n maxLength,\n options,\n className,\n allowDecimal,\n numbersOnly,\n canReset,\n datePosition,\n disableFutureDates,\n calendarSelectContainerClass,\n revalidateFields,\n renderCustomField,\n colspan,\n checkboxLabel,\n contentAlign,\n addressDetailKey,\n addressClassNames,\n cascadingSelect,\n cascadingSelectClassNames,\n selectWithInput,\n selectWithInputClassNames,\n inputWithButton,\n onClickInputWithButton,\n };\n}\n","import type { FieldValues } from \"react-hook-form\";\n\nimport FormField from \"./FormField\";\nimport {\n rowPropsToFieldConfig,\n type SubmitFormRowProps,\n} from \"../config/rowPropsToFieldConfig\";\n\nexport default function SubmitFormRow<TFieldValues extends FieldValues = FieldValues>(\n props: SubmitFormRowProps<TFieldValues>,\n) {\n return <FormField config={rowPropsToFieldConfig(props)} />;\n}\n","import { isEmptyFieldValue } from \"../validation/zod\";\n\n/** defaultValues에 값이 있으면 hadFieldValue로 시드 (수정 화면 등) */\nexport function seedHadValueFromDefaults(\n values: unknown,\n ref: Record<string, boolean>,\n pathPrefix = \"\",\n): void {\n if (values === undefined || values === null) return;\n\n if (Array.isArray(values)) {\n values.forEach((item, index) => {\n seedHadValueFromDefaults(item, ref, pathPrefix ? `${pathPrefix}.${index}` : String(index));\n });\n return;\n }\n\n if (typeof values === \"object\") {\n for (const [key, val] of Object.entries(values as Record<string, unknown>)) {\n const path = pathPrefix ? `${pathPrefix}.${key}` : key;\n seedHadValueFromDefaults(val, ref, path);\n }\n return;\n }\n\n if (!isEmptyFieldValue(values) && pathPrefix) {\n ref[pathPrefix] = true;\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, type ReactNode } from \"react\";\n\nimport { seedHadValueFromDefaults } from \"../validation/seedHadValue\";\nimport { SubmitFormValidationContext } from \"../validation/context\";\n\ntype SubmitFormValidationProviderProps = {\n children: ReactNode;\n defaultValues?: Record<string, unknown>;\n};\n\nexport default function SubmitFormValidationProvider(props: SubmitFormValidationProviderProps) {\n const { children, defaultValues } = props;\n const hadValueRef = useRef<Record<string, boolean>>({});\n\n useEffect(() => {\n if (defaultValues) {\n seedHadValueFromDefaults(defaultValues, hadValueRef.current);\n }\n }, [defaultValues]);\n\n const markFieldHadValue = useCallback((name: string) => {\n hadValueRef.current[name] = true;\n }, []);\n\n const hadFieldValue = useCallback((name: string) => !!hadValueRef.current[name], []);\n\n const value = useMemo(\n () => ({\n markFieldHadValue,\n hadFieldValue,\n }),\n [markFieldHadValue, hadFieldValue],\n );\n\n return (\n <SubmitFormValidationContext.Provider value={value}>{children}</SubmitFormValidationContext.Provider>\n );\n}\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\n\nimport FormTable from \"./components/FormTable\";\nimport SubmitFormRow from \"./components/SubmitFormRow\";\nimport { SUBMIT_FORM_CLASS } from \"./config/styles\";\nimport type { SubmitFormProps } from \"./config/types\";\nimport { cn } from \"./config/utils\";\nimport SubmitFormValidationProvider from \"./validation/SubmitFormValidationProvider\";\n\nfunction SubmitFormRoot<TSchema extends z.ZodTypeAny = z.ZodTypeAny>(props: SubmitFormProps<TSchema>) {\n const {\n schema,\n formId,\n defaultValues,\n onSubmit,\n children,\n className = \"\",\n formClassName,\n gridClassName = \"grid-cols-12\",\n mode = \"onSubmit\",\n autoComplete,\n } = props;\n const methods = useForm<z.infer<TSchema>>({\n resolver: zodResolver(schema),\n defaultValues,\n mode,\n reValidateMode: \"onSubmit\",\n shouldFocusError: false,\n });\n\n const handleSubmit = methods.handleSubmit(\n async (data) => {\n await onSubmit(data);\n },\n async () => {\n await methods.trigger();\n },\n );\n\n return (\n <SubmitFormValidationProvider defaultValues={defaultValues as Record<string, unknown> | undefined}>\n <FormProvider {...methods}>\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(SUBMIT_FORM_CLASS, formClassName, className)}\n autoComplete={autoComplete}\n noValidate\n >\n <div className={`grid ${gridClassName} items-stretch gap-0`}>{children}</div>\n </form>\n </FormProvider>\n </SubmitFormValidationProvider>\n );\n}\n\nexport const SubmitForm = Object.assign(SubmitFormRoot, {\n Row: SubmitFormRow,\n Table: FormTable,\n});\n","import type { ReactNode } from \"react\";\n\ninterface LabeledFilterOptionProps {\n label?: string;\n children: ReactNode;\n gap: number;\n}\n\nexport default function LabeledFilterOption(props: LabeledFilterOptionProps) {\n const { label, children, gap } = props;\n\n return (\n <div style={{ marginLeft: gap }} className=\"flex flex-row items-center gap-5\">\n {label && <label className=\"text-sm font-medium text-gray-60 shrink-0\">{label}</label>}\n {children}\n </div>\n );\n}\n","import { useRef } from \"react\";\nimport { cn } from \"../../lib/variants\";\nimport Input from \"../Input\";\nimport Select from \"../Select\";\nimport RadioGroup from \"../Radio\";\nimport Checkbox from \"../Checkbox\";\nimport DatePickerSingle from \"../DatePicker/ui/DatePickerSingle\";\nimport DatePickerRange from \"../DatePicker/ui/DatePickerRange\";\nimport type { FilterRow } from \"./config/type\";\nimport LabeledFilterOption from \"./ui/LabeledFilterOption\";\nimport Button from \"../Button\";\n\ninterface PageFilterProps<P> {\n rows: Array<FilterRow<P>>;\n onChange: (updates: Partial<P>) => void;\n onSubmit: () => void;\n onReset?: () => void;\n containerClassName?: string;\n rowGap?: number;\n colGap?: number;\n submitButtonText?: string;\n resetButtonText?: string;\n values: P;\n primaryColor?: string;\n}\n\nexport default function PageFilter<P extends Record<keyof P, string>>(props: PageFilterProps<P>) {\n const {\n rows,\n onChange,\n onSubmit,\n onReset,\n containerClassName,\n rowGap = 32,\n colGap = 0,\n submitButtonText = \"검색\",\n resetButtonText = \"초기화\",\n values,\n primaryColor,\n } = props;\n\n const initialValuesRef = useRef<P>(values);\n\n const handleInputChange = (key: keyof P) => (e: React.ChangeEvent<HTMLInputElement>) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n onChange({ [key]: e.target.value } as Partial<P>);\n };\n\n const handleSelectChange = (key: keyof P) => (value: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n onChange({ [key]: value } as Partial<P>);\n };\n\n const handleRadioChange = (key: keyof P) => (value: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n onChange({ [key]: value } as Partial<P>);\n };\n\n const handleDateChange = (key: keyof P) => (date: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n onChange({ [key]: date } as Partial<P>);\n };\n\n const handleRangeChangeCurried = (startKey: keyof P, endKey: keyof P) => (start: string, end: string) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n onChange({ [startKey]: start, [endKey]: end } as Partial<P>);\n };\n\n const handleCheckboxChange = (key: keyof P) => (checked: boolean) => {\n // @ts-expect-cast: P extends Record<keyof P, string> guarantees string values are valid\n onChange({ [key]: checked ? \"true\" : \"false\" } as Partial<P>);\n };\n\n const handleSubmit = () => {\n onSubmit();\n };\n\n const handleReset = () => {\n onChange(initialValuesRef.current);\n onReset?.();\n };\n\n const renderFilterOption = (option: FilterRow<P>[\"options\"][0], gap: number, index: number) => {\n const optionKey = option.key;\n const currentValue = String(values[optionKey] ?? \"\");\n\n const rowGap = index !== 0 ? (option.label ? gap : 5) : 0;\n\n switch (option.type) {\n case \"input\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <Input\n placeholder={option.placeholder}\n value={currentValue}\n onChange={handleInputChange(optionKey)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSubmit();\n }}\n />\n </LabeledFilterOption>\n );\n\n case \"select\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <Select\n value={currentValue}\n onChange={handleSelectChange(optionKey)}\n options={option.options}\n placeholder=\"선택\"\n canReset\n containerClassName={option.containerClassName ?? \"w-30\"}\n />\n </LabeledFilterOption>\n );\n\n case \"radio\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <RadioGroup\n name={String(optionKey)}\n value={currentValue}\n onChange={handleRadioChange(optionKey)}\n options={option.options}\n direction=\"horizontal\"\n />\n </LabeledFilterOption>\n );\n\n case \"date\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <DatePickerSingle\n value={currentValue}\n onChange={handleDateChange(optionKey)}\n placeholder={option.placeholder}\n />\n </LabeledFilterOption>\n );\n\n case \"date-range\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <DatePickerRange\n startValue={currentValue}\n endValue={String(values[option.endKey] ?? \"\")}\n onRangeChange={handleRangeChangeCurried(optionKey, option.endKey)}\n />\n </LabeledFilterOption>\n );\n\n case \"checkbox\":\n return (\n <LabeledFilterOption key={String(optionKey)} label={option.label} gap={rowGap}>\n <Checkbox\n checked={currentValue === \"true\"}\n name={String(optionKey)}\n value={currentValue}\n onChange={handleCheckboxChange(optionKey)}\n />\n </LabeledFilterOption>\n );\n\n default: {\n const _exhaustive: never = option;\n return _exhaustive;\n }\n }\n };\n\n return (\n <div\n className={cn(\"flex flex-col gap-3 bg-white py-3 px-5 border-t-main border-t-1 shadow-panel\", containerClassName)}\n style={primaryColor ? { borderTopColor: primaryColor } : undefined}\n >\n <div className=\"relative flex flex-col\" style={{ gap: `${colGap}px` }}>\n {rows.map((row, ix) => {\n const isLastRow = rows.length - 1 === ix;\n\n return (\n <div key={row.options.map((opt) => String(opt.key)).join(\"_\")} className=\"flex flex-row min-h-12\">\n {row.options.map((option, index) => renderFilterOption(option, rowGap, index))}\n {isLastRow && (\n <div className=\"ml-4 flex flex-row items-center gap-2\">\n <Button variant=\"search\" onClick={handleSubmit}>\n {submitButtonText}\n </Button>\n {onReset && (\n <Button variant=\"reset\" onClick={handleReset}>\n {resetButtonText}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Plus, X } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport type { MultiTab } from \"../../stores/multiTabStore\";\n\nexport type MultiTabVariant = \"light\" | \"dark\" | \"system-light\" | \"system-dark\";\n\ninterface TabVariantStyle {\n container: string;\n activeTab: string;\n inactiveTab: string;\n activeText: string;\n inactiveText: string;\n indicator: string;\n closeBtn: string; // hover/color classes (include ml-auto for system variants)\n closeBtnWH: string; // dimension: \"w-3.5 h-3.5\" or \"w-4 h-4\"\n closeBtnSize: number; // <X> icon px size\n plusBtnArea: string;\n plusBtn: string;\n fadeOpacity: number; // peak opacity of the dark edge overlay (0–1)\n tabPy: string;\n tabPx: string;\n tabTextSize: string;\n scrollPadding: string;\n rounded: string;\n}\n\nconst VARIANT_STYLES: Record<MultiTabVariant, TabVariantStyle> = {\n light: {\n container: \"bg-white border-b border-gray-200\",\n activeTab: \"bg-gray-50 border-gray-200 text-gray-800 shadow-sm\",\n inactiveTab: \"bg-white border-gray-100 text-gray-400 hover:text-gray-600 hover:border-gray-200 hover:bg-gray-50\",\n activeText: \"font-semibold text-gray-800\",\n inactiveText: \"font-normal\",\n indicator: \"bg-blue-500\",\n closeBtn: \"rounded hover:bg-gray-300/60\",\n closeBtnWH: \"w-3.5 h-3.5\",\n closeBtnSize: 10,\n plusBtnArea: \"border-l border-gray-100 bg-white\",\n plusBtn: \"text-gray-400 hover:text-gray-600 hover:bg-gray-100\",\n fadeOpacity: 0.12,\n tabPy: \"py-1.5\",\n tabPx: \"px-3\",\n tabTextSize: \"text-xs\",\n scrollPadding: \"px-3 pt-1.5\",\n rounded: \"rounded-t-md\",\n },\n dark: {\n container: \"bg-gray-900 border-b border-gray-700\",\n activeTab: \"bg-gray-800 border-gray-600 text-white shadow-sm\",\n inactiveTab:\n \"bg-gray-900 border-gray-700/50 text-gray-500 hover:text-gray-300 hover:border-gray-600 hover:bg-gray-800\",\n activeText: \"font-semibold text-white\",\n inactiveText: \"font-normal\",\n indicator: \"bg-indigo-400\",\n closeBtn: \"rounded hover:bg-gray-600/60\",\n closeBtnWH: \"w-3.5 h-3.5\",\n closeBtnSize: 10,\n plusBtnArea: \"border-l border-gray-700 bg-gray-900\",\n plusBtn: \"text-gray-500 hover:text-gray-300 hover:bg-gray-700\",\n fadeOpacity: 0.4,\n tabPy: \"py-1.5\",\n tabPx: \"px-3\",\n tabTextSize: \"text-xs\",\n scrollPadding: \"px-3 pt-1.5\",\n rounded: \"rounded-t-md\",\n },\n \"system-light\": {\n container: \"bg-gray-200 border-b border-gray-300\",\n activeTab: \"bg-white border-gray-300 text-slate-800 shadow-sm\",\n inactiveTab:\n \"bg-transparent border-gray-300/80 text-slate-500 hover:text-slate-700 hover:bg-[#efefef] hover:border-gray-300\",\n activeText: \"font-semibold text-slate-800\",\n inactiveText: \"font-medium\",\n indicator: \"bg-[#2b2b2b]\",\n closeBtn: \"ml-auto text-slate-400 hover:text-slate-700\",\n closeBtnWH: \"w-4 h-4\",\n closeBtnSize: 13,\n plusBtnArea: \"border-l border-gray-300 bg-gray-200\",\n plusBtn: \"text-slate-400 hover:text-slate-600 hover:bg-gray-300\",\n fadeOpacity: 0.15,\n tabPy: \"py-2.5\",\n tabPx: \"px-5\",\n tabTextSize: \"text-sm\",\n scrollPadding: \"px-3 pt-2\",\n rounded: \"rounded-t-none\",\n },\n \"system-dark\": {\n container: \"bg-slate-900 border-b border-slate-700\",\n activeTab: \"bg-slate-800 border-slate-600 text-slate-100 shadow-sm\",\n inactiveTab:\n \"bg-transparent border-slate-700/50 text-slate-400 hover:text-slate-200 hover:bg-slate-800/60 hover:border-slate-700\",\n activeText: \"font-semibold text-slate-100\",\n inactiveText: \"font-medium\",\n indicator: \"bg-indigo-400\",\n closeBtn: \"ml-auto text-slate-500 hover:text-slate-200\",\n closeBtnWH: \"w-4 h-4\",\n closeBtnSize: 13,\n plusBtnArea: \"border-l border-slate-700 bg-slate-900\",\n plusBtn: \"text-slate-400 hover:text-slate-200 hover:bg-slate-700\",\n fadeOpacity: 0.45,\n tabPy: \"py-2.5\",\n tabPx: \"px-5\",\n tabTextSize: \"text-sm\",\n scrollPadding: \"px-4 pt-2\",\n rounded: \"rounded-t-none\",\n },\n};\n\nconst PLUS_BTN_WIDTH = 36;\n\n// ease-out 곡선을 5개 stop으로 근사해 자연스럽게 감쇠하는 dark 오버레이 그라디언트\nfunction easedFade(dir: string, opacity: number): string {\n const c = (t: number) => `rgba(0,0,0,${(opacity * t).toFixed(3)})`;\n return `linear-gradient(${dir}, ${c(1)} 0%, ${c(0.72)} 20%, ${c(0.38)} 45%, ${c(0.1)} 70%, transparent 100%)`;\n}\n\ninterface MultiTabBarProps {\n tabs: Array<MultiTab>;\n activeTabId: string | null;\n onTabClick: (tabId: string) => void;\n onTabClose: (tabId: string) => void;\n onTabAdd?: () => void;\n variant?: MultiTabVariant;\n primaryColor?: string;\n}\n\nexport default function MultiTabBar(props: MultiTabBarProps) {\n const { tabs, activeTabId, onTabClick, onTabClose, onTabAdd, variant = \"light\", primaryColor } = props;\n const s = VARIANT_STYLES[variant];\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const tabRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n\n const [showLeftFade, setShowLeftFade] = useState(false);\n const [showRightFade, setShowRightFade] = useState(false);\n\n const isDragging = useRef(false);\n const hasDragged = useRef(false);\n const dragStartX = useRef(0);\n const dragScrollLeft = useRef(0);\n\n /* ── 활성 탭이 항상 보이도록 자동 스크롤 ── */\n useEffect(() => {\n if (!activeTabId || !scrollRef.current) return;\n const el = tabRefs.current.get(activeTabId);\n if (!el) return;\n\n const container = scrollRef.current;\n const tabLeft = el.offsetLeft;\n const tabRight = tabLeft + el.offsetWidth;\n const containerLeft = container.scrollLeft;\n const containerRight = containerLeft + container.clientWidth;\n\n if (tabLeft < containerLeft) {\n container.scrollTo({ left: tabLeft - 12, behavior: \"smooth\" });\n } else if (tabRight > containerRight) {\n container.scrollTo({ left: tabRight - container.clientWidth + 12, behavior: \"smooth\" });\n }\n }, [activeTabId, tabs.length]);\n\n /* ── 좌우 페이드 상태 갱신 ── */\n const updateFades = () => {\n const c = scrollRef.current;\n if (!c) return;\n setShowLeftFade(c.scrollLeft > 2);\n setShowRightFade(c.scrollLeft + c.clientWidth < c.scrollWidth - 2);\n };\n\n useEffect(() => {\n updateFades();\n const obs = new ResizeObserver(updateFades);\n if (scrollRef.current) obs.observe(scrollRef.current);\n return () => obs.disconnect();\n }, [tabs]);\n\n /* ── 마우스 드래그 스크롤 ── */\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!scrollRef.current) return;\n isDragging.current = true;\n hasDragged.current = false;\n dragStartX.current = e.pageX - scrollRef.current.getBoundingClientRect().left;\n dragScrollLeft.current = scrollRef.current.scrollLeft;\n };\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging.current || !scrollRef.current) return;\n const x = e.pageX - scrollRef.current.getBoundingClientRect().left;\n const walk = x - dragStartX.current;\n if (Math.abs(walk) > 4) hasDragged.current = true;\n scrollRef.current.scrollLeft = dragScrollLeft.current - walk;\n };\n\n const handleStopDrag = () => {\n isDragging.current = false;\n };\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n el.scrollLeft += e.deltaY || e.deltaX;\n };\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, []);\n\n if (tabs.length === 0) return null;\n\n return (\n <div className={`flex-shrink-0 w-full overflow-hidden ${s.container}`}>\n <div className=\"relative flex items-stretch\">\n {showLeftFade && (\n <div\n className=\"absolute left-0 top-0 bottom-0 w-10 pointer-events-none z-10\"\n style={{ background: easedFade(\"to right\", s.fadeOpacity) }}\n />\n )}\n\n {showRightFade && (\n <div\n className=\"absolute top-0 bottom-0 w-10 pointer-events-none z-10\"\n style={{\n right: PLUS_BTN_WIDTH,\n background: easedFade(\"to left\", s.fadeOpacity),\n }}\n />\n )}\n\n <div\n ref={scrollRef}\n className={`flex-1 min-w-0 flex items-end gap-0.5 ${s.scrollPadding} overflow-x-auto [&::-webkit-scrollbar]:hidden`}\n style={{ scrollbarWidth: \"none\" }}\n onScroll={updateFades}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleStopDrag}\n onMouseLeave={handleStopDrag}\n >\n {tabs.map((tab) => {\n const isActive = tab.id === activeTabId;\n return (\n <div\n key={tab.id}\n ref={(el) => {\n if (el) tabRefs.current.set(tab.id, el);\n else tabRefs.current.delete(tab.id);\n }}\n onClick={() => {\n if (hasDragged.current) return;\n if (!isActive) onTabClick(tab.id);\n }}\n className={`\n group relative flex items-center gap-1.5 ${s.tabPx} ${s.tabPy} flex-shrink-0\n ${s.rounded} border border-b-0 cursor-pointer select-none\n transition-colors duration-100\n ${isActive ? s.activeTab : s.inactiveTab}\n `}\n >\n {isActive && (\n <div\n className={`absolute top-0 left-0 right-0 h-0.5 ${s.rounded} ${s.indicator}`}\n style={primaryColor ? { backgroundColor: primaryColor } : undefined}\n />\n )}\n\n <span\n className={`${s.tabTextSize} max-w-35 truncate leading-none ${isActive ? s.activeText : s.inactiveText}`}\n >\n {tab.label}\n </span>\n\n {tabs.length > 1 && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onTabClose(tab.id);\n }}\n className={`\n flex-shrink-0 ${s.closeBtnWH} flex items-center justify-center\n transition-all duration-100 cursor-pointer\n ${s.closeBtn}\n ${isActive ? \"opacity-100\" : \"opacity-40 group-hover:opacity-60\"}\n `}\n >\n <X size={s.closeBtnSize} strokeWidth={2.5} />\n </button>\n )}\n </div>\n );\n })}\n </div>\n\n {onTabAdd && (\n <div\n className={`flex-shrink-0 flex items-center justify-center ${s.plusBtnArea}`}\n style={{ width: PLUS_BTN_WIDTH }}\n >\n <button\n onClick={onTabAdd}\n title=\"현재 페이지를 새 탭으로 열기\"\n className={`w-6 h-6 flex items-center justify-center rounded cursor-pointer transition-colors ${s.plusBtn}`}\n >\n <Plus size={13} strokeWidth={2} />\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { create } from \"zustand\";\nimport { createJSONStorage, persist } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport type MultiTab = {\n id: string;\n basePath: string;\n label: string;\n currentPath: string;\n};\n\ninterface MultiTabStore {\n tabs: MultiTab[];\n activeTabId: string | null;\n hasHydrated: boolean;\n /**\n * 탭 열기 (메뉴 클릭용)\n * - 동일 basePath 탭이 있으면 활성화 후 currentPath 반환\n * - 없으면 새 탭 생성 후 null 반환\n */\n openTab: (basePath: string, label: string, initialPath?: string) => string | null;\n /**\n * 탭 강제 추가 ([+] 버튼용)\n * - 동일 basePath가 있어도 항상 새 탭 생성\n */\n addTab: (basePath: string, label: string, currentPath: string) => string;\n /**\n * 탭 전환\n * - 이전 탭의 currentPath를 fromPath로 갱신 후 대상 탭 활성화\n * - 전환할 탭의 currentPath 반환\n */\n switchToTab: (toId: string, fromPath: string) => string;\n closeTab: (id: string) => string | null;\n updateCurrentPath: (id: string, path: string) => void;\n setActiveTabId: (id: string) => void;\n setHasHydrated: (v: boolean) => void;\n}\n\n// 읽기/쓰기 시점마다 currentId를 조회하므로 로그인 전/후 모두 올바른 키 사용\nconst userScopedStorage = createJSONStorage(() => ({\n getItem: (name: string) => {\n const userId = localStorage.getItem(\"currentId\") ?? \"guest\";\n return localStorage.getItem(`${name}-${userId}`);\n },\n setItem: (name: string, value: string) => {\n const userId = localStorage.getItem(\"currentId\") ?? \"guest\";\n localStorage.setItem(`${name}-${userId}`, value);\n },\n removeItem: (name: string) => {\n const userId = localStorage.getItem(\"currentId\") ?? \"guest\";\n localStorage.removeItem(`${name}-${userId}`);\n },\n}));\n\nexport const useMultiTabStore = create<MultiTabStore>()(\n persist(\n (set, get) => ({\n tabs: [],\n activeTabId: null,\n hasHydrated: false,\n\n openTab: (basePath, label, initialPath) => {\n const { tabs } = get();\n const existing = tabs.find((t) => t.basePath === basePath);\n if (existing) {\n set({ activeTabId: existing.id });\n return existing.currentPath;\n }\n const id = uuidv4();\n const currentPath = initialPath ?? basePath;\n set({ tabs: [...tabs, { id, basePath, label, currentPath }], activeTabId: id });\n return null;\n },\n\n addTab: (basePath, label, currentPath) => {\n const id = uuidv4();\n set((s) => ({ tabs: [...s.tabs, { id, basePath, label, currentPath }], activeTabId: id }));\n return currentPath;\n },\n\n switchToTab: (toId, fromPath) => {\n const { tabs, activeTabId } = get();\n const fromTab = activeTabId ? tabs.find((t) => t.id === activeTabId) : null;\n const urlBelongsToFrom =\n fromTab != null &&\n (fromPath === fromTab.basePath ||\n fromPath.startsWith(fromTab.basePath + \"/\") ||\n fromPath.startsWith(fromTab.basePath + \"?\"));\n const updatedTabs =\n urlBelongsToFrom && activeTabId\n ? tabs.map((t) => (t.id === activeTabId ? { ...t, currentPath: fromPath } : t))\n : tabs;\n const toTab = updatedTabs.find((t) => t.id === toId)!;\n set({ tabs: updatedTabs, activeTabId: toId });\n return toTab.currentPath;\n },\n\n closeTab: (id) => {\n const { tabs, activeTabId } = get();\n const idx = tabs.findIndex((t) => t.id === id);\n const newTabs = tabs.filter((t) => t.id !== id);\n if (activeTabId !== id) {\n set({ tabs: newTabs });\n return null;\n }\n if (newTabs.length === 0) {\n set({ tabs: [], activeTabId: null });\n return null;\n }\n const nextTab = newTabs[Math.min(idx, newTabs.length - 1)];\n if (!nextTab) {\n set({ tabs: newTabs, activeTabId: null });\n return null;\n }\n set({ tabs: newTabs, activeTabId: nextTab.id });\n return nextTab.currentPath;\n },\n\n updateCurrentPath: (id, path) =>\n set((s) => ({ tabs: s.tabs.map((t) => (t.id === id ? { ...t, currentPath: path } : t)) })),\n\n setActiveTabId: (id) => set({ activeTabId: id }),\n\n setHasHydrated: (v) => set({ hasHydrated: v }),\n }),\n {\n name: \"multi-tab-store\",\n storage: userScopedStorage,\n partialize: (state) => ({ tabs: state.tabs, activeTabId: state.activeTabId }),\n onRehydrateStorage: () => (state) => {\n state?.setHasHydrated(true);\n },\n },\n ),\n);\n","import { useCallback, useEffect, useRef, useState, type RefObject } from \"react\";\n\nimport { cn } from \"../../lib/variants\";\n\ninterface ScrollBarProps {\n direction: \"horizontal\" | \"vertical\";\n scrollRef: RefObject<HTMLDivElement | null>;\n}\n\nexport default function ScrollBar(props: ScrollBarProps) {\n const { direction, scrollRef } = props;\n const [scrollPosition, setScrollPosition] = useState(0);\n const [thumbSize, setThumbSize] = useState(0);\n const [trackSize, setTrackSize] = useState(0);\n const [clientSize, setClientSize] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n const dragOffsetRef = useRef(0);\n\n const getWrapperClassName = () => {\n if (direction === \"horizontal\") {\n return \"w-full h-[6px]\";\n }\n return \"h-full w-[6px]\";\n };\n\n const getThumbClassName = () => {\n const defaultClass = \"bg-[#D8D8D8] cursor-pointer hover:bg-[#999999] transition-colors\";\n if (direction === \"horizontal\") {\n return cn(defaultClass, \"h-full\", isDragging ? \"bg-[#999999]\" : \"\");\n }\n return cn(defaultClass, \"w-full\", isDragging ? \"bg-[#999999]\" : \"\");\n };\n\n const updateScrollBar = useCallback(() => {\n if (!scrollRef.current) {\n return;\n }\n\n const scrollElement = scrollRef.current;\n\n if (direction === \"horizontal\") {\n setTrackSize(scrollElement.scrollWidth);\n const scrollWidth = scrollElement.scrollWidth;\n const clientWidth = scrollElement.clientWidth;\n setClientSize(clientWidth);\n const scrollLeft = scrollElement.scrollLeft;\n\n const thumbSizeRatio = clientWidth / scrollWidth;\n const newThumbSize = Math.max(thumbSizeRatio * clientWidth, 30);\n const maxScroll = scrollWidth - clientWidth;\n const scrollRatio = maxScroll > 0 ? scrollLeft / maxScroll : 0;\n const maxThumbPosition = clientWidth - newThumbSize;\n const newScrollPosition = scrollRatio * maxThumbPosition;\n\n setThumbSize(newThumbSize);\n setScrollPosition(newScrollPosition);\n } else {\n setTrackSize(scrollElement.scrollHeight);\n const scrollHeight = scrollElement.scrollHeight;\n const clientHeight = scrollElement.clientHeight;\n setClientSize(clientHeight);\n const scrollTop = scrollElement.scrollTop;\n\n const thumbSizeRatio = clientHeight / scrollHeight;\n const newThumbSize = Math.max(thumbSizeRatio * clientHeight, 30);\n const maxScroll = scrollHeight - clientHeight;\n const scrollRatio = maxScroll > 0 ? scrollTop / maxScroll : 0;\n const maxThumbPosition = clientHeight - newThumbSize;\n const newScrollPosition = scrollRatio * maxThumbPosition;\n\n setThumbSize(newThumbSize);\n setScrollPosition(newScrollPosition);\n }\n }, [direction, scrollRef]);\n\n const handleThumbMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n\n if (!thumbRef.current) {\n return;\n }\n const thumbRect = thumbRef.current.getBoundingClientRect();\n\n // 마우스가 thumb 내에서 클릭한 위치의 offset 저장\n if (direction === \"horizontal\") {\n dragOffsetRef.current = e.clientX - thumbRect.left;\n } else {\n dragOffsetRef.current = e.clientY - thumbRect.top;\n }\n\n setIsDragging(true);\n };\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || !scrollRef.current || !trackRef.current) {\n return;\n }\n const trackRect = trackRef.current.getBoundingClientRect();\n const scrollBoxRect = scrollRef.current.getBoundingClientRect();\n const scrollElement = scrollRef.current;\n\n if (direction === \"horizontal\") {\n // 마우스 위치에서 클릭 offset을 빼서 thumb의 시작 위치 계산\n const thumbPosition = e.clientX - trackRect.left - dragOffsetRef.current;\n const trackWidth = trackRect.width;\n const maxThumbPosition = trackWidth - thumbSize;\n\n // thumb 위치를 0과 maxThumbPosition 사이로 제한\n const clampedThumbPosition = Math.max(0, Math.min(thumbPosition, maxThumbPosition));\n // thumb 위치 비율을 스크롤 위치로 변환\n const scrollRatio = maxThumbPosition > 0 ? clampedThumbPosition / maxThumbPosition : 0;\n const maxScroll = scrollElement.scrollWidth - scrollElement.clientWidth;\n scrollElement.scrollLeft = scrollRatio * maxScroll;\n } else {\n // 마우스 위치에서 클릭 offset을 빼서 thumb의 시작 위치 계산\n const thumbPosition = e.clientY - trackRect.top - dragOffsetRef.current;\n const scrollBoxHeight = scrollBoxRect.height;\n const maxThumbPosition = scrollBoxHeight - thumbSize;\n\n // thumb 위치를 0과 maxThumbPosition 사이로 제한\n const clampedThumbPosition = Math.max(0, Math.min(thumbPosition, maxThumbPosition));\n // thumb 위치 비율을 스크롤 위치로 변환\n const scrollRatio = maxThumbPosition > 0 ? clampedThumbPosition / maxThumbPosition : 0;\n const maxScroll = scrollElement.scrollHeight - scrollElement.clientHeight;\n scrollElement.scrollTop = scrollRatio * maxScroll;\n }\n },\n [isDragging, direction, scrollRef, thumbSize],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n useEffect(() => {\n const scrollElement = scrollRef.current;\n if (!scrollElement) {\n return;\n }\n\n const updateAfterRender = () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updateScrollBar();\n });\n });\n };\n\n updateAfterRender();\n scrollElement.addEventListener(\"scroll\", updateScrollBar);\n\n const resizeObserver = new ResizeObserver(() => {\n updateScrollBar();\n });\n resizeObserver.observe(scrollElement);\n\n const mutationObserver = new MutationObserver(() => {\n updateScrollBar();\n });\n mutationObserver.observe(scrollElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n return () => {\n scrollElement.removeEventListener(\"scroll\", updateScrollBar);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [updateScrollBar, scrollRef]);\n\n useEffect(() => {\n if (isDragging) {\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }\n return undefined;\n }, [isDragging, handleMouseMove, handleMouseUp]);\n\n // 스크롤바가 필요하지 않은 경우 렌더링하지 않음\n\n if (thumbSize === 0 || thumbSize === trackSize) {\n return null;\n }\n\n return (\n <div\n ref={trackRef}\n className={cn(\"bg-[#F4F4F4] relative\", getWrapperClassName())}\n style={{\n [direction === \"horizontal\" ? \"width\" : \"height\"]:\n direction === \"horizontal\"\n ? `${clientSize > 0 ? clientSize : trackSize}px`\n : `${clientSize > 0 ? clientSize : trackSize}px`,\n }}\n >\n <div\n ref={thumbRef}\n className={getThumbClassName()}\n style={{\n [direction === \"horizontal\" ? \"width\" : \"height\"]: `${thumbSize}px`,\n transform:\n direction === \"horizontal\"\n ? `translateX(${scrollPosition}px)`\n : `translateY(${scrollPosition}px)`,\n }}\n onMouseDown={handleThumbMouseDown}\n />\n </div>\n );\n}\n","interface ToggleSwitchProps {\n isOn: boolean;\n toggleSwitch: () => void;\n offText?: string;\n onText?: string;\n width?: string;\n height?: string;\n circleSize?: string;\n onColor?: {\n from: string;\n to: string;\n };\n offColor?: {\n from: string;\n to: string;\n };\n textPosition?: {\n on: string;\n off: string;\n };\n}\n\nexport default function ToggleSwitch(props: ToggleSwitchProps) {\n const {\n isOn,\n toggleSwitch,\n offText = \"상하\",\n onText = \"좌우\",\n width = \"w-15\",\n height = \"h-6.5\",\n circleSize = \"w-4 h-4\",\n onColor = { from: \"#4ade80\", to: \"#22c55e\" },\n offColor = { from: \"#f87171\", to: \"#ef4444\" },\n } = props;\n\n return (\n <button\n className={`relative ${width} ${height} rounded-full bg-white shadow-md flex items-center cursor-pointer transition-all duration-300 ease-in-out`}\n onClick={toggleSwitch}\n aria-pressed={isOn}\n >\n <div\n className={`absolute w-10 text-xs font-semibold text-red-600 transition-opacity duration-300 left-2/3 -translate-x-1/2 ${\n !isOn ? \"opacity-100\" : \"opacity-0\"\n }`}\n >\n {offText}\n </div>\n\n <div\n className={`absolute w-10 text-xs font-semibold text-green-700 transition-opacity duration-300 left-1/3 -translate-x-1/2 ${\n isOn ? \"opacity-100\" : \"opacity-0\"\n }`}\n >\n {onText}\n </div>\n\n <div\n className={`absolute ${circleSize} rounded-full shadow-md transition-transform duration-300 ease-in-out left-1 ${\n isOn ? \"translate-x-8\" : \"translate-x-0\"\n }`}\n style={{\n background: isOn\n ? `linear-gradient(to bottom right, ${onColor.from}, ${onColor.to})`\n : `linear-gradient(to bottom right, ${offColor.from}, ${offColor.to})`,\n }}\n />\n </button>\n );\n}\n","import dayjs from \"dayjs\";\n\nexport function formatDate(date: string, time: boolean = false): string {\n return dayjs(date).format(time ? \"YYYY-MM-DD HH:mm:ss\" : \"YYYY-MM-DD\");\n}\n\nexport function todayDate(): string {\n return dayjs().format(\"YYYY-MM-DD\");\n}\n\nexport function chatTime(timestamp: string): string {\n const date = new Date(timestamp);\n return dayjs(date).format(\"HH:MM\");\n}\n\nexport function chatFullTime(timestamp: string): string {\n const date = new Date(timestamp);\n return dayjs(date).format(\"YYYY-MM-DD HH:MM\");\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useId, useRef, useState } from \"react\";\nimport { Upload, X, FileText } from \"lucide-react\";\nimport { cn } from \"../../lib/variants\";\nimport { formatFileSize } from \"../../lib/dateUtils\";\n\nexport interface BaseUploaderProps {\n files: Array<File>;\n onChange: (files: Array<File>) => void;\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n}\n\nfunction checkAccept(file: File, accept?: string): boolean {\n if (!accept) return true;\n const parts = accept.split(\",\").map((s) => s.trim().toLowerCase());\n const name = file.name.toLowerCase();\n const mime = file.type.toLowerCase();\n return parts.some((part) => {\n if (part.startsWith(\".\")) return name.endsWith(part);\n if (part.endsWith(\"/*\")) return mime.startsWith(part.slice(0, -2));\n return mime === part;\n });\n}\n\nexport default function BaseUploader(props: BaseUploaderProps) {\n const {\n files,\n onChange,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n disabled = false,\n placeholder,\n className,\n } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n const [isDragging, setIsDragging] = useState(false);\n const [error, setError] = useState(\"\");\n\n const processFiles = useCallback(\n (incoming: Array<File>) => {\n setError(\"\");\n const valid: Array<File> = [];\n const errors: Array<string> = [];\n\n for (const file of incoming) {\n if (!checkAccept(file, accept)) {\n errors.push(`${file.name}: 허용되지 않는 파일 형식`);\n continue;\n }\n if (maxSize && file.size > maxSize) {\n errors.push(`${file.name}: 파일 크기 초과 (최대 ${formatFileSize(maxSize)})`);\n continue;\n }\n valid.push(file);\n }\n\n if (errors.length) setError(errors.join(\" / \"));\n if (!valid.length) return;\n\n const next = multiple ? [...files, ...valid] : [valid[0]];\n const limited = maxFiles ? next.slice(0, maxFiles) : next;\n\n onChange(limited as Array<File>);\n },\n [accept, files, maxFiles, maxSize, multiple, onChange],\n );\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n processFiles(Array.from(e.dataTransfer.files));\n };\n\n const removeFile = (idx: number) => {\n const next = files.filter((_, i) => i !== idx);\n onChange(next);\n setError(\"\");\n };\n\n const showZone = multiple || files.length === 0;\n const acceptLabel = accept\n ? accept\n .split(\",\")\n .map((s) => s.trim().toUpperCase())\n .join(\", \")\n : \"모든 형식\";\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <input\n id={inputId}\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n className=\"hidden\"\n onChange={(e) => {\n processFiles(Array.from(e.target.files ?? []));\n if (inputRef.current) inputRef.current.value = \"\";\n }}\n />\n\n {showZone && (\n <div\n onClick={() => !disabled && inputRef.current?.click()}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n }}\n onDragEnter={(e) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n setIsDragging(false);\n }}\n onDrop={handleDrop}\n className={cn(\n \"flex flex-col items-center justify-center gap-2 min-h-28 w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed\",\n disabled ? \"cursor-not-allowed border-gray-200 bg-gray-100 opacity-60\" : \"cursor-pointer hover:bg-gray-50\",\n isDragging ? \"border-blue-500 bg-blue-50\" : \"border-gray-300\",\n error && !isDragging ? \"border-red-300 bg-red-50\" : \"\",\n )}\n >\n <Upload className=\"w-6 h-6 text-gray-400\" />\n <p className=\"text-sm text-gray-600\">{placeholder ?? \"클릭하거나 파일을 드래그하세요\"}</p>\n <p className=\"text-xs text-gray-400\">\n {acceptLabel}\n {maxFiles ? ` · 최대 ${maxFiles}개` : \"\"}\n {maxSize ? ` · 최대 ${formatFileSize(maxSize)}` : \"\"}\n </p>\n </div>\n )}\n\n {error && <p className=\"text-xs text-red-500 bg-red-50 border border-red-200 rounded px-3 py-2\">{error}</p>}\n\n {files.length > 0 && (\n <ul className=\"space-y-2\">\n {files.map((file, idx) => (\n <li\n key={`${file.name}-${idx}`}\n className=\"flex items-center gap-3 rounded-lg border border-gray-200 bg-white px-3 py-2\"\n >\n <FileText className=\"w-4 h-4 shrink-0 text-gray-400\" />\n <span className=\"flex-1 truncate text-sm text-gray-700\" title={file.name}>\n {file.name}\n </span>\n <span className=\"shrink-0 text-xs text-gray-400\">{formatFileSize(file.size)}</span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => removeFile(idx)}\n className=\"shrink-0 text-gray-400 hover:text-red-500 transition-colors cursor-pointer\"\n aria-label=\"파일 제거\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","import BaseUploader from \"./BaseUploader\";\n\nexport interface ExcelUploaderProps {\n files: Array<File>;\n onChange: (files: Array<File>) => void;\n disabled?: boolean;\n className?: string;\n}\n\nconst EXCEL_ACCEPT = \".xlsx,.xls,.csv\";\nconst MAX_EXCEL_BYTES = 10 * 1024 * 1024; // Excel 파일당 10 MB\n\nexport default function ExcelUploader(props: ExcelUploaderProps) {\n const { files, onChange, disabled, className } = props;\n return (\n <BaseUploader\n files={files}\n onChange={onChange}\n accept={EXCEL_ACCEPT}\n multiple={false}\n maxSize={MAX_EXCEL_BYTES}\n disabled={disabled}\n placeholder=\"엑셀 파일을 클릭하거나 드래그하세요\"\n className={className}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\n\nimport type { FilePreviewViewerProps } from \"..\";\n\ntype FilePreviewViewerFiles<T extends string> = FilePreviewViewerProps<T>[\"files\"];\n\nexport function useFilePreviewViewer<T extends string = string>(files: FilePreviewViewerFiles<T>) {\n const [isOpen, setIsOpen] = useState(false);\n const [initialIndex, setInitialIndex] = useState(0);\n\n const open = useCallback((index = 0) => {\n setInitialIndex(index);\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const viewerProps: FilePreviewViewerProps<T> = {\n isOpen,\n onClose: close,\n files,\n initialIndex,\n };\n\n return { isOpen, initialIndex, open, close, viewerProps };\n}\n","import heic2any from \"heic2any\";\nimport { useCallback, useEffect, useRef, useState, type DragEvent } from \"react\";\nimport { FileText, FileUp, X } from \"lucide-react\";\nimport FilePreviewViewer from \"../FilePreviewViewer\";\nimport { useFilePreviewViewer } from \"../FilePreviewViewer/hooks/useFilePreviewViewer\";\nimport { formatFileSize } from \"../../lib/dateUtils\";\nimport { cn } from \"../../lib/variants\";\n\n// ── 업로드 사양 ────────────────────────────────────────────────────────────\nconst MAX_FILES = 20;\nconst MAX_TOTAL_BYTES = 20 * 1024 * 1024; // 전체 합산 20 MB\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024; // 이미지 파일당 50 MB\nconst MAX_PDF_BYTES = 10 * 1024 * 1024; // PDF 파일당 10 MB\nconst COMPRESS_THRESHOLD = 1 * 1024 * 1024; // 1 MB 초과 시 압축\nconst TARGET_MAX_BYTES = 1 * 1024 * 1024; // 압축 목표 출력 크기\nconst MAX_DIMENSION = 1920;\nconst QUALITY_STEPS = [0.92, 0.85, 0.75, 0.65, 0.55, 0.45, 0.3, 0.2];\n\nconst ALLOWED_IMAGE_EXTS = new Set([\"jpg\", \"jpeg\", \"png\", \"heic\", \"heif\", \"webp\"]);\n\nconst getExt = (name: string) => name.split(\".\").pop()?.toLowerCase() ?? \"\";\nconst isImageFile = (file: File) => ALLOWED_IMAGE_EXTS.has(getExt(file.name));\nconst isPdfFile = (file: File) => getExt(file.name) === \"pdf\";\nconst isHeicFile = (file: File) => [\"heic\", \"heif\"].includes(getExt(file.name));\n\n// ── URL 캐시 (WeakMap: render 중 접근 가능, react-hooks/refs 위반 없음) ────\nconst urlCache = new WeakMap<File, string>();\n\nfunction getOrCreateUrl(file: File): string {\n if (!urlCache.has(file)) {\n const previewable = file.type.startsWith(\"image/\") || file.type === \"application/pdf\";\n urlCache.set(file, previewable ? URL.createObjectURL(file) : \"\");\n }\n return urlCache.get(file)!;\n}\n\nfunction revokeFile(file: File) {\n const url = urlCache.get(file);\n if (url) {\n URL.revokeObjectURL(url);\n urlCache.delete(file);\n }\n}\n\n// ── HEIC/HEIF → JPEG 변환 ─────────────────────────────────────────────────\nconst convertHeicToJpeg = async (file: File): Promise<File> => {\n const blob = await heic2any({ blob: file, toType: \"image/jpeg\", quality: 0.92 });\n const result = Array.isArray(blob) ? blob[0] : blob;\n const baseName = file.name.replace(/\\.[^.]+$/, \"\");\n if (!result) throw new Error(\"HEIC conversion failed\");\n return new File([result], `${baseName}.jpg`, { type: \"image/jpeg\" });\n};\n\n// ── 1MB 초과 이미지 압축 (Canvas 리사이징 + 단계적 품질 조정) ────────────\nconst compressImage = (file: File): Promise<File> => {\n if (!isImageFile(file) || file.size <= COMPRESS_THRESHOLD) return Promise.resolve(file);\n return createImageBitmap(file)\n .then((bitmap) => {\n let { width, height } = bitmap;\n if (Math.max(width, height) > MAX_DIMENSION) {\n if (width >= height) {\n height = Math.round((height * MAX_DIMENSION) / width);\n width = MAX_DIMENSION;\n } else {\n width = Math.round((width * MAX_DIMENSION) / height);\n height = MAX_DIMENSION;\n }\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n canvas.getContext(\"2d\")!.drawImage(bitmap, 0, 0, width, height);\n bitmap.close();\n\n const tryQuality = (stepIdx: number): Promise<File> =>\n new Promise<File>((resolve) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n resolve(file);\n return;\n }\n if (blob.size <= TARGET_MAX_BYTES || stepIdx >= QUALITY_STEPS.length - 1) {\n const baseName = file.name.replace(/\\.[^.]+$/, \"\");\n resolve(new File([blob], `${baseName}.jpg`, { type: \"image/jpeg\" }));\n } else {\n resolve(tryQuality(stepIdx + 1));\n }\n },\n \"image/jpeg\",\n QUALITY_STEPS[stepIdx],\n );\n });\n\n return tryQuality(0);\n })\n .catch(() => file);\n};\n\nexport interface FileUploaderProps {\n files: Array<File>;\n onChange: (files: Array<File>) => void;\n multiple?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport default function FileUploader(props: FileUploaderProps) {\n const { files, onChange, multiple = true, disabled = false, className } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [processingCount, setProcessingCount] = useState(0);\n const [error, setError] = useState(\"\");\n\n // render 중 WeakMap에서 URL 파생 (ref 미사용)\n const previewUrls = files.map(getOrCreateUrl);\n\n // effect 내부에서만 접근하는 ref\n const prevFilesRef = useRef<Array<File>>([]);\n\n useEffect(() => {\n const prevFiles = prevFilesRef.current;\n prevFilesRef.current = files;\n return () => {\n const nextSet = new Set(files);\n prevFiles.forEach((f) => {\n if (!nextSet.has(f)) revokeFile(f);\n });\n };\n }, [files]);\n\n useEffect(() => {\n return () => {\n prevFilesRef.current.forEach(revokeFile);\n };\n }, []);\n\n const viewer = useFilePreviewViewer(previewUrls);\n\n const fileTypes = files.map((f): \"image\" | \"pdf\" | \"unsupported\" => {\n if (f.type.startsWith(\"image/\")) return \"image\";\n if (f.type === \"application/pdf\") return \"pdf\";\n return \"unsupported\";\n });\n\n const handleFiles = useCallback(\n async (list: FileList | null) => {\n if (!list || list.length < 1) return;\n setError(\"\");\n\n const remaining = MAX_FILES - files.length;\n if (remaining <= 0) {\n setError(`최대 업로드 가능 개수(${MAX_FILES}개)를 초과했습니다.`);\n return;\n }\n\n const allFiles = Array.from(list);\n const filesToProcess = allFiles.slice(0, remaining);\n const errors: Array<string> = [];\n\n if (allFiles.length > remaining) {\n errors.push(\n `파일은 최대 ${MAX_FILES}개까지 업로드할 수 있습니다. 선택한 파일 중 ${remaining}개만 추가됩니다.`,\n );\n }\n\n let currentTotalBytes = files.reduce((sum, f) => sum + (f.size || 0), 0);\n const processed: Array<File> = [];\n\n for (const el of filesToProcess) {\n if (!isImageFile(el) && !isPdfFile(el)) {\n errors.push(`${el.name}: 지원하지 않는 형식 (이미지 또는 PDF만 가능)`);\n continue;\n }\n if (isImageFile(el) && el.size > MAX_IMAGE_BYTES) {\n errors.push(`${el.name}: 이미지 파일은 50MB를 초과할 수 없습니다.`);\n continue;\n }\n if (isPdfFile(el) && el.size > MAX_PDF_BYTES) {\n errors.push(`${el.name}: PDF 파일은 10MB를 초과할 수 없습니다.`);\n continue;\n }\n\n setProcessingCount((c) => c + 1);\n try {\n const converted = isHeicFile(el) ? await convertHeicToJpeg(el) : el;\n const compressed = await compressImage(converted);\n if (currentTotalBytes + compressed.size > MAX_TOTAL_BYTES) {\n errors.push(`${el.name}: 전체 업로드 용량(20MB)을 초과하여 추가되지 않았습니다.`);\n continue;\n }\n currentTotalBytes += compressed.size;\n processed.push(compressed);\n } catch (err) {\n console.error(err);\n errors.push(`${el.name}: 처리 중 오류가 발생했습니다.`);\n } finally {\n setProcessingCount((c) => c - 1);\n }\n }\n\n if (errors.length > 0) setError(errors.join(\"\\n\"));\n if (processed.length > 0) {\n const first = processed[0];\n onChange(multiple ? [...files, ...processed] : (first ? [first] : []));\n }\n },\n [files, multiple, onChange],\n );\n\n const handleDragOver = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n const relatedTarget = e.relatedTarget as Node | null;\n if (!relatedTarget || (containerRef.current && !containerRef.current.contains(relatedTarget))) {\n setIsDragging(false);\n }\n };\n\n const handleDrop = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled) handleFiles(e.dataTransfer.files);\n };\n\n const removeFile = (idx: number) => {\n onChange(files.filter((_, i) => i !== idx));\n setError(\"\");\n };\n\n const isProcessing = processingCount > 0;\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept=\"image/jpeg,image/png,image/webp,image/heic,image/heif,application/pdf,.heic,.heif\"\n disabled={disabled}\n className=\"hidden\"\n onChange={(e) => {\n handleFiles(e.target.files);\n if (inputRef.current) inputRef.current.value = \"\";\n }}\n />\n\n <div\n ref={containerRef}\n onClick={isProcessing || disabled ? undefined : () => inputRef.current?.click()}\n onDragOver={handleDragOver}\n onDragEnter={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={cn(\n \"relative w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed\",\n disabled\n ? \"cursor-not-allowed border-gray-200 bg-gray-100 opacity-60\"\n : isProcessing\n ? \"cursor-default border-gray-300\"\n : \"cursor-pointer hover:bg-gray-50\",\n isDragging ? \"border-blue-500 bg-blue-50\" : \"border-gray-300\",\n error && !isDragging ? \"border-red-300 bg-red-50\" : \"\",\n files.length > 0 ? \"p-3\" : \"flex flex-col items-center justify-center gap-1 min-h-32\",\n )}\n >\n {/* 파일 처리 중 오버레이 */}\n {isProcessing && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-white/80\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-blue-400 border-t-transparent\" />\n <p className=\"text-xs text-gray-600\">처리 중...</p>\n </div>\n )}\n\n {files.length > 0 ? (\n <>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3\">\n {files.map((file, idx) => {\n const url = previewUrls[idx];\n const isImage = file.type.startsWith(\"image/\");\n return (\n <div\n key={`${file.name}-${idx}`}\n className=\"group relative overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow-md\"\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n viewer.open(idx);\n }}\n className=\"block w-full aspect-square cursor-pointer\"\n aria-label={`${file.name} 미리보기`}\n >\n {isImage && url ? (\n <img src={url} alt={file.name} className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full flex-col items-center justify-center bg-gray-50 text-gray-400\">\n <FileText className=\"w-8 h-8\" />\n <span className=\"mt-1 max-w-full truncate px-1 text-center text-[10px]\">\n {file.name}\n </span>\n </div>\n )}\n </button>\n <div className=\"flex items-center justify-between gap-1 border-t border-gray-100 px-1.5 py-1\">\n <span className=\"flex-1 truncate text-[10px] text-gray-600\" title={file.name}>\n {file.name}\n </span>\n <span className=\"shrink-0 text-[10px] text-gray-400\">{formatFileSize(file.size)}</span>\n </div>\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(idx);\n }}\n className=\"absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded-full bg-black/60 text-white opacity-0 transition-opacity group-hover:opacity-100 cursor-pointer\"\n aria-label=\"파일 제거\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n <div className=\"mt-2 flex items-center justify-between text-xs text-gray-500\">\n <span>\n {files.length}개 파일 선택됨{!disabled && \" · 클릭하여 추가\"}\n </span>\n <span>총 {formatFileSize(files.reduce((sum, f) => sum + f.size, 0))}</span>\n </div>\n </>\n ) : isDragging ? (\n <div className=\"flex flex-col items-center justify-center gap-1 text-blue-500\">\n <p className=\"text-sm font-semibold flex gap-1\">\n <FileUp size={15} className=\"mt-[1px]\" />\n 파일을 여기에 놓아주세요\n </p>\n <p className=\"text-xs font-medium\">드롭하면 자동으로 업로드됩니다.</p>\n </div>\n ) : (\n <>\n <p className=\"text-sm text-gray-600 flex gap-1\">\n <FileUp size={15} className=\"text-gray-400 mt-[1px]\" /> 클릭하여 파일을 선택하거나 드래그하세요\n </p>\n <p className=\"text-xs text-gray-400\">\n 이미지(JPG · PNG · WEBP · HEIC, 최대 50MB) · PDF(최대 10MB)\n </p>\n <p className=\"text-xs text-gray-400\">\n {multiple ? `최대 ${MAX_FILES}개 · 전체 20MB 이하` : \"단일 파일\"}\n </p>\n </>\n )}\n </div>\n\n {error && (\n <p className=\"whitespace-pre-line text-xs text-red-500 bg-red-50 border border-red-200 rounded px-3 py-2\">\n {error}\n </p>\n )}\n\n <FilePreviewViewer {...viewer.viewerProps} fileTypes={fileTypes} fileNames={files.map((f) => f.name)} />\n </div>\n );\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport { useNavigate, useLocation } from \"react-router\";\nimport { PanelLeftClose, PanelRightClose } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface MenuGrandchild {\n label: string;\n path: string;\n}\n\nexport interface MenuChild {\n label: string;\n path?: string;\n children?: Array<MenuGrandchild>;\n}\n\nexport interface MenuItem {\n icon: LucideIcon;\n label: string;\n path?: string;\n children?: Array<MenuChild>;\n}\n\nexport interface MenuSection {\n title?: string;\n items: Array<MenuItem>;\n}\n\nexport type SidebarVariant = \"light\" | \"dark\" | \"system-dark\" | \"system-light\";\n\nexport interface SidebarProps {\n menuSections: Array<MenuSection>;\n header?: ReactNode;\n footer?: ReactNode;\n className?: string;\n showCollapseButton?: boolean;\n onClose?: () => void;\n variant?: SidebarVariant;\n primaryColor?: string;\n}\n\ninterface VariantStyle {\n aside: string;\n sectionTitle: string;\n itemActive: string;\n itemInactive: string;\n subItemActive: string;\n subItemInactive: string;\n childGroupBorder: string;\n childActive: string;\n childInactive: string;\n grandchildActive: string;\n grandchildInactive: string;\n collapseBtn: string;\n collapseIcon: string;\n rounded: string;\n itemPy: string;\n childPy: string;\n grandchildPy: string;\n itemFont: string;\n itemTextSize: string;\n grandchildTextSize: string;\n iconClass: string;\n activeItemStyle: React.CSSProperties;\n activeChildStyle: React.CSSProperties;\n activeGrandchildStyle: React.CSSProperties;\n footerBorder: string;\n}\n\nconst VARIANT_STYLES: Record<SidebarVariant, VariantStyle> = {\n light: {\n aside: \"bg-white border-r border-gray-200\",\n sectionTitle: \"text-xs font-semibold text-gray-500 tracking-wider mb-3\",\n itemActive: \"bg-blue-50 text-blue-600\",\n itemInactive: \"text-gray-700 hover:bg-gray-100\",\n subItemActive: \"text-blue-600 font-medium\",\n subItemInactive: \"text-gray-600 hover:bg-gray-50 hover:text-gray-900\",\n childGroupBorder: \"border-gray-100\",\n childActive: \"bg-blue-50 text-blue-600 font-medium\",\n childInactive: \"text-gray-600 hover:bg-gray-50 hover:text-gray-900\",\n grandchildActive: \"bg-blue-50 text-blue-600 font-medium\",\n grandchildInactive: \"text-gray-500 hover:bg-gray-50 hover:text-gray-900\",\n collapseBtn: \"bg-gray-50 hover:bg-gray-100\",\n collapseIcon: \"var(--color-sub-darkgray)\",\n rounded: \"rounded-lg\",\n itemPy: \"py-2\",\n childPy: \"py-1.5\",\n grandchildPy: \"py-1\",\n itemFont: \"font-semibold\",\n itemTextSize: \"text-sm\",\n grandchildTextSize: \"text-xs\",\n iconClass: \"w-4 h-4 flex-shrink-0\",\n activeItemStyle: {},\n activeChildStyle: {},\n activeGrandchildStyle: {},\n footerBorder: \"border-t border-gray-200\",\n },\n dark: {\n aside: \"bg-gray-900 border-r border-gray-700\",\n sectionTitle: \"text-xs font-semibold text-gray-400 tracking-wider mb-3\",\n itemActive: \"bg-gray-700 text-white\",\n itemInactive: \"text-gray-300 hover:bg-gray-800\",\n subItemActive: \"text-blue-400 font-medium\",\n subItemInactive: \"text-gray-400 hover:bg-gray-800 hover:text-gray-100\",\n childGroupBorder: \"border-gray-700\",\n childActive: \"bg-gray-700 text-white font-medium\",\n childInactive: \"text-gray-400 hover:bg-gray-800 hover:text-gray-100\",\n grandchildActive: \"bg-gray-700 text-blue-400 font-medium\",\n grandchildInactive: \"text-gray-500 hover:bg-gray-800 hover:text-gray-100\",\n collapseBtn: \"bg-gray-800 hover:bg-gray-700\",\n collapseIcon: \"#9ca3af\",\n rounded: \"rounded-lg\",\n itemPy: \"py-2\",\n childPy: \"py-1.5\",\n grandchildPy: \"py-1\",\n itemFont: \"font-semibold\",\n itemTextSize: \"text-sm\",\n grandchildTextSize: \"text-xs\",\n iconClass: \"w-4 h-4 flex-shrink-0\",\n activeItemStyle: {},\n activeChildStyle: {},\n activeGrandchildStyle: {},\n footerBorder: \"border-t border-gray-700\",\n },\n \"system-dark\": {\n aside: \"bg-slate-900 border-r border-slate-700\",\n sectionTitle:\n \"text-[10px] font-bold text-slate-500 uppercase tracking-[0.12em] mb-2 pb-2 border-b border-slate-700/70\",\n itemActive: \"bg-slate-800 text-white\",\n itemInactive: \"text-slate-300 hover:bg-slate-800/60 hover:text-white\",\n subItemActive: \"text-slate-100 font-medium\",\n subItemInactive: \"text-slate-400 hover:bg-slate-800/50 hover:text-slate-200\",\n childGroupBorder: \"border-slate-700/60\",\n childActive: \"bg-slate-800/70 text-slate-100 font-medium\",\n childInactive: \"text-slate-400 hover:bg-slate-800/50 hover:text-slate-200\",\n grandchildActive: \"text-slate-100 font-medium\",\n grandchildInactive: \"text-slate-500 hover:bg-slate-800/50 hover:text-slate-200\",\n collapseBtn: \"bg-slate-800 hover:bg-slate-700\",\n collapseIcon: \"#94a3b8\",\n rounded: \"rounded-none\",\n itemPy: \"py-3\",\n childPy: \"py-[10px]\",\n grandchildPy: \"py-2\",\n itemFont: \"font-medium\",\n itemTextSize: \"text-sm\",\n grandchildTextSize: \"text-xs\",\n iconClass: \"w-4.5 h-4.5 flex-shrink-0\",\n activeItemStyle: { borderLeft: \"3px solid #818cf8\", paddingLeft: \"9px\" },\n activeChildStyle: { borderLeft: \"2px solid #818cf8\", paddingLeft: \"14px\" },\n activeGrandchildStyle: { borderLeft: \"2px solid #818cf8\", paddingLeft: \"10px\" },\n footerBorder: \"border-t border-slate-700\",\n },\n \"system-light\": {\n aside: \"bg-gray-50 border-r border-gray-200\",\n sectionTitle: \"text-[10px] font-bold text-slate-400 uppercase tracking-[0.12em] mb-2 pb-2 border-b border-gray-200\",\n itemActive: \"font-medium\",\n itemInactive: \"text-slate-700 hover:bg-gray-100\",\n subItemActive: \"text-[#2b2b2b] font-medium\",\n subItemInactive: \"text-slate-500 hover:bg-gray-100 hover:text-slate-800\",\n childGroupBorder: \"border-gray-200\",\n childActive: \"font-medium\",\n childInactive: \"text-slate-500 hover:bg-gray-100 hover:text-slate-800\",\n grandchildActive: \"text-[#2b2b2b] font-medium\",\n grandchildInactive: \"text-slate-500 hover:bg-gray-100 hover:text-slate-800\",\n collapseBtn: \"bg-gray-100 hover:bg-gray-200\",\n collapseIcon: \"#64748b\",\n rounded: \"rounded-none\",\n itemPy: \"py-3\",\n childPy: \"py-[10px]\",\n grandchildPy: \"py-2\",\n itemFont: \"font-medium\",\n itemTextSize: \"text-[15px]\",\n grandchildTextSize: \"text-sm\",\n iconClass: \"w-4.5 h-4.5 flex-shrink-0\",\n activeItemStyle: {\n color: \"#2b2b2b\",\n backgroundColor: \"color-mix(in srgb, #2b2b2b 10%, transparent)\",\n borderLeft: \"3px solid #2b2b2b\",\n paddingLeft: \"9px\",\n },\n activeChildStyle: {\n color: \"#2b2b2b\",\n backgroundColor: \"color-mix(in srgb, #2b2b2b 10%, transparent)\",\n borderLeft: \"2px solid #2b2b2b\",\n paddingLeft: \"14px\",\n },\n activeGrandchildStyle: {\n color: \"#2b2b2b\",\n backgroundColor: \"color-mix(in srgb, #2b2b2b 10%, transparent)\",\n borderLeft: \"2px solid #2b2b2b\",\n paddingLeft: \"10px\",\n },\n footerBorder: \"border-t border-gray-200\",\n },\n};\n\n// tinted: bg=light tint of primary, text=primary → light variant item/child active\n// text: text=primary only → sub/grandchild active, dark variant\n// solid: bg=primary, text=white → system variant item active\nfunction tintedStyle(color: string): React.CSSProperties {\n return {\n color,\n backgroundColor: `color-mix(in srgb, ${color} 12%, transparent)`,\n };\n}\nfunction textStyle(color: string): React.CSSProperties {\n return { color };\n}\nfunction solidStyle(color: string): React.CSSProperties {\n return {\n backgroundColor: `color-mix(in srgb, ${color} 25%, transparent)`,\n color: \"#ffffff\",\n boxShadow: `inset 3px 0 0 ${color}`,\n };\n}\n\ntype AccentApplier = {\n itemActive: (c: string) => React.CSSProperties;\n subItemActive: (c: string) => React.CSSProperties;\n childActive: (c: string) => React.CSSProperties;\n grandchildActive: (c: string) => React.CSSProperties;\n};\n\nconst ACCENT_APPLIERS: Record<SidebarVariant, AccentApplier> = {\n light: {\n itemActive: tintedStyle,\n subItemActive: textStyle,\n childActive: tintedStyle,\n grandchildActive: textStyle,\n },\n dark: {\n itemActive: textStyle,\n subItemActive: textStyle,\n childActive: textStyle,\n grandchildActive: textStyle,\n },\n \"system-dark\": {\n itemActive: (c: string) => ({\n ...solidStyle(c),\n boxShadow: undefined,\n borderLeft: `3px solid ${c}`,\n paddingLeft: \"9px\",\n }),\n subItemActive: textStyle,\n childActive: (c: string) => ({\n ...solidStyle(c),\n boxShadow: undefined,\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"14px\",\n }),\n grandchildActive: (c: string) => ({\n ...textStyle(c),\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"10px\",\n }),\n },\n \"system-light\": {\n itemActive: (c: string) => ({\n ...tintedStyle(c),\n borderLeft: `3px solid ${c}`,\n paddingLeft: \"9px\",\n }),\n subItemActive: textStyle,\n childActive: (c: string) => ({\n ...tintedStyle(c),\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"14px\",\n }),\n grandchildActive: (c: string) => ({\n ...tintedStyle(c),\n borderLeft: `2px solid ${c}`,\n paddingLeft: \"10px\",\n }),\n },\n};\n\nexport default function Sidebar(props: SidebarProps) {\n const navigate = useNavigate();\n const {\n onClose,\n menuSections,\n header,\n footer,\n className,\n showCollapseButton = false,\n variant = \"light\",\n primaryColor,\n } = props;\n const { pathname } = useLocation();\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [overflowVisible, setOverflowVisible] = useState(true);\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n const [expandedSubItems, setExpandedSubItems] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n if (isCollapsed) {\n setOverflowVisible(false);\n return;\n }\n const timer = setTimeout(() => setOverflowVisible(true), 300);\n return () => clearTimeout(timer);\n }, [isCollapsed]);\n\n const s = VARIANT_STYLES[variant];\n const applier = ACCENT_APPLIERS[variant];\n\n useEffect(() => {\n menuSections.forEach((section) => {\n section.items.forEach((item) => {\n if (!item.children) return;\n\n const allLeafPaths = item.children.flatMap((child) =>\n child.children ? child.children.map((gc) => gc.path) : child.path ? [child.path] : [],\n );\n\n if (!allLeafPaths.includes(pathname)) return;\n\n setExpandedItems((prev) => {\n if (prev.has(item.label)) return prev;\n const next = new Set(prev);\n next.add(item.label);\n return next;\n });\n\n item.children.forEach((child) => {\n if (!child.children) return;\n const gcPaths = child.children.map((gc) => gc.path);\n if (!gcPaths.includes(pathname)) return;\n const subKey = `${item.label}::${child.label}`;\n setExpandedSubItems((prev) => {\n if (prev.has(subKey)) return prev;\n const next = new Set(prev);\n next.add(subKey);\n return next;\n });\n });\n });\n });\n }, [pathname, menuSections]);\n\n const toggleExpand = (label: string) => {\n setExpandedItems((prev) => {\n const next = new Set(prev);\n if (next.has(label)) next.delete(label);\n else next.add(label);\n return next;\n });\n };\n\n const toggleSubExpand = (subKey: string) => {\n setExpandedSubItems((prev) => {\n const next = new Set(prev);\n if (next.has(subKey)) next.delete(subKey);\n else next.add(subKey);\n return next;\n });\n };\n\n const handleItemClick = (path: string) => {\n if (path.includes(\"https\")) {\n window.open(path, \"_blank\", \"noopener,noreferrer\");\n } else if (path !== \"\") {\n navigate(path);\n onClose?.();\n }\n };\n\n return (\n <aside\n className={`\n ${isCollapsed ? \"w-11 min-w-11\" : \"min-w-60 w-62\"}\n transition-[width,min-width] duration-300 ease-in-out\n relative h-screen shrink-0 overflow-x-hidden flex flex-col\n ${s.aside}\n ${className ?? \"\"}\n `}\n >\n {showCollapseButton && (\n <button\n onClick={() => setIsCollapsed((prev) => !prev)}\n className={`absolute top-4 right-2 z-20 w-6.5 h-6.5 rounded-full flex items-center justify-center transition-colors cursor-pointer ${s.collapseBtn}`}\n >\n {isCollapsed ? (\n <PanelRightClose size={18} color={primaryColor ?? s.collapseIcon} />\n ) : (\n <PanelLeftClose size={18} color={primaryColor ?? s.collapseIcon} />\n )}\n </button>\n )}\n\n <div className={`flex-1 min-h-0 hide-scrollbar ${overflowVisible ? \"overflow-y-auto\" : \"overflow-hidden\"}`}>\n <div\n className={`transition-opacity duration-200 ease-in-out ${isCollapsed ? \"opacity-0 pointer-events-none select-none\" : \"opacity-100\"} ${variant === \"system-dark\" || variant === \"system-light\" ? \"pb-6\" : \"px-4 pb-6\"}`}\n style={{ transitionDelay: isCollapsed ? \"0ms\" : \"150ms\" }}\n >\n {header && header}\n\n <nav className={`space-y-6 ${variant === \"system-dark\" || variant === \"system-light\" ? \"px-1\" : \"\"}`}>\n {menuSections.map((section, sectionIndex) => (\n <div key={section.title ?? sectionIndex}>\n {section.title && <div className={s.sectionTitle}>{section.title}</div>}\n\n <div className=\"space-y-0.5\">\n {section.items.map((item) => {\n const isActive = !item.children && pathname === item.path;\n return (\n <div key={item.label}>\n {/* 1depth: 아이콘 + 라벨, children 있으면 토글 / 없으면 이동 */}\n <button\n onClick={() => {\n if (item.children) {\n toggleExpand(item.label);\n } else if (item.path) {\n handleItemClick(item.path);\n }\n }}\n className={`\n w-full text-left flex items-center gap-2 px-3 ${s.itemPy} ${s.rounded} ${s.itemTextSize} ${s.itemFont} transition-colors cursor-pointer\n ${isActive ? s.itemActive : s.itemInactive}\n `}\n style={{\n ...(isActive ? s.activeItemStyle : {}),\n ...(isActive && primaryColor ? applier.itemActive(primaryColor) : {}),\n }}\n >\n <item.icon className={s.iconClass} />\n <span className=\"flex-1\">{item.label}</span>\n\n {item.children && (\n <svg\n className={`w-4 h-4 transition-transform ${expandedItems.has(item.label) ? \"rotate-90\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n\n {item.path?.includes(\"https\") && (\n <svg\n className=\"w-4 h-4 flex-shrink-0 opacity-50\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n </button>\n\n {item.children && expandedItems.has(item.label) && (\n <div className={`ml-5 mt-0.5 space-y-0.5 border-l ${s.childGroupBorder}`}>\n {item.children.map((child, childIndex) => {\n if (child.children && child.children.length > 0) {\n const subKey = `${item.label}::${child.label}`;\n const isSubExpanded = expandedSubItems.has(subKey);\n const isSubActive = child.children.some((gc) => gc.path === pathname);\n\n return (\n <div key={child.label}>\n {/* 2depth (sub): children 있는 경우 — 토글 버튼 */}\n <button\n onClick={() => toggleSubExpand(subKey)}\n className={`\n w-full text-left flex items-center justify-between pl-4 pr-3 ${s.childPy} ${s.rounded} ${s.itemTextSize} transition-colors cursor-pointer\n ${isSubActive ? s.subItemActive : s.subItemInactive}\n `}\n style={\n isSubActive && primaryColor ? applier.subItemActive(primaryColor) : undefined\n }\n >\n <span>{child.label}</span>\n <svg\n className={`w-3 h-3 transition-transform ${isSubExpanded ? \"rotate-90\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n\n {isSubExpanded && (\n <div className=\"ml-3 mt-0.5 space-y-0.5 pl-2\">\n {/* 3depth: 리프 노드, 항상 경로로 이동 */}\n {child.children.map((grandchild) => {\n const isGrandchildActive = pathname === grandchild.path;\n return (\n <button\n key={grandchild.path}\n onClick={() => handleItemClick(grandchild.path)}\n className={`\n w-full text-left px-3 ${s.grandchildPy} ${s.rounded} ${s.grandchildTextSize} transition-colors cursor-pointer\n ${isGrandchildActive ? s.grandchildActive : s.grandchildInactive}\n `}\n style={{\n ...(isGrandchildActive ? s.activeGrandchildStyle : {}),\n ...(isGrandchildActive && primaryColor\n ? applier.grandchildActive(primaryColor)\n : {}),\n }}\n >\n {grandchild.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n }\n\n // 2depth (leaf): children 없는 경우 — 바로 이동\n const isChildActive = pathname === child.path;\n return (\n <button\n key={childIndex}\n onClick={() => handleItemClick(child.path ?? \"\")}\n className={`\n w-full text-left pl-4 pr-3 ${s.childPy} ${s.rounded} ${s.itemTextSize} transition-colors cursor-pointer\n ${isChildActive ? s.childActive : s.childInactive}\n `}\n style={{\n ...(isChildActive ? s.activeChildStyle : {}),\n ...(isChildActive && primaryColor ? applier.childActive(primaryColor) : {}),\n }}\n >\n {child.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n </div>\n </div>\n\n {footer && (\n <div\n className={`flex-shrink-0 transition-opacity duration-200 ease-in-out ${isCollapsed ? \"opacity-0 pointer-events-none select-none\" : \"opacity-100\"} ${s.footerBorder}`}\n style={{ transitionDelay: isCollapsed ? \"0ms\" : \"150ms\" }}\n >\n {footer}\n </div>\n )}\n </aside>\n );\n}\n","import { useCallback, useId, useState } from \"react\";\n\nimport type { DetailController, DetailMode, UseDetailControllerParams } from \"./types\";\n\nexport function useDetailController(params: UseDetailControllerParams = {}): DetailController {\n const { mode: controlledMode, onModeChange } = params;\n\n const [internalMode, setInternalMode] = useState<DetailMode>(\"read\");\n const [isDirty, setIsDirty] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n\n // React useId — 안정적인 formId (SubmitForm ↔ 외부 submit 버튼 연결)\n const rawId = useId();\n // useId 반환값 \":r0:\" 형태에서 콜론 제거 (form id에 콜론 불가)\n const formId = `detail-form-${rawId.replace(/:/g, \"\")}`;\n\n const mode = controlledMode ?? internalMode;\n\n const toEdit = useCallback(() => {\n if (onModeChange) {\n onModeChange(\"edit\");\n } else {\n setInternalMode(\"edit\");\n }\n }, [onModeChange]);\n\n const toRead = useCallback(() => {\n setIsDirty(false);\n if (onModeChange) {\n onModeChange(\"read\");\n } else {\n setInternalMode(\"read\");\n }\n }, [onModeChange]);\n\n const handleDirtyChange = useCallback((dirty: boolean) => {\n setIsDirty(dirty);\n }, []);\n\n const handleSaveStart = useCallback(() => {\n setIsSaving(true);\n }, []);\n\n const handleSaveEnd = useCallback(() => {\n setIsSaving(false);\n }, []);\n\n return {\n mode,\n isDirty,\n isSaving,\n formId,\n toEdit,\n toRead,\n handleDirtyChange,\n handleSaveStart,\n handleSaveEnd,\n };\n}\n","import { useCallback, useRef, type ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport type { FieldValues, UseFormReturn } from \"react-hook-form\";\nimport type { z } from \"zod\";\n\nimport FormField from \"../../SubmitForm/components/FormField\";\nimport type { FormFieldConfig } from \"../../SubmitForm/config/types\";\nimport { SubmitForm } from \"../../SubmitForm\";\n\nimport type { DetailEditBodyContext } from \"../model/types\";\n\n// ─── FormDirtyBridge ─────────────────────────────────────────────────────────\n// widgets 레이어에서 pages 레이어 import 불가 → 동일 로직 인라인\n// (원본: src/pages/form/blocker/FormDirtyBridge.tsx)\n\ninterface DirtyBridgeProps {\n onDirtyChange: (dirty: boolean) => void;\n}\n\nfunction DirtyBridge(props: DirtyBridgeProps) {\n const { onDirtyChange } = props;\n const { formState } = useFormContext();\n\n useEffect(() => {\n onDirtyChange(formState.isDirty);\n }, [formState.isDirty, onDirtyChange]);\n\n return null;\n}\n\n// ─── EditBodyBridge ───────────────────────────────────────────────────────────\n// renderEditBody 가 제공됐을 때 FormProvider 컨텍스트에서 methods 를 꺼내 주입\n\ninterface EditBodyBridgeProps<TFieldValues extends FieldValues, S extends z.ZodTypeAny> {\n data: TFieldValues;\n render: (ctx: DetailEditBodyContext<TFieldValues, S>) => ReactNode;\n}\n\nfunction EditBodyBridge<TFieldValues extends FieldValues, S extends z.ZodTypeAny>(\n props: EditBodyBridgeProps<TFieldValues, S>,\n) {\n const { data, render } = props;\n const methods = useFormContext<z.infer<S>>() as UseFormReturn<z.infer<S>>;\n return <>{render({ methods, data })}</>;\n}\n\n// ─── DetailEditView ───────────────────────────────────────────────────────────\n\ninterface DetailEditViewProps<T, S extends z.ZodTypeAny> {\n data: T;\n schema: S;\n fields: Array<FormFieldConfig<z.infer<S>>>;\n formId: string;\n onDirtyChange: (dirty: boolean) => void;\n onSave: (data: z.infer<S>) => Promise<void>;\n /** 저장 시작/완료 시 controller 에 알림 */\n onSaveStart: () => void;\n onSaveEnd: () => void;\n /** 저장 성공 후 read 모드로 전환 */\n onSaveDone: () => void;\n /** Body 전면 교체 — 커스텀 필드가 RHF 에 합류해야 할 때 */\n renderBody?: (ctx: DetailEditBodyContext<z.infer<S>, S>) => ReactNode;\n}\n\nexport default function DetailEditView<T, S extends z.ZodTypeAny>(props: DetailEditViewProps<T, S>) {\n const {\n data,\n schema,\n fields,\n formId,\n onDirtyChange,\n onSave,\n onSaveStart,\n onSaveEnd,\n onSaveDone,\n renderBody,\n } = props;\n\n const methodsRef = useRef<UseFormReturn<z.infer<S>> | null>(null);\n\n const handleSubmit = useCallback(\n async (formData: z.infer<S>) => {\n onSaveStart();\n try {\n await onSave(formData);\n // 저장 성공 후 dirty 상태 초기화\n methodsRef.current?.reset(formData as Parameters<typeof methodsRef.current.reset>[0]);\n onSaveDone();\n } finally {\n onSaveEnd();\n }\n },\n [onSave, onSaveStart, onSaveEnd, onSaveDone],\n );\n\n return (\n <SubmitForm formId={formId} schema={schema} defaultValues={data as z.input<S>} onSubmit={handleSubmit}>\n {/* dirty 상태를 controller 로 브릿지 */}\n <DirtyBridge onDirtyChange={onDirtyChange} />\n\n {renderBody ? (\n <EditBodyBridge<z.infer<S>, S> data={data as z.infer<S>} render={renderBody} />\n ) : (\n fields.map((config) => <FormField key={String(config.name)} config={config} />)\n )}\n </SubmitForm>\n );\n}\n","import type { BadgeTone } from \"../../model/types\";\n\nconst BADGE_TONE_CLASS: Record<BadgeTone, string> = {\n success: \"bg-green-100 text-green-800\",\n warning: \"bg-amber-100 text-amber-800\",\n error: \"bg-red-100 text-red-800\",\n info: \"bg-blue-100 text-blue-800\",\n default: \"bg-gray-100 text-gray-800\",\n};\n\ninterface BadgeRendererProps {\n value: unknown;\n tone: BadgeTone;\n}\n\nexport default function BadgeRenderer(props: BadgeRendererProps) {\n const { value, tone } = props;\n return (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${BADGE_TONE_CLASS[tone]}`}\n >\n {String(value ?? \"-\")}\n </span>\n );\n}\n","interface BooleanRendererProps {\n value: unknown;\n}\n\nexport default function BooleanRenderer(props: BooleanRendererProps) {\n const { value } = props;\n return (\n <span className={`text-sm font-medium ${value ? \"text-green-600\" : \"text-gray-500\"}`}>\n {value ? \"예\" : \"아니오\"}\n </span>\n );\n}\n","interface ImageRendererProps {\n value: unknown;\n}\n\nexport default function ImageRenderer(props: ImageRendererProps) {\n const { value } = props;\n if (!value) return <span className=\"text-gray-400 text-sm\">-</span>;\n return (\n <img src={String(value)} alt=\"\" className=\"h-16 w-16 rounded-md object-cover border border-gray-200\" />\n );\n}\n","interface LinkRendererProps {\n value: unknown;\n}\n\nexport default function LinkRenderer(props: LinkRendererProps) {\n const { value } = props;\n if (!value) return <span className=\"text-gray-400 text-sm\">-</span>;\n return (\n <a\n href={String(value)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 underline-offset-4 hover:underline text-sm break-all\"\n >\n {String(value)}\n </a>\n );\n}\n","interface TagListRendererProps {\n value: unknown;\n}\n\nexport default function TagListRenderer(props: TagListRendererProps) {\n const { value } = props;\n const items = Array.isArray(value) ? value : [];\n if (items.length === 0) return <span className=\"text-gray-400 text-sm\">-</span>;\n return (\n <div className=\"flex flex-wrap gap-1\">\n {items.map((item, i) => (\n <span\n key={i}\n className=\"inline-flex items-center rounded-md bg-gray-100 px-2 py-0.5 text-xs text-gray-700\"\n >\n {String(item)}\n </span>\n ))}\n </div>\n );\n}\n","interface TextRendererProps {\n value: unknown;\n}\n\nexport default function TextRenderer(props: TextRendererProps) {\n const { value } = props;\n const text = value !== null && value !== undefined && String(value) !== \"\" ? String(value) : \"-\";\n return <span className=\"text-sm text-gray-900 break-all\">{text}</span>;\n}\n","import type { ReactNode } from \"react\";\n\nimport type { DetailField, DetailRenderContext } from \"../../model/types\";\nimport BadgeRenderer from \"./BadgeRenderer\";\nimport BooleanRenderer from \"./BooleanRenderer\";\nimport ImageRenderer from \"./ImageRenderer\";\nimport LinkRenderer from \"./LinkRenderer\";\nimport TagListRenderer from \"./TagListRenderer\";\nimport TextRenderer from \"./TextRenderer\";\n\nexport function renderDetailFieldValue<T>(field: DetailField<T>, ctx: DetailRenderContext<T>): ReactNode {\n if (field.render) {\n return field.render(ctx);\n }\n\n const { value } = ctx;\n\n switch (field.type) {\n case \"badge\": {\n const tone = field.tone ? field.tone(value) : \"default\";\n return <BadgeRenderer value={value} tone={tone} />;\n }\n case \"tag\":\n return <TagListRenderer value={value} />;\n case \"link\":\n return <LinkRenderer value={value} />;\n case \"image\":\n return <ImageRenderer value={value} />;\n case \"boolean\":\n return <BooleanRenderer value={value} />;\n case \"date\":\n case \"number\":\n case \"text\":\n default:\n return <TextRenderer value={value} />;\n }\n}\n","import type { ReactNode } from \"react\";\n\nimport {\n ROW_LABEL_CLASS,\n ROW_LABEL_TEXT_CLASS,\n ROW_VALUE_CELL_CLASS,\n ROW_VALUE_INNER_CLASS,\n} from \"../../SubmitForm/config/styles\";\nimport { COL_SPAN_CLASS } from \"../../SubmitForm/config/utils\";\n\nimport type { DetailField, DetailFieldOrSection, DetailMode, DetailSection } from \"../model/types\";\nimport { renderDetailFieldValue } from \"./fieldRenderers\";\n\ninterface DetailReadViewProps<T> {\n data: T;\n mode: DetailMode;\n fields: Array<DetailFieldOrSection<T>>;\n /** 3단 escape: body 전면 커스텀 */\n renderBody?: (ctx: { data: T }) => ReactNode;\n}\n\nfunction isSection<T>(item: DetailFieldOrSection<T>): item is DetailSection<T> {\n return item.kind === \"section\";\n}\n\nfunction FieldRow<T>(props: { field: DetailField<T>; data: T; mode: DetailMode }) {\n const { field, data, mode } = props;\n const value = data[field.key as keyof T];\n const ctx = { value: value as T[keyof T], row: data, mode };\n\n const isFullWidth = field.colspan === 2;\n const valueColClass = isFullWidth ? COL_SPAN_CLASS[10] : COL_SPAN_CLASS[4];\n\n return (\n <>\n <dt className={ROW_LABEL_CLASS}>\n <p className={ROW_LABEL_TEXT_CLASS}>{field.label}</p>\n </dt>\n <dd className={`${valueColClass} ${ROW_VALUE_CELL_CLASS}`}>\n <div className={ROW_VALUE_INNER_CLASS}>{renderDetailFieldValue(field, ctx)}</div>\n </dd>\n </>\n );\n}\n\nfunction SectionRow<T>(props: { section: DetailSection<T>; data: T; mode: DetailMode }) {\n const { section, data, mode } = props;\n const colSpanClass = section.colspan === 1 ? COL_SPAN_CLASS[6] : COL_SPAN_CLASS[12];\n\n return <div className={colSpanClass}>{section.render({ data, mode })}</div>;\n}\n\nexport default function DetailReadView<T>(props: DetailReadViewProps<T>) {\n const { data, mode, fields, renderBody } = props;\n\n if (renderBody) {\n return <div className=\"p-4\">{renderBody({ data })}</div>;\n }\n\n return (\n <dl className=\"grid grid-cols-12 items-stretch gap-0\">\n {fields.map((item, index) => {\n if (isSection(item)) {\n return <SectionRow key={index} section={item} data={data} mode={mode} />;\n }\n return <FieldRow key={item.key} field={item} data={data} mode={mode} />;\n })}\n </dl>\n );\n}\n","import type { z } from \"zod\";\n\nimport { cn } from \"../../../lib/variants\";\n\nimport type { DetailContentProps } from \"../model/types\";\nimport DetailEditView from \"./DetailEditView\";\nimport DetailReadView from \"./DetailReadView\";\n\nexport default function DetailContent<T, S extends z.ZodTypeAny = z.ZodTypeAny>(props: DetailContentProps<T, S>) {\n const {\n controller,\n data,\n readFields,\n editSchema,\n editFields,\n onSave,\n renderReadBody,\n renderEditBody,\n layout = \"compact\",\n className,\n } = props;\n\n const containerClass =\n layout === \"none\"\n ? cn(className)\n : cn(\"overflow-y-auto\", layout === \"compact\" ? \"max-h-[60vh]\" : \"min-h-0 flex-1\", className);\n\n if (!data) {\n return (\n <div className={cn(containerClass, \"flex items-center justify-center p-8\")}>\n <p className=\"text-sm text-gray-400\">데이터를 불러오는 중...</p>\n </div>\n );\n }\n\n if (controller.mode === \"edit\" && editSchema && (editFields || renderEditBody)) {\n return (\n <div className={containerClass}>\n <DetailEditView\n data={data}\n schema={editSchema}\n fields={editFields ?? []}\n formId={controller.formId}\n onDirtyChange={controller.handleDirtyChange}\n onSave={onSave ?? (() => Promise.resolve())}\n onSaveStart={controller.handleSaveStart}\n onSaveEnd={controller.handleSaveEnd}\n onSaveDone={controller.toRead}\n renderBody={renderEditBody}\n />\n </div>\n );\n }\n\n return (\n <div className={containerClass}>\n <DetailReadView data={data} mode={controller.mode} fields={readFields} renderBody={renderReadBody} />\n </div>\n );\n}\n","import { useCallback, useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { z } from \"zod\";\n\nimport Button from \"../../Button\";\nimport Modal, { ModalBody, ModalFooter, ModalHeader } from \"../../Modal\";\nimport { cn } from \"../../../lib/variants\";\nimport { confirmModal } from \"../../Confirm\";\nimport type { FormFieldConfig } from \"../../SubmitForm/config/types\";\n\nimport type { DetailContentProps, DetailFieldOrSection, UseDetailControllerParams } from \"../model/types\";\nimport { useDetailController } from \"../model/useDetailController\";\nimport DetailContent from \"../ui/DetailContent\";\n\ninterface DetailModalFrameProps<T, S extends z.ZodTypeAny = z.ZodTypeAny> {\n open: boolean;\n title: string;\n data: T | undefined;\n readFields: Array<DetailFieldOrSection<T>>;\n editSchema?: S;\n editFields?: Array<FormFieldConfig<z.infer<S>>>;\n onSave?: (data: z.infer<S>) => Promise<void>;\n onDone: () => void;\n renderReadBody?: DetailContentProps<T, S>[\"renderReadBody\"];\n renderEditBody?: DetailContentProps<T, S>[\"renderEditBody\"];\n /** controlled mode 주입 (URL query 등으로 외부에서 mode 관리 시) */\n mode?: UseDetailControllerParams[\"mode\"];\n onModeChange?: UseDetailControllerParams[\"onModeChange\"];\n contentClassName?: string;\n /** ModalBody 내 DetailContent 하단 추가 컨텐츠 (프로필 사진 등) */\n renderExtraContent?: (ctx: { isEditMode: boolean }) => ReactNode;\n /** read 모드 footer 추가 버튼 — 닫기 앞에 삽입 */\n renderFooterExtra?: ReactNode;\n /** isDirty 상태 외부 노출 — 라우터 blocker 등에서 활용 */\n onDirtyChange?: (isDirty: boolean) => void;\n}\n\nexport default function DetailModalFrame<T, S extends z.ZodTypeAny = z.ZodTypeAny>(props: DetailModalFrameProps<T, S>) {\n const {\n open,\n title,\n data,\n readFields,\n editSchema,\n editFields,\n onSave,\n onDone,\n renderReadBody,\n renderEditBody,\n mode,\n onModeChange,\n contentClassName,\n renderExtraContent,\n renderFooterExtra,\n onDirtyChange,\n } = props;\n\n const controller = useDetailController({ mode, onModeChange });\n\n useEffect(() => {\n onDirtyChange?.(controller.isDirty);\n }, [controller.isDirty, onDirtyChange]);\n\n const handleClose = useCallback(async () => {\n if (controller.isDirty) {\n const confirmed = await new Promise<boolean>((resolve) => {\n confirmModal({\n content: \"저장하지 않은 변경사항이 있습니다. 닫으시겠습니까?\",\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!confirmed) return;\n }\n controller.toRead();\n onDone();\n }, [controller, onDone]);\n\n const handleEdit = useCallback(() => {\n controller.toEdit();\n }, [controller]);\n\n const handleCancelEdit = useCallback(async () => {\n if (controller.isDirty) {\n const confirmed = await new Promise<boolean>((resolve) => {\n confirmModal({\n content: \"변경사항을 저장하지 않고 조회 화면으로 돌아가시겠습니까?\",\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!confirmed) return;\n }\n controller.toRead();\n }, [controller]);\n\n const isEditMode = controller.mode === \"edit\";\n const canEdit = Boolean(editSchema && (editFields || renderEditBody));\n\n return (\n <Modal isOpen={open} onClose={handleClose} contentClassName={cn(\"max-w-2xl\", contentClassName)}>\n <ModalHeader className=\"flex flex-row items-center justify-between\">\n <span className=\"text-base font-semibold text-gray-900\">{title}</span>\n </ModalHeader>\n\n <ModalBody className=\"flex-1 min-h-0 overflow-hidden p-0 flex flex-col\">\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n <DetailContent<T, S>\n controller={controller}\n data={data}\n readFields={readFields}\n editSchema={editSchema}\n editFields={editFields}\n onSave={onSave}\n renderReadBody={renderReadBody}\n renderEditBody={renderEditBody}\n layout=\"none\"\n />\n </div>\n {renderExtraContent?.({ isEditMode })}\n </ModalBody>\n\n <ModalFooter className=\"flex justify-end\">\n {isEditMode ? (\n <>\n <Button variant=\"outline\" onClick={handleCancelEdit} disabled={controller.isSaving}>\n 취소\n </Button>\n <Button type=\"submit\" form={controller.formId} variant=\"save\" disabled={controller.isSaving}>\n 저장\n </Button>\n </>\n ) : (\n <>\n {canEdit && (\n <Button variant=\"outline\" onClick={handleEdit}>\n 수정\n </Button>\n )}\n {renderFooterExtra}\n <Button variant=\"outline\" onClick={handleClose}>\n 닫기\n </Button>\n </>\n )}\n </ModalFooter>\n </Modal>\n );\n}\n","import { useCallback, useRef } from \"react\";\n\nimport { confirmModal } from \"../components/Confirm\";\n\ninterface BlockModalConfirmOptions {\n content?: string;\n onOk?: () => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n okText?: string;\n cancelText?: string;\n}\n\nexport function useBlockModalConfirm() {\n const blockCalledRef = useRef(false);\n\n const promiseConfirm = useCallback((options: BlockModalConfirmOptions): Promise<boolean> => {\n if (blockCalledRef.current) {\n return Promise.resolve(false);\n }\n\n blockCalledRef.current = true;\n return new Promise<boolean>((res) => {\n confirmModal({\n content: options.content || \"\",\n onOk: async () => {\n blockCalledRef.current = false;\n res(true);\n if (options.onOk) {\n await options.onOk();\n }\n },\n onCancel: async () => {\n blockCalledRef.current = false;\n res(false);\n if (options.onCancel) {\n await options.onCancel();\n }\n },\n okText: \"예\",\n cancelText: \"아니요\",\n });\n });\n }, []);\n\n return { promiseConfirm };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useBlocker, useLocation } from \"react-router\";\nimport type { Location } from \"react-router\";\n\nexport interface ConfirmArgs {\n currentLocation: Location;\n nextLocation: Location;\n}\n\nexport interface UseCustomBlockerOptions {\n enabled: boolean;\n isDirty: boolean;\n bypass?: boolean;\n message?: string;\n confirm?: (args: ConfirmArgs) => boolean | Promise<boolean>;\n excludedPaths?: Array<string>;\n}\n\nexport type CustomBlockerState = \"idle\" | \"blocked\" | \"confirming\";\n\ninterface UseCustomBlockerResult {\n proceed: () => void;\n reset: () => void;\n state: CustomBlockerState;\n}\n\nconst DEFAULT_MESSAGE = \"변경사항이 저장되지 않습니다. 페이지를 이동하시겠습니까?\";\nconst DEFAULT_EXCLUDED_PATHS = [\"/login\"];\n\nexport function useCustomBlocker(options: UseCustomBlockerOptions): UseCustomBlockerResult {\n const enabledRef = useRef(options.enabled);\n const isDirtyRef = useRef(options.isDirty);\n const bypassRef = useRef(options.bypass ?? false);\n const messageRef = useRef(options.message ?? DEFAULT_MESSAGE);\n const confirmRef = useRef(options.confirm);\n\n enabledRef.current = options.enabled;\n isDirtyRef.current = options.isDirty;\n bypassRef.current = options.bypass ?? false;\n messageRef.current = options.message ?? DEFAULT_MESSAGE;\n confirmRef.current = options.confirm;\n\n const excludedPathsRef = useRef(options.excludedPaths ?? []);\n excludedPathsRef.current = options.excludedPaths ?? [];\n\n const confirmingRef = useRef(false);\n const mountedRef = useRef(true);\n const abortedRef = useRef(false);\n\n const [state, setState] = useState<CustomBlockerState>(\"idle\");\n\n const location = useLocation();\n const locationRef = useRef(location);\n locationRef.current = location;\n\n // shouldBlock은 ref로 최신 옵션을 읽으므로 stable reference 유지 (blocker 재생성 방지)\n const shouldBlock = useCallback(\n ({ currentLocation, nextLocation }: { currentLocation: Location; nextLocation: Location }): boolean => {\n if (bypassRef.current) return false;\n if (!enabledRef.current) return false;\n if (!isDirtyRef.current) return false;\n if (currentLocation.pathname === nextLocation.pathname) return false;\n if (\n DEFAULT_EXCLUDED_PATHS.some(\n (path) => nextLocation.pathname === path || nextLocation.pathname.startsWith(`${path}/`),\n )\n )\n return false;\n if (\n excludedPathsRef.current.some(\n (path) => nextLocation.pathname === path || nextLocation.pathname.startsWith(`${path}/`),\n )\n )\n return false;\n return true;\n },\n [],\n );\n\n const blocker = useBlocker(shouldBlock);\n const blockerRef = useRef(blocker);\n blockerRef.current = blocker;\n\n // bypass가 true가 되면 pending transition을 자동으로 proceed\n useEffect(() => {\n if (!options.bypass || blocker.state !== \"blocked\") return;\n abortedRef.current = true;\n confirmingRef.current = false;\n setState(\"idle\");\n blockerRef.current?.proceed?.();\n }, [options.bypass, blocker.state]);\n\n // navigation이 blocked되면 자동으로 confirm 트리거\n useEffect(() => {\n if (blocker.state !== \"blocked\") {\n setState(\"idle\");\n return;\n }\n if (bypassRef.current) return;\n if (confirmingRef.current) return;\n\n setState(\"blocked\");\n\n const runConfirm = async () => {\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state !== \"blocked\") return;\n\n abortedRef.current = false;\n const capturedCurrentLocation = locationRef.current;\n const nextLocation = currentBlocker.location;\n\n confirmingRef.current = true;\n setState(\"confirming\");\n\n try {\n let confirmed: boolean;\n\n if (confirmRef.current) {\n confirmed = await confirmRef.current({\n currentLocation: capturedCurrentLocation,\n nextLocation,\n });\n } else {\n confirmed = typeof window !== \"undefined\" ? window.confirm(messageRef.current) : false;\n }\n\n if (!mountedRef.current || abortedRef.current) return;\n\n const latestBlocker = blockerRef.current;\n if (latestBlocker.state !== \"blocked\") return;\n\n if (confirmed) {\n latestBlocker.proceed();\n } else {\n latestBlocker.reset();\n }\n } catch {\n if (mountedRef.current && !abortedRef.current) {\n const latestBlocker = blockerRef.current;\n if (latestBlocker.state === \"blocked\") {\n latestBlocker.reset();\n }\n }\n } finally {\n confirmingRef.current = false;\n if (mountedRef.current) setState(\"idle\");\n }\n };\n\n runConfirm();\n // blockerRef로 최신 blocker에 접근하므로 blocker 객체는 dep에서 제외\n }, [blocker.state]);\n\n useEffect(() => {\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n if (!enabledRef.current || !isDirtyRef.current || bypassRef.current) return;\n event.preventDefault();\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state === \"blocked\") {\n currentBlocker.reset();\n }\n };\n }, []);\n\n const proceed = useCallback(() => {\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state === \"blocked\") {\n abortedRef.current = true;\n confirmingRef.current = false;\n currentBlocker.proceed();\n }\n setState(\"idle\");\n }, []);\n\n const reset = useCallback(() => {\n const currentBlocker = blockerRef.current;\n if (currentBlocker.state === \"blocked\") {\n abortedRef.current = true;\n confirmingRef.current = false;\n currentBlocker.reset();\n }\n setState(\"idle\");\n }, []);\n\n return { proceed, reset, state };\n}\n","import { useCallback } from \"react\";\nimport type { z } from \"zod\";\n\nimport Button from \"../../Button\";\nimport { cn } from \"../../../lib/variants\";\nimport { useBlockModalConfirm } from \"../../../hooks/useBlockModalConfirm\";\nimport { useCustomBlocker } from \"../../../hooks/useCustomBlocker\";\nimport type { FormFieldConfig } from \"../../SubmitForm/config/types\";\n\nimport type { DetailContentProps, DetailFieldOrSection, UseDetailControllerParams } from \"../model/types\";\nimport { useDetailController } from \"../model/useDetailController\";\nimport DetailContent from \"../ui/DetailContent\";\n\ninterface DetailPageFrameProps<T, S extends z.ZodTypeAny = z.ZodTypeAny> {\n data: T | undefined;\n readFields: Array<DetailFieldOrSection<T>>;\n editSchema?: S;\n editFields?: Array<FormFieldConfig<z.infer<S>>>;\n onSave?: (data: z.infer<S>) => Promise<void>;\n /** 닫기/뒤로가기 — navigate(-1) 또는 라우터 이동 */\n onDone: () => void;\n renderReadBody?: DetailContentProps<T, S>[\"renderReadBody\"];\n renderEditBody?: DetailContentProps<T, S>[\"renderEditBody\"];\n /** controlled mode 주입 (URL ?mode=edit 등) */\n mode?: UseDetailControllerParams[\"mode\"];\n onModeChange?: UseDetailControllerParams[\"onModeChange\"];\n className?: string;\n}\n\nexport default function DetailPageFrame<T, S extends z.ZodTypeAny = z.ZodTypeAny>(\n props: DetailPageFrameProps<T, S>,\n) {\n const {\n data,\n readFields,\n editSchema,\n editFields,\n onSave,\n onDone,\n renderReadBody,\n renderEditBody,\n mode,\n onModeChange,\n className,\n } = props;\n\n const controller = useDetailController({ mode, onModeChange });\n const { promiseConfirm } = useBlockModalConfirm();\n\n // 라우터 이탈 방지 — edit 모드 + dirty 일 때만 활성\n useCustomBlocker({\n enabled: controller.mode === \"edit\",\n isDirty: controller.isDirty,\n confirm: () =>\n promiseConfirm({\n content: \"저장하지 않은 변경사항이 있습니다. 페이지를 이동하시겠습니까?\",\n }),\n });\n\n const handleEdit = useCallback(() => {\n controller.toEdit();\n }, [controller]);\n\n const handleCancelEdit = useCallback(async () => {\n if (controller.isDirty) {\n const ok = await promiseConfirm({\n content: \"변경사항을 저장하지 않고 조회 화면으로 돌아가시겠습니까?\",\n });\n if (!ok) return;\n }\n controller.toRead();\n }, [controller, promiseConfirm]);\n\n const isEditMode = controller.mode === \"edit\";\n const canEdit = Boolean(editSchema && (editFields || renderEditBody));\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {/* 액션 바 */}\n <div className=\"flex items-center justify-between\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onDone}>\n ← 목록으로\n </Button>\n\n <div className=\"flex gap-2\">\n {isEditMode ? (\n <>\n <Button variant=\"outline\" onClick={handleCancelEdit} disabled={controller.isSaving}>\n 취소\n </Button>\n <Button type=\"submit\" form={controller.formId} variant=\"save\" disabled={controller.isSaving}>\n {controller.isSaving ? \"저장 중...\" : \"저장\"}\n </Button>\n </>\n ) : (\n canEdit && (\n <Button variant=\"outline\" onClick={handleEdit}>\n 수정\n </Button>\n )\n )}\n </div>\n </div>\n\n {/* 컨텐츠 */}\n <div className=\"rounded-lg border border-gray-200 bg-white shadow-sm\">\n <DetailContent<T, S>\n controller={controller}\n data={data}\n readFields={readFields}\n editSchema={editSchema}\n editFields={editFields}\n onSave={onSave}\n renderReadBody={renderReadBody}\n renderEditBody={renderEditBody}\n layout=\"full\"\n />\n </div>\n </div>\n );\n}\n","import { useCallback } from \"react\";\n\nimport { useSearchParams } from \"react-router\";\n\n/**\n * URL query parameter를 사용하여 모달을 관리하는 hook\n * @param modalKey - URL query parameter에 사용될 키 (예: \"modal\", \"dialog\")\n * @returns { isOpen, openModal, closeModal }\n * 모달 open 시 URL query parameter에 modalKey를 true로 설정 닫을 시 삭제\n */\nexport function useModal(modalKey: string = \"modal\") {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const isOpen = searchParams.get(modalKey) === \"true\";\n\n const openModal = useCallback(() => {\n setSearchParams((prev) => {\n const newParams = new URLSearchParams(prev);\n newParams.set(modalKey, \"true\");\n return newParams;\n });\n }, [modalKey, setSearchParams]);\n\n const closeModal = useCallback(() => {\n setSearchParams((prev) => {\n const newParams = new URLSearchParams(prev);\n newParams.delete(modalKey);\n return newParams;\n });\n }, [modalKey, setSearchParams]);\n\n return {\n isOpen,\n openModal,\n closeModal,\n };\n}\n","import { useCallback } from \"react\";\n\n/**\n * 스크롤을 맨 위로 이동시키는 함수를 반환하는 hook\n * @param containerId - 스크롤할 컨테이너의 id (없으면 window 스크롤)\n * @returns scrollToTop - 호출 시 스크롤을 맨 위로 이동\n *\n * @example\n * // window 스크롤\n * const scrollToTop = useScrollToTop();\n *\n * // 특정 컨테이너 스크롤\n * const scrollToTop = useScrollToTop(\"doc-scroll-container\");\n *\n * // 버튼 클릭 시 스크롤 이동\n * <button onClick={scrollToTop}>맨 위로</button>\n *\n * // 또는 함수 내에서 직접 호출\n * const handleSubmit = () => {\n * // ... 로직\n * scrollToTop();\n * }\n */\nexport function useScrollToTop(containerId?: string) {\n const scrollToTop = useCallback(() => {\n if (containerId) {\n const container = document.getElementById(containerId);\n if (container) {\n container.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n }\n } else {\n window.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n }\n }, [containerId]);\n\n return scrollToTop;\n}\n","export function paramsToSearchParams<P extends object>(params: P): URLSearchParams {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n // null이나 undefined는 URL에 추가하지 않음\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((item) => searchParams.append(key, String(item)));\n } else if (value !== \"\") {\n // 빈 문자열이 아닌 경우만 추가\n searchParams.set(key, String(value));\n }\n });\n\n return searchParams;\n}\n","import { useState } from \"react\";\nimport type { SortOption } from \"../../components/Table/config/type\";\nimport type { BaseParams, SortOrder } from \"../../config/params\";\nimport { useSearchParams } from \"react-router\";\nimport { useRef } from \"react\";\nimport { useCallback } from \"react\";\nimport { paramsToSearchParams } from \"./config/utils\";\nimport { useEffect } from \"react\";\nimport { useMemo } from \"react\";\n\nexport interface UseParams<P extends BaseParams> {\n localParams: P; // 로컬 상태\n params: P; // 실제 상태 (URL과 동기화)\n updateParam: (key: keyof P, value: P[keyof P]) => void;\n updateLocalParam: (key: keyof P, value: P[keyof P]) => void;\n update: () => void;\n reset: () => void;\n handleSortChange: (sortKey: string, sortOrder: SortOrder) => void;\n sortOption: SortOption | undefined;\n}\n\nexport function useParams<P extends BaseParams>(initialParams: P): UseParams<P> {\n if (!initialParams) {\n throw new Error(\"initialParams is required\");\n }\n\n const [params, setParams] = useState<P>(initialParams);\n const [localParams, setLocalParams] = useState<P>(initialParams);\n const [searchParams, setSearchParams] = useSearchParams();\n const isInitializedRef = useRef(false);\n\n // 초기 동기화: searchParams 우선 -> initialParams fallback\n const getInitialState = useCallback(() => {\n const result = { ...initialParams };\n\n Object.keys(initialParams).forEach((key) => {\n const initialValue = initialParams[key as keyof P];\n // 배열 타입인 경우 getAll() 사용\n if (Array.isArray(initialValue)) {\n const urlValue = searchParams.getAll(key);\n if (urlValue.length > 0) {\n result[key as keyof P] = urlValue as P[keyof P];\n }\n } else {\n const urlValue = searchParams.get(key);\n if (urlValue !== null) {\n // \"null\" 문자열을 실제 null로 변환\n if (urlValue === \"null\") {\n result[key as keyof P] = null as P[keyof P];\n } else if (urlValue === \"undefined\") {\n result[key as keyof P] = undefined as P[keyof P];\n } else {\n result[key as keyof P] = urlValue as P[keyof P];\n }\n }\n }\n });\n\n return result;\n }, [initialParams, searchParams]);\n\n // 초기화 (한 번만)\n useEffect(() => {\n if (!isInitializedRef.current) {\n const initialState = getInitialState();\n setLocalParams(initialState);\n setParams(initialState);\n\n // searchParams가 비어있으면 initialParams로 URL 초기화\n if (!searchParams.toString()) {\n const newSearchParams = paramsToSearchParams(initialParams);\n setSearchParams(newSearchParams, { replace: true });\n }\n\n isInitializedRef.current = true;\n }\n }, [getInitialState, initialParams, searchParams, setSearchParams]);\n\n const updateLocalParam = useCallback(\n (key: keyof P, value: P[keyof P]) => {\n setLocalParams((prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [setLocalParams],\n );\n\n // 여러 파라미터 업데이트 (실제 상태)\n const updateParams = useCallback(\n (updatedParams: Partial<P>) => {\n const newParams = {\n ...params,\n ...updatedParams,\n };\n setParams(newParams);\n setLocalParams(newParams);\n setSearchParams(paramsToSearchParams(newParams));\n },\n [params, setSearchParams],\n );\n\n // 개별 파라미터 업데이트 (실제 상태)\n const updateParam = useCallback(\n (key: keyof P, value: P[keyof P]) => {\n const newParams = {\n ...params,\n [key]: value,\n };\n setParams(newParams);\n setLocalParams(newParams);\n setSearchParams(paramsToSearchParams(newParams));\n },\n [params, setSearchParams],\n );\n\n const update = useCallback(() => {\n const paramsWithResetPage = {\n ...localParams,\n page: 0,\n };\n const newSearchParams = paramsToSearchParams(paramsWithResetPage);\n setSearchParams(newSearchParams);\n setParams(paramsWithResetPage);\n setLocalParams(paramsWithResetPage);\n }, [localParams, setSearchParams]);\n\n const reset = useCallback(() => {\n setLocalParams(initialParams);\n setParams(initialParams);\n const newSearchParams = paramsToSearchParams(initialParams);\n setSearchParams(newSearchParams);\n }, [initialParams, setSearchParams]);\n\n const handleSortChange = useCallback(\n (sortKey: string, sortOrder: SortOrder) => {\n const newParams = {\n ...params,\n sortBy: sortKey,\n sortOrder: sortOrder,\n };\n updateParams(newParams);\n },\n [updateParams, params],\n );\n\n const sortOption = useMemo(() => {\n if (!params.sortBy || !params.sortOrder) return undefined;\n return {\n sortKey: params.sortBy,\n sortOrder: params.sortOrder,\n };\n }, [params.sortBy, params.sortOrder]);\n\n return {\n localParams,\n params,\n updateParam,\n updateLocalParam,\n update,\n reset,\n handleSortChange,\n sortOption,\n };\n}\n"]}
|