@likelion-design/ui 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stories/Typography/Typography.tsx","../src/stories/Button/ActionButton/ActionButton.tsx","../src/stories/Button/IconButton/IconButton.tsx","../src/stories/Tab/Tab.tsx","../src/stories/Badge/Badge.tsx","../src/stories/Chip/Chip.tsx","../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js","../node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js","../src/stories/Dialog/Dialog.tsx","../src/shared/hooks/useMediaQuery.ts","../src/stories/TextInput/TextInput.tsx","../node_modules/@heroicons/react/20/solid/esm/ExclamationCircleIcon.js","../node_modules/@heroicons/react/20/solid/esm/InformationCircleIcon.js","../src/stories/Toggle/Toggle.tsx","../src/stories/Checkbox/Checkbox.tsx","../src/stories/Checkbox/useCheckboxGroup.ts","../src/stories/Select/SelectHeader/SelectHeader.tsx","../src/stories/Select/SelectMenu/SelectMenu.tsx","../node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js","../node_modules/@heroicons/react/24/solid/esm/ExclamationCircleIcon.js","../node_modules/@heroicons/react/24/solid/esm/ExclamationTriangleIcon.js","../node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js","../node_modules/@heroicons/react/24/solid/esm/XCircleIcon.js","../src/stories/Select/SelectBox/SelectBox.tsx","../src/stories/Pagination/Pagination.tsx","../src/stories/RadioButton/RadioButton.tsx","../src/stories/Tag/Tag.tsx","../src/stories/Tooltip/Tooltip.tsx","../src/stories/Toast/Toast.tsx","../src/stories/Logo/logo-assets.ts","../src/stories/Logo/Logo.tsx","../src/stories/Screen/index.ts"],"sourcesContent":["import React from \"react\";\nimport \"./typography.css\";\n\nexport type TextVariant =\n | \"display-d1\"\n | \"display-d2\"\n | \"display-d3\"\n | \"display-d4\"\n | \"heading-h1\"\n | \"heading-h2\"\n | \"heading-h3\"\n | \"heading-h4\"\n | \"heading-h5\"\n | \"heading-h6\"\n | \"subtitle-p1\"\n | \"subtitle-p2\"\n | \"subtitle-p3\"\n | \"body-p1\"\n | \"body-p2\"\n | \"body-p3\"\n | \"body-p4\"\n | \"body-p5\";\n\nexport type TextDecoration = \"none\" | \"underline\";\n\nexport interface TextProps\n extends React.HTMLAttributes<HTMLElement> {\n /** Text 변형 */\n variant: TextVariant;\n /** 텍스트 장식 (underline 등) */\n decoration?: TextDecoration;\n /** HTML 태그 (기본값: variant에 따라 자동 결정) */\n as?: keyof React.JSX.IntrinsicElements;\n /** 자식 요소 */\n children: React.ReactNode;\n}\n\n/** Text 컴포넌트는 텍스트 스타일을 일관되게 적용하는 컴포넌트입니다. */\nexport const Text = ({\n variant,\n decoration = \"none\",\n as,\n children,\n className = \"\",\n ...props\n}: TextProps) => {\n // variant에 따라 기본 HTML 태그 결정\n const defaultTag = (() => {\n if (variant.startsWith(\"heading-\")) {\n const level = variant.split(\"-\")[1];\n if (level.startsWith(\"d\")) {\n return \"h1\"; // Display는 h1으로\n }\n return level; // h1, h2, h3, h4, h5, h6\n }\n if (variant.startsWith(\"subtitle-\")) {\n return \"h3\";\n }\n return \"p\"; // Body는 p 태그\n })();\n\n const Tag = (as || defaultTag) as keyof React.JSX.IntrinsicElements;\n\n const baseClasses = [\n \"typography\",\n `typography--${variant}`,\n decoration !== \"none\" && `typography--decoration-${decoration}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return React.createElement(Tag, { className: baseClasses, ...props }, children);\n};\n","import React from \"react\";\nimport { Text } from \"@/stories/Typography/Typography\";\nimport \"./action-button.css\";\n\nexport type ButtonSize = \"xlarge\" | \"large\" | \"medium\" | \"small\";\nexport type ButtonColor = \"primary\" | \"neutral\" | \"secondary\";\nexport type ButtonType = \"solid\" | \"outline\" | \"ghost\" | \"weak\";\nexport type ButtonState = \"enabled\" | \"hovered\" | \"loading\" | \"disabled\";\n\nexport interface ActionButtonProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" // HTML type 속성과 이름 충돌 방지\n> {\n /** 버튼 크기 */\n size?: ButtonSize;\n /** 버튼 색상 (primary, neutral, secondary) */\n color?: ButtonColor;\n /** 버튼 스타일 타입 (solid, outline, ghost, weak) */\n type?: ButtonType;\n /** HTML 버튼 타입 (button, submit, reset) */\n htmlType?: \"button\" | \"submit\" | \"reset\";\n /** 버튼 상태 */\n state?: ButtonState;\n /** 버튼 텍스트 */\n label: React.ReactNode;\n /** Prefix 아이콘 */\n prefixIcon?: React.ReactNode;\n /** Suffix 아이콘 */\n suffixIcon?: React.ReactNode;\n /** 로딩 상태일 때 표시할 스피너 */\n loading?: boolean;\n}\n\n/** ActionButton 컴포넌트는 사용자가 어떠한 액션을 트리거하거나 이벤트를 실행할 때 사용한다. */\nexport const ActionButton = ({\n size = \"medium\",\n color = \"primary\",\n type = \"solid\",\n htmlType = \"button\",\n state = \"enabled\",\n label,\n prefixIcon,\n suffixIcon,\n loading = false,\n className = \"\",\n disabled,\n ...props\n}: ActionButtonProps) => {\n const isDisabled = disabled || state === \"disabled\";\n // ghost 타입은 hovered와 loading 상태를 지원하지 않음\n let actualState: ButtonState = state;\n if (type === \"ghost\") {\n // ghost 타입은 hovered와 loading 상태를 enabled로 처리\n if (state === \"hovered\" || state === \"loading\" || loading) {\n actualState = \"enabled\";\n }\n } else {\n // 다른 타입은 loading prop에 따라 loading 상태로 설정\n actualState = loading ? \"loading\" : state;\n }\n\n const baseClasses = [\n \"action-button\",\n `action-button--${size}`,\n `action-button--${color}`,\n `action-button--${type}`,\n `action-button--${actualState}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const textVariant = (() => {\n if (size === \"xlarge\") {\n return \"heading-h6\";\n } else if (size === \"large\" || size === \"medium\") {\n return \"subtitle-p2\";\n } else if (size === \"small\") {\n return \"subtitle-p3\";\n } else {\n return \"subtitle-p3\";\n }\n })();\n\n return (\n <button\n type={htmlType}\n className={baseClasses}\n disabled={isDisabled}\n {...props}\n >\n <span className=\"action-button__content\">\n {prefixIcon && (\n <span className=\"action-button__prefix-icon\">{prefixIcon}</span>\n )}\n <p className=\"action-button__label\">\n <Text variant={textVariant}>{label}</Text>\n </p>\n {suffixIcon && (\n <span className=\"action-button__suffix-icon\">{suffixIcon}</span>\n )}\n </span>\n {loading && type !== \"ghost\" && (\n <span className=\"action-button__spinner\" aria-hidden=\"true\">\n <svg\n className=\"action-button__spinner-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n className=\"action-button__spinner-circle\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 40;40 40;0 40\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-40;-80\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n </span>\n )}\n </button>\n );\n};\n","import React from \"react\";\n\nexport type IconButtonSize = \"xlarge\" | \"large\" | \"medium\" | \"small\";\n/** 버튼 색상. solid/outline: primary | neutral | secondary. weak: primary | neutral-dark | neutral-light */\nexport type IconButtonColor =\n | \"primary\"\n | \"neutral\"\n | \"secondary\"\n | \"neutral-dark\"\n | \"neutral-light\";\n/** 버튼 타입. weak일 때 color로 primary / neutral-dark / neutral-light 구분 */\nexport type IconButtonType = \"solid\" | \"outline\" | \"weak\";\nexport type IconButtonState = \"enabled\" | \"hovered\" | \"disabled\";\n\n/** 기본 색상에 없는 커스텀 색상 (inline style로 적용, 클래스보다 우선) */\nexport interface IconButtonCustomColor {\n /** 배경색 */\n background?: string;\n /** 아이콘(전경) 색상 */\n color?: string;\n}\n\nexport interface IconButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n /** 버튼 크기 */\n size?: IconButtonSize;\n /** 버튼 색상. 기본 세트: primary, neutral, secondary 등. 없으면 customColor 또는 style로 지정 */\n color?: IconButtonColor;\n /** 버튼 타입 (solid, outline, weak) */\n type?: IconButtonType;\n /** 버튼 상태 */\n state?: IconButtonState;\n /** 아이콘 (Heroicons 또는 React 컴포넌트) */\n icon: React.ReactNode;\n /** 아이콘에 대한 접근성 라벨 */\n \"aria-label\": string;\n /** button 요소의 type (submit 등). 기본값 button */\n htmlType?: \"button\" | \"submit\" | \"reset\";\n /**\n * 기본 팔레트에 없는 색상 사용 시.\n * 지정 시 inline style로 적용되어 클래스 스타일보다 우선합니다.\n * hover/disabled는 적용되지 않으므로, 필요 시 style prop으로 보완하세요.\n */\n customColor?: IconButtonCustomColor;\n}\n\n/** IconButton 컴포넌트는 텍스트 레이블 없이 아이콘만으로 액션을 전달하는 버튼 컴포넌트이다. */\nexport const IconButton = ({\n size = \"large\",\n color = \"primary\",\n type = \"solid\",\n state = \"enabled\",\n icon,\n className = \"\",\n disabled,\n htmlType = \"button\",\n style: propsStyle,\n customColor,\n ...props\n}: IconButtonProps) => {\n const isDisabled = disabled || state === \"disabled\";\n const isWeakType = type === \"weak\";\n // weak 타입은 disabled 상태를 가지지 않음 (미노출)\n const actualState = isWeakType && isDisabled ? \"enabled\" : state;\n\n // customColor가 있으면 color 클래스 생략하고 inline style로 적용\n const colorClass = !customColor\n ? isWeakType\n ? `icon-button--weak-${color}`\n : `icon-button--${color}`\n : \"\";\n const typeClass = isWeakType ? \"icon-button--weak\" : `icon-button--${type}`;\n\n const baseClasses = [\n \"icon-button\",\n `icon-button--${size}`,\n colorClass,\n typeClass,\n `icon-button--${actualState}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // weak 타입이고 disabled 상태일 때는 미노출 (opacity-0)\n const shouldHide = isWeakType && isDisabled;\n\n const customStyle: React.CSSProperties = {\n ...(customColor?.background && { backgroundColor: customColor.background }),\n ...(customColor?.color && { color: customColor.color }),\n };\n\n return (\n <button\n type={htmlType}\n className={baseClasses}\n disabled={isDisabled}\n style={{\n ...propsStyle,\n ...customStyle,\n ...(shouldHide ? { opacity: 0, pointerEvents: \"none\" } : {}),\n }}\n {...props}\n >\n <span className=\"icon-button__icon\">{icon}</span>\n </button>\n );\n};\n","import React, { useState } from \"react\";\nimport \"./tab.css\";\nimport { Badge } from \"../Badge/Badge\";\n\nexport type TabType = \"round\" | \"text\";\nexport type TabSize = \"large\" | \"medium\";\n\nexport interface TabProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n /** 탭 타입 (round 또는 text) */\n type?: TabType;\n /** 탭 크기 */\n size?: TabSize;\n /** 배지 표시 여부 */\n badge?: boolean;\n /** 탭 라벨 */\n label: React.ReactNode;\n /** 탭 값 (Tab.Group에서 사용 시 식별자) */\n value?: string;\n /** 다크 모드 여부 */\n mode?: boolean;\n /** 선택된 상태 (탭 그룹에서 사용 시 부모 컴포넌트가 관리, 예: 기본 탭이 '설명'이면 selected={true}) */\n selected?: boolean;\n /** 비활성화 상태 */\n disabled?: boolean;\n}\n\n/** Tab 컴포넌트는 사용자가 여러 옵션 중 하나를 선택할 때 사용하는 탭 컴포넌트이다. */\nexport const Tab = ({\n type = \"round\",\n size = \"large\",\n badge = false,\n label,\n mode = false,\n className = \"\",\n selected,\n disabled = false,\n onClick,\n ...props\n}: TabProps) => {\n // selected prop이 제공되면 controlled, 아니면 uncontrolled\n const [internalPressed, setInternalPressed] = useState(false);\n const isControlled = selected !== undefined;\n const isPressed = isControlled ? selected : internalPressed;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n \n if (!isControlled) {\n // uncontrolled 모드: 내부 상태 토글\n setInternalPressed((prev) => !prev);\n }\n onClick?.(e);\n };\n\n const state = disabled ? \"disabled\" : (isPressed ? \"pressed\" : \"enabled\");\n\n const baseClasses = [\n \"tab\",\n `tab--${type}`,\n `tab--${size}`,\n `tab--${state}`,\n mode && \"tab--dark\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n className={baseClasses}\n aria-pressed={isPressed}\n disabled={disabled}\n onClick={handleClick}\n {...props}\n >\n <span className=\"tab__label\">{label}</span>\n {badge && (\n <Badge\n type=\"dot\"\n variant=\"primary\"\n className=\"tab__badge\"\n aria-label=\"알림\"\n />\n )}\n </button>\n );\n};\n\n// Tab.Group\nexport interface TabGroupProps {\n /** 선택된 탭 값 (controlled) */\n value?: string;\n /** 초기 선택 탭 값 (uncontrolled) */\n defaultValue?: string;\n /** 선택 변경 핸들러 */\n onChange?: (value: string) => void;\n /** 탭 타입 (컨테이너 스타일: Round일 때 gap, Text일 때 하단 보더) */\n type?: TabType;\n /** 탭 크기 (컨테이너 gap 등) */\n size?: TabSize;\n /** 다크 모드 */\n mode?: boolean;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** 자식 Tab 컴포넌트들 */\n children: React.ReactNode;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\n/** Tab.Group은 여러 Tab을 그룹화하여 단일 선택을 관리한다. */\nexport const TabGroup = ({\n value: valueProp,\n defaultValue,\n onChange,\n type = \"round\",\n size = \"large\",\n mode = false,\n disabled = false,\n children,\n className = \"\",\n}: TabGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string | undefined>(\n defaultValue\n );\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const baseClasses = [\n \"tab-group\",\n `tab-group--${type}`,\n `tab-group--${size}`,\n mode && \"tab-group--dark\",\n disabled && \"tab-group--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<TabProps>(child) && child.type === Tab) {\n const tabValue = child.props.value;\n if (tabValue === undefined) {\n console.warn(\"Tab.Group 내부의 Tab은 value prop이 필요합니다.\");\n return child;\n }\n\n const isSelected = value === tabValue;\n\n return React.cloneElement(child, {\n type: child.props.type ?? type,\n size: child.props.size ?? size,\n mode: child.props.mode ?? mode,\n selected: isSelected,\n disabled: disabled || child.props.disabled,\n role: \"tab\",\n \"aria-selected\": isSelected,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!isControlled) setInternalValue(tabValue);\n onChange?.(tabValue);\n child.props.onClick?.(e);\n },\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses} role=\"tablist\">\n {enhancedChildren}\n </div>\n );\n};\n\nTabGroup.displayName = \"TabGroup\";\n\n(Tab as typeof Tab & { Group: typeof TabGroup }).Group = TabGroup;\n\n","import React from \"react\";\nimport \"./badge.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type BadgeVariant =\n | \"primary\"\n | \"secondary\"\n | \"progressing\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"disabled\";\nexport type BadgeType = \"number\" | \"dot\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** number: 글자(숫자/문자) 표시, dot: 점만 표시 */\n type?: BadgeType;\n /** Badge variant (primary, secondary, progressing, success, warning, error, disabled) */\n variant?: BadgeVariant;\n /** Badge 값 (type이 number일 때 표시할 숫자 또는 글자) */\n value?: number | string;\n /** 최대 표시 숫자 (숫자일 때 이 값을 넘으면 maxValue+ 형태로 표시) */\n maxValue?: number;\n}\n\n/** Badge 컴포넌트는 알림 카운트, 상태 등을 시각적으로 표현하는 원형 라벨 컴포넌트다. */\nexport const Badge = ({\n type = \"number\",\n variant = \"primary\",\n value,\n maxValue = 99,\n className = \"\",\n ...props\n}: BadgeProps) => {\n const baseClasses = [\n \"badge\",\n `badge--${variant}`,\n `badge--${type}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const displayValue =\n type === \"number\" && value !== undefined\n ? typeof value === \"number\"\n ? value > maxValue\n ? `${maxValue}+`\n : String(value)\n : String(value)\n : null;\n\n return (\n <span className={baseClasses} {...props}>\n {type === \"number\" && displayValue && (\n <Text variant=\"subtitle-p3\" as=\"span\">\n {displayValue}\n </Text>\n )}\n </span>\n );\n};\n","import React from \"react\";\nimport { CheckIcon } from \"@heroicons/react/24/outline\";\nimport \"./chip.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type ChipType = \"solid\" | \"outline\" | \"weak\";\nexport type ChipSize = \"medium\" | \"small\";\nexport type ChipVariant = \"primary\" | \"neutral\";\n\nexport interface ChipProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onChange\"\n> {\n /** Chip 타입 (solid, outline, weak) */\n type?: ChipType;\n /** Chip 크기 */\n size?: ChipSize;\n /** Chip variant (primary, neutral) */\n variant?: ChipVariant;\n /** Chip 값 (각 Chip을 구분하는 고유 값) */\n value: string;\n /** Chip 클릭 핸들러 (클릭 시 해당 Chip의 value를 전달) */\n onChange?: (value: string) => void;\n /** Chip 선택 상태 (controlled 모드) */\n checked?: boolean;\n /** Chip 초기 선택 상태 (uncontrolled 모드) */\n defaultChecked?: boolean;\n /** 단일 선택 그룹에서 선택된 값 (checked prop이 없을 때 자동으로 checked 계산) */\n selectedValue?: string | null;\n /** 다중 선택 그룹에서 선택된 값들 (checked prop이 없을 때 자동으로 checked 계산) */\n selectedValues?: string[];\n /** Chip 라벨 */\n label: React.ReactNode;\n /** Prefix 아이콘 (항상 표시) */\n prefixIcon?: React.ReactNode;\n /** Suffix 아이콘 */\n suffixIcon?: React.ReactNode;\n /** \n * Checked 상태일 때 체크 아이콘 표시 여부\n * - 기본값: undefined (outline 타입이고 prefixIcon이 없을 때만 자동 표시)\n * - true: 항상 표시 (checked 상태일 때)\n * - false: 표시 안 함\n */\n showCheck?: boolean;\n /** Close 버튼 표시 여부 */\n showClose?: boolean;\n /** Close 버튼 클릭 핸들러 */\n onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\n/** Chip 컴포넌트는 사용자가 직접 선택, 추가, 삭제할 수 있는 인터랙티브한 컴포넌트다. */\nconst ChipComponent = ({\n type = \"solid\",\n size = \"medium\",\n variant = \"primary\",\n value,\n onChange,\n checked: checkedProp,\n defaultChecked = false,\n selectedValue,\n selectedValues,\n label,\n prefixIcon,\n suffixIcon,\n showCheck,\n showClose = false,\n onClose,\n className = \"\",\n disabled,\n onClick,\n ...props\n}: ChipProps) => {\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n\n // checked 상태 결정\n const checked = React.useMemo(() => {\n if (isControlled) {\n return checkedProp;\n }\n if (selectedValue !== undefined && selectedValue !== null) {\n return selectedValue === value;\n }\n if (selectedValues !== undefined) {\n return selectedValues.includes(value);\n }\n return internalChecked;\n }, [\n isControlled,\n checkedProp,\n selectedValue,\n selectedValues,\n value,\n internalChecked,\n ]);\n\n // 체크 아이콘 렌더링 결정\n let shouldRenderCheckIcon = false;\n\n if (checked) {\n if (showCheck === true) {\n // 강제 표시\n shouldRenderCheckIcon = true;\n } else if (showCheck === false) {\n // 강제 미표시\n shouldRenderCheckIcon = false;\n } else {\n // 기본 로직: outline 타입이고 prefixIcon이 없을 때만 자동 표시\n shouldRenderCheckIcon = type === \"outline\" && !prefixIcon;\n }\n }\n\n const renderedCheckIcon = shouldRenderCheckIcon ? (\n <CheckIcon\n className=\"chip__check-icon\"\n style={{\n width: size === \"small\" ? \"14px\" : \"16px\",\n height: size === \"small\" ? \"14px\" : \"16px\",\n }}\n />\n ) : null;\n\n // 최종 Prefix 영역: prefixIcon이 있으면 우선, 없으면 체크 아이콘\n // (showCheck={true}일 때도 prefixIcon이 있으면 prefixIcon이 우선시됨)\n const displayLeftIcon = prefixIcon || renderedCheckIcon;\n\n // 아이콘 조합에 따른 패딩 클래스 결정\n const hasPrefix = !!displayLeftIcon;\n const hasSuffix = !!(suffixIcon || showClose);\n\n const paddingClass = (() => {\n if (hasPrefix && hasSuffix) {\n return \"chip--has-prefix-suffix\";\n } else if (hasPrefix) {\n return \"chip--has-prefix\";\n } else if (hasSuffix) {\n return \"chip--has-suffix\";\n }\n return \"chip--no-icon\";\n })();\n\n const baseClasses = [\n \"chip\",\n `chip--${type}`,\n `chip--${size}`,\n `chip--${variant}`,\n paddingClass,\n checked && \"chip--checked\",\n disabled && \"chip--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n if (\n !isControlled &&\n selectedValue === undefined &&\n selectedValues === undefined\n ) {\n setInternalChecked((prev) => !prev);\n }\n\n if (onChange) {\n onChange(value);\n }\n\n onClick?.(e);\n };\n\n const handleClose = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (onClose && !disabled) {\n onClose(e);\n }\n };\n\n return (\n <button\n type=\"button\"\n className={baseClasses}\n disabled={disabled}\n onClick={handleClick}\n aria-pressed={checked}\n {...props}\n >\n {displayLeftIcon && (\n <span className=\"chip__prefix-icon\">{displayLeftIcon}</span>\n )}\n <Text variant={size === \"small\" ? \"body-p3\" : \"body-p2\"}>{label}</Text>\n {suffixIcon && !showClose && (\n <span className=\"chip__suffix-icon\">{suffixIcon}</span>\n )}\n {showClose && (\n <button\n type=\"button\"\n className=\"chip__close-button\"\n onClick={handleClose}\n disabled={disabled}\n aria-label=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M8 1C11.866 1 15 4.13401 15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1ZM10.7803 5.21973C10.4874 4.92683 10.0126 4.92683 9.71973 5.21973L8 6.93945L6.28027 5.21973C5.98738 4.92683 5.51262 4.92683 5.21973 5.21973C4.92683 5.51262 4.92683 5.98738 5.21973 6.28027L6.93945 8L5.21973 9.71973C4.92683 10.0126 4.92683 10.4874 5.21973 10.7803C5.51262 11.0732 5.98738 11.0732 6.28027 10.7803L8 9.06055L9.71973 10.7803C10.0126 11.0732 10.4874 11.0732 10.7803 10.7803C11.0732 10.4874 11.0732 10.0126 10.7803 9.71973L9.06055 8L10.7803 6.28027C11.0732 5.98738 11.0732 5.51262 10.7803 5.21973Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.56\"\n />\n </svg>\n </button>\n )}\n </button>\n );\n};\n\n// Chip.Group\nexport interface ChipGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** 선택된 값 (controlled) - 단일: string, 다중: string[] */\n value?: string | string[];\n /** 초기 선택 값 (uncontrolled) */\n defaultValue?: string | string[];\n /** 선택 변경 시 호출 (클릭한 Chip의 value 전달) */\n onChange?: (value: string) => void;\n /** 다중 선택 여부 */\n multiple?: boolean;\n /** Chip 타입 */\n type?: ChipType;\n /** Chip 크기 */\n size?: ChipSize;\n /** Chip variant */\n variant?: ChipVariant;\n /** 체크 아이콘 표시 여부 (자식 Chip에 일괄 적용) */\n showCheck?: boolean;\n /** 전체 비활성화 */\n disabled?: boolean;\n /** 자식 Chip 컴포넌트들 */\n children: React.ReactNode;\n}\n\n/** Chip.Group은 여러 Chip을 그룹화하여 단일/다중 선택을 관리한다. */\nexport const ChipGroup = ({\n value: valueProp,\n defaultValue,\n onChange,\n multiple = false,\n type = \"solid\",\n size = \"medium\",\n variant = \"primary\",\n showCheck,\n disabled = false,\n children,\n className = \"\",\n ...rest\n}: ChipGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string | string[]>(\n () => defaultValue ?? (multiple ? [] : \"\")\n );\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const handleChange = (chipValue: string) => {\n if (multiple) {\n const arr = (Array.isArray(value) ? value : []) as string[];\n const next = arr.includes(chipValue)\n ? arr.filter((v) => v !== chipValue)\n : [...arr, chipValue];\n if (!isControlled) setInternalValue(next);\n onChange?.(chipValue);\n } else {\n if (!isControlled) setInternalValue(chipValue);\n onChange?.(chipValue);\n }\n };\n\n const selectedValue = multiple ? undefined : (value as string);\n const selectedValues = multiple ? (value as string[]) : undefined;\n\n const baseClasses = [\"chip-group\", className].filter(Boolean).join(\" \");\n\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<ChipProps>(child) && child.type === Chip) {\n const chipValue = child.props.value;\n if (chipValue === undefined) {\n console.warn(\"Chip.Group 내부의 Chip은 value prop이 필요합니다.\");\n return child;\n }\n\n return React.cloneElement(child, {\n type: child.props.type ?? type,\n size: child.props.size ?? size,\n variant: child.props.variant ?? variant,\n showCheck: child.props.showCheck ?? showCheck,\n selectedValue,\n selectedValues,\n onChange: (v: string) => {\n handleChange(v);\n child.props.onChange?.(v);\n },\n disabled: disabled || child.props.disabled,\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses} {...rest}>\n {enhancedChildren}\n </div>\n );\n};\n\nChipGroup.displayName = \"ChipGroup\";\nChipComponent.displayName = \"Chip\";\n\nexport const Chip = Object.assign(ChipComponent, {\n Group: ChipGroup,\n});\n","import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m19.5 8.25-7.5 7.5-7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronDownIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction XMarkIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(XMarkIcon);\nexport default ForwardRef;","import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XMarkIcon } from \"@heroicons/react/24/outline\";\nimport { ActionButton } from \"../Button/ActionButton/ActionButton\";\nimport type {\n ButtonSize,\n ButtonColor,\n ButtonType,\n} from \"../Button/ActionButton/ActionButton\";\nimport \"./dialog.css\";\nimport \"../Button/ActionButton/action-button.css\";\nimport { useBreakpoint } from \"../../shared/hooks/useMediaQuery\";\nimport { Text } from \"../Typography/Typography\";\nimport \"../Typography/typography.css\";\n\n// -------------------- Contexts --------------------\n\nconst DialogContext = React.createContext<{\n onClose?: () => void;\n variant?: DialogVariant;\n} | null>(null);\n\n// -------------------- Types --------------------\n\nexport type DialogAlign = \"center\" | \"left\";\nexport type DialogFooterLayout = \"horizontal\" | \"vertical\";\nexport type DialogVariant = \"alert\" | \"confirm\";\nexport type DialogActionColor = ButtonColor;\nexport type DialogActionType = ButtonType;\nexport type DialogActionSize = Exclude<ButtonSize, \"xlarge\">;\n\n/** 기존 방식의 Action Item 정의 */\nexport interface DialogActionItem {\n label: string;\n color?: DialogActionColor;\n type?: DialogActionType;\n size?: DialogActionSize;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n loading?: boolean;\n disabled?: boolean;\n onClick?: () => void | Promise<void>;\n /** 클릭 시 다이얼로그 닫기 여부 (기본값: true) */\n closeOnClick?: boolean;\n}\n\nexport interface DialogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\" | \"content\"> {\n open?: boolean;\n onClose?: () => void;\n /** 오버레이 클릭 시 닫기 여부 (기본값: true) */\n closeOnOverlayClick?: boolean;\n /** ESC 키로 닫기 여부 (기본값: true) */\n closeOnEsc?: boolean;\n /** 우측 상단 X(닫기) 버튼 표시 여부 (기본값: false) */\n withClose?: boolean;\n /** 다이얼로그 타입 (스타일링용) */\n variant?: DialogVariant;\n /** 정렬 (기본값: variant가 alert면 left, 아니면 center) */\n align?: DialogAlign;\n \n // --- Data-driven Props (편의성 및 하위 호환성) ---\n /** 다이얼로그 제목 */\n title?: React.ReactNode;\n /** 다이얼로그 본문/설명 */\n description?: React.ReactNode;\n /** 다이얼로그 아이콘 */\n icon?: React.ReactNode;\n /** 하단 버튼 목록 (Compound Component 대신 사용 가능) */\n actionItems?: DialogActionItem[];\n /** actionItems 사용 시 버튼 레이아웃 */\n footerLayout?: DialogFooterLayout;\n /** 커스텀 컨텐츠 (헤더/푸터 없이 내용만 렌더링할 때 사용) */\n content?: React.ReactNode;\n \n className?: string;\n children?: React.ReactNode;\n}\n\n// -------------------- Components --------------------\n\nconst DialogRoot = ({\n open = false,\n onClose,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n withClose = false,\n variant = \"confirm\",\n align,\n \n // Data-driven props\n title,\n description,\n icon,\n actionItems,\n footerLayout = \"horizontal\",\n content, // 추가됨\n\n className = \"\",\n children,\n ...props\n}: DialogProps) => {\n const { isUnderTablet } = useBreakpoint();\n\n // mounted 상태 확인 (SSR 대응)\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n React.useEffect(() => {\n if (!open) return;\n\n // Body Scroll Lock\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = \"hidden\";\n\n if (closeOnEsc) {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose?.();\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = originalStyle; // Cleanup 시 복원\n };\n }\n \n return () => {\n document.body.style.overflow = originalStyle; // Cleanup 시 복원\n };\n }, [open, closeOnEsc, onClose]);\n\n if (!open) return null;\n\n const resolvedAlign = align ?? (variant === \"alert\" ? \"left\" : \"center\");\n const baseClasses = [\n \"dialog\",\n `dialog--${variant}`,\n `dialog--${resolvedAlign}`,\n isUnderTablet ? \"is-mobile\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.target === e.currentTarget && closeOnOverlayClick) {\n onClose?.();\n }\n };\n\n // 렌더링 우선순위:\n // 1. content prop이 있으면 그것만 렌더링 (완전 커스텀)\n // 2. children이 있으면 children 렌더링 (Compound 방식)\n // 3. 없으면 props로 전달된 title, description, actionItems 렌더링 (Data-driven 방식)\n \n let contentNode: React.ReactNode;\n\n if (content) {\n contentNode = content;\n } else if (children) {\n contentNode = children;\n } else {\n contentNode = (\n <>\n {(title || icon) && <DialogHeader title={title} icon={icon} />}\n {description && <DialogBody>{description}</DialogBody>}\n {actionItems && actionItems.length > 0 && (\n <DialogFooter layout={footerLayout}>\n {actionItems.map((item, idx) => (\n <DialogButton\n key={`${item.label}-${idx}`}\n label={item.label}\n color={item.color}\n type={item.type}\n size={item.size}\n prefixIcon={item.prefixIcon}\n suffixIcon={item.suffixIcon}\n loading={item.loading}\n disabled={item.disabled}\n onClick={item.onClick}\n closeOnClick={item.closeOnClick ?? true} // Data-driven은 기본적으로 닫힘\n />\n ))}\n </DialogFooter>\n )}\n </>\n );\n }\n\n const dialogOverlay = (\n <div\n className=\"dialog-overlay\"\n role=\"presentation\"\n onClick={handleOverlayClick}\n >\n <div className={baseClasses} role=\"dialog\" aria-modal=\"true\" {...props}>\n <DialogContext.Provider value={{ onClose, variant }}>\n {withClose && (\n <button\n type=\"button\"\n className=\"dialog__close\"\n onClick={onClose}\n aria-label=\"닫기\"\n >\n <XMarkIcon className=\"dialog__close-icon\" />\n </button>\n )}\n {contentNode}\n </DialogContext.Provider>\n </div>\n </div>\n );\n\n // mounted 상태 확인 (SSR 대응) - 상단에서 처리됨\n // const [mounted, setMounted] = React.useState(false);\n // React.useEffect(() => {\n // setMounted(true);\n // return () => setMounted(false);\n // }, []);\n\n if (!mounted) return null;\n\n return createPortal(dialogOverlay, document.body);\n};\n\n// --- Sub Components ---\n\nexport interface DialogHeaderProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nconst DialogHeader = ({\n title,\n icon,\n className = \"\",\n children,\n ...props\n}: DialogHeaderProps) => {\n const { isUnderTablet } = useBreakpoint();\n return (\n <div className={`dialog__header ${className}`} {...props}>\n {icon && <span className=\"dialog__icon\">{icon}</span>}\n {title && (\n <Text variant={isUnderTablet ? \"subtitle-p1\" : \"heading-h6\"}>\n {title}\n </Text>\n )}\n {children}\n </div>\n );\n};\n\nexport type DialogBodyProps = React.HTMLAttributes<HTMLDivElement>\n\nconst DialogBody = ({ className = \"\", children, ...props }: DialogBodyProps) => {\n return (\n <div className={`dialog__body ${className}`} {...props}>\n <div className=\"body-p2 dialog__body-text\">{children}</div>\n </div>\n );\n};\n\nexport interface DialogFooterProps\n extends React.HTMLAttributes<HTMLDivElement> {\n layout?: DialogFooterLayout;\n}\n\nconst DialogFooter = ({\n layout = \"horizontal\",\n className = \"\",\n children,\n ...props\n}: DialogFooterProps) => {\n const layoutClass =\n layout === \"vertical\"\n ? \"dialog__actions--vertical\"\n : \"dialog__actions--horizontal\";\n\n return (\n <div\n className={`dialog__footer dialog__footer--${layout} ${className}`}\n {...props}\n >\n <div className={`dialog__actions ${layoutClass}`}>{children}</div>\n </div>\n );\n};\n\n// DialogButton: ActionButton을 래핑하여 Dialog 컨텍스트와 연동\nexport interface DialogButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n label: string;\n color?: ButtonColor;\n type?: ButtonType;\n size?: Exclude<ButtonSize, \"xlarge\">;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n loading?: boolean;\n disabled?: boolean;\n /** 클릭 시 다이얼로그 닫기 여부 (기본값: false - 명시적으로 닫아야 함) */\n closeOnClick?: boolean;\n}\n\nconst DialogButton = ({\n label,\n color,\n type,\n size,\n prefixIcon,\n suffixIcon,\n loading,\n disabled,\n onClick,\n closeOnClick = false,\n style,\n ...props\n}: DialogButtonProps) => {\n const context = React.useContext(DialogContext);\n const { isUnderTablet } = useBreakpoint();\n\n // 기본 스타일 계산\n const variant = context?.variant ?? \"confirm\";\n const buttonWidth = variant === \"confirm\" ? \"100%\" : \"auto\";\n const defaultSize =\n variant === \"alert\" ? (isUnderTablet ? \"small\" : \"medium\") : \"large\";\n const defaultType = variant === \"alert\" ? \"outline\" : \"solid\";\n const defaultColor = \"neutral\"; \n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (closeOnClick) {\n context?.onClose?.();\n }\n };\n\n return (\n <ActionButton\n label={label}\n size={size ?? defaultSize}\n color={color ?? defaultColor}\n type={type ?? defaultType}\n prefixIcon={prefixIcon}\n suffixIcon={suffixIcon}\n loading={loading}\n disabled={disabled}\n onClick={handleClick}\n style={{ width: buttonWidth, ...style }}\n {...props}\n />\n );\n};\n\n// --- Export with Compound Component Pattern ---\n\nexport const Dialog = Object.assign(DialogRoot, {\n Header: DialogHeader,\n Body: DialogBody,\n Footer: DialogFooter,\n Button: DialogButton,\n});\n\n// -------------------- Global Provider & Hook --------------------\n\nexport interface DialogOptions {\n id?: string;\n variant?: DialogVariant;\n align?: DialogAlign;\n title?: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n // Hook에서 사용할 때는 간단한 버튼 정의 (Compound 대신)\n buttons?: DialogActionItem[]; \n // 또는 완전히 커스텀한 컨텐츠\n content?: React.ReactNode;\n \n onClose?: () => void;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n withClose?: boolean;\n}\n\nexport interface AlertOptions extends Omit<DialogOptions, \"buttons\" | \"content\"> {\n confirmLabel?: string;\n onConfirm?: () => void | Promise<void>;\n}\n\nexport interface ConfirmOptions extends Omit<DialogOptions, \"buttons\" | \"content\"> {\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm?: () => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n}\n\ninterface DialogContextType {\n open: (options: DialogOptions) => string;\n close: (id: string) => void;\n closeAll: () => void;\n alert: (options: AlertOptions) => Promise<void>;\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n}\n\nconst GlobalDialogContext = React.createContext<DialogContextType | undefined>(\n undefined\n);\n\nexport const DialogProvider = ({ children }: { children: React.ReactNode }) => {\n const [dialogs, setDialogs] = React.useState<\n (DialogOptions & { id: string })[]\n >([]);\n\n const close = React.useCallback((id: string) => {\n setDialogs((prev) => prev.filter((d) => d.id !== id));\n }, []);\n\n const closeAll = React.useCallback(() => {\n setDialogs([]);\n }, []);\n\n const open = React.useCallback(\n (options: DialogOptions) => {\n const id = options.id || `dialog-${Date.now()}-${Math.random()}`;\n setDialogs((prev) => [...prev, { ...options, id }]);\n return id;\n },\n []\n );\n\n const alert = React.useCallback(\n (options: AlertOptions) => {\n return new Promise<void>((resolve) => {\n const id = `alert-${Date.now()}`;\n open({\n ...options,\n id,\n variant: options.variant ?? \"alert\",\n buttons: [\n {\n label: options.confirmLabel ?? \"확인\",\n color: \"primary\",\n type: \"solid\",\n closeOnClick: true,\n onClick: async () => {\n await options.onConfirm?.();\n resolve();\n },\n },\n ],\n onClose: () => {\n resolve();\n close(id);\n },\n });\n });\n },\n [open, close]\n );\n\n const confirm = React.useCallback(\n (options: ConfirmOptions) => {\n return new Promise<boolean>((resolve) => {\n const id = `confirm-${Date.now()}`;\n open({\n ...options,\n id,\n variant: options.variant ?? \"confirm\",\n buttons: [\n {\n label: options.cancelLabel ?? \"취소\",\n color: \"neutral\",\n type: \"outline\",\n closeOnClick: true,\n onClick: async () => {\n await options.onCancel?.();\n resolve(false);\n },\n },\n {\n label: options.confirmLabel ?? \"확인\",\n color: \"primary\",\n type: \"solid\",\n closeOnClick: true,\n onClick: async () => {\n await options.onConfirm?.();\n resolve(true);\n },\n },\n ],\n onClose: () => {\n resolve(false);\n close(id);\n },\n });\n });\n },\n [open, close]\n );\n\n return (\n <GlobalDialogContext.Provider\n value={{ open, close, closeAll, alert, confirm }}\n >\n {children}\n {/* DialogRoot 내부에서 이미 createPortal을 사용하므로, 여기서는 그냥 렌더링하면 됨 */}\n {dialogs.map((dialog) => (\n <DialogRoot\n key={dialog.id}\n open={true}\n onClose={() => {\n dialog.onClose?.();\n close(dialog.id);\n }}\n variant={dialog.variant}\n align={dialog.align}\n closeOnOverlayClick={dialog.closeOnOverlayClick}\n closeOnEsc={dialog.closeOnEsc}\n withClose={dialog.withClose}\n // Data-driven props 전달\n title={dialog.title}\n description={dialog.description}\n icon={dialog.icon}\n actionItems={dialog.buttons}\n content={dialog.content}\n >\n {dialog.content}\n </DialogRoot>\n ))}\n </GlobalDialogContext.Provider>\n );\n};\n\nexport function useDialog() {\n const context = React.useContext(GlobalDialogContext);\n if (!context) {\n throw new Error(\"useDialog must be used within a DialogProvider\");\n }\n return context;\n}\n","import React, { createContext, useContext, useSyncExternalStore } from 'react';\n\n\n// 1. 상태 타입 정의\ninterface BreakpointContextType {\n isMobile?: boolean;\n isTablet?: boolean;\n isDesktop?: boolean;\n isUnderTablet?: boolean;\n }\n \n // 2. Context 생성\n const BreakpointContext = createContext<BreakpointContextType | null>(null);\n \n // 3. Provider (스토리북 등에서 사용)\n export const BreakpointProvider = BreakpointContext.Provider;\n\nexport function useMediaQuery(query: string): boolean {\n // SSR 환경에서는 기본값으로 false를 반환합니다.\n const subscribe = (callback: () => void) => {\n const matchMedia = window.matchMedia(query);\n matchMedia.addEventListener(\"change\", callback);\n return () => matchMedia.removeEventListener(\"change\", callback);\n };\n\n const getSnapshot = () => {\n return window.matchMedia(query).matches;\n };\n\n const getServerSnapshot = () => {\n return false; // 서버 사이드에서는 항상 false (혹은 기본 레이아웃 기준)\n };\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n\n/**\n * 프로젝트 브레이크포인트 전용 훅\n */\nexport function useBreakpoint() {\n // Context에 값이 들어있다면 (스토리북에서 강제했다면) 그 값을 우선 사용\n const contextValue = useContext(BreakpointContext);\n \n // 실제 윈도우 미디어 쿼리 구독\n const isMobileQuery = useMediaQuery(\"(min-width: 375px) and (max-width: 743px)\");\n const isTabletQuery = useMediaQuery(\"(min-width: 744px) and (max-width: 1279px)\");\n const isDesktopQuery = useMediaQuery(\"(min-width: 1280px)\");\n const isUnderTabletQuery = useMediaQuery(\"(max-width: 743px)\");\n \n // 수정 포인트: \n // contextValue가 있더라도 내부의 특정 값(예: isMobile)이 없을 수 있으므로 \n // 널 병합 연산자(??)를 사용해 실제 쿼리 결과값을 기본값으로 넣어줍니다.\n return {\n isMobile: contextValue?.isMobile ?? isMobileQuery,\n isTablet: contextValue?.isTablet ?? isTabletQuery,\n isDesktop: contextValue?.isDesktop ?? isDesktopQuery,\n isUnderTablet: contextValue?.isUnderTablet ?? isUnderTabletQuery,\n };\n }","import React, { useState, useId } from \"react\";\nimport { ExclamationCircleIcon } from \"@heroicons/react/20/solid\";\nimport \"./text-input.css\";\nimport { Text } from \"../Typography/Typography\";\n\n// pc/mo는 디바이스 기반, medium/small은 스토리에서 쓰는 사이즈 네이밍\nexport type TextInputSize = \"pc\" | \"mo\" | \"medium\" | \"small\";\ntype NormalizedTextInputSize = \"pc\" | \"mo\";\nexport type TextInputState = \"default\" | \"error\";\n\nexport interface TextInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"title\"\n> {\n /** Title 텍스트 (있으면 표시) */\n title?: string;\n /** 필수 필드 표시 여부 */\n required?: boolean;\n /**\n * Input 크기\n * - \"pc\" / \"mo\": 디바이스 기반 네이밍\n * - \"medium\" / \"small\": 스토리/디자인 토큰 기반 네이밍 (pc ↔ medium, mo ↔ small)\n * 미지정 시 breakpoint 기준: tablet 미만 mo(small), 이상 pc(medium). 지정 시 오버라이드\n */\n size?: TextInputSize;\n /** Input 상태 (에러 상태) */\n error?: boolean;\n /** Help text */\n description?: React.ReactNode;\n /** Character count 표시 (예: \"99/100\") */\n maxLength?: number;\n /** 왼쪽 아이콘 */\n prefixIcon?: React.ReactNode;\n /** 오른쪽 아이콘 */\n suffixIcon?: React.ReactNode;\n /** 오른쪽 단위 (타이머 등) */\n suffixUnit?: React.ReactNode;\n\n /** Help text 아이콘 (true면 기본 아이콘, 노드면 커스텀) */\n accentIcon?: boolean | React.ReactNode;\n}\n\n/** TextInput 컴포넌트는 사용자로부터 텍스트 입력을 받는 폼 컴포넌트입니다. */\nexport const TextInput = ({\n required = false,\n size,\n error = false,\n description,\n maxLength,\n prefixIcon,\n suffixIcon,\n suffixUnit,\n title,\n accentIcon = true,\n className = \"\",\n style,\n id,\n value,\n defaultValue,\n readOnly,\n onChange,\n onFocus,\n onBlur,\n ...props\n}: TextInputProps) => {\n const generatedId = useId();\n const inputId = id || `textinput-${generatedId}`;\n const [focused, setFocused] = useState(false);\n\n // size 미지정 시: CSS media query로 해상도별 적용 (responsive). 지정 시: pc/mo\n const effectiveSize: NormalizedTextInputSize | \"responsive\" =\n size === undefined\n ? \"responsive\"\n : size === \"medium\"\n ? \"pc\"\n : size === \"small\"\n ? \"mo\"\n : size;\n\n // maxLength 글자 수 표시용. value 없으면 uncontrolled → 내부에서만 사용\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\n const currentValue = isControlled ? value : internalValue;\n\n const inputState: TextInputState = error ? \"error\" : \"default\";\n const count = maxLength\n ? `${String(currentValue).length}/${maxLength}`\n : undefined;\n const showCount = Boolean(count);\n const [countValue, countTotal] =\n typeof count === \"string\" && count.includes(\"/\")\n ? count.split(\"/\")\n : [count, undefined];\n const iconNode =\n typeof accentIcon === \"boolean\" ? (\n accentIcon ? (\n <ExclamationCircleIcon className=\"help-text__icon-svg\" />\n ) : null\n ) : (\n accentIcon\n );\n const helpVariant = error ? \"error\" : \"inform\";\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let next = e.target.value;\n if (maxLength != null && next.length > maxLength) {\n next = next.slice(0, maxLength);\n e.target.value = next;\n }\n if (!isControlled) setInternalValue(next);\n onChange?.(e);\n };\n\n const inputClasses = [\n \"text-input\",\n `text-input--${effectiveSize}`,\n `text-input--${inputState}`,\n focused && \"text-input--focused\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={`text-input-wrapper ${className}`.trim()} style={style}>\n {title && (\n <label htmlFor={inputId} className=\"flex items-center gap-1\">\n <Text variant=\"body-p3\">{title}</Text>\n {required && <span className=\"text-input__required\"> *</span>}\n </label>\n )}\n <div\n className={`text-input-shell text-input-shell--${inputState} text-input-shell--${effectiveSize}${readOnly ? \" text-input-shell--readonly\" : \"\"}`}\n >\n <div className={`text-input-container text-input-container--${effectiveSize}`}>\n {prefixIcon && (\n <span className=\"text-input__left-section\">{prefixIcon}</span>\n )}\n <input\n {...props}\n id={inputId}\n readOnly={readOnly}\n className={inputClasses}\n value={currentValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n maxLength={maxLength}\n aria-invalid={error}\n aria-describedby={\n description || count ? `${inputId}-description` : undefined\n }\n />\n {(suffixIcon || suffixUnit) && (\n <div className=\"text-input__right-section\">\n {suffixIcon && <>{suffixIcon}</>}\n {suffixUnit && <>{suffixUnit}</>}\n </div>\n )}\n </div>\n </div>\n {(description || showCount) && (\n <div id={`${inputId}-description`} className=\"text-input__footer\">\n <div\n className={`help-text-wrapper ${\n description && showCount\n ? \"help-text-wrapper--between\"\n : description\n ? \"help-text-wrapper--start\"\n : \"help-text-wrapper--end\"\n }`}\n >\n {description && (\n <span className={`help-text help-text--${helpVariant}`}>\n {iconNode && (\n <span className=\"help-text__icon\">{iconNode}</span>\n )}\n {typeof description === \"string\" ||\n typeof description === \"number\" ? (\n <Text variant=\"body-p3\" className=\"help-text__content\">\n {description}\n </Text>\n ) : (\n <span className=\"help-text__content\">{description}</span>\n )}\n </span>\n )}\n {showCount && (\n <span\n className={`help-text__count help-text__count--${helpVariant}`}\n >\n {countValue && (\n <Text variant=\"body-p3\" className=\"help-text__count-number\">\n {countValue}\n </Text>\n )}\n {countTotal && (\n <Text variant=\"body-p3\" className=\"help-text__count-total\">\n /{countTotal}\n </Text>\n )}\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n","import * as React from \"react\";\nfunction ExclamationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-8-5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 10 5Zm0 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ExclamationCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction InformationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-7-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM9 9a.75.75 0 0 0 0 1.5h.253a.25.25 0 0 1 .244.304l-.459 2.066A1.75 1.75 0 0 0 10.747 15H11a.75.75 0 0 0 0-1.5h-.253a.25.25 0 0 1-.244-.304l.459-2.066A1.75 1.75 0 0 0 9.253 9H9Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(InformationCircleIcon);\nexport default ForwardRef;","import React from \"react\";\nimport \"./toggle.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type ToggleSize = \"medium\" | \"small\";\nexport type ToggleLabelPosition = \"start\" | \"end\";\n\nexport interface ToggleProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"onChange\" | \"type\"\n> {\n /** Toggle 크기 */\n size?: ToggleSize;\n /** Toggle 라벨 */\n label?: React.ReactNode;\n /** Toggle 라벨 위치 */\n labelPosition?: ToggleLabelPosition;\n /** Toggle 설명 텍스트 */\n description?: React.ReactNode;\n /** Toggle 상태 변경 핸들러 */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\n/** Toggle 컴포넌트는 사용자가 on/off 상태를 전환할 수 있는 스위치 컴포넌트다. */\nexport const Toggle = React.forwardRef<HTMLInputElement, ToggleProps>(\n (\n {\n size = \"medium\",\n label,\n labelPosition = \"end\",\n description,\n checked: checkedProp,\n defaultChecked = false,\n onChange,\n disabled,\n className = \"\",\n id,\n ...props\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const combinedRef = React.useMemo(() => {\n if (typeof ref === \"function\") {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n ref(node);\n };\n } else if (ref) {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (ref) ref.current = node;\n };\n }\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n };\n }, [ref]);\n\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] =\n React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n\n onChange?.(e);\n };\n\n const generatedId = React.useId();\n const toggleId = id || generatedId;\n const descriptionId = description ? `${toggleId}-description` : undefined;\n\n const baseClasses = [\n \"toggle\",\n `toggle--${size}`,\n labelPosition === \"start\" && \"toggle--label-start\",\n disabled && \"toggle--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={baseClasses}>\n <div className=\"toggle__wrapper\">\n <input\n ref={combinedRef}\n type=\"checkbox\"\n id={toggleId}\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={handleChange}\n disabled={disabled}\n aria-describedby={descriptionId}\n className=\"toggle__input\"\n role=\"switch\"\n aria-checked={checked}\n {...props}\n />\n <label htmlFor={toggleId} className=\"toggle__label-wrapper\">\n {labelPosition === \"start\" && label && (\n <Text\n variant={size === \"medium\" ? \"body-p2\" : \"body-p3\"}\n as=\"span\"\n >\n {label}\n </Text>\n )}\n <span className=\"toggle__switch\">\n <span className=\"toggle__thumb\" />\n </span>\n {labelPosition === \"end\" && label && (\n <Text\n variant={size === \"medium\" ? \"body-p2\" : \"body-p3\"}\n as=\"span\"\n >\n {label}\n </Text>\n )}\n </label>\n </div>\n {description && (\n <div id={descriptionId} className=\"toggle__description\">\n {description}\n </div>\n )}\n </div>\n );\n }\n);\n\nToggle.displayName = \"Toggle\";\n","import React from \"react\";\nimport \"./checkbox.css\";\nimport {\n RiCheckboxBlankLine,\n RiCheckboxFill,\n RiCheckboxIndeterminateFill,\n} from \"@remixicon/react\";\nimport { Text } from \"../Typography/Typography\";\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"onChange\"> {\n /** Checkbox 라벨 */\n label?: React.ReactNode;\n /** label 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** Checkbox 설명 텍스트 */\n description?: React.ReactNode;\n /** Checkbox 값 (Checkbox.Group에서 사용) */\n value?: string;\n /** Checkbox 상태 변경 핸들러 */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n /** Indeterminate 상태 (부분 선택 상태) */\n indeterminate?: boolean;\n}\n\n/** Checkbox 컴포넌트는 사용자가 선택/해제할 수 있는 체크박스 입력 컴포넌트다. */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n labelProps,\n description,\n value,\n checked: checkedProp,\n defaultChecked = false,\n onChange,\n disabled,\n indeterminate = false,\n className = \"\",\n id,\n ...props\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const combinedRef = React.useMemo(() => {\n if (typeof ref === \"function\") {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n ref(node);\n };\n } else if (ref) {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (ref) ref.current = node;\n };\n }\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n };\n }, [ref]);\n\n // Indeterminate 상태 설정\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n\n onChange?.(e);\n };\n\n const generatedId = React.useId();\n const checkboxId = id || generatedId;\n const descriptionId = description ? `${checkboxId}-description` : undefined;\n\n const baseClasses = [\n \"checkbox\",\n disabled && \"checkbox--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const resolvedLabelProps = labelProps ?? {};\n const labelClassName = [\"checkbox__label-text\", resolvedLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={baseClasses}>\n <div className=\"checkbox__wrapper\">\n <input\n ref={combinedRef}\n type=\"checkbox\"\n id={checkboxId}\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={handleChange}\n disabled={disabled}\n value={value}\n aria-describedby={descriptionId || undefined}\n className=\"checkbox__input\"\n {...props}\n />\n <label htmlFor={checkboxId} className=\"checkbox__label-wrapper\">\n <span className=\"checkbox__icon-wrapper\" aria-hidden=\"true\">\n {indeterminate ? (\n <RiCheckboxIndeterminateFill className=\"checkbox__icon\" />\n ) : checked ? (\n <RiCheckboxFill className=\"checkbox__icon\" />\n ) : (\n <RiCheckboxBlankLine className=\"checkbox__icon\" />\n )}\n </span>\n {label && (\n <Text\n variant={resolvedLabelProps.variant ?? \"body-p2\"}\n as={resolvedLabelProps.as ?? \"span\"}\n {...resolvedLabelProps}\n className={labelClassName}\n >\n {label}\n </Text>\n )}\n </label>\n </div>\n {description && (\n <div id={descriptionId} className=\"checkbox__description\">\n {description}\n </div>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n\n// Checkbox.Group 컴포넌트\nexport interface CheckboxGroupProps {\n /** 그룹 라벨 */\n label?: React.ReactNode;\n /** 그룹 라벨 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 그룹 설명 */\n description?: React.ReactNode;\n /** 그룹 설명 스타일 오버라이드 (옵션) */\n descriptionProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 복수 선택 허용 여부. false면 단일 선택(라디오처럼 동작) */\n multiple?: boolean;\n /** 선택된 값들 (controlled). multiple=false일 때는 길이 0 또는 1 */\n value?: string[];\n /** 초기 선택된 값들 (uncontrolled) */\n defaultValue?: string[];\n /** 값 변경 핸들러 */\n onChange?: (values: string[]) => void;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** 자식 Checkbox 컴포넌트들 */\n children: React.ReactNode;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\n/** Checkbox.Group은 여러 Checkbox를 그룹화하여 관리할 수 있는 컴포넌트다. */\nexport const CheckboxGroup = ({\n label,\n labelProps,\n description,\n descriptionProps,\n multiple = true,\n value: valueProp,\n defaultValue = [],\n onChange,\n disabled,\n children,\n className = \"\",\n}: CheckboxGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const handleChange = (checkboxValue: string, checked: boolean) => {\n const newValue = multiple\n ? checked\n ? [...value, checkboxValue]\n : value.filter((v) => v !== checkboxValue)\n : checked\n ? [checkboxValue]\n : [];\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n };\n\n const groupId = React.useId();\n const descriptionId = description ? `${groupId}-description` : undefined;\n\n const resolvedGroupLabelProps = labelProps ?? {};\n const resolvedGroupDescriptionProps = descriptionProps ?? {};\n const groupLabelClassName = [\"checkbox-group__label\", resolvedGroupLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n const groupDescriptionClassName = [\n \"checkbox-group__description\",\n resolvedGroupDescriptionProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const baseClasses = [\n \"checkbox-group\",\n disabled && \"checkbox-group--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // children을 순회하며 각 Checkbox에 value와 onChange를 주입\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<CheckboxProps>(child) && child.type === Checkbox) {\n const checkboxValue = child.props.value;\n if (checkboxValue === undefined) {\n console.warn(\"Checkbox.Group 내부의 Checkbox는 value prop이 필요합니다.\");\n return child;\n }\n\n const isChecked = value.includes(checkboxValue);\n\n return React.cloneElement(child, {\n checked: isChecked,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n handleChange(checkboxValue, e.target.checked);\n child.props.onChange?.(e);\n },\n disabled: disabled || child.props.disabled,\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses}>\n \n {label && (\n <Text\n variant={resolvedGroupLabelProps.variant ?? \"subtitle-p2\"}\n as={resolvedGroupLabelProps.as ?? \"div\"}\n {...resolvedGroupLabelProps}\n className={groupLabelClassName}\n >\n {label}\n </Text>\n )}\n {description && (\n <Text\n id={descriptionId}\n variant={resolvedGroupDescriptionProps.variant ?? \"body-p3\"}\n as={resolvedGroupDescriptionProps.as ?? \"div\"}\n {...resolvedGroupDescriptionProps}\n className={groupDescriptionClassName}\n >\n {description}\n </Text>\n )}\n <div className=\"checkbox-group__content\">\n {enhancedChildren}\n </div>\n </div>\n );\n};\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n\n// Checkbox.Group을 Checkbox의 정적 프로퍼티로 추가\n(Checkbox as typeof Checkbox & { Group: typeof CheckboxGroup }).Group = CheckboxGroup;\n","import React from \"react\";\n\nexport interface UseCheckboxGroupOptions {\n /** 선택 가능한 값 목록 (CheckboxGroup 자식들의 value와 일치) */\n options: readonly string[];\n /** 초기 선택 값 (uncontrolled일 때) */\n defaultValue?: string[];\n /** 선택 값 (controlled일 때). 지정하면 onChange와 함께 사용 */\n value?: string[];\n /** 선택 값 변경 핸들러 (controlled일 때 필수) */\n onChange?: (values: string[]) => void;\n}\n\nexport interface UseCheckboxGroupResult {\n /** 현재 선택된 값들. CheckboxGroup의 value에 전달 */\n value: string[];\n /** 선택 변경 핸들러. CheckboxGroup의 onChange에 전달 */\n onChange: (values: string[]) => void;\n /** '전체 선택' 체크박스에 넘길 checked */\n selectAllChecked: boolean;\n /** '전체 선택' 체크박스에 넘길 indeterminate (일부만 선택된 경우) */\n selectAllIndeterminate: boolean;\n /** '전체 선택' 체크박스에 넘길 onChange */\n handleSelectAll: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** '전체 선택' Checkbox에 그대로 spread 가능한 props (checked, indeterminate, onChange) */\n selectAllProps: {\n checked: boolean;\n indeterminate: boolean;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n };\n}\n\n/**\n * CheckboxGroup + '전체 선택' 체크박스(indeterminate 포함) 상태를 관리하는 훅.\n * options와 동기화된 value/onChange와, 전체 선택용 checked/indeterminate/onChange를 반환한다.\n * 외부에서는 이 훅만 사용하면 된다.\n *\n * @example\n * const options = ['react', 'vue', 'angular'] as const;\n * const { value, onChange, selectAllProps } = useCheckboxGroup({ options });\n *\n * <Checkbox label=\"전체 선택\" {...selectAllProps} />\n * <CheckboxGroup value={value} onChange={onChange} ...>\n * {options.map(v => <Checkbox key={v} value={v} label={v} />)}\n * </CheckboxGroup>\n */\nexport function useCheckboxGroup(\n config: UseCheckboxGroupOptions\n): UseCheckboxGroupResult {\n const {\n options,\n defaultValue = [],\n value: valueProp,\n onChange: onChangeProp,\n } = config;\n\n const [internalValue, setInternalValue] = React.useState<string[]>(\n defaultValue\n );\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const onChange = React.useCallback(\n (newValue: string[]) => {\n if (!isControlled) setInternalValue(newValue);\n onChangeProp?.(newValue);\n },\n [isControlled, onChangeProp]\n );\n\n const allSelected = value.length === options.length;\n const someSelected = value.length > 0;\n const selectAllChecked = allSelected;\n const selectAllIndeterminate = someSelected && !allSelected;\n\n const handleSelectAll = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked ? [...options] : []);\n },\n [options, onChange]\n );\n\n return {\n value,\n onChange,\n selectAllChecked,\n selectAllIndeterminate,\n handleSelectAll,\n selectAllProps: {\n checked: selectAllChecked,\n indeterminate: selectAllIndeterminate,\n onChange: handleSelectAll,\n },\n };\n}\n","import React from \"react\";\nimport { ChevronDownIcon, XMarkIcon } from \"@heroicons/react/24/outline\";\nimport {\n ExclamationCircleIcon,\n InformationCircleIcon,\n} from \"@heroicons/react/20/solid\";\nimport { useBreakpoint } from \"../../../shared/hooks/useMediaQuery\";\nimport { Text } from \"../../Typography/Typography\";\nimport {\n SelectMenuOverlay,\n type SelectMenuItem,\n type SelectMenuProps,\n} from \"../SelectMenu/SelectMenu\";\nimport \"./select-header.css\";\n\nexport type SelectHeaderType = \"outlined\" | \"underlined\";\nexport type SelectHeaderSize = \"medium\" | \"small\";\n\nexport interface SelectHeaderProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onChange\" | \"value\"\n> {\n /** SelectHeader 타입 */\n type?: SelectHeaderType;\n /**\n * SelectHeader 사이즈\n * - \"medium\": Web~Tab 권장 사이즈\n * - \"small\": Mo 권장 사이즈\n * - 지정하지 않으면 breakpoint에 따라 자동 결정됨.\n */\n size?: SelectHeaderSize;\n /** Title 텍스트 */\n title?: string;\n /** 필수 필드 표시 여부 */\n required?: boolean;\n /** 선택된 값 표시 (items 없을 때) / 선택된 값 controlled (items 있을 때) */\n value?: string | string[] | null;\n /** 플레이스홀더 텍스트 */\n placeholder?: string;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** 에러 상태 */\n error?: boolean;\n /** Help text (도움말 텍스트) */\n description?: React.ReactNode;\n /** Help text 아이콘 (true면 기본 아이콘, 노드면 커스텀, false면 아이콘 없음) */\n accentIcon?: boolean | React.ReactNode;\n /** 클릭 핸들러 */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** 값 클리어 핸들러 */\n onClear?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** 커스텀 아이콘 */\n icon?: React.ReactNode;\n /** SelectMenu 항목들 (있으면 클릭 시 메뉴 열림) */\n items?: SelectMenuItem[];\n /** 초기 선택 값 (uncontrolled, items 있을 때) */\n defaultValue?: string | string[];\n /** 값 변경 핸들러 (items 있을 때) */\n onChange?: (value: string | string[] | undefined) => void;\n /** 다중 선택 허용 여부 (items 있을 때) */\n multiple?: boolean;\n /** 클리어 버튼 표시 여부 (미지정 시 hasValue && !disabled && (onChange|onClear) 기준 자동) */\n showClear?: boolean;\n /** 래퍼(Wrapper)에 적용할 클래스 이름 */\n wrapperClassName?: string;\n /** 래퍼(Wrapper)에 적용할 인라인 스타일 */\n wrapperStyle?: React.CSSProperties;\n /** 너비 설정 (예: \"100%\", \"300px\"). 설정 시 max-width 제한이 해제됨 */\n width?: string | number;\n /** SelectMenu에 전달: 항목 텍스트 스타일 오버라이드 */\n menuItemTextProps?: SelectMenuProps[\"itemTextProps\"];\n /** SelectMenu에 전달: 선택된 항목 suffix 아이콘 */\n menuSuffixIcon?: SelectMenuProps[\"suffixIcon\"];\n /** 헤더와 메뉴 사이 간격 (px, 기본 8) */\n menuGap?: number;\n /** SelectMenu에 전달: className */\n menuClassName?: string;\n /** SelectMenu에 전달: style */\n menuStyle?: React.CSSProperties;\n}\n\n/** SelectHeader 컴포넌트는 선택된 값을 표시하고 드롭다운을 여는 헤더 컴포넌트다. items를 주면 클릭 시 메뉴가 열린다. */\nexport const SelectHeader = React.forwardRef<\n HTMLButtonElement,\n SelectHeaderProps\n>(\n (\n {\n type = \"outlined\",\n title,\n required = false,\n value: valueProp,\n placeholder = \"선택하세요\",\n disabled = false,\n error = false,\n description,\n accentIcon = true,\n onClick,\n onClear,\n icon,\n className = \"\",\n id,\n items,\n defaultValue,\n onChange,\n multiple,\n showClear,\n wrapperClassName = \"\",\n wrapperStyle,\n width,\n size,\n menuItemTextProps,\n menuSuffixIcon,\n menuGap = 8,\n menuClassName,\n menuStyle,\n ...props\n },\n ref\n ) => {\n const { isUnderTablet } = useBreakpoint();\n const generatedId = React.useId();\n const selectHeaderId = id || `select-header-${generatedId}`;\n const descriptionId = description\n ? `${selectHeaderId}-description`\n : undefined;\n\n // size prop이 있으면 medium/small 기준으로 우선, 없으면 breakpoint 기준으로 결정\n const resolvedSize: \"web-tab\" | \"mo\" =\n size === \"medium\"\n ? \"web-tab\"\n : size === \"small\"\n ? \"mo\"\n : isUnderTablet\n ? \"mo\"\n : \"web-tab\";\n\n const [internalValue, setInternalValue] = React.useState<\n string | string[] | undefined\n >(defaultValue);\n\n const isSelectMode = items != null && items.length > 0;\n\n const isControlled = valueProp !== undefined;\n\n // items가 있으면 풀 셀렉트: value/defaultValue/onChange로 선택 상태 관리\n let currentValueForSelect: string | string[] | undefined = undefined;\n if (isSelectMode) {\n currentValueForSelect = isControlled\n ? valueProp === null\n ? undefined\n : valueProp\n : internalValue;\n }\n\n const handleSelectChange = (next: string | string[] | undefined) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n };\n\n const displayValue: string | null = (() => {\n // Select + items 모드: label 기반 표시\n if (isSelectMode) {\n const v = currentValueForSelect;\n if (v == null || (Array.isArray(v) && v.length === 0)) return null;\n if (Array.isArray(v)) {\n return v\n .map(\n (value) => items!.find((i) => i.value === value)?.label ?? value\n )\n .filter(Boolean)\n .join(\", \");\n }\n const found = items!.find((i) => i.value === v)?.label;\n return found != null ? String(found) : v;\n }\n\n // 단순 헤더 모드: value를 문자열로만 표시\n if (valueProp == null) return null;\n if (Array.isArray(valueProp)) return valueProp.join(\", \");\n return typeof valueProp === \"string\" ? valueProp : null;\n })();\n\n const hasValue = Boolean(displayValue);\n const showClearButton =\n showClear !== undefined\n ? showClear\n : hasValue &&\n !disabled &&\n (isSelectMode ? Boolean(onChange) : Boolean(onClear));\n\n const iconNode =\n typeof accentIcon === \"boolean\" ? (\n accentIcon ? (\n error ? (\n <ExclamationCircleIcon className=\"help-text__icon-svg\" />\n ) : (\n <InformationCircleIcon className=\"help-text__icon-svg\" />\n )\n ) : null\n ) : (\n accentIcon\n );\n const helpVariant = error ? \"error\" : \"inform\";\n\n const baseClasses = [\n \"select-header\",\n `select-header--${resolvedSize}`,\n `select-header--${type}`,\n disabled && \"select-header--disabled\",\n error && \"select-header--error\",\n hasValue && \"select-header--has-value\",\n width && \"select-header--full\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClear = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (isSelectMode) {\n handleSelectChange(undefined);\n } else {\n onClear?.(e);\n }\n };\n\n const headerButton = (\n <button\n ref={ref}\n type=\"button\"\n id={selectHeaderId}\n className={baseClasses}\n disabled={disabled}\n onClick={onClick}\n aria-haspopup=\"listbox\"\n aria-describedby={descriptionId}\n {...props}\n >\n <span className=\"select-header__content\">\n {hasValue ? (\n <Text as=\"span\" variant=\"body-p2\">\n {displayValue}\n </Text>\n ) : (\n <Text as=\"span\" variant=\"body-p2\">\n {placeholder}\n </Text>\n )}\n </span>\n <span className=\"select-header__actions\">\n {showClearButton && (\n <button\n type=\"button\"\n className=\"select-header__clear\"\n onClick={handleClear}\n aria-label=\"값 지우기\"\n >\n <XMarkIcon className=\"select-header__clear-icon\" />\n </button>\n )}\n <span className=\"select-header__icon\">\n {icon || <ChevronDownIcon className=\"select-header__chevron\" />}\n </span>\n </span>\n </button>\n );\n\n return (\n <div\n className={`select-header-wrapper ${wrapperClassName}`}\n style={{ ...wrapperStyle, ...(width ? { width } : {}) }}\n >\n {(title || required) && (\n <label htmlFor={selectHeaderId} className=\"select-header__label\">\n {title && (\n <Text as=\"span\" variant=\"subtitle-p3\">\n {title}\n </Text>\n )}\n {required && (\n <Text\n as=\"span\"\n variant=\"subtitle-p3\"\n className=\"text-info-negative\"\n >\n *\n </Text>\n )}\n </label>\n )}\n {isSelectMode ? (\n <SelectMenuOverlay\n items={items!}\n value={currentValueForSelect}\n multiple={multiple}\n onChange={handleSelectChange}\n menuContainerStyle={{ width: \"100%\", marginTop: menuGap }}\n itemTextProps={menuItemTextProps}\n suffixIcon={menuSuffixIcon}\n className={menuClassName}\n style={menuStyle}\n >\n {headerButton}\n </SelectMenuOverlay>\n ) : (\n headerButton\n )}\n {description && (\n <div id={descriptionId} className=\"select-header__footer\">\n <span className={`help-text help-text--${helpVariant}`}>\n {iconNode && <span className=\"help-text__icon\">{iconNode}</span>}\n <Text as=\"span\" variant=\"body-p3\">\n {description}\n </Text>\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nSelectHeader.displayName = \"SelectHeader\";\n","import React from \"react\";\nimport \"./select-menu.css\";\nimport { Text } from \"../../Typography/Typography\";\nimport { useBreakpoint } from \"../../../shared/hooks/useMediaQuery\";\nimport { RiCheckboxCircleFill } from \"@remixicon/react\";\n\nexport interface SelectMenuItem {\n value: string;\n label: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface SelectMenuProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** 메뉴 항목들 */\n items: SelectMenuItem[];\n /**\n * 메뉴 사이즈\n * - \"medium\": Web~Tab 권장 사이즈\n * - \"small\": Mo 권장 사이즈\n * - 지정하지 않으면 breakpoint에 따라 자동 결정됨.\n */\n size?: \"medium\" | \"small\";\n /** 선택된 값 (controlled) */\n value?: string | string[];\n /** 초기 선택 값 (uncontrolled) */\n defaultValue?: string | string[];\n /** 값 변경 핸들러 */\n onChange?: (value: string | string[] | undefined) => void;\n /** 다중 선택 허용 여부 */\n multiple?: boolean;\n /** 항목 텍스트 스타일 오버라이드 (옵션) */\n itemTextProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 선택된 항목 suffix 아이콘 (기본 체크 아이콘, 함수로 커스터마이즈 가능) */\n suffixIcon?: React.ReactNode | ((item: SelectMenuItem) => React.ReactNode);\n}\n\n/** SelectMenu는 옵션 리스트를 표시하고 값을 선택하는 메뉴 컴포넌트다. */\nexport const SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuProps>((props, ref) => {\n const {\n items,\n size,\n value,\n defaultValue,\n onChange,\n multiple,\n itemTextProps,\n suffixIcon,\n className = \"\",\n id,\n ...rest\n } = props;\n\n // value prop이 존재하면 (undefined 포함) controlled 로 간주\n const isControlled = Object.prototype.hasOwnProperty.call(props, \"value\");\n const [internalValue, setInternalValue] = React.useState<string | string[] | undefined>(\n defaultValue\n );\n const currentValue = isControlled ? value : internalValue;\n const isMultiple = !!multiple;\n\n const { isUnderTablet } = useBreakpoint();\n // size prop이 우선이며, 없으면 breakpoint 기준 자동 결정\n const resolvedSize: \"medium\" | \"small\" =\n size ?? (isUnderTablet ? \"small\" : \"medium\");\n\n const generatedId = React.useId();\n const menuId = id || `select-menu-${generatedId}`;\n\n const commitValue = (next: string) => {\n let newValue: string | string[] | undefined;\n\n if (isMultiple) {\n const prevArray = Array.isArray(currentValue)\n ? currentValue\n : currentValue\n ? [currentValue]\n : [];\n newValue = prevArray.includes(next)\n ? prevArray.filter((v) => v !== next)\n : [...prevArray, next];\n } else {\n newValue = currentValue === next ? undefined : next;\n }\n\n if (!isControlled) setInternalValue(newValue);\n onChange?.(newValue);\n };\n\n const baseClasses = [\"select-menu\", `select-menu--${resolvedSize}`, className]\n .filter(Boolean)\n .join(\" \");\n\n const resolvedItemTextProps = itemTextProps ?? {};\n const defaultVariant = resolvedSize === \"medium\" ? \"body-p2\" : \"body-p3\";\n\n return (\n <div\n ref={ref}\n id={menuId}\n className={baseClasses}\n role=\"listbox\"\n {...rest}\n >\n {items.map((item, idx) => {\n const isSelected = Array.isArray(currentValue)\n ? currentValue.includes(item.value)\n : currentValue === item.value;\n const optionId = `${menuId}-option-${item.value}`;\n\n const defaultSuffix = <RiCheckboxCircleFill className=\"select-menu__suffix-icon\" />;\n const suffixNode =\n typeof suffixIcon === \"function\" ? suffixIcon(item) : suffixIcon ?? defaultSuffix;\n\n return (\n <button\n key={item.value}\n id={optionId}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n disabled={item.disabled}\n className=\"select-menu__item\"\n onClick={() => !item.disabled && commitValue(item.value)}\n >\n <Text\n variant={resolvedItemTextProps.variant ?? defaultVariant}\n as={resolvedItemTextProps.as ?? \"span\"}\n {...resolvedItemTextProps}\n className={[\"select-menu__item-text\", resolvedItemTextProps.className]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.label}\n </Text>\n {isSelected && <span className=\"select-menu__suffix\">{suffixNode}</span>}\n </button>\n );\n })}\n </div>\n );\n});\n\nSelectMenu.displayName = \"SelectMenu\";\n\nexport interface SelectMenuOverlayProps\n extends Omit<SelectMenuProps, \"onClose\"> {\n /** 메뉴를 열기 위한 트리거 요소 (버튼/텍스트/아이콘 등) */\n children: React.ReactNode;\n /** 열림 상태 (controlled) */\n open?: boolean;\n /** 초기 열림 상태 (uncontrolled) */\n defaultOpen?: boolean;\n /** 열림 상태 변경 핸들러 */\n onOpenChange?: (open: boolean) => void;\n /** 메뉴 컨테이너 스타일 (positioning 커스터마이즈용) */\n menuContainerStyle?: React.CSSProperties;\n}\n\n/** SelectMenuOverlay는 트리거(children)를 감싸고 SelectMenu를 토글하는 래퍼 컴포넌트다. */\nexport const SelectMenuOverlay = ({\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n menuContainerStyle,\n ...menuProps\n}: SelectMenuOverlayProps) => {\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n\n const setOpen = (next: boolean) => {\n if (!isControlled) {\n setInternalOpen(next);\n }\n onOpenChange?.(next);\n };\n\n // 메뉴 밖을 클릭하면 닫기\n React.useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!wrapperRef.current) return;\n if (!wrapperRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [open, setOpen]);\n\n const handleToggle = () => {\n setOpen(!open);\n };\n\n let triggerNode: React.ReactNode = children;\n\n if (React.isValidElement<React.HTMLAttributes<HTMLElement>>(children)) {\n const originalOnClick = children.props.onClick;\n\n triggerNode = React.cloneElement<React.HTMLAttributes<HTMLElement>>(children, {\n ...children.props,\n onClick: (event: React.MouseEvent<HTMLElement>) => {\n originalOnClick?.(event);\n handleToggle();\n },\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": open,\n });\n } else {\n triggerNode = (\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n {children}\n </button>\n );\n }\n\n return (\n <div\n ref={wrapperRef}\n style={{ position: \"relative\", display: \"inline-flex\" }}\n >\n {triggerNode}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n ...menuContainerStyle,\n }}\n >\n <SelectMenu\n {...menuProps}\n style={{\n ...menuProps.style,\n width: \"100%\",\n minWidth: 0,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\nSelectMenuOverlay.displayName = \"SelectMenuOverlay\";\n\n","import * as React from \"react\";\nfunction CheckCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ExclamationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ExclamationCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ExclamationTriangleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ExclamationTriangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction InformationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(InformationCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction XCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-1.72 6.97a.75.75 0 1 0-1.06 1.06L10.94 12l-1.72 1.72a.75.75 0 1 0 1.06 1.06L12 13.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L13.06 12l1.72-1.72a.75.75 0 1 0-1.06-1.06L12 10.94l-1.72-1.72Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(XCircleIcon);\nexport default ForwardRef;","import React from \"react\";\nimport {\n SelectHeader,\n type SelectHeaderProps,\n type SelectHeaderType,\n} from \"../SelectHeader\";\nimport type { SelectMenuItem, SelectMenuProps } from \"../SelectMenu/SelectMenu\";\nimport { Text } from \"../../Typography/Typography\";\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n} from \"@heroicons/react/24/solid\";\nimport \"../SelectHeader/select-header.css\";\nimport \"../SelectMenu/select-menu.css\";\nimport \"./select-box.css\";\n\nexport type SelectBoxType = \"default\" | \"label\" | \"placeholder\";\nexport type SelectBoxSize = \"small\" | \"medium\" | \"large\" | \"full\";\nexport type SelectBoxState =\n | \"default\"\n | \"active\"\n | \"disabled\"\n | \"error\"\n | \"success\"\n | \"loading\";\n\n/** root/header/menu별 className 또는 전체 적용 */\nexport type SelectBoxClassName =\n | string\n | { root?: string; header?: string; menu?: string };\n\n/** root/header/menu별 style 또는 전체 적용 */\nexport type SelectBoxStyle =\n | React.CSSProperties\n | { root?: React.CSSProperties; header?: React.CSSProperties; menu?: React.CSSProperties };\n\n/** SelectBox 전용 props (label는 SelectHeader title에 매핑) */\ntype SelectBoxSpecificProps = {\n /** SelectBox 타입 (Default: 라벨 없음, Label: 라벨 있음, Placeholder: 라벨+플레이스홀더) */\n type?: SelectBoxType;\n /** SelectBox 사이즈 */\n size?: SelectBoxSize;\n /** SelectBox 상태 */\n state?: SelectBoxState;\n /** 라벨 텍스트 (SelectHeader title에 매핑) */\n label?: string;\n /** Helper text (에러/성공 시 표시) */\n helperText?: string;\n /**\n * className: 문자열이면 root에 적용, 객체면 root/header/menu 각각 적용\n * @example className=\"w-12\"\n * @example className={{ root: \"w-12\", header: \"border-red-500\", menu: \"border-red-500\" }}\n */\n className?: SelectBoxClassName;\n /**\n * style: 객체면 root/header/menu 각각 적용\n * @example style={{ root: { width: 48 }, header: { borderColor: \"red\" }, menu: { borderColor: \"red\" } }}\n */\n style?: SelectBoxStyle;\n};\n\n/** SelectHeader에서 SelectBox가 오버라이드하는 props 제외 */\ntype SelectHeaderPassThrough = Omit<\n SelectHeaderProps,\n | \"type\"\n | \"size\"\n | \"title\"\n | \"disabled\"\n | \"error\"\n | \"description\"\n | \"accentIcon\"\n | \"icon\"\n | \"wrapperClassName\"\n | \"menuClassName\"\n | \"menuStyle\"\n | \"style\"\n | \"className\"\n> & {\n /** SelectHeader 타입 (outlined | underlined) */\n headerType?: SelectHeaderType;\n};\n\n/** SelectMenu props (SelectHeader menuItemTextProps, menuSuffixIcon로 전달) */\ntype SelectMenuPassThrough = Pick<\n SelectMenuProps,\n \"itemTextProps\" | \"suffixIcon\"\n>;\n\nexport type SelectBoxProps = SelectBoxSpecificProps &\n SelectHeaderPassThrough &\n SelectMenuPassThrough;\n\nconst LoadingSpinner = () => (\n <span className=\"select-box__spinner\" aria-hidden=\"true\">\n <svg\n className=\"select-box__spinner-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n className=\"select-box__spinner-circle\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 40;40 40;0 40\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-40;-80\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n </span>\n);\n\n/** SelectBox는 SelectHeader와 SelectMenu를 하나로 통합한 컴포넌트로, 미리 정의된 목록에서 항목을 선택하도록 돕습니다. */\nexport const SelectBox = ({\n type = \"label\",\n size = \"medium\",\n state = \"default\",\n label,\n required = false,\n placeholder = \"선택하세요\",\n items,\n value,\n defaultValue,\n onChange,\n multiple,\n helperText,\n className,\n style,\n width,\n // SelectHeader pass-through\n headerType = \"outlined\",\n onClear,\n showClear,\n wrapperStyle,\n onClick,\n id,\n itemTextProps,\n suffixIcon,\n ...restHeaderProps\n}: SelectBoxProps) => {\n const isDisabled = state === \"disabled\" || state === \"loading\";\n const isError = state === \"error\";\n const isSuccess = state === \"success\";\n\n const showLabel = type === \"label\" || type === \"placeholder\";\n const showPlaceholder = type === \"placeholder\" || type === \"default\";\n const resolvedPlaceholder = showPlaceholder ? placeholder : \"선택하세요\";\n\n const resolvedWidth =\n size === \"full\"\n ? \"100%\"\n : width !== undefined\n ? typeof width === \"number\"\n ? `${width}px`\n : width\n : undefined;\n\n const iconNode = state === \"loading\" ? <LoadingSpinner /> : undefined;\n\n const isClassNameObj =\n typeof className === \"object\" &&\n className !== null &&\n (\"root\" in className || \"header\" in className || \"menu\" in className);\n const isStyleObj =\n typeof style === \"object\" &&\n style !== null &&\n !Array.isArray(style) &&\n (\"root\" in style || \"header\" in style || \"menu\" in style);\n\n const rootClassName = isClassNameObj ? className.root : (className as string | undefined);\n const headerClassName = isClassNameObj ? className.header : undefined;\n const menuClassName = isClassNameObj ? className.menu : undefined;\n\n const styleForParts = style as\n | { root?: React.CSSProperties; header?: React.CSSProperties; menu?: React.CSSProperties }\n | React.CSSProperties\n | undefined;\n const rootStyle: React.CSSProperties | undefined = isStyleObj\n ? (styleForParts as { root?: React.CSSProperties }).root\n : (styleForParts as React.CSSProperties | undefined);\n const headerStyle: React.CSSProperties | undefined = isStyleObj\n ? (styleForParts as { header?: React.CSSProperties }).header\n : undefined;\n const menuStyle: React.CSSProperties | undefined = isStyleObj\n ? (styleForParts as { menu?: React.CSSProperties }).menu\n : undefined;\n\n const baseClasses = [\n \"select-box\",\n `select-box--${size}`,\n `select-box--${state}`,\n isError && \"select-box--error\",\n isSuccess && \"select-box--success\",\n rootClassName,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const helperTextNode =\n helperText && (isError || isSuccess) ? (\n <div className=\"select-box__footer\">\n <span\n className={`help-text help-text--${isError ? \"error\" : \"success\"}`}\n >\n {(isError ? (\n <span className=\"help-text__icon\">\n <ExclamationCircleIcon className=\"help-text__icon-svg\" />\n </span>\n ) : (\n <span className=\"help-text__icon\">\n <CheckCircleIcon className=\"help-text__icon-svg\" />\n </span>\n ))}\n <Text as=\"span\" variant=\"body-p3\">\n {helperText}\n </Text>\n </span>\n </div>\n ) : null;\n\n return (\n <div className={baseClasses} style={rootStyle}>\n <SelectHeader\n type={headerType}\n size={size === \"small\" ? \"small\" : \"medium\"}\n title={showLabel ? label : undefined}\n required={required}\n placeholder={resolvedPlaceholder}\n items={items}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n multiple={multiple}\n disabled={isDisabled}\n error={isError}\n accentIcon={false}\n icon={iconNode}\n onClear={onClear}\n showClear={showClear}\n wrapperStyle={\n headerStyle || wrapperStyle\n ? { ...wrapperStyle, ...headerStyle }\n : undefined\n }\n wrapperClassName={[\"select-box__header-wrapper\", headerClassName].filter(Boolean).join(\" \")}\n menuClassName={menuClassName}\n menuStyle={menuStyle}\n onClick={onClick}\n id={id}\n menuItemTextProps={itemTextProps}\n menuSuffixIcon={suffixIcon}\n width={resolvedWidth}\n {...restHeaderProps}\n />\n {helperTextNode}\n </div>\n );\n};\n\nSelectBox.displayName = \"SelectBox\";\n","import React from \"react\";\n\nimport \"./pagination.css\";\nimport { Text } from \"../Typography/Typography\";\nimport {\n RiArrowLeftSLine,\n RiArrowRightSLine,\n RiMoreLine,\n} from \"@remixicon/react\";\n\nexport type PaginationType = \"basic\" | \"compact\";\n\ntype PaginationItemType =\n | \"page\"\n | \"ellipsis\"\n | \"prev\"\n | \"next\"\n | \"first\"\n | \"last\";\n\ninterface PaginationItem {\n type: PaginationItemType;\n page?: number;\n key: string;\n disabled?: boolean;\n selected?: boolean;\n}\n\nexport interface PaginationProps {\n /** 총 페이지 수 (1 이상) */\n totalPages: number;\n /** 현재 페이지 (1부터 시작) */\n currentPage: number;\n /** 페이지 변경 핸들러 */\n onChange?: (page: number) => void;\n /** Pagination 타입 (기본형 / 축약형) */\n type?: PaginationType;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\nconst range = (start: number, end: number): number[] => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => start + idx);\n};\n\nconst createPaginationItems = ({\n totalPages,\n currentPage,\n siblingCount,\n showEdgeButtons,\n showPrevNext,\n}: {\n totalPages: number;\n currentPage: number;\n siblingCount: number;\n showEdgeButtons: boolean;\n showPrevNext: boolean;\n}): PaginationItem[] => {\n if (totalPages <= 0) return [];\n\n const safeCurrent = Math.min(Math.max(currentPage, 1), totalPages);\n const items: PaginationItem[] = [];\n\n const add = (item: PaginationItem) => items.push(item);\n\n const isFirstPage = safeCurrent === 1;\n const isLastPage = safeCurrent === totalPages;\n\n if (showEdgeButtons) {\n add({\n type: \"first\",\n page: 1,\n key: \"first\",\n disabled: isFirstPage,\n });\n }\n\n if (showPrevNext) {\n add({\n type: \"prev\",\n page: Math.max(1, safeCurrent - 1),\n key: \"prev\",\n disabled: isFirstPage,\n });\n }\n\n // 페이지 번호들 + ... 계산 (MUI Pagination 로직과 유사)\n const totalPageNumbers = siblingCount * 2 + 5; // 1, last, current, 양옆, 그리고 두 개의 ellipsis 자리\n\n if (totalPages <= totalPageNumbers) {\n range(1, totalPages).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-${page}`,\n selected: page === safeCurrent,\n })\n );\n } else {\n const leftSiblingIndex = Math.max(safeCurrent - siblingCount, 2);\n const rightSiblingIndex = Math.min(\n safeCurrent + siblingCount,\n totalPages - 1\n );\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2;\n const shouldShowRightEllipsis = rightSiblingIndex < totalPages - 1;\n\n // 항상 첫 페이지\n add({\n type: \"page\",\n page: 1,\n key: \"page-1\",\n selected: safeCurrent === 1,\n });\n\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n // 왼쪽 ellipsis 없고 오른쪽만 필요\n const leftItemCount = 3 + 2 * siblingCount;\n const leftRange = range(2, leftItemCount);\n\n leftRange.forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n\n add({ type: \"ellipsis\", key: `ellipsis-right-${rightSiblingIndex}` });\n add({\n type: \"page\",\n page: totalPages,\n key: `page-${totalPages}`,\n selected: safeCurrent === totalPages,\n });\n } else if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n // 왼쪽만 필요하고 오른쪽 ellipsis 없음\n add({ type: \"ellipsis\", key: `ellipsis-left-${leftSiblingIndex}` });\n\n const rightItemCount = 3 + 2 * siblingCount;\n const rightRange = range(totalPages - rightItemCount + 1, totalPages - 1);\n\n rightRange.forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n\n add({\n type: \"page\",\n page: totalPages,\n key: `page-${totalPages}`,\n selected: safeCurrent === totalPages,\n });\n } else if (shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n // 양쪽 모두 필요할 때: 1 ... [left~right] ... last\n add({ type: \"ellipsis\", key: `ellipsis-left-${leftSiblingIndex}` });\n\n range(leftSiblingIndex, rightSiblingIndex).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n\n add({ type: \"ellipsis\", key: `ellipsis-right-${rightSiblingIndex}` });\n add({\n type: \"page\",\n page: totalPages,\n key: `page-${totalPages}`,\n selected: safeCurrent === totalPages,\n });\n } else {\n // ellipsis 둘 다 필요 없을 때 (fallback)\n range(1, totalPages).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n }\n }\n\n if (showPrevNext) {\n add({\n type: \"next\",\n page: Math.min(totalPages, safeCurrent + 1),\n key: \"next\",\n disabled: isLastPage,\n });\n }\n\n if (showEdgeButtons) {\n add({\n type: \"last\",\n page: totalPages,\n key: \"last\",\n disabled: isLastPage,\n });\n }\n\n return items;\n};\n\nconst createBasicPaginationItems = ({\n totalPages,\n currentPage,\n}: {\n totalPages: number;\n currentPage: number;\n}): PaginationItem[] => {\n if (totalPages <= 0) return [];\n\n const safeCurrent = Math.min(Math.max(currentPage, 1), totalPages);\n const items: PaginationItem[] = [];\n\n const add = (item: PaginationItem) => items.push(item);\n\n const isFirstPage = safeCurrent === 1;\n const isLastPage = safeCurrent === totalPages;\n\n // 기본형: first/last, ellipsis 없이 이전/다음 + 모든 페이지 번호\n add({\n type: \"prev\",\n page: Math.max(1, safeCurrent - 1),\n key: \"prev\",\n disabled: isFirstPage,\n });\n\n range(1, totalPages).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-${page}`,\n selected: page === safeCurrent,\n })\n );\n\n add({\n type: \"next\",\n page: Math.min(totalPages, safeCurrent + 1),\n key: \"next\",\n disabled: isLastPage,\n });\n\n return items;\n};\n\n/** Pagination 컴포넌트는 리스트/테이블 등에서 여러 페이지를 탐색할 때 사용하는 페이지네이션 컴포넌트다. */\nexport const Pagination = ({\n totalPages,\n currentPage,\n onChange,\n type = \"basic\",\n className = \"\",\n ...rest\n}: PaginationProps) => {\n // 디자인은 데스크탑 기준 단일 사이즈만 사용\n const size = \"web-tab\" as const;\n\n const variant: PaginationType = type ?? \"basic\";\n\n const items = React.useMemo(() => {\n if (variant === \"basic\") {\n return createBasicPaginationItems({\n totalPages,\n currentPage,\n });\n }\n\n // compact: ellipsis + first/last 버튼 포함\n return createPaginationItems({\n totalPages,\n currentPage,\n siblingCount: 1,\n showEdgeButtons: false,\n showPrevNext: true,\n });\n }, [totalPages, currentPage, variant]);\n\n const handleItemClick = React.useCallback(\n (item: PaginationItem) => {\n if (item.disabled) return;\n if (!item.page) return;\n onChange?.(item.page);\n },\n [onChange]\n );\n\n const handleEllipsisClick = React.useCallback(\n (key: string) => {\n if (key === \"ellipsis-left\") {\n // 왼쪽 ellipsis 클릭 → 첫 페이지로 이동\n onChange?.(1);\n } else if (key === \"ellipsis-right\") {\n // 오른쪽 ellipsis 클릭 → 마지막 페이지로 이동\n onChange?.(totalPages);\n }\n },\n [onChange, totalPages]\n );\n\n const rootClasses = [\"pagination\", `pagination--${size}`, className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <nav className={rootClasses} aria-label=\"페이지네이션\" {...rest}>\n <ul className=\"pagination__list\">\n {items.map((item) => {\n const isPage = item.type === \"page\";\n const isSelected = Boolean(item.selected);\n const isDisabled = Boolean(item.disabled);\n\n const itemClasses = [\n \"pagination__button\",\n `pagination__button--${item.type}`,\n isPage && \"pagination__button--page\",\n isSelected && \"pagination__button--selected\",\n isDisabled && \"pagination__button--disabled\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const labelText =\n item.type === \"page\"\n ? String(item.page)\n : item.type === \"prev\"\n ? \"이전 페이지\"\n : item.type === \"next\"\n ? \"다음 페이지\"\n : item.type === \"first\"\n ? \"첫 페이지\"\n : item.type === \"last\"\n ? \"마지막 페이지\"\n : \"\";\n\n const ariaLabel =\n item.type === \"page\" ? `${item.page}페이지` : labelText;\n\n if (item.type === \"ellipsis\") {\n return (\n <li\n key={item.key}\n className=\"pagination__item pagination__item--ellipsis\"\n >\n <button\n type=\"button\"\n className=\"pagination__button pagination__button--ellipsis\"\n onClick={() => handleEllipsisClick(item.key)}\n aria-label={\n item.key === \"ellipsis-left\"\n ? \"첫 페이지로 이동\"\n : \"마지막 페이지로 이동\"\n }\n >\n <RiMoreLine />\n </button>\n </li>\n );\n }\n\n return (\n <li key={item.key} className=\"pagination__item\">\n <button\n type=\"button\"\n className={itemClasses}\n onClick={() => handleItemClick(item)}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-current={isPage && isSelected ? \"page\" : undefined}\n >\n {item.type === \"prev\" && (\n <RiArrowLeftSLine className=\"pagination__icon\" />\n )}\n {item.type === \"next\" && (\n <RiArrowRightSLine className=\"pagination__icon\" />\n )}\n {item.type === \"first\" && (\n <>\n <RiArrowLeftSLine className=\"pagination__icon pagination__icon--double\" />\n <RiArrowLeftSLine className=\"pagination__icon pagination__icon--double\" />\n </>\n )}\n {item.type === \"last\" && (\n <>\n <RiArrowRightSLine className=\"pagination__icon pagination__icon--double\" />\n <RiArrowRightSLine className=\"pagination__icon pagination__icon--double\" />\n </>\n )}\n {item.type === \"page\" && (\n <Text\n as=\"span\"\n variant={size === \"web-tab\" ? \"body-p2\" : \"body-p3\"}\n >\n {item.page}\n </Text>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n};\n\nPagination.displayName = \"Pagination\";\n","import React from \"react\";\nimport \"./radio-button.css\";\nimport { RiCircleLine, RiRadioButtonLine } from \"@remixicon/react\";\nimport { Text } from \"../Typography/Typography\";\n\nexport interface RadioButtonProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"onChange\"\n > {\n /** 라디오 라벨 */\n label?: React.ReactNode;\n /** label 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 라디오 설명 텍스트 */\n description?: React.ReactNode;\n /** 라디오 값 (RadioButton.Group에서 사용) */\n value?: string;\n /** 라디오 상태 변경 핸들러 */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\n/** RadioButton은 단일 선택(라디오) 입력 컴포넌트다. */\nexport const RadioButton = React.forwardRef<HTMLInputElement, RadioButtonProps>(\n (\n {\n label,\n labelProps,\n description,\n value,\n checked: checkedProp,\n defaultChecked = false,\n onChange,\n disabled,\n className = \"\",\n id,\n name,\n onClick,\n ...props\n },\n ref\n ) => {\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n\n onChange?.(e);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n if (checked && !disabled) {\n e.preventDefault();\n if (!isControlled) setInternalChecked(false);\n const syntheticEvent = {\n ...e,\n target: { ...e.target, checked: false },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n }\n onClick?.(e);\n };\n\n const generatedId = React.useId();\n const radioId = id || generatedId;\n const descriptionId = description ? `${radioId}-description` : undefined;\n\n const [isHovered, setIsHovered] = React.useState(false);\n\n const baseClasses = [\"radio-button\", disabled && \"radio-button--disabled\", className]\n .filter(Boolean)\n .join(\" \");\n\n const labelWrapperClasses = [\n \"radio-button__label-wrapper\",\n isHovered && !checked && !disabled && \"radio-button__label-wrapper--hovered\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const resolvedLabelProps = labelProps ?? {};\n const labelClassName = [\"radio-button__label-text\", resolvedLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={baseClasses} data-checked={checked}>\n <div className=\"radio-button__wrapper\">\n <input\n ref={ref}\n type=\"radio\"\n id={radioId}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={handleChange}\n onClick={handleClick}\n disabled={disabled}\n value={value}\n aria-describedby={descriptionId || undefined}\n className=\"radio-button__input\"\n {...props}\n />\n <label\n htmlFor={radioId}\n className={labelWrapperClasses}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <span className=\"radio-button__icon-wrapper\" aria-hidden=\"true\">\n {checked ? (\n <RiRadioButtonLine className=\"radio-button__icon\" />\n ) : (\n <RiCircleLine className=\"radio-button__icon\" />\n )}\n </span>\n {label && (\n <Text\n variant={resolvedLabelProps.variant ?? \"body-p2\"}\n as={resolvedLabelProps.as ?? \"span\"}\n {...resolvedLabelProps}\n className={labelClassName}\n >\n {label}\n </Text>\n )}\n </label>\n </div>\n {description && (\n <div id={descriptionId} className=\"radio-button__description\">\n {description}\n </div>\n )}\n </div>\n );\n }\n);\n\nRadioButton.displayName = \"RadioButton\";\n\n// RadioButton.Group\nexport interface RadioButtonGroupProps {\n /** 그룹 라벨 */\n label?: React.ReactNode;\n /** 그룹 라벨 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 그룹 설명 */\n description?: React.ReactNode;\n /** 그룹 설명 스타일 오버라이드 (옵션) */\n descriptionProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 선택된 값 (controlled) */\n value?: string;\n /** 초기 선택 값 (uncontrolled) */\n defaultValue?: string;\n /** 값 변경 핸들러 (선택 해제 시 value는 undefined) */\n onChange?: (value: string | undefined) => void;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** name (미지정 시 내부 생성) */\n name?: string;\n /** 자식 RadioButton 컴포넌트들 */\n children: React.ReactNode;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\n/** RadioButton.Group은 여러 RadioButton을 그룹화하여 단일 선택을 관리한다. */\nexport const RadioButtonGroup = ({\n label,\n labelProps,\n description,\n descriptionProps,\n value: valueProp,\n defaultValue,\n onChange,\n disabled,\n name,\n children,\n className = \"\",\n}: RadioButtonGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string | undefined>(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const groupId = React.useId();\n const groupName = name || `radio-group-${groupId}`;\n const descriptionId = description ? `${groupId}-description` : undefined;\n const resolvedGroupLabelProps = labelProps ?? {};\n const resolvedGroupDescriptionProps = descriptionProps ?? {};\n\n const groupLabelClassName = [\"radio-button-group__label\", resolvedGroupLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n const groupDescriptionClassName = [\n \"radio-button-group__description\",\n resolvedGroupDescriptionProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const baseClasses = [\n \"radio-button-group\",\n disabled && \"radio-button-group--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<RadioButtonProps>(child) && child.type === RadioButton) {\n const radioValue = child.props.value;\n if (radioValue === undefined) {\n console.warn(\"RadioButton.Group 내부의 RadioButton은 value prop이 필요합니다.\");\n return child;\n }\n\n const isChecked = value === radioValue;\n\n return React.cloneElement(child, {\n name: groupName,\n checked: isChecked,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n if (!isControlled) setInternalValue(radioValue);\n onChange?.(radioValue);\n } else {\n if (!isControlled) setInternalValue(undefined);\n onChange?.(undefined);\n }\n child.props.onChange?.(e);\n },\n disabled: disabled || child.props.disabled,\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses} role=\"radiogroup\" aria-describedby={descriptionId || undefined}>\n {label && (\n <Text\n variant={resolvedGroupLabelProps.variant ?? \"subtitle-p2\"}\n as={resolvedGroupLabelProps.as ?? \"div\"}\n {...resolvedGroupLabelProps}\n className={groupLabelClassName}\n >\n {label}\n </Text>\n )}\n {description && (\n <Text\n id={descriptionId}\n variant={resolvedGroupDescriptionProps.variant ?? \"body-p3\"}\n as={resolvedGroupDescriptionProps.as ?? \"div\"}\n {...resolvedGroupDescriptionProps}\n className={groupDescriptionClassName}\n >\n {description}\n </Text>\n )}\n <div className=\"radio-button-group__content\">{enhancedChildren}</div>\n </div>\n );\n};\n\nRadioButtonGroup.displayName = \"RadioButtonGroup\";\n\n// RadioButton.Group을 RadioButton의 정적 프로퍼티로 추가\n(RadioButton as typeof RadioButton & { Group: typeof RadioButtonGroup }).Group = RadioButtonGroup;\n\n","import React from \"react\";\nimport \"./tag.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type TagType = \"solid\" | \"outline\" | \"weak\";\nexport type TagSize = \"medium\" | \"small\";\nexport type TagState = \"enabled\" | \"error\" | \"progress\" | \"warning\" | \"success\";\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 태그 타입 (solid, outline, weak) */\n type?: TagType;\n /** 태그 크기 */\n size?: TagSize;\n /** 태그 상태 (type이 weak일 때만 사용 가능) */\n state?: TagState;\n /** 태그 라벨 */\n label: React.ReactNode;\n /** Prefix 아이콘 */\n prefixIcon?: React.ReactNode;\n /** Suffix 아이콘 */\n suffixIcon?: React.ReactNode;\n}\n\n/** Tag 컴포넌트는 콘텐츠의 속성, 상태, 카테고리를 시각적으로 표현하는 읽기 전용 라벨 컴포넌트다. */\nexport const Tag = ({\n type = \"solid\",\n size = \"medium\",\n state = \"enabled\",\n label,\n prefixIcon,\n suffixIcon,\n className = \"\",\n ...props\n}: TagProps) => {\n // type이 weak가 아닐 때는 state를 무시하고 enabled로 처리\n const effectiveState = type === \"weak\" ? state : \"enabled\";\n\n // className은 마지막에 두고, tag.css는 타입/상태를 :where()로 넣어서 전달한 className이 우선 적용되도록 함\n const resolvedClassName = [\n \"tag\",\n `tag--${type}`,\n `tag--${size}`,\n `tag--${effectiveState}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n const textVariant = size === \"medium\" ? \"body-p2\" : \"body-p3\";\n\n return (\n <span {...props} className={resolvedClassName}>\n {prefixIcon && <span className=\"tag__prefix-icon\">{prefixIcon}</span>}\n <Text variant={textVariant}>{label}</Text>\n {suffixIcon && <span className=\"tag__suffix-icon\">{suffixIcon}</span>}\n </span>\n );\n};\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { Text } from \"../Typography/Typography\";\nimport \"./tooltip.css\";\n\nexport type TooltipPosition =\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport type TooltipType = \"word\" | \"sentence\";\n\nexport interface TooltipProps {\n /** 툴팁에 표시할 내용 */\n label: React.ReactNode;\n /** 툴팁 타입 (word: 단어형, sentence: 장문형) */\n type?: TooltipType;\n /** Prefix 아이콘 (왼쪽) */\n prefixIcon?: React.ReactNode;\n /** Close 버튼 클릭 핸들러 (제공 시 닫기 버튼이 표시됨) */\n onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n /** 툴팁이 표시될 방향 */\n direction?: TooltipPosition;\n /** 화살표 표시 여부 */\n withArrow?: boolean;\n /** 툴팁 열림 상태 (controlled) */\n opened?: boolean;\n /** 툴팁 초기 열림 상태 (uncontrolled) */\n defaultOpened?: boolean;\n /** 툴팁 비활성화 */\n disabled?: boolean;\n /** 툴팁 너비 */\n width?: number | string;\n /** 툴팁 오프셋 (px) */\n offset?: number;\n /** 포털 사용 여부 */\n withinPortal?: boolean;\n /** 툴팁 표시 지연 시간 (ms) */\n openDelay?: number;\n /** 툴팁 숨김 지연 시간 (ms) */\n closeDelay?: number;\n /** 툴팁이 표시될 대상 요소 */\n children: React.ReactElement;\n /** 추가 클래스명 */\n className?: string;\n}\n\n/** Tooltip 컴포넌트는 사용자에게 추가 정보나 설명을 제공하는 작은 팝오버입니다. */\nexport const Tooltip = ({\n label,\n type = \"word\",\n prefixIcon,\n onClose,\n direction = \"top\",\n withArrow = true,\n opened: openedProp,\n defaultOpened = false,\n disabled = false,\n width,\n offset = 8,\n withinPortal = true,\n openDelay = 0,\n closeDelay = 0,\n children,\n className = \"\",\n}: TooltipProps) => {\n const [opened, setOpened] = useState(defaultOpened);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const openTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const closeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isControlled = openedProp !== undefined;\n const isOpened = isControlled ? openedProp : opened;\n\n // 타임아웃 정리\n useEffect(() => {\n return () => {\n if (openTimeoutRef.current) {\n clearTimeout(openTimeoutRef.current);\n }\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n };\n }, []);\n\n const handleMouseEnter = () => {\n if (!disabled && !isControlled) {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n if (openDelay > 0) {\n openTimeoutRef.current = setTimeout(() => {\n setOpened(true);\n }, openDelay);\n } else {\n setOpened(true);\n }\n }\n };\n\n const handleMouseLeave = () => {\n if (!disabled && !isControlled) {\n if (openTimeoutRef.current) {\n clearTimeout(openTimeoutRef.current);\n openTimeoutRef.current = null;\n }\n if (closeDelay > 0) {\n closeTimeoutRef.current = setTimeout(() => {\n setOpened(false);\n }, closeDelay);\n } else {\n setOpened(false);\n }\n }\n };\n\n const handleFocus = () => {\n if (!disabled && !isControlled) {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n if (openDelay > 0) {\n openTimeoutRef.current = setTimeout(() => {\n setOpened(true);\n }, openDelay);\n } else {\n setOpened(true);\n }\n }\n };\n\n const handleBlur = () => {\n if (!disabled && !isControlled) {\n if (openTimeoutRef.current) {\n clearTimeout(openTimeoutRef.current);\n openTimeoutRef.current = null;\n }\n if (closeDelay > 0) {\n closeTimeoutRef.current = setTimeout(() => {\n setOpened(false);\n }, closeDelay);\n } else {\n setOpened(false);\n }\n }\n };\n\n const handleCloseClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (onClose) {\n onClose(e);\n }\n if (!disabled && !isControlled) {\n setOpened(false);\n }\n };\n\n const tooltipContent = (\n <div\n className={`tooltip tooltip--${type} tooltip--${direction} ${withArrow ? \"tooltip--with-arrow\" : \"\"} ${className}`}\n style={width ? { width: typeof width === \"number\" ? `${width}px` : width } : undefined}\n role=\"tooltip\"\n >\n <div className=\"tooltip__content\">\n {prefixIcon && (\n <div className=\"tooltip__prefix-icon\">\n {prefixIcon}\n </div>\n )}\n <div className=\"tooltip__label\">\n <Text variant=\"body-p3\">{label}</Text>\n </div>\n {onClose && (\n <button\n type=\"button\"\n className=\"tooltip__close-button\"\n onClick={handleCloseClick}\n aria-label=\"Close tooltip\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n {withArrow && (\n <div\n className={`tooltip__arrow tooltip__arrow--${direction.split(\"-\")[0]}`}\n />\n )}\n </div>\n );\n\n return (\n <div\n ref={wrapperRef}\n className=\"tooltip__wrapper\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n {children}\n {isOpened && !disabled && tooltipContent}\n </div>\n );\n};\n","import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n XCircleIcon,\n ExclamationTriangleIcon,\n CheckCircleIcon,\n InformationCircleIcon,\n} from \"@heroicons/react/24/solid\";\nimport { useBreakpoint } from \"../../shared/hooks/useMediaQuery\";\nimport { Text } from \"../Typography/Typography\";\nimport \"./toast.css\";\n\nexport type ToastSize = \"medium\" | \"small\";\nexport type ToastState =\n | \"default\"\n | \"error\"\n | \"warning\"\n | \"success\"\n | \"information\";\nexport type ToastPosition = \"top\" | \"bottom\";\nexport type ToastHorizontalAlign = \"center\" | \"left\" | \"right\";\n\nexport interface ToastProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"style\"> {\n /** Toast 크기. 미지정 시 breakpoint 기준(tablet 미만: small, 이상: medium). 지정 시 해당 값으로 오버라이드 */\n size?: ToastSize;\n /** Toast 상태 (default, error, warning, success, information) */\n state?: ToastState;\n /** Toast 메시지 */\n label: React.ReactNode;\n /** State 아이콘 (state에 따라 자동으로 표시되지만, 커스텀 아이콘을 전달할 수 있음) */\n icon?: React.ReactNode;\n /** Toast 위치 (top: 상단, bottom: 하단) - 기본값: top */\n position?: ToastPosition;\n /** 수평 정렬 (center: 중앙, left: 왼쪽, right: 오른쪽) - 기본값: center */\n horizontalAlign?: ToastHorizontalAlign;\n /** 상단 여백 (px) - 기본값: medium일 때 60px, small일 때 20px */\n topOffset?: number;\n /** 하단 여백 (px) - 기본값: 20px */\n bottomOffset?: number;\n /** 좌우 여백 (px) - small 사이즈일 때만 적용, 기본값: 16px */\n horizontalPadding?: number;\n /** 추가 스타일 (position이 명시되면 fixed position 로직을 건너뜁니다) */\n style?: React.CSSProperties;\n}\n\n/** Toast 컴포넌트는 화면에 짧은 시간 동안 나타났다가 자동으로 사라지는 경량 알림 컴포넌트다. */\nexport const Toast = (props: ToastProps) => {\n const {\n size: sizeProp,\n state = \"default\",\n label,\n icon,\n position = \"top\",\n horizontalAlign = \"center\",\n topOffset,\n bottomOffset,\n horizontalPadding,\n className = \"\",\n style,\n ...rest\n } = props;\n\n const { isUnderTablet } = useBreakpoint();\n /** breakpoint 우선, size prop 있으면 오버라이드 (Dialog/TextInput과 동일) */\n const size: ToastSize = sizeProp ?? (isUnderTablet ? \"small\" : \"medium\");\n\n const baseClasses = [\"toast\", `toast--${size}`, `toast--${state}`, className]\n .filter(Boolean)\n .join(\" \");\n\n // 기본 위치 값 계산 (Layout 스펙: desktop/tablet 60px, mobile 20px)\n const defaultTopOffset = size === \"medium\" ? 60 : 20;\n const defaultBottomOffset = size === \"medium\" ? 60 : 20;\n const defaultHorizontalPadding = 16;\n\n // style prop에 position이 명시되어 있으면 fixed position 로직을 건너뜀\n const hasCustomPosition = style?.position !== undefined;\n\n // 위치 스타일 계산\n const positionStyles: React.CSSProperties = hasCustomPosition\n ? {\n // style prop에 position이 있으면 그대로 사용 (문서/스토리북용)\n ...style,\n }\n : {\n // 실제 사용: fixed position\n position: \"fixed\",\n zIndex: 1000,\n ...style,\n };\n\n // 커스텀 position이 없을 때만 위치 스타일 적용\n if (!hasCustomPosition) {\n // 수직 위치\n if (position === \"top\") {\n positionStyles.top = `${topOffset ?? defaultTopOffset}px`;\n positionStyles.bottom = \"auto\";\n } else {\n positionStyles.bottom = `${bottomOffset ?? defaultBottomOffset}px`;\n positionStyles.top = \"auto\";\n }\n\n // 수평 정렬\n if (size === \"small\") {\n // Mobile: 좌우 패딩 적용\n const padding = horizontalPadding ?? defaultHorizontalPadding;\n positionStyles.left = `${padding}px`;\n positionStyles.right = `${padding}px`;\n positionStyles.transform = \"none\";\n positionStyles.width = `calc(100% - ${padding * 2}px)`;\n } else {\n // Desktop/Tablet: 중앙 정렬 또는 좌우 정렬\n if (horizontalAlign === \"center\") {\n positionStyles.left = \"50%\";\n positionStyles.right = \"auto\";\n positionStyles.transform = \"translateX(-50%)\";\n positionStyles.width = \"auto\";\n positionStyles.minWidth = \"540px\";\n positionStyles.maxWidth = \"760px\";\n } else if (horizontalAlign === \"left\") {\n positionStyles.left = \"16px\";\n positionStyles.right = \"auto\";\n positionStyles.transform = \"none\";\n positionStyles.width = \"auto\";\n positionStyles.minWidth = \"540px\";\n positionStyles.maxWidth = \"760px\";\n } else {\n positionStyles.right = \"16px\";\n positionStyles.left = \"auto\";\n positionStyles.transform = \"none\";\n positionStyles.width = \"auto\";\n positionStyles.minWidth = \"540px\";\n positionStyles.maxWidth = \"760px\";\n }\n }\n }\n\n // State에 따른 기본 아이콘 (icon prop이 제공되지 않은 경우)\n const defaultIcon =\n !icon && state !== \"default\" ? (\n <div className=\"toast__icon\">\n {state === \"error\" && (\n <XCircleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n {state === \"warning\" && (\n <ExclamationTriangleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n {state === \"success\" && (\n <CheckCircleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n {state === \"information\" && (\n <InformationCircleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n </div>\n ) : icon ? (\n <div className=\"toast__icon\">{icon}</div>\n ) : null;\n\n return (\n <div className={baseClasses} style={positionStyles} {...rest}>\n {defaultIcon}\n <Text variant={size === \"medium\" ? \"heading-h6\" : \"subtitle-p2\"}>\n {label}\n </Text>\n </div>\n );\n};\n\n// useToast hook 관련 타입 및 인터페이스\nexport interface ToastOptions {\n /** Toast 상태 */\n state?: ToastState;\n /** Toast 크기 */\n size?: ToastSize;\n /** 자동으로 사라지는 시간 (ms) - 기본값: 3000 */\n duration?: number;\n /** Toast 위치 */\n position?: ToastPosition;\n /** 수평 정렬 */\n horizontalAlign?: ToastHorizontalAlign;\n /** 상단 여백 */\n topOffset?: number;\n /** 하단 여백 */\n bottomOffset?: number;\n /** 좌우 여백 */\n horizontalPadding?: number;\n}\n\nconst TOAST_EXIT_MS = 250;\n\ninterface ToastItem {\n id: string;\n message: string;\n state: ToastState;\n /** 미지정 시 Toast 내부에서 breakpoint 기준 적용 */\n size?: ToastSize;\n duration: number;\n position: ToastPosition;\n horizontalAlign: ToastHorizontalAlign;\n topOffset?: number;\n bottomOffset?: number;\n horizontalPadding?: number;\n exiting?: boolean;\n}\n\ninterface ToastContextType {\n showToast: (message: string, options?: ToastOptions) => void;\n hideToast: (id: string) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextType | undefined>(\n undefined\n);\n\n/**\n * ToastProvider\n *\n * 앱의 최상위(Root)에 선언하여 전역 Toast 기능을 제공합니다.\n * Portal을 사용하여 document.body에 Toast를 렌더링합니다.\n */\nexport const ToastProvider = ({ children }: { children: React.ReactNode }) => {\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n const showToast = React.useCallback(\n (message: string, options: ToastOptions = {}) => {\n const id = `toast-${Date.now()}-${Math.random()}`;\n const {\n state = \"default\",\n size,\n duration = 3000,\n position = \"top\",\n horizontalAlign = \"center\",\n topOffset,\n bottomOffset,\n horizontalPadding,\n } = options;\n\n const newToast: ToastItem = {\n id,\n message,\n state,\n ...(size !== undefined && { size }),\n duration,\n position,\n horizontalAlign,\n topOffset,\n bottomOffset,\n horizontalPadding,\n };\n\n setToasts((prev) => [...prev, newToast]);\n\n if (duration > 0) {\n setTimeout(() => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, exiting: true } : t))\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, TOAST_EXIT_MS);\n }, duration);\n }\n },\n []\n );\n\n const hideToast = React.useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n return (\n <ToastContext.Provider value={{ showToast, hideToast }}>\n {children}\n {mounted &&\n createPortal(\n <>\n {toasts.map((toast) => (\n <Toast\n key={toast.id}\n state={toast.state}\n size={toast.size}\n label={toast.message}\n position={toast.position}\n horizontalAlign={toast.horizontalAlign}\n topOffset={toast.topOffset}\n bottomOffset={toast.bottomOffset}\n horizontalPadding={toast.horizontalPadding}\n {...(toast.exiting && { className: \"toast--exiting\" })}\n />\n ))}\n </>,\n document.body\n )}\n </ToastContext.Provider>\n );\n};\n\n/**\n * useToast Hook\n *\n * ToastProvider 내부의 컴포넌트에서 호출하여 사용합니다.\n * { showToast } 함수를 반환합니다.\n *\n * @example\n * const { showToast } = useToast();\n * showToast(\"메시지\", { state: \"success\" });\n */\nexport function useToast() {\n const context = React.useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n","/**\n * 로고 SVG 에셋 - 번들에 포함되어 패키지 사용 시 별도 복사 불필요\n */\nimport likelionEngPrimary from \"../assets/logo/likelion-eng-primary.svg\";\nimport likelionEngBlack from \"../assets/logo/likelion-eng-black.svg\";\nimport likelionEngWhite from \"../assets/logo/likelion-eng-white.svg\";\nimport likelionKrPrimary from \"../assets/logo/likelion-kr-primary.svg\";\nimport likelionKrBlack from \"../assets/logo/likelion-kr-black.svg\";\nimport likelionKrWhite from \"../assets/logo/likelion-kr-white.svg\";\nimport bootcampPrimary from \"../assets/logo/bootcamp-primary.svg\";\nimport bootcampBlack from \"../assets/logo/bootcamp-black.svg\";\nimport bootcampWhite from \"../assets/logo/bootcamp-white.svg\";\nimport symbolPrimary from \"../assets/logo/symbol-primary.svg\";\nimport symbolBlack from \"../assets/logo/symbol-black.svg\";\nimport symbolWhite from \"../assets/logo/symbol-white.svg\";\nimport faviconPrimary from \"../assets/logo/favicon-primary.svg\";\nimport faviconBlack from \"../assets/logo/favicon-black.svg\";\n\nexport type LogoColor = \"primary\" | \"black\" | \"white\";\n\nexport const LOGO_URLS: Record<\n string,\n Record<LogoColor, string>\n> = {\n \"likelion-eng\": {\n primary: likelionEngPrimary,\n black: likelionEngBlack,\n white: likelionEngWhite,\n },\n \"likelion-kr\": {\n primary: likelionKrPrimary,\n black: likelionKrBlack,\n white: likelionKrWhite,\n },\n bootcamp: {\n primary: bootcampPrimary,\n black: bootcampBlack,\n white: bootcampWhite,\n },\n symbol: {\n primary: symbolPrimary,\n black: symbolBlack,\n white: symbolWhite,\n },\n favicon: {\n primary: faviconPrimary,\n black: faviconBlack,\n white: faviconPrimary,\n },\n};\n","import React from \"react\";\nimport \"./logo.css\";\nimport { LOGO_URLS } from \"./logo-assets\";\n\nexport type LogoType =\n | \"likelion-eng\"\n | \"likelion-kr\"\n | \"bootcamp\"\n | \"symbol\"\n | \"favicon\"\n | \"og-image\";\n\nexport type LogoColor = \"primary\" | \"black\" | \"white\";\n\nexport type LogoSize = \"large\" | \"medium\" | \"small\" | \"favicon\" | \"og-image\";\n\nexport interface LogoProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 로고 타입 */\n type?: LogoType;\n /** 로고 색상 */\n color?: LogoColor;\n /** 로고 크기 */\n size?: LogoSize;\n /** 서비스 타입 (og-image용) */\n service?: \"likelion\" | \"bootcamp\";\n}\n\nconst getLogoSrc = (type: LogoType, color: LogoColor) => {\n if (type in LOGO_URLS) {\n return LOGO_URLS[type][color];\n }\n return \"\";\n};\n\nconst LionIcon = ({ className: iconClassName }: { className?: string }) => (\n <img\n src={LOGO_URLS.symbol.white}\n alt=\"Lion Icon\"\n className={iconClassName}\n />\n);\n\n/**\n * Logo 컴포넌트는 브랜드 아이덴티티를 표현하는 로고 컴포넌트다.\n * `size` 외에 `className` 또는 `style`로 너비/높이를 직접 지정할 수 있다.\n */\nexport const Logo = ({\n type = \"likelion-kr\",\n color = \"primary\",\n size = \"medium\",\n service = \"likelion\",\n className = \"\",\n style,\n ...props\n}: LogoProps) => {\n const baseClasses = [\n \"logo\",\n `logo--${type}`,\n `logo--${color}`,\n `logo--${size}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const rootProps = { ...props, className: baseClasses, style };\n\n // 멋쟁이사자처럼_ENG\n if (type === \"likelion-eng\") {\n return (\n <div {...rootProps}>\n <img\n src={getLogoSrc(\"likelion-eng\", color)}\n alt=\"멋쟁이사자처럼_ENG\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n />\n </div>\n );\n }\n\n // 멋쟁이사자처럼_KR\n if (type === \"likelion-kr\") {\n return (\n <div {...rootProps}>\n <img\n src={getLogoSrc(\"likelion-kr\", color)}\n alt=\"멋쟁이사자처럼_KR\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n />\n </div>\n );\n }\n\n // 멋사 부트캠프\n if (type === \"bootcamp\") {\n return (\n <div {...rootProps}>\n <img\n src={getLogoSrc(\"bootcamp\", color)}\n alt=\"멋사 부트캠프\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n />\n </div>\n );\n }\n\n const getText = () => null;\n\n // 심볼\n if (type === \"symbol\") {\n return (\n <div {...rootProps}>\n <img\n src={getLogoSrc(\"symbol\", color)}\n alt=\"심볼\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n />\n </div>\n );\n }\n\n // 파비콘\n if (type === \"favicon\") {\n return (\n <div {...rootProps}>\n <img\n src={getLogoSrc(\"favicon\", color)}\n alt=\"파비콘\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\" }}\n />\n </div>\n );\n }\n\n // OG 이미지\n if (type === \"og-image\") {\n const ogText = service === \"likelion\" ? \"멋쟁이사자처럼\" : \"멋사 부트캠프\";\n const ogLogoSrc =\n service === \"likelion\"\n ? getLogoSrc(\"likelion-kr\", \"white\")\n : getLogoSrc(\"bootcamp\", \"white\");\n return (\n <div {...rootProps}>\n <div className=\"logo__og-container\">\n <img\n src={ogLogoSrc}\n alt={ogText}\n style={{ width: \"auto\", height: \"37.8px\", display: \"block\" }}\n />\n </div>\n </div>\n );\n }\n\n const text = getText();\n return (\n <div {...rootProps}>\n <div className=\"logo__icon\">\n <LionIcon />\n </div>\n {text && <span className=\"logo__text\">{text}</span>}\n </div>\n );\n};\n","// Screen Foundation - 브레이크포인트 관련 유틸리티 export\nexport { useBreakpoint, useMediaQuery, BreakpointProvider } from \"../../shared/hooks/useMediaQuery\";\n\n// 브레이크포인트 상수 (기본 - Mobile/Tablet/Desktop)\nexport const BREAKPOINTS = {\n mobile: {\n min: 375,\n max: 743,\n },\n tablet: {\n min: 744,\n max: 1279,\n },\n desktop: {\n min: 1280,\n },\n} as const;\n\n// Tailwind Screens 설정 - 주요 브레이크포인트 (mo, tb, pc)\nexport const TAILWIND_SCREENS = {\n mo: \"375px\", // Mobile\n tb: \"744px\", // Tablet\n pc: \"1280px\", // Desktop\n} as const;\n\n// 미디어 쿼리 문자열\nexport const MEDIA_QUERIES = {\n mobile: \"(min-width: 375px) and (max-width: 743px)\",\n tablet: \"(min-width: 744px) and (max-width: 1279px)\",\n desktop: \"(min-width: 1280px)\",\n underTablet: \"(max-width: 743px)\",\n} as const;\n\n// 레이아웃 시스템 (Margin, Column, Gutter)\nexport const LAYOUT_SYSTEM = {\n mobile: {\n margin: 16, // 화면 가장자리 여백\n column: 4, // 컬럼 수\n gutter: 16, // 컬럼 사이 간격\n },\n tablet: {\n margin: 24,\n column: 8,\n gutter: 24,\n },\n desktop: {\n margin: 24,\n column: 12,\n gutter: 24,\n },\n} as const;\n"],"mappings":"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","names":["React","Text","_a","_b","variant","decoration","as","children","className","props","__objRest","defaultTag","level","Tag","baseClasses","React","__spreadValues","jsx","jsxs","ActionButton","_a","_b","size","color","type","htmlType","state","label","prefixIcon","suffixIcon","loading","className","disabled","props","__objRest","isDisabled","actualState","baseClasses","textVariant","__spreadProps","__spreadValues","Text","jsx","IconButton","_a","_b","size","color","type","state","icon","className","disabled","htmlType","propsStyle","customColor","props","__objRest","isDisabled","isWeakType","actualState","colorClass","typeClass","baseClasses","shouldHide","customStyle","__spreadValues","__spreadProps","React","useState","jsx","Badge","_a","_b","type","variant","value","maxValue","className","props","__objRest","baseClasses","displayValue","__spreadProps","__spreadValues","Text","jsx","jsxs","Tab","_a","_b","type","size","badge","label","mode","className","selected","disabled","onClick","props","__objRest","internalPressed","setInternalPressed","useState","isControlled","isPressed","handleClick","e","prev","state","baseClasses","__spreadProps","__spreadValues","Badge","TabGroup","valueProp","defaultValue","onChange","children","internalValue","setInternalValue","React","value","enhancedChildren","child","_c","tabValue","isSelected","React","React","CheckIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","CheckIcon_default","React","ChevronDownIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ChevronDownIcon_default","React","XMarkIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","XMarkIcon_default","jsx","jsxs","ChipComponent","_a","_b","type","size","variant","value","onChange","checkedProp","defaultChecked","selectedValue","selectedValues","label","prefixIcon","suffixIcon","showCheck","showClose","onClose","className","disabled","onClick","props","__objRest","internalChecked","setInternalChecked","React","isControlled","checked","shouldRenderCheckIcon","displayLeftIcon","CheckIcon_default","hasPrefix","hasSuffix","paddingClass","baseClasses","handleClick","e","prev","handleClose","__spreadProps","__spreadValues","Text","ChipGroup","valueProp","defaultValue","multiple","children","rest","internalValue","setInternalValue","handleChange","chipValue","arr","next","v","enhancedChildren","child","_c","_d","Chip","React","createPortal","createContext","useContext","useSyncExternalStore","BreakpointContext","BreakpointProvider","useMediaQuery","query","callback","matchMedia","useBreakpoint","_a","_b","_c","_d","contextValue","isMobileQuery","isTabletQuery","isDesktopQuery","isUnderTabletQuery","Fragment","jsx","jsxs","DialogContext","React","DialogRoot","_a","_b","open","onClose","closeOnOverlayClick","closeOnEsc","withClose","variant","align","title","description","icon","actionItems","footerLayout","content","className","children","props","__objRest","isUnderTablet","useBreakpoint","mounted","setMounted","originalStyle","handleKeyDown","e","resolvedAlign","baseClasses","handleOverlayClick","contentNode","DialogHeader","DialogBody","DialogFooter","item","idx","DialogButton","dialogOverlay","__spreadProps","__spreadValues","XMarkIcon_default","createPortal","Text","layout","layoutClass","label","color","type","size","prefixIcon","suffixIcon","loading","disabled","onClick","closeOnClick","style","context","buttonWidth","defaultSize","defaultType","defaultColor","handleClick","ActionButton","Dialog","GlobalDialogContext","DialogProvider","dialogs","setDialogs","close","id","prev","d","closeAll","options","alert","resolve","confirm","_c","dialog","useDialog","useState","useId","React","ExclamationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ExclamationCircleIcon_default","React","InformationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","InformationCircleIcon_default","Fragment","jsx","jsxs","TextInput","_a","_b","required","size","error","description","maxLength","prefixIcon","suffixIcon","suffixUnit","title","accentIcon","className","style","id","value","defaultValue","readOnly","onChange","onFocus","onBlur","props","__objRest","generatedId","useId","inputId","focused","setFocused","useState","effectiveSize","isControlled","internalValue","setInternalValue","currentValue","inputState","count","showCount","countValue","countTotal","iconNode","ExclamationCircleIcon_default","helpVariant","handleFocus","e","handleBlur","handleChange","next","inputClasses","Text","__spreadProps","__spreadValues","React","jsx","jsxs","Toggle","React","_a","ref","_b","size","label","labelPosition","description","checkedProp","defaultChecked","onChange","disabled","className","id","props","__objRest","inputRef","combinedRef","node","internalChecked","setInternalChecked","isControlled","checked","handleChange","e","generatedId","toggleId","descriptionId","baseClasses","__spreadValues","Text","React","RiCheckboxBlankLine","RiCheckboxFill","RiCheckboxIndeterminateFill","jsx","jsxs","Checkbox","React","_a","ref","_b","label","labelProps","description","value","checkedProp","defaultChecked","onChange","disabled","indeterminate","className","id","props","__objRest","inputRef","combinedRef","node","internalChecked","setInternalChecked","isControlled","checked","handleChange","e","generatedId","checkboxId","descriptionId","baseClasses","resolvedLabelProps","labelClassName","__spreadValues","RiCheckboxIndeterminateFill","RiCheckboxFill","RiCheckboxBlankLine","Text","__spreadProps","CheckboxGroup","descriptionProps","multiple","valueProp","defaultValue","children","_c","_d","internalValue","setInternalValue","checkboxValue","newValue","v","groupId","resolvedGroupLabelProps","resolvedGroupDescriptionProps","groupLabelClassName","groupDescriptionClassName","enhancedChildren","child","isChecked","React","useCheckboxGroup","config","options","defaultValue","valueProp","onChangeProp","internalValue","setInternalValue","isControlled","value","onChange","newValue","allSelected","someSelected","selectAllChecked","selectAllIndeterminate","handleSelectAll","e","React","React","RiCheckboxCircleFill","jsx","jsxs","SelectMenu","React","props","ref","_a","items","size","value","defaultValue","onChange","multiple","itemTextProps","suffixIcon","className","id","rest","__objRest","isControlled","internalValue","setInternalValue","currentValue","isMultiple","isUnderTablet","useBreakpoint","resolvedSize","generatedId","menuId","commitValue","next","newValue","prevArray","v","baseClasses","resolvedItemTextProps","defaultVariant","__spreadProps","__spreadValues","item","idx","_b","isSelected","optionId","defaultSuffix","RiCheckboxCircleFill","suffixNode","Text","SelectMenuOverlay","children","openProp","defaultOpen","onOpenChange","menuContainerStyle","menuProps","internalOpen","setInternalOpen","open","wrapperRef","setOpen","handleClickOutside","event","handleToggle","triggerNode","originalOnClick","jsx","jsxs","SelectHeader","React","_a","ref","_b","type","title","required","valueProp","placeholder","disabled","error","description","accentIcon","onClick","onClear","icon","className","id","items","defaultValue","onChange","multiple","showClear","wrapperClassName","wrapperStyle","width","size","menuItemTextProps","menuSuffixIcon","menuGap","menuClassName","menuStyle","props","__objRest","isUnderTablet","useBreakpoint","generatedId","selectHeaderId","descriptionId","resolvedSize","internalValue","setInternalValue","isSelectMode","isControlled","currentValueForSelect","handleSelectChange","next","displayValue","v","value","i","found","hasValue","showClearButton","iconNode","ExclamationCircleIcon_default","InformationCircleIcon_default","helpVariant","baseClasses","handleClear","e","headerButton","__spreadProps","__spreadValues","Text","XMarkIcon_default","ChevronDownIcon_default","SelectMenuOverlay","React","CheckCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","CheckCircleIcon_default","React","ExclamationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ExclamationCircleIcon_default","React","ExclamationTriangleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ExclamationTriangleIcon_default","React","InformationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","InformationCircleIcon_default","React","XCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","XCircleIcon_default","jsx","jsxs","LoadingSpinner","SelectBox","_a","_b","type","size","state","label","required","placeholder","items","value","defaultValue","onChange","multiple","helperText","className","style","width","headerType","onClear","showClear","wrapperStyle","onClick","id","itemTextProps","suffixIcon","restHeaderProps","__objRest","isDisabled","isError","isSuccess","showLabel","resolvedPlaceholder","resolvedWidth","iconNode","isClassNameObj","isStyleObj","rootClassName","headerClassName","menuClassName","styleForParts","rootStyle","headerStyle","menuStyle","baseClasses","helperTextNode","ExclamationCircleIcon_default","CheckCircleIcon_default","Text","SelectHeader","__spreadValues","React","RiArrowLeftSLine","RiArrowRightSLine","RiMoreLine","Fragment","jsx","jsxs","range","start","end","length","_","idx","createPaginationItems","totalPages","currentPage","siblingCount","showEdgeButtons","showPrevNext","safeCurrent","items","add","item","isFirstPage","isLastPage","totalPageNumbers","page","leftSiblingIndex","rightSiblingIndex","shouldShowLeftEllipsis","shouldShowRightEllipsis","leftItemCount","rightItemCount","createBasicPaginationItems","Pagination","_a","_b","onChange","type","className","rest","__objRest","size","variant","React","handleItemClick","handleEllipsisClick","key","rootClasses","__spreadProps","__spreadValues","isPage","isSelected","isDisabled","itemClasses","labelText","ariaLabel","RiMoreLine","RiArrowLeftSLine","RiArrowRightSLine","Text","React","RiCircleLine","RiRadioButtonLine","jsx","jsxs","RadioButton","React","_a","ref","_b","label","labelProps","description","value","checkedProp","defaultChecked","onChange","disabled","className","id","name","onClick","props","__objRest","internalChecked","setInternalChecked","isControlled","checked","handleChange","e","handleClick","syntheticEvent","__spreadProps","__spreadValues","generatedId","radioId","descriptionId","isHovered","setIsHovered","baseClasses","labelWrapperClasses","resolvedLabelProps","labelClassName","RiRadioButtonLine","RiCircleLine","Text","RadioButtonGroup","descriptionProps","valueProp","defaultValue","children","_c","_d","internalValue","setInternalValue","groupId","groupName","resolvedGroupLabelProps","resolvedGroupDescriptionProps","groupLabelClassName","groupDescriptionClassName","enhancedChildren","child","radioValue","isChecked","jsx","jsxs","Tag","_a","_b","type","size","state","label","prefixIcon","suffixIcon","className","props","__objRest","effectiveState","resolvedClassName","textVariant","__spreadProps","__spreadValues","Text","useState","useRef","useEffect","jsx","jsxs","Tooltip","label","type","prefixIcon","onClose","direction","withArrow","openedProp","defaultOpened","disabled","width","offset","withinPortal","openDelay","closeDelay","children","className","opened","setOpened","useState","wrapperRef","useRef","openTimeoutRef","closeTimeoutRef","isControlled","isOpened","useEffect","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","handleCloseClick","e","tooltipContent","Text","React","createPortal","Fragment","jsx","jsxs","Toast","props","_a","sizeProp","state","label","icon","position","horizontalAlign","topOffset","bottomOffset","horizontalPadding","className","style","rest","__objRest","isUnderTablet","useBreakpoint","size","baseClasses","defaultTopOffset","defaultBottomOffset","defaultHorizontalPadding","hasCustomPosition","positionStyles","__spreadValues","padding","defaultIcon","XCircleIcon_default","ExclamationTriangleIcon_default","CheckCircleIcon_default","InformationCircleIcon_default","__spreadProps","Text","TOAST_EXIT_MS","ToastContext","React","ToastProvider","children","toasts","setToasts","mounted","setMounted","showToast","message","options","id","duration","newToast","prev","t","toast","hideToast","createPortal","useToast","context","LOGO_URLS","likelion_eng_primary_default","likelion_eng_black_default","likelion_eng_white_default","likelion_kr_primary_default","likelion_kr_black_default","likelion_kr_white_default","bootcamp_primary_default","bootcamp_black_default","bootcamp_white_default","symbol_primary_default","symbol_black_default","symbol_white_default","favicon_primary_default","favicon_black_default","jsx","jsxs","getLogoSrc","type","color","LOGO_URLS","LionIcon","iconClassName","Logo","_a","_b","size","service","className","style","props","__objRest","baseClasses","rootProps","__spreadProps","__spreadValues","getText","ogText","ogLogoSrc","text","BREAKPOINTS","TAILWIND_SCREENS","MEDIA_QUERIES","LAYOUT_SYSTEM"]}
1
+ {"version":3,"sources":["../src/stories/Button/ActionButton/ActionButton.tsx","../src/stories/Typography/Typography.tsx","../src/stories/Button/IconButton/IconButton.tsx","../src/stories/Tab/Tab.tsx","../src/stories/Badge/Badge.tsx","../src/stories/Chip/Chip.tsx","../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../node_modules/@heroicons/react/24/outline/esm/ChevronDownIcon.js","../node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js","../src/stories/Dialog/Dialog.tsx","../src/shared/hooks/useMediaQuery.ts","../src/stories/TextInput/TextInput.tsx","../node_modules/@heroicons/react/20/solid/esm/ExclamationCircleIcon.js","../node_modules/@heroicons/react/20/solid/esm/InformationCircleIcon.js","../src/stories/Toggle/Toggle.tsx","../src/stories/Checkbox/Checkbox.tsx","../src/stories/Checkbox/useCheckboxGroup.ts","../src/stories/Select/SelectHeader/SelectHeader.tsx","../src/stories/Select/SelectMenu/SelectMenu.tsx","../node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js","../node_modules/@heroicons/react/24/solid/esm/ExclamationCircleIcon.js","../node_modules/@heroicons/react/24/solid/esm/ExclamationTriangleIcon.js","../node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js","../node_modules/@heroicons/react/24/solid/esm/XCircleIcon.js","../src/stories/Select/SelectBox/SelectBox.tsx","../src/stories/Pagination/Pagination.tsx","../src/stories/RadioButton/RadioButton.tsx","../src/stories/Tag/Tag.tsx","../src/stories/Tooltip/Tooltip.tsx","../src/stories/Toast/Toast.tsx","../src/stories/Logo/logo-assets.ts","../src/stories/Logo/Logo.tsx","../src/stories/Screen/index.ts"],"sourcesContent":["import React from \"react\";\nimport { Text } from \"@/stories/Typography/Typography\";\nimport \"./action-button.css\";\n\n/** label 내부의 Text를 span으로 렌더링 (p > h3 등 invalid nesting 방지) */\nfunction ensureTextAsSpan(node: React.ReactNode): React.ReactNode {\n if (React.isValidElement(node) && node.type === Text) {\n return React.cloneElement(node as React.ReactElement<{ as?: string }>, { as: \"span\" });\n }\n if (React.isValidElement(node)) {\n const { children, ...rest } = (node.props as { children?: React.ReactNode });\n if (children != null) {\n return React.cloneElement(\n node as React.ReactElement<{ children?: React.ReactNode }>,\n { ...rest, children: React.Children.map(children, ensureTextAsSpan) }\n );\n }\n }\n return node;\n}\n\nexport type ButtonSize = \"xlarge\" | \"large\" | \"medium\" | \"small\";\nexport type ButtonColor = \"primary\" | \"neutral\" | \"secondary\";\nexport type ButtonType = \"solid\" | \"outline\" | \"ghost\" | \"weak\";\nexport type ButtonState = \"enabled\" | \"hovered\" | \"loading\" | \"disabled\";\n\nexport interface ActionButtonProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" // HTML type 속성과 이름 충돌 방지\n> {\n /** 버튼 크기 */\n size?: ButtonSize;\n /** 버튼 색상 (primary, neutral, secondary) */\n color?: ButtonColor;\n /** 버튼 스타일 타입 (solid, outline, ghost, weak) */\n type?: ButtonType;\n /** HTML 버튼 타입 (button, submit, reset) */\n htmlType?: \"button\" | \"submit\" | \"reset\";\n /** 버튼 상태 */\n state?: ButtonState;\n /** 버튼 텍스트 */\n label: React.ReactNode;\n /** Prefix 아이콘 */\n prefixIcon?: React.ReactNode;\n /** Suffix 아이콘 */\n suffixIcon?: React.ReactNode;\n /** 로딩 상태일 때 표시할 스피너 */\n loading?: boolean;\n}\n\n/** ActionButton 컴포넌트는 사용자가 어떠한 액션을 트리거하거나 이벤트를 실행할 때 사용한다. */\nexport const ActionButton = ({\n size = \"medium\",\n color = \"primary\",\n type = \"solid\",\n htmlType = \"button\",\n state = \"enabled\",\n label,\n prefixIcon,\n suffixIcon,\n loading = false,\n className = \"\",\n disabled,\n ...props\n}: ActionButtonProps) => {\n const isDisabled = disabled || state === \"disabled\";\n // ghost 타입은 hovered와 loading 상태를 지원하지 않음\n let actualState: ButtonState = state;\n if (type === \"ghost\") {\n // ghost 타입은 hovered와 loading 상태를 enabled로 처리\n if (state === \"hovered\" || state === \"loading\" || loading) {\n actualState = \"enabled\";\n }\n } else {\n // 다른 타입은 loading prop에 따라 loading 상태로 설정\n actualState = loading ? \"loading\" : state;\n }\n\n const baseClasses = [\n \"action-button\",\n `action-button--${size}`,\n `action-button--${color}`,\n `action-button--${type}`,\n `action-button--${actualState}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const textVariant = (() => {\n if (size === \"xlarge\") {\n return \"heading-h6\";\n } else if (size === \"large\" || size === \"medium\") {\n return \"subtitle-p2\";\n } else if (size === \"small\") {\n return \"subtitle-p3\";\n } else {\n return \"subtitle-p3\";\n }\n })();\n\n return (\n <button\n type={htmlType}\n className={baseClasses}\n disabled={isDisabled}\n {...props}\n >\n <span className=\"action-button__content\">\n {prefixIcon && (\n <span className=\"action-button__prefix-icon\">{prefixIcon}</span>\n )}\n <span className=\"action-button__label\">\n <Text variant={textVariant} as=\"span\">{ensureTextAsSpan(label)}</Text>\n </span>\n {suffixIcon && (\n <span className=\"action-button__suffix-icon\">{suffixIcon}</span>\n )}\n </span>\n {loading && type !== \"ghost\" && (\n <span className=\"action-button__spinner\" aria-hidden=\"true\">\n <svg\n className=\"action-button__spinner-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n className=\"action-button__spinner-circle\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 40;40 40;0 40\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-40;-80\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n </span>\n )}\n </button>\n );\n};\n","import React from \"react\";\nimport \"./typography.css\";\n\nexport type TextVariant =\n | \"display-d1\"\n | \"display-d2\"\n | \"display-d3\"\n | \"display-d4\"\n | \"heading-h1\"\n | \"heading-h2\"\n | \"heading-h3\"\n | \"heading-h4\"\n | \"heading-h5\"\n | \"heading-h6\"\n | \"subtitle-p1\"\n | \"subtitle-p2\"\n | \"subtitle-p3\"\n | \"body-p1\"\n | \"body-p2\"\n | \"body-p3\"\n | \"body-p4\"\n | \"body-p5\";\n\nexport type TextDecoration = \"none\" | \"underline\";\n\nexport interface TextProps\n extends React.HTMLAttributes<HTMLElement> {\n /** Text 변형 */\n variant: TextVariant;\n /** 텍스트 장식 (underline 등) */\n decoration?: TextDecoration;\n /** HTML 태그 (기본값: variant에 따라 자동 결정) */\n as?: keyof React.JSX.IntrinsicElements;\n /** 자식 요소 */\n children: React.ReactNode;\n}\n\n/** Text 컴포넌트는 텍스트 스타일을 일관되게 적용하는 컴포넌트입니다. */\nexport const Text = ({\n variant,\n decoration = \"none\",\n as,\n children,\n className = \"\",\n ...props\n}: TextProps) => {\n // variant에 따라 기본 HTML 태그 결정\n const defaultTag = (() => {\n if (variant.startsWith(\"heading-\")) {\n const level = variant.split(\"-\")[1];\n if (level.startsWith(\"d\")) {\n return \"h1\"; // Display는 h1으로\n }\n return level; // h1, h2, h3, h4, h5, h6\n }\n if (variant.startsWith(\"subtitle-\")) {\n return \"h3\";\n }\n return \"p\"; // Body는 p 태그\n })();\n\n const Tag = (as || defaultTag) as keyof React.JSX.IntrinsicElements;\n\n const baseClasses = [\n \"typography\",\n `typography--${variant}`,\n decoration !== \"none\" && `typography--decoration-${decoration}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return React.createElement(Tag, { className: baseClasses, ...props }, children);\n};\n","import React from \"react\";\n\nexport type IconButtonSize = \"xlarge\" | \"large\" | \"medium\" | \"small\";\n/** 버튼 색상. solid/outline: primary | neutral | secondary. weak: primary | neutral-dark | neutral-light */\nexport type IconButtonColor =\n | \"primary\"\n | \"neutral\"\n | \"secondary\"\n | \"neutral-dark\"\n | \"neutral-light\";\n/** 버튼 타입. weak일 때 color로 primary / neutral-dark / neutral-light 구분 */\nexport type IconButtonType = \"solid\" | \"outline\" | \"weak\";\nexport type IconButtonState = \"enabled\" | \"hovered\" | \"disabled\";\n\n/** 기본 색상에 없는 커스텀 색상 (inline style로 적용, 클래스보다 우선) */\nexport interface IconButtonCustomColor {\n /** 배경색 */\n background?: string;\n /** 아이콘(전경) 색상 */\n color?: string;\n}\n\nexport interface IconButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n /** 버튼 크기 */\n size?: IconButtonSize;\n /** 버튼 색상. 기본 세트: primary, neutral, secondary 등. 없으면 customColor 또는 style로 지정 */\n color?: IconButtonColor;\n /** 버튼 타입 (solid, outline, weak) */\n type?: IconButtonType;\n /** 버튼 상태 */\n state?: IconButtonState;\n /** 아이콘 (Heroicons 또는 React 컴포넌트) */\n icon: React.ReactNode;\n /** 아이콘에 대한 접근성 라벨 */\n \"aria-label\": string;\n /** button 요소의 type (submit 등). 기본값 button */\n htmlType?: \"button\" | \"submit\" | \"reset\";\n /**\n * 기본 팔레트에 없는 색상 사용 시.\n * 지정 시 inline style로 적용되어 클래스 스타일보다 우선합니다.\n * hover/disabled는 적용되지 않으므로, 필요 시 style prop으로 보완하세요.\n */\n customColor?: IconButtonCustomColor;\n}\n\n/** IconButton 컴포넌트는 텍스트 레이블 없이 아이콘만으로 액션을 전달하는 버튼 컴포넌트이다. */\nexport const IconButton = ({\n size = \"large\",\n color = \"primary\",\n type = \"solid\",\n state = \"enabled\",\n icon,\n className = \"\",\n disabled,\n htmlType = \"button\",\n style: propsStyle,\n customColor,\n ...props\n}: IconButtonProps) => {\n const isDisabled = disabled || state === \"disabled\";\n const isWeakType = type === \"weak\";\n // weak 타입은 disabled 상태를 가지지 않음 (미노출)\n const actualState = isWeakType && isDisabled ? \"enabled\" : state;\n\n // customColor가 있으면 color 클래스 생략하고 inline style로 적용\n const colorClass = !customColor\n ? isWeakType\n ? `icon-button--weak-${color}`\n : `icon-button--${color}`\n : \"\";\n const typeClass = isWeakType ? \"icon-button--weak\" : `icon-button--${type}`;\n\n const baseClasses = [\n \"icon-button\",\n `icon-button--${size}`,\n colorClass,\n typeClass,\n `icon-button--${actualState}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // weak 타입이고 disabled 상태일 때는 미노출 (opacity-0)\n const shouldHide = isWeakType && isDisabled;\n\n const customStyle: React.CSSProperties = {\n ...(customColor?.background && { backgroundColor: customColor.background }),\n ...(customColor?.color && { color: customColor.color }),\n };\n\n return (\n <button\n type={htmlType}\n className={baseClasses}\n disabled={isDisabled}\n style={{\n ...propsStyle,\n ...customStyle,\n ...(shouldHide ? { opacity: 0, pointerEvents: \"none\" } : {}),\n }}\n {...props}\n >\n <span className=\"icon-button__icon\">{icon}</span>\n </button>\n );\n};\n","import React, { useState } from \"react\";\nimport \"./tab.css\";\nimport { Badge } from \"../Badge/Badge\";\n\nexport type TabType = \"round\" | \"text\";\nexport type TabSize = \"large\" | \"medium\";\n\nexport interface TabProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n /** 탭 타입 (round 또는 text) */\n type?: TabType;\n /** 탭 크기 */\n size?: TabSize;\n /** 배지 표시 여부 */\n badge?: boolean;\n /** 탭 라벨 */\n label: React.ReactNode;\n /** 탭 값 (Tab.Group에서 사용 시 식별자) */\n value?: string;\n /** 다크 모드 여부 */\n mode?: boolean;\n /** 선택된 상태 (탭 그룹에서 사용 시 부모 컴포넌트가 관리, 예: 기본 탭이 '설명'이면 selected={true}) */\n selected?: boolean;\n /** 비활성화 상태 */\n disabled?: boolean;\n}\n\n/** Tab 컴포넌트는 사용자가 여러 옵션 중 하나를 선택할 때 사용하는 탭 컴포넌트이다. */\nexport const Tab = ({\n type = \"round\",\n size = \"large\",\n badge = false,\n label,\n mode = false,\n className = \"\",\n selected,\n disabled = false,\n onClick,\n ...props\n}: TabProps) => {\n // selected prop이 제공되면 controlled, 아니면 uncontrolled\n const [internalPressed, setInternalPressed] = useState(false);\n const isControlled = selected !== undefined;\n const isPressed = isControlled ? selected : internalPressed;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n \n if (!isControlled) {\n // uncontrolled 모드: 내부 상태 토글\n setInternalPressed((prev) => !prev);\n }\n onClick?.(e);\n };\n\n const state = disabled ? \"disabled\" : (isPressed ? \"pressed\" : \"enabled\");\n\n const baseClasses = [\n \"tab\",\n `tab--${type}`,\n `tab--${size}`,\n `tab--${state}`,\n mode && \"tab--dark\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n className={baseClasses}\n aria-pressed={isPressed}\n disabled={disabled}\n onClick={handleClick}\n {...props}\n >\n <span className=\"tab__label\">{label}</span>\n {badge && (\n <Badge\n type=\"dot\"\n variant=\"primary\"\n className=\"tab__badge\"\n aria-label=\"알림\"\n />\n )}\n </button>\n );\n};\n\n// Tab.Group\nexport interface TabGroupProps {\n /** 선택된 탭 값 (controlled) */\n value?: string;\n /** 초기 선택 탭 값 (uncontrolled) */\n defaultValue?: string;\n /** 선택 변경 핸들러 */\n onChange?: (value: string) => void;\n /** 탭 타입 (컨테이너 스타일: Round일 때 gap, Text일 때 하단 보더) */\n type?: TabType;\n /** 탭 크기 (컨테이너 gap 등) */\n size?: TabSize;\n /** 다크 모드 */\n mode?: boolean;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** 자식 Tab 컴포넌트들 */\n children: React.ReactNode;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\n/** Tab.Group은 여러 Tab을 그룹화하여 단일 선택을 관리한다. */\nexport const TabGroup = ({\n value: valueProp,\n defaultValue,\n onChange,\n type = \"round\",\n size = \"large\",\n mode = false,\n disabled = false,\n children,\n className = \"\",\n}: TabGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string | undefined>(\n defaultValue\n );\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const baseClasses = [\n \"tab-group\",\n `tab-group--${type}`,\n `tab-group--${size}`,\n mode && \"tab-group--dark\",\n disabled && \"tab-group--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<TabProps>(child) && child.type === Tab) {\n const tabValue = child.props.value;\n if (tabValue === undefined) {\n console.warn(\"Tab.Group 내부의 Tab은 value prop이 필요합니다.\");\n return child;\n }\n\n const isSelected = value === tabValue;\n\n return React.cloneElement(child, {\n type: child.props.type ?? type,\n size: child.props.size ?? size,\n mode: child.props.mode ?? mode,\n selected: isSelected,\n disabled: disabled || child.props.disabled,\n role: \"tab\",\n \"aria-selected\": isSelected,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!isControlled) setInternalValue(tabValue);\n onChange?.(tabValue);\n child.props.onClick?.(e);\n },\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses} role=\"tablist\">\n {enhancedChildren}\n </div>\n );\n};\n\nTabGroup.displayName = \"TabGroup\";\n\n(Tab as typeof Tab & { Group: typeof TabGroup }).Group = TabGroup;\n\n","import React from \"react\";\nimport \"./badge.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type BadgeVariant =\n | \"primary\"\n | \"secondary\"\n | \"progressing\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"disabled\";\nexport type BadgeType = \"number\" | \"dot\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** number: 글자(숫자/문자) 표시, dot: 점만 표시 */\n type?: BadgeType;\n /** Badge variant (primary, secondary, progressing, success, warning, error, disabled) */\n variant?: BadgeVariant;\n /** Badge 값 (type이 number일 때 표시할 숫자 또는 글자) */\n value?: number | string;\n /** 최대 표시 숫자 (숫자일 때 이 값을 넘으면 maxValue+ 형태로 표시) */\n maxValue?: number;\n}\n\n/** Badge 컴포넌트는 알림 카운트, 상태 등을 시각적으로 표현하는 원형 라벨 컴포넌트다. */\nexport const Badge = ({\n type = \"number\",\n variant = \"primary\",\n value,\n maxValue = 99,\n className = \"\",\n ...props\n}: BadgeProps) => {\n const baseClasses = [\n \"badge\",\n `badge--${variant}`,\n `badge--${type}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const displayValue =\n type === \"number\" && value !== undefined\n ? typeof value === \"number\"\n ? value > maxValue\n ? `${maxValue}+`\n : String(value)\n : String(value)\n : null;\n\n return (\n <span className={baseClasses} {...props}>\n {type === \"number\" && displayValue && (\n <Text variant=\"subtitle-p3\" as=\"span\">\n {displayValue}\n </Text>\n )}\n </span>\n );\n};\n","import React from \"react\";\nimport { CheckIcon } from \"@heroicons/react/24/outline\";\nimport \"./chip.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type ChipType = \"solid\" | \"outline\" | \"weak\";\nexport type ChipSize = \"medium\" | \"small\";\nexport type ChipVariant = \"primary\" | \"neutral\";\n\nexport interface ChipProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onChange\"\n> {\n /** Chip 타입 (solid, outline, weak) */\n type?: ChipType;\n /** Chip 크기 */\n size?: ChipSize;\n /** Chip variant (primary, neutral) */\n variant?: ChipVariant;\n /** Chip 값 (각 Chip을 구분하는 고유 값) */\n value: string;\n /** Chip 클릭 핸들러 (클릭 시 해당 Chip의 value를 전달) */\n onChange?: (value: string) => void;\n /** Chip 선택 상태 (controlled 모드) */\n checked?: boolean;\n /** Chip 초기 선택 상태 (uncontrolled 모드) */\n defaultChecked?: boolean;\n /** 단일 선택 그룹에서 선택된 값 (checked prop이 없을 때 자동으로 checked 계산) */\n selectedValue?: string | null;\n /** 다중 선택 그룹에서 선택된 값들 (checked prop이 없을 때 자동으로 checked 계산) */\n selectedValues?: string[];\n /** Chip 라벨 */\n label: React.ReactNode;\n /** Prefix 아이콘 (항상 표시) */\n prefixIcon?: React.ReactNode;\n /** Suffix 아이콘 */\n suffixIcon?: React.ReactNode;\n /** \n * Checked 상태일 때 체크 아이콘 표시 여부\n * - 기본값: undefined (outline 타입이고 prefixIcon이 없을 때만 자동 표시)\n * - true: 항상 표시 (checked 상태일 때)\n * - false: 표시 안 함\n */\n showCheck?: boolean;\n /** Close 버튼 표시 여부 */\n showClose?: boolean;\n /** Close 버튼 클릭 핸들러 */\n onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\n/** Chip 컴포넌트는 사용자가 직접 선택, 추가, 삭제할 수 있는 인터랙티브한 컴포넌트다. */\nconst ChipComponent = ({\n type = \"solid\",\n size = \"medium\",\n variant = \"primary\",\n value,\n onChange,\n checked: checkedProp,\n defaultChecked = false,\n selectedValue,\n selectedValues,\n label,\n prefixIcon,\n suffixIcon,\n showCheck,\n showClose = false,\n onClose,\n className = \"\",\n disabled,\n onClick,\n ...props\n}: ChipProps) => {\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n\n // checked 상태 결정\n const checked = React.useMemo(() => {\n if (isControlled) {\n return checkedProp;\n }\n if (selectedValue !== undefined && selectedValue !== null) {\n return selectedValue === value;\n }\n if (selectedValues !== undefined) {\n return selectedValues.includes(value);\n }\n return internalChecked;\n }, [\n isControlled,\n checkedProp,\n selectedValue,\n selectedValues,\n value,\n internalChecked,\n ]);\n\n // 체크 아이콘 렌더링 결정\n let shouldRenderCheckIcon = false;\n\n if (checked) {\n if (showCheck === true) {\n // 강제 표시\n shouldRenderCheckIcon = true;\n } else if (showCheck === false) {\n // 강제 미표시\n shouldRenderCheckIcon = false;\n } else {\n // 기본 로직: outline 타입이고 prefixIcon이 없을 때만 자동 표시\n shouldRenderCheckIcon = type === \"outline\" && !prefixIcon;\n }\n }\n\n const renderedCheckIcon = shouldRenderCheckIcon ? (\n <CheckIcon\n className=\"chip__check-icon\"\n style={{\n width: size === \"small\" ? \"14px\" : \"16px\",\n height: size === \"small\" ? \"14px\" : \"16px\",\n }}\n />\n ) : null;\n\n // 최종 Prefix 영역: prefixIcon이 있으면 우선, 없으면 체크 아이콘\n // (showCheck={true}일 때도 prefixIcon이 있으면 prefixIcon이 우선시됨)\n const displayLeftIcon = prefixIcon || renderedCheckIcon;\n\n // 아이콘 조합에 따른 패딩 클래스 결정\n const hasPrefix = !!displayLeftIcon;\n const hasSuffix = !!(suffixIcon || showClose);\n\n const paddingClass = (() => {\n if (hasPrefix && hasSuffix) {\n return \"chip--has-prefix-suffix\";\n } else if (hasPrefix) {\n return \"chip--has-prefix\";\n } else if (hasSuffix) {\n return \"chip--has-suffix\";\n }\n return \"chip--no-icon\";\n })();\n\n const baseClasses = [\n \"chip\",\n `chip--${type}`,\n `chip--${size}`,\n `chip--${variant}`,\n paddingClass,\n checked && \"chip--checked\",\n disabled && \"chip--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n if (\n !isControlled &&\n selectedValue === undefined &&\n selectedValues === undefined\n ) {\n setInternalChecked((prev) => !prev);\n }\n\n if (onChange) {\n onChange(value);\n }\n\n onClick?.(e);\n };\n\n const handleClose = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (onClose && !disabled) {\n onClose(e);\n }\n };\n\n return (\n <button\n type=\"button\"\n className={baseClasses}\n disabled={disabled}\n onClick={handleClick}\n aria-pressed={checked}\n {...props}\n >\n {displayLeftIcon && (\n <span className=\"chip__prefix-icon\">{displayLeftIcon}</span>\n )}\n <Text variant={size === \"small\" ? \"body-p3\" : \"body-p2\"}>{label}</Text>\n {suffixIcon && !showClose && (\n <span className=\"chip__suffix-icon\">{suffixIcon}</span>\n )}\n {showClose && (\n <span\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className=\"chip__close-button\"\n onClick={handleClose}\n onKeyDown={(e) => {\n if (!disabled && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleClose(e as unknown as React.MouseEvent<HTMLButtonElement>);\n }\n }}\n aria-label=\"Close\"\n aria-disabled={disabled}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M8 1C11.866 1 15 4.13401 15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1ZM10.7803 5.21973C10.4874 4.92683 10.0126 4.92683 9.71973 5.21973L8 6.93945L6.28027 5.21973C5.98738 4.92683 5.51262 4.92683 5.21973 5.21973C4.92683 5.51262 4.92683 5.98738 5.21973 6.28027L6.93945 8L5.21973 9.71973C4.92683 10.0126 4.92683 10.4874 5.21973 10.7803C5.51262 11.0732 5.98738 11.0732 6.28027 10.7803L8 9.06055L9.71973 10.7803C10.0126 11.0732 10.4874 11.0732 10.7803 10.7803C11.0732 10.4874 11.0732 10.0126 10.7803 9.71973L9.06055 8L10.7803 6.28027C11.0732 5.98738 11.0732 5.51262 10.7803 5.21973Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.56\"\n />\n </svg>\n </span>\n )}\n </button>\n );\n};\n\n// Chip.Group\nexport interface ChipGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** 선택된 값 (controlled) - 단일: string, 다중: string[] */\n value?: string | string[];\n /** 초기 선택 값 (uncontrolled) */\n defaultValue?: string | string[];\n /** 선택 변경 시 호출 (클릭한 Chip의 value 전달) */\n onChange?: (value: string) => void;\n /** 다중 선택 여부 */\n multiple?: boolean;\n /** Chip 타입 */\n type?: ChipType;\n /** Chip 크기 */\n size?: ChipSize;\n /** Chip variant */\n variant?: ChipVariant;\n /** 체크 아이콘 표시 여부 (자식 Chip에 일괄 적용) */\n showCheck?: boolean;\n /** 전체 비활성화 */\n disabled?: boolean;\n /** 자식 Chip 컴포넌트들 */\n children: React.ReactNode;\n}\n\n/** Chip.Group은 여러 Chip을 그룹화하여 단일/다중 선택을 관리한다. */\nexport const ChipGroup = ({\n value: valueProp,\n defaultValue,\n onChange,\n multiple = false,\n type = \"solid\",\n size = \"medium\",\n variant = \"primary\",\n showCheck,\n disabled = false,\n children,\n className = \"\",\n ...rest\n}: ChipGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string | string[]>(\n () => defaultValue ?? (multiple ? [] : \"\")\n );\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const handleChange = (chipValue: string) => {\n if (multiple) {\n const arr = (Array.isArray(value) ? value : []) as string[];\n const next = arr.includes(chipValue)\n ? arr.filter((v) => v !== chipValue)\n : [...arr, chipValue];\n if (!isControlled) setInternalValue(next);\n onChange?.(chipValue);\n } else {\n if (!isControlled) setInternalValue(chipValue);\n onChange?.(chipValue);\n }\n };\n\n const selectedValue = multiple ? undefined : (value as string);\n const selectedValues = multiple ? (value as string[]) : undefined;\n\n const baseClasses = [\"chip-group\", className].filter(Boolean).join(\" \");\n\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<ChipProps>(child) && child.type === Chip) {\n const chipValue = child.props.value;\n if (chipValue === undefined) {\n console.warn(\"Chip.Group 내부의 Chip은 value prop이 필요합니다.\");\n return child;\n }\n\n return React.cloneElement(child, {\n type: child.props.type ?? type,\n size: child.props.size ?? size,\n variant: child.props.variant ?? variant,\n showCheck: child.props.showCheck ?? showCheck,\n selectedValue,\n selectedValues,\n onChange: (v: string) => {\n handleChange(v);\n child.props.onChange?.(v);\n },\n disabled: disabled || child.props.disabled,\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses} {...rest}>\n {enhancedChildren}\n </div>\n );\n};\n\nChipGroup.displayName = \"ChipGroup\";\nChipComponent.displayName = \"Chip\";\n\nexport const Chip = Object.assign(ChipComponent, {\n Group: ChipGroup,\n});\n","import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m19.5 8.25-7.5 7.5-7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronDownIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction XMarkIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(XMarkIcon);\nexport default ForwardRef;","import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XMarkIcon } from \"@heroicons/react/24/outline\";\nimport { ActionButton } from \"../Button/ActionButton/ActionButton\";\nimport type {\n ButtonSize,\n ButtonColor,\n ButtonType,\n} from \"../Button/ActionButton/ActionButton\";\nimport \"./dialog.css\";\nimport \"../Button/ActionButton/action-button.css\";\nimport { useBreakpoint } from \"../../shared/hooks/useMediaQuery\";\nimport { Text } from \"../Typography/Typography\";\nimport \"../Typography/typography.css\";\n\n// -------------------- Contexts --------------------\n\nconst DialogContext = React.createContext<{\n onClose?: () => void;\n variant?: DialogVariant;\n} | null>(null);\n\n// -------------------- Types --------------------\n\nexport type DialogAlign = \"center\" | \"left\";\nexport type DialogFooterLayout = \"horizontal\" | \"vertical\";\nexport type DialogVariant = \"alert\" | \"confirm\";\nexport type DialogActionColor = ButtonColor;\nexport type DialogActionType = ButtonType;\nexport type DialogActionSize = Exclude<ButtonSize, \"xlarge\">;\n\n/** 기존 방식의 Action Item 정의 */\nexport interface DialogActionItem {\n label: string;\n color?: DialogActionColor;\n type?: DialogActionType;\n size?: DialogActionSize;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n loading?: boolean;\n disabled?: boolean;\n onClick?: () => void | Promise<void>;\n /** 클릭 시 다이얼로그 닫기 여부 (기본값: true) */\n closeOnClick?: boolean;\n}\n\nexport interface DialogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\" | \"content\"> {\n open?: boolean;\n onClose?: () => void;\n /** 오버레이 클릭 시 닫기 여부 (기본값: true) */\n closeOnOverlayClick?: boolean;\n /** ESC 키로 닫기 여부 (기본값: true) */\n closeOnEsc?: boolean;\n /** 우측 상단 X(닫기) 버튼 표시 여부 (기본값: false) */\n withClose?: boolean;\n /** 다이얼로그 타입 (스타일링용) */\n variant?: DialogVariant;\n /** 정렬 (기본값: variant가 alert면 left, 아니면 center) */\n align?: DialogAlign;\n \n // --- Data-driven Props (편의성 및 하위 호환성) ---\n /** 다이얼로그 제목 */\n title?: React.ReactNode;\n /** 다이얼로그 본문/설명 */\n description?: React.ReactNode;\n /** 다이얼로그 아이콘 */\n icon?: React.ReactNode;\n /** 하단 버튼 목록 (Compound Component 대신 사용 가능) */\n actionItems?: DialogActionItem[];\n /** actionItems 사용 시 버튼 레이아웃 */\n footerLayout?: DialogFooterLayout;\n /** 커스텀 컨텐츠 (헤더/푸터 없이 내용만 렌더링할 때 사용) */\n content?: React.ReactNode;\n \n className?: string;\n children?: React.ReactNode;\n}\n\n// -------------------- Components --------------------\n\nconst DialogRoot = ({\n open = false,\n onClose,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n withClose = false,\n variant = \"confirm\",\n align,\n \n // Data-driven props\n title,\n description,\n icon,\n actionItems,\n footerLayout = \"horizontal\",\n content, // 추가됨\n\n className = \"\",\n children,\n ...props\n}: DialogProps) => {\n const { isUnderTablet } = useBreakpoint();\n\n // mounted 상태 확인 (SSR 대응)\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n React.useEffect(() => {\n if (!open) return;\n\n // Body Scroll Lock\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = \"hidden\";\n\n if (closeOnEsc) {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose?.();\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = originalStyle; // Cleanup 시 복원\n };\n }\n \n return () => {\n document.body.style.overflow = originalStyle; // Cleanup 시 복원\n };\n }, [open, closeOnEsc, onClose]);\n\n if (!open) return null;\n\n const resolvedAlign = align ?? (variant === \"alert\" ? \"left\" : \"center\");\n const baseClasses = [\n \"dialog\",\n `dialog--${variant}`,\n `dialog--${resolvedAlign}`,\n isUnderTablet ? \"is-mobile\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.target === e.currentTarget && closeOnOverlayClick) {\n onClose?.();\n }\n };\n\n // 렌더링 우선순위:\n // 1. content prop이 있으면 그것만 렌더링 (완전 커스텀)\n // 2. children이 있으면 children 렌더링 (Compound 방식)\n // 3. 없으면 props로 전달된 title, description, actionItems 렌더링 (Data-driven 방식)\n \n let contentNode: React.ReactNode;\n\n if (content) {\n contentNode = content;\n } else if (children) {\n contentNode = children;\n } else {\n contentNode = (\n <>\n {(title || icon) && <DialogHeader title={title} icon={icon} />}\n {description && <DialogBody>{description}</DialogBody>}\n {actionItems && actionItems.length > 0 && (\n <DialogFooter layout={footerLayout}>\n {actionItems.map((item, idx) => (\n <DialogButton\n key={`${item.label}-${idx}`}\n label={item.label}\n color={item.color}\n type={item.type}\n size={item.size}\n prefixIcon={item.prefixIcon}\n suffixIcon={item.suffixIcon}\n loading={item.loading}\n disabled={item.disabled}\n onClick={item.onClick}\n closeOnClick={item.closeOnClick ?? true} // Data-driven은 기본적으로 닫힘\n />\n ))}\n </DialogFooter>\n )}\n </>\n );\n }\n\n const dialogOverlay = (\n <div\n className=\"dialog-overlay\"\n role=\"presentation\"\n onClick={handleOverlayClick}\n >\n <div className={baseClasses} role=\"dialog\" aria-modal=\"true\" {...props}>\n <DialogContext.Provider value={{ onClose, variant }}>\n {withClose && (\n <button\n type=\"button\"\n className=\"dialog__close\"\n onClick={onClose}\n aria-label=\"닫기\"\n >\n <XMarkIcon className=\"dialog__close-icon\" />\n </button>\n )}\n {contentNode}\n </DialogContext.Provider>\n </div>\n </div>\n );\n\n // mounted 상태 확인 (SSR 대응) - 상단에서 처리됨\n // const [mounted, setMounted] = React.useState(false);\n // React.useEffect(() => {\n // setMounted(true);\n // return () => setMounted(false);\n // }, []);\n\n if (!mounted) return null;\n\n return createPortal(dialogOverlay, document.body);\n};\n\n// --- Sub Components ---\n\nexport interface DialogHeaderProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nconst DialogHeader = ({\n title,\n icon,\n className = \"\",\n children,\n ...props\n}: DialogHeaderProps) => {\n const { isUnderTablet } = useBreakpoint();\n return (\n <div className={`dialog__header ${className}`} {...props}>\n {icon && <span className=\"dialog__icon\">{icon}</span>}\n {title && (\n <Text variant={isUnderTablet ? \"subtitle-p1\" : \"heading-h6\"}>\n {title}\n </Text>\n )}\n {children}\n </div>\n );\n};\n\nexport type DialogBodyProps = React.HTMLAttributes<HTMLDivElement>\n\nconst DialogBody = ({ className = \"\", children, ...props }: DialogBodyProps) => {\n return (\n <div className={`dialog__body ${className}`} {...props}>\n <div className=\"body-p2 dialog__body-text\">{children}</div>\n </div>\n );\n};\n\nexport interface DialogFooterProps\n extends React.HTMLAttributes<HTMLDivElement> {\n layout?: DialogFooterLayout;\n}\n\nconst DialogFooter = ({\n layout = \"horizontal\",\n className = \"\",\n children,\n ...props\n}: DialogFooterProps) => {\n const layoutClass =\n layout === \"vertical\"\n ? \"dialog__actions--vertical\"\n : \"dialog__actions--horizontal\";\n\n return (\n <div\n className={`dialog__footer dialog__footer--${layout} ${className}`}\n {...props}\n >\n <div className={`dialog__actions ${layoutClass}`}>{children}</div>\n </div>\n );\n};\n\n// DialogButton: ActionButton을 래핑하여 Dialog 컨텍스트와 연동\nexport interface DialogButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n label: string;\n color?: ButtonColor;\n type?: ButtonType;\n size?: Exclude<ButtonSize, \"xlarge\">;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n loading?: boolean;\n disabled?: boolean;\n /** 클릭 시 다이얼로그 닫기 여부 (기본값: false - 명시적으로 닫아야 함) */\n closeOnClick?: boolean;\n}\n\nconst DialogButton = ({\n label,\n color,\n type,\n size,\n prefixIcon,\n suffixIcon,\n loading,\n disabled,\n onClick,\n closeOnClick = false,\n style,\n ...props\n}: DialogButtonProps) => {\n const context = React.useContext(DialogContext);\n const { isUnderTablet } = useBreakpoint();\n\n // 기본 스타일 계산\n const variant = context?.variant ?? \"confirm\";\n const buttonWidth = variant === \"confirm\" ? \"100%\" : \"auto\";\n const defaultSize =\n variant === \"alert\" ? (isUnderTablet ? \"small\" : \"medium\") : \"large\";\n const defaultType = variant === \"alert\" ? \"outline\" : \"solid\";\n const defaultColor = \"neutral\"; \n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (closeOnClick) {\n context?.onClose?.();\n }\n };\n\n return (\n <ActionButton\n label={label}\n size={size ?? defaultSize}\n color={color ?? defaultColor}\n type={type ?? defaultType}\n prefixIcon={prefixIcon}\n suffixIcon={suffixIcon}\n loading={loading}\n disabled={disabled}\n onClick={handleClick}\n style={{ width: buttonWidth, ...style }}\n {...props}\n />\n );\n};\n\n// --- Export with Compound Component Pattern ---\n\nexport const Dialog = Object.assign(DialogRoot, {\n Header: DialogHeader,\n Body: DialogBody,\n Footer: DialogFooter,\n Button: DialogButton,\n});\n\n// -------------------- Global Provider & Hook --------------------\n\nexport interface DialogOptions {\n id?: string;\n variant?: DialogVariant;\n align?: DialogAlign;\n title?: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n // Hook에서 사용할 때는 간단한 버튼 정의 (Compound 대신)\n buttons?: DialogActionItem[]; \n // 또는 완전히 커스텀한 컨텐츠\n content?: React.ReactNode;\n \n onClose?: () => void;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n withClose?: boolean;\n}\n\nexport interface AlertOptions extends Omit<DialogOptions, \"buttons\" | \"content\"> {\n confirmLabel?: string;\n onConfirm?: () => void | Promise<void>;\n}\n\nexport interface ConfirmOptions extends Omit<DialogOptions, \"buttons\" | \"content\"> {\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm?: () => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n}\n\ninterface DialogContextType {\n open: (options: DialogOptions) => string;\n close: (id: string) => void;\n closeAll: () => void;\n alert: (options: AlertOptions) => Promise<void>;\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n}\n\nconst GlobalDialogContext = React.createContext<DialogContextType | undefined>(\n undefined\n);\n\nexport const DialogProvider = ({ children }: { children: React.ReactNode }) => {\n const [dialogs, setDialogs] = React.useState<\n (DialogOptions & { id: string })[]\n >([]);\n\n const close = React.useCallback((id: string) => {\n setDialogs((prev) => prev.filter((d) => d.id !== id));\n }, []);\n\n const closeAll = React.useCallback(() => {\n setDialogs([]);\n }, []);\n\n const open = React.useCallback(\n (options: DialogOptions) => {\n const id = options.id || `dialog-${Date.now()}-${Math.random()}`;\n setDialogs((prev) => [...prev, { ...options, id }]);\n return id;\n },\n []\n );\n\n const alert = React.useCallback(\n (options: AlertOptions) => {\n return new Promise<void>((resolve) => {\n const id = `alert-${Date.now()}`;\n open({\n ...options,\n id,\n variant: options.variant ?? \"alert\",\n buttons: [\n {\n label: options.confirmLabel ?? \"확인\",\n color: \"primary\",\n type: \"solid\",\n closeOnClick: true,\n onClick: async () => {\n await options.onConfirm?.();\n resolve();\n },\n },\n ],\n onClose: () => {\n resolve();\n close(id);\n },\n });\n });\n },\n [open, close]\n );\n\n const confirm = React.useCallback(\n (options: ConfirmOptions) => {\n return new Promise<boolean>((resolve) => {\n const id = `confirm-${Date.now()}`;\n open({\n ...options,\n id,\n variant: options.variant ?? \"confirm\",\n buttons: [\n {\n label: options.cancelLabel ?? \"취소\",\n color: \"neutral\",\n type: \"outline\",\n closeOnClick: true,\n onClick: async () => {\n await options.onCancel?.();\n resolve(false);\n },\n },\n {\n label: options.confirmLabel ?? \"확인\",\n color: \"primary\",\n type: \"solid\",\n closeOnClick: true,\n onClick: async () => {\n await options.onConfirm?.();\n resolve(true);\n },\n },\n ],\n onClose: () => {\n resolve(false);\n close(id);\n },\n });\n });\n },\n [open, close]\n );\n\n return (\n <GlobalDialogContext.Provider\n value={{ open, close, closeAll, alert, confirm }}\n >\n {children}\n {/* DialogRoot 내부에서 이미 createPortal을 사용하므로, 여기서는 그냥 렌더링하면 됨 */}\n {dialogs.map((dialog) => (\n <DialogRoot\n key={dialog.id}\n open={true}\n onClose={() => {\n dialog.onClose?.();\n close(dialog.id);\n }}\n variant={dialog.variant}\n align={dialog.align}\n closeOnOverlayClick={dialog.closeOnOverlayClick}\n closeOnEsc={dialog.closeOnEsc}\n withClose={dialog.withClose}\n // Data-driven props 전달\n title={dialog.title}\n description={dialog.description}\n icon={dialog.icon}\n actionItems={dialog.buttons}\n content={dialog.content}\n >\n {dialog.content}\n </DialogRoot>\n ))}\n </GlobalDialogContext.Provider>\n );\n};\n\nexport function useDialog() {\n const context = React.useContext(GlobalDialogContext);\n if (!context) {\n throw new Error(\"useDialog must be used within a DialogProvider\");\n }\n return context;\n}\n","import React, { createContext, useContext, useSyncExternalStore } from 'react';\n\n\n// 1. 상태 타입 정의\ninterface BreakpointContextType {\n isMobile?: boolean;\n isTablet?: boolean;\n isDesktop?: boolean;\n isUnderTablet?: boolean;\n }\n \n // 2. Context 생성\n const BreakpointContext = createContext<BreakpointContextType | null>(null);\n \n // 3. Provider (스토리북 등에서 사용)\n export const BreakpointProvider = BreakpointContext.Provider;\n\nexport function useMediaQuery(query: string): boolean {\n // SSR 환경에서는 기본값으로 false를 반환합니다.\n const subscribe = (callback: () => void) => {\n const matchMedia = window.matchMedia(query);\n matchMedia.addEventListener(\"change\", callback);\n return () => matchMedia.removeEventListener(\"change\", callback);\n };\n\n const getSnapshot = () => {\n return window.matchMedia(query).matches;\n };\n\n const getServerSnapshot = () => {\n return false; // 서버 사이드에서는 항상 false (혹은 기본 레이아웃 기준)\n };\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n\n/**\n * 프로젝트 브레이크포인트 전용 훅\n */\nexport function useBreakpoint() {\n // Context에 값이 들어있다면 (스토리북에서 강제했다면) 그 값을 우선 사용\n const contextValue = useContext(BreakpointContext);\n \n // 실제 윈도우 미디어 쿼리 구독\n const isMobileQuery = useMediaQuery(\"(min-width: 375px) and (max-width: 743px)\");\n const isTabletQuery = useMediaQuery(\"(min-width: 744px) and (max-width: 1279px)\");\n const isDesktopQuery = useMediaQuery(\"(min-width: 1280px)\");\n const isUnderTabletQuery = useMediaQuery(\"(max-width: 743px)\");\n \n // 수정 포인트: \n // contextValue가 있더라도 내부의 특정 값(예: isMobile)이 없을 수 있으므로 \n // 널 병합 연산자(??)를 사용해 실제 쿼리 결과값을 기본값으로 넣어줍니다.\n return {\n isMobile: contextValue?.isMobile ?? isMobileQuery,\n isTablet: contextValue?.isTablet ?? isTabletQuery,\n isDesktop: contextValue?.isDesktop ?? isDesktopQuery,\n isUnderTablet: contextValue?.isUnderTablet ?? isUnderTabletQuery,\n };\n }","import React, { useState, useId } from \"react\";\nimport { ExclamationCircleIcon } from \"@heroicons/react/20/solid\";\nimport \"./text-input.css\";\nimport { Text } from \"../Typography/Typography\";\n\n// pc/mo는 디바이스 기반, medium/small은 스토리에서 쓰는 사이즈 네이밍\nexport type TextInputSize = \"pc\" | \"mo\" | \"medium\" | \"small\";\ntype NormalizedTextInputSize = \"pc\" | \"mo\";\nexport type TextInputState = \"default\" | \"error\";\n\nexport interface TextInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"title\"\n> {\n /** Title 텍스트 (있으면 표시) */\n title?: string;\n /** 필수 필드 표시 여부 */\n required?: boolean;\n /**\n * Input 크기\n * - \"pc\" / \"mo\": 디바이스 기반 네이밍\n * - \"medium\" / \"small\": 스토리/디자인 토큰 기반 네이밍 (pc ↔ medium, mo ↔ small)\n * 미지정 시 breakpoint 기준: tablet 미만 mo(small), 이상 pc(medium). 지정 시 오버라이드\n */\n size?: TextInputSize;\n /** Input 상태 (에러 상태) */\n error?: boolean;\n /** Help text */\n description?: React.ReactNode;\n /** Character count 표시 (예: \"99/100\") */\n maxLength?: number;\n /** 왼쪽 아이콘 */\n prefixIcon?: React.ReactNode;\n /** 오른쪽 아이콘 */\n suffixIcon?: React.ReactNode;\n /** 오른쪽 단위 (타이머 등) */\n suffixUnit?: React.ReactNode;\n\n /** Help text 아이콘 (true면 기본 아이콘, 노드면 커스텀) */\n accentIcon?: boolean | React.ReactNode;\n}\n\n/** TextInput 컴포넌트는 사용자로부터 텍스트 입력을 받는 폼 컴포넌트입니다. */\nexport const TextInput = ({\n required = false,\n size,\n error = false,\n description,\n maxLength,\n prefixIcon,\n suffixIcon,\n suffixUnit,\n title,\n accentIcon = true,\n className = \"\",\n style,\n id,\n value,\n defaultValue,\n readOnly,\n onChange,\n onFocus,\n onBlur,\n ...props\n}: TextInputProps) => {\n const generatedId = useId();\n const inputId = id || `textinput-${generatedId}`;\n const [focused, setFocused] = useState(false);\n\n // size 미지정 시: CSS media query로 해상도별 적용 (responsive). 지정 시: pc/mo\n const effectiveSize: NormalizedTextInputSize | \"responsive\" =\n size === undefined\n ? \"responsive\"\n : size === \"medium\"\n ? \"pc\"\n : size === \"small\"\n ? \"mo\"\n : size;\n\n // maxLength 글자 수 표시용. value 없으면 uncontrolled → 내부에서만 사용\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\n const currentValue = isControlled ? value : internalValue;\n\n const inputState: TextInputState = error ? \"error\" : \"default\";\n const count = maxLength\n ? `${String(currentValue).length}/${maxLength}`\n : undefined;\n const showCount = Boolean(count);\n const [countValue, countTotal] =\n typeof count === \"string\" && count.includes(\"/\")\n ? count.split(\"/\")\n : [count, undefined];\n const iconNode =\n typeof accentIcon === \"boolean\" ? (\n accentIcon ? (\n <ExclamationCircleIcon className=\"help-text__icon-svg\" />\n ) : null\n ) : (\n accentIcon\n );\n const helpVariant = error ? \"error\" : \"inform\";\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let next = e.target.value;\n if (maxLength != null && next.length > maxLength) {\n next = next.slice(0, maxLength);\n e.target.value = next;\n }\n if (!isControlled) setInternalValue(next);\n onChange?.(e);\n };\n\n const inputClasses = [\n \"text-input\",\n `text-input--${effectiveSize}`,\n `text-input--${inputState}`,\n focused && \"text-input--focused\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={`text-input-wrapper ${className}`.trim()} style={style}>\n {title && (\n <label htmlFor={inputId} className=\"flex items-center gap-1\">\n <Text variant=\"body-p3\">{title}</Text>\n {required && <span className=\"text-input__required\"> *</span>}\n </label>\n )}\n <div\n className={`text-input-shell text-input-shell--${inputState} text-input-shell--${effectiveSize}${readOnly ? \" text-input-shell--readonly\" : \"\"}`}\n >\n <div className={`text-input-container text-input-container--${effectiveSize}`}>\n {prefixIcon && (\n <span className=\"text-input__left-section\">{prefixIcon}</span>\n )}\n <input\n {...props}\n id={inputId}\n readOnly={readOnly}\n className={inputClasses}\n value={currentValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n maxLength={maxLength}\n aria-invalid={error}\n aria-describedby={\n description || count ? `${inputId}-description` : undefined\n }\n />\n {(suffixIcon || suffixUnit) && (\n <div className=\"text-input__right-section\">\n {suffixIcon && <>{suffixIcon}</>}\n {suffixUnit && <>{suffixUnit}</>}\n </div>\n )}\n </div>\n </div>\n {(description || showCount) && (\n <div id={`${inputId}-description`} className=\"text-input__footer\">\n <div\n className={`help-text-wrapper ${\n description && showCount\n ? \"help-text-wrapper--between\"\n : description\n ? \"help-text-wrapper--start\"\n : \"help-text-wrapper--end\"\n }`}\n >\n {description && (\n <span className={`help-text help-text--${helpVariant}`}>\n {iconNode && (\n <span className=\"help-text__icon\">{iconNode}</span>\n )}\n {typeof description === \"string\" ||\n typeof description === \"number\" ? (\n <Text variant=\"body-p3\" className=\"help-text__content\">\n {description}\n </Text>\n ) : (\n <span className=\"help-text__content\">{description}</span>\n )}\n </span>\n )}\n {showCount && (\n <span\n className={`help-text__count help-text__count--${helpVariant}`}\n >\n {countValue && (\n <Text variant=\"body-p3\" className=\"help-text__count-number\">\n {countValue}\n </Text>\n )}\n {countTotal && (\n <Text variant=\"body-p3\" className=\"help-text__count-total\">\n /{countTotal}\n </Text>\n )}\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n","import * as React from \"react\";\nfunction ExclamationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-8-5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 10 5Zm0 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ExclamationCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction InformationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-7-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM9 9a.75.75 0 0 0 0 1.5h.253a.25.25 0 0 1 .244.304l-.459 2.066A1.75 1.75 0 0 0 10.747 15H11a.75.75 0 0 0 0-1.5h-.253a.25.25 0 0 1-.244-.304l.459-2.066A1.75 1.75 0 0 0 9.253 9H9Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(InformationCircleIcon);\nexport default ForwardRef;","import React from \"react\";\nimport \"./toggle.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type ToggleSize = \"medium\" | \"small\";\nexport type ToggleLabelPosition = \"start\" | \"end\";\n\nexport interface ToggleProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"onChange\" | \"type\"\n> {\n /** Toggle 크기 */\n size?: ToggleSize;\n /** Toggle 라벨 */\n label?: React.ReactNode;\n /** Toggle 라벨 위치 */\n labelPosition?: ToggleLabelPosition;\n /** Toggle 설명 텍스트 */\n description?: React.ReactNode;\n /** Toggle 상태 변경 핸들러 */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\n/** Toggle 컴포넌트는 사용자가 on/off 상태를 전환할 수 있는 스위치 컴포넌트다. */\nexport const Toggle = React.forwardRef<HTMLInputElement, ToggleProps>(\n (\n {\n size = \"medium\",\n label,\n labelPosition = \"end\",\n description,\n checked: checkedProp,\n defaultChecked = false,\n onChange,\n disabled,\n className = \"\",\n id,\n ...props\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const combinedRef = React.useMemo(() => {\n if (typeof ref === \"function\") {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n ref(node);\n };\n } else if (ref) {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (ref) ref.current = node;\n };\n }\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n };\n }, [ref]);\n\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] =\n React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n\n onChange?.(e);\n };\n\n const generatedId = React.useId();\n const toggleId = id || generatedId;\n const descriptionId = description ? `${toggleId}-description` : undefined;\n\n const baseClasses = [\n \"toggle\",\n `toggle--${size}`,\n labelPosition === \"start\" && \"toggle--label-start\",\n disabled && \"toggle--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={baseClasses}>\n <div className=\"toggle__wrapper\">\n <input\n ref={combinedRef}\n type=\"checkbox\"\n id={toggleId}\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={handleChange}\n disabled={disabled}\n aria-describedby={descriptionId}\n className=\"toggle__input\"\n role=\"switch\"\n aria-checked={checked}\n {...props}\n />\n <label htmlFor={toggleId} className=\"toggle__label-wrapper\">\n {labelPosition === \"start\" && label && (\n <Text\n variant={size === \"medium\" ? \"body-p2\" : \"body-p3\"}\n as=\"span\"\n >\n {label}\n </Text>\n )}\n <span className=\"toggle__switch\">\n <span className=\"toggle__thumb\" />\n </span>\n {labelPosition === \"end\" && label && (\n <Text\n variant={size === \"medium\" ? \"body-p2\" : \"body-p3\"}\n as=\"span\"\n >\n {label}\n </Text>\n )}\n </label>\n </div>\n {description && (\n <div id={descriptionId} className=\"toggle__description\">\n {description}\n </div>\n )}\n </div>\n );\n }\n);\n\nToggle.displayName = \"Toggle\";\n","import React from \"react\";\nimport \"./checkbox.css\";\nimport {\n RiCheckboxBlankLine,\n RiCheckboxFill,\n RiCheckboxIndeterminateFill,\n} from \"@remixicon/react\";\nimport { Text } from \"../Typography/Typography\";\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"onChange\"> {\n /** Checkbox 라벨 */\n label?: React.ReactNode;\n /** label 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** Checkbox 설명 텍스트 */\n description?: React.ReactNode;\n /** Checkbox 값 (Checkbox.Group에서 사용) */\n value?: string;\n /** Checkbox 상태 변경 핸들러 */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n /** Indeterminate 상태 (부분 선택 상태) */\n indeterminate?: boolean;\n}\n\n/** Checkbox 컴포넌트는 사용자가 선택/해제할 수 있는 체크박스 입력 컴포넌트다. */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n labelProps,\n description,\n value,\n checked: checkedProp,\n defaultChecked = false,\n onChange,\n disabled,\n indeterminate = false,\n className = \"\",\n id,\n ...props\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const combinedRef = React.useMemo(() => {\n if (typeof ref === \"function\") {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n ref(node);\n };\n } else if (ref) {\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (ref) ref.current = node;\n };\n }\n return (node: HTMLInputElement | null) => {\n inputRef.current = node;\n };\n }, [ref]);\n\n // Indeterminate 상태 설정\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n\n onChange?.(e);\n };\n\n const generatedId = React.useId();\n const checkboxId = id || generatedId;\n const descriptionId = description ? `${checkboxId}-description` : undefined;\n\n const baseClasses = [\n \"checkbox\",\n disabled && \"checkbox--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const resolvedLabelProps = labelProps ?? {};\n const labelClassName = [\"checkbox__label-text\", resolvedLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={baseClasses}>\n <div className=\"checkbox__wrapper\">\n <input\n ref={combinedRef}\n type=\"checkbox\"\n id={checkboxId}\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={handleChange}\n disabled={disabled}\n value={value}\n aria-describedby={descriptionId || undefined}\n className=\"checkbox__input\"\n {...props}\n />\n <label htmlFor={checkboxId} className=\"checkbox__label-wrapper\">\n <span className=\"checkbox__icon-wrapper\" aria-hidden=\"true\">\n {indeterminate ? (\n <RiCheckboxIndeterminateFill className=\"checkbox__icon\" />\n ) : checked ? (\n <RiCheckboxFill className=\"checkbox__icon\" />\n ) : (\n <RiCheckboxBlankLine className=\"checkbox__icon\" />\n )}\n </span>\n {label && (\n <Text\n variant={resolvedLabelProps.variant ?? \"body-p2\"}\n as={resolvedLabelProps.as ?? \"span\"}\n {...resolvedLabelProps}\n className={labelClassName}\n >\n {label}\n </Text>\n )}\n </label>\n </div>\n {description && (\n <div id={descriptionId} className=\"checkbox__description\">\n {description}\n </div>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n\n// Checkbox.Group 컴포넌트\nexport interface CheckboxGroupProps {\n /** 그룹 라벨 */\n label?: React.ReactNode;\n /** 그룹 라벨 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 그룹 설명 */\n description?: React.ReactNode;\n /** 그룹 설명 스타일 오버라이드 (옵션) */\n descriptionProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 복수 선택 허용 여부. false면 단일 선택(라디오처럼 동작) */\n multiple?: boolean;\n /** 선택된 값들 (controlled). multiple=false일 때는 길이 0 또는 1 */\n value?: string[];\n /** 초기 선택된 값들 (uncontrolled) */\n defaultValue?: string[];\n /** 값 변경 핸들러 */\n onChange?: (values: string[]) => void;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** 자식 Checkbox 컴포넌트들 */\n children: React.ReactNode;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\n/** Checkbox.Group은 여러 Checkbox를 그룹화하여 관리할 수 있는 컴포넌트다. */\nexport const CheckboxGroup = ({\n label,\n labelProps,\n description,\n descriptionProps,\n multiple = true,\n value: valueProp,\n defaultValue = [],\n onChange,\n disabled,\n children,\n className = \"\",\n}: CheckboxGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const handleChange = (checkboxValue: string, checked: boolean) => {\n const newValue = multiple\n ? checked\n ? [...value, checkboxValue]\n : value.filter((v) => v !== checkboxValue)\n : checked\n ? [checkboxValue]\n : [];\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n };\n\n const groupId = React.useId();\n const descriptionId = description ? `${groupId}-description` : undefined;\n\n const resolvedGroupLabelProps = labelProps ?? {};\n const resolvedGroupDescriptionProps = descriptionProps ?? {};\n const groupLabelClassName = [\"checkbox-group__label\", resolvedGroupLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n const groupDescriptionClassName = [\n \"checkbox-group__description\",\n resolvedGroupDescriptionProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const baseClasses = [\n \"checkbox-group\",\n disabled && \"checkbox-group--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // children을 순회하며 각 Checkbox에 value와 onChange를 주입\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<CheckboxProps>(child) && child.type === Checkbox) {\n const checkboxValue = child.props.value;\n if (checkboxValue === undefined) {\n console.warn(\"Checkbox.Group 내부의 Checkbox는 value prop이 필요합니다.\");\n return child;\n }\n\n const isChecked = value.includes(checkboxValue);\n\n return React.cloneElement(child, {\n checked: isChecked,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n handleChange(checkboxValue, e.target.checked);\n child.props.onChange?.(e);\n },\n disabled: disabled || child.props.disabled,\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses}>\n \n {label && (\n <Text\n variant={resolvedGroupLabelProps.variant ?? \"subtitle-p2\"}\n as={resolvedGroupLabelProps.as ?? \"div\"}\n {...resolvedGroupLabelProps}\n className={groupLabelClassName}\n >\n {label}\n </Text>\n )}\n {description && (\n <Text\n id={descriptionId}\n variant={resolvedGroupDescriptionProps.variant ?? \"body-p3\"}\n as={resolvedGroupDescriptionProps.as ?? \"div\"}\n {...resolvedGroupDescriptionProps}\n className={groupDescriptionClassName}\n >\n {description}\n </Text>\n )}\n <div className=\"checkbox-group__content\">\n {enhancedChildren}\n </div>\n </div>\n );\n};\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n\n// Checkbox.Group을 Checkbox의 정적 프로퍼티로 추가\n(Checkbox as typeof Checkbox & { Group: typeof CheckboxGroup }).Group = CheckboxGroup;\n","import React from \"react\";\n\nexport interface UseCheckboxGroupOptions {\n /** 선택 가능한 값 목록 (CheckboxGroup 자식들의 value와 일치) */\n options: readonly string[];\n /** 초기 선택 값 (uncontrolled일 때) */\n defaultValue?: string[];\n /** 선택 값 (controlled일 때). 지정하면 onChange와 함께 사용 */\n value?: string[];\n /** 선택 값 변경 핸들러 (controlled일 때 필수) */\n onChange?: (values: string[]) => void;\n}\n\nexport interface UseCheckboxGroupResult {\n /** 현재 선택된 값들. CheckboxGroup의 value에 전달 */\n value: string[];\n /** 선택 변경 핸들러. CheckboxGroup의 onChange에 전달 */\n onChange: (values: string[]) => void;\n /** '전체 선택' 체크박스에 넘길 checked */\n selectAllChecked: boolean;\n /** '전체 선택' 체크박스에 넘길 indeterminate (일부만 선택된 경우) */\n selectAllIndeterminate: boolean;\n /** '전체 선택' 체크박스에 넘길 onChange */\n handleSelectAll: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** '전체 선택' Checkbox에 그대로 spread 가능한 props (checked, indeterminate, onChange) */\n selectAllProps: {\n checked: boolean;\n indeterminate: boolean;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n };\n}\n\n/**\n * CheckboxGroup + '전체 선택' 체크박스(indeterminate 포함) 상태를 관리하는 훅.\n * options와 동기화된 value/onChange와, 전체 선택용 checked/indeterminate/onChange를 반환한다.\n * 외부에서는 이 훅만 사용하면 된다.\n *\n * @example\n * const options = ['react', 'vue', 'angular'] as const;\n * const { value, onChange, selectAllProps } = useCheckboxGroup({ options });\n *\n * <Checkbox label=\"전체 선택\" {...selectAllProps} />\n * <CheckboxGroup value={value} onChange={onChange} ...>\n * {options.map(v => <Checkbox key={v} value={v} label={v} />)}\n * </CheckboxGroup>\n */\nexport function useCheckboxGroup(\n config: UseCheckboxGroupOptions\n): UseCheckboxGroupResult {\n const {\n options,\n defaultValue = [],\n value: valueProp,\n onChange: onChangeProp,\n } = config;\n\n const [internalValue, setInternalValue] = React.useState<string[]>(\n defaultValue\n );\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const onChange = React.useCallback(\n (newValue: string[]) => {\n if (!isControlled) setInternalValue(newValue);\n onChangeProp?.(newValue);\n },\n [isControlled, onChangeProp]\n );\n\n const allSelected = value.length === options.length;\n const someSelected = value.length > 0;\n const selectAllChecked = allSelected;\n const selectAllIndeterminate = someSelected && !allSelected;\n\n const handleSelectAll = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked ? [...options] : []);\n },\n [options, onChange]\n );\n\n return {\n value,\n onChange,\n selectAllChecked,\n selectAllIndeterminate,\n handleSelectAll,\n selectAllProps: {\n checked: selectAllChecked,\n indeterminate: selectAllIndeterminate,\n onChange: handleSelectAll,\n },\n };\n}\n","import React from \"react\";\nimport { ChevronDownIcon, XMarkIcon } from \"@heroicons/react/24/outline\";\nimport {\n ExclamationCircleIcon,\n InformationCircleIcon,\n} from \"@heroicons/react/20/solid\";\nimport { useBreakpoint } from \"../../../shared/hooks/useMediaQuery\";\nimport { Text } from \"../../Typography/Typography\";\nimport {\n SelectMenuOverlay,\n type SelectMenuItem,\n type SelectMenuProps,\n} from \"../SelectMenu/SelectMenu\";\nimport \"./select-header.css\";\n\nexport type SelectHeaderType = \"outlined\" | \"underlined\";\nexport type SelectHeaderSize = \"medium\" | \"small\";\n\nexport interface SelectHeaderProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onChange\" | \"value\"\n> {\n /** SelectHeader 타입 */\n type?: SelectHeaderType;\n /**\n * SelectHeader 사이즈\n * - \"medium\": Web~Tab 권장 사이즈\n * - \"small\": Mo 권장 사이즈\n * - 지정하지 않으면 breakpoint에 따라 자동 결정됨.\n */\n size?: SelectHeaderSize;\n /** Title 텍스트 */\n title?: string;\n /** 필수 필드 표시 여부 */\n required?: boolean;\n /** 선택된 값 표시 (items 없을 때) / 선택된 값 controlled (items 있을 때) */\n value?: string | string[] | null;\n /** 플레이스홀더 텍스트 */\n placeholder?: string;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** 에러 상태 */\n error?: boolean;\n /** Help text (도움말 텍스트) */\n description?: React.ReactNode;\n /** Help text 아이콘 (true면 기본 아이콘, 노드면 커스텀, false면 아이콘 없음) */\n accentIcon?: boolean | React.ReactNode;\n /** 클릭 핸들러 */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** 값 클리어 핸들러 */\n onClear?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** 커스텀 아이콘 */\n icon?: React.ReactNode;\n /** SelectMenu 항목들 (있으면 클릭 시 메뉴 열림) */\n items?: SelectMenuItem[];\n /** 초기 선택 값 (uncontrolled, items 있을 때) */\n defaultValue?: string | string[];\n /** 값 변경 핸들러 (items 있을 때) */\n onChange?: (value: string | string[] | undefined) => void;\n /** 다중 선택 허용 여부 (items 있을 때) */\n multiple?: boolean;\n /** 클리어 버튼 표시 여부 (미지정 시 hasValue && !disabled && (onChange|onClear) 기준 자동) */\n showClear?: boolean;\n /** 래퍼(Wrapper)에 적용할 클래스 이름 */\n wrapperClassName?: string;\n /** 래퍼(Wrapper)에 적용할 인라인 스타일 */\n wrapperStyle?: React.CSSProperties;\n /** 너비 설정 (예: \"100%\", \"300px\"). 설정 시 max-width 제한이 해제됨 */\n width?: string | number;\n /** SelectMenu에 전달: 항목 텍스트 스타일 오버라이드 */\n menuItemTextProps?: SelectMenuProps[\"itemTextProps\"];\n /** SelectMenu에 전달: 선택된 항목 suffix 아이콘 */\n menuSuffixIcon?: SelectMenuProps[\"suffixIcon\"];\n /** 헤더와 메뉴 사이 간격 (px, 기본 8) */\n menuGap?: number;\n /** SelectMenu에 전달: className */\n menuClassName?: string;\n /** SelectMenu에 전달: style */\n menuStyle?: React.CSSProperties;\n}\n\n/** SelectHeader 컴포넌트는 선택된 값을 표시하고 드롭다운을 여는 헤더 컴포넌트다. items를 주면 클릭 시 메뉴가 열린다. */\nexport const SelectHeader = React.forwardRef<\n HTMLButtonElement,\n SelectHeaderProps\n>(\n (\n {\n type = \"outlined\",\n title,\n required = false,\n value: valueProp,\n placeholder = \"선택하세요\",\n disabled = false,\n error = false,\n description,\n accentIcon = true,\n onClick,\n onClear,\n icon,\n className = \"\",\n id,\n items,\n defaultValue,\n onChange,\n multiple,\n showClear,\n wrapperClassName = \"\",\n wrapperStyle,\n width,\n size,\n menuItemTextProps,\n menuSuffixIcon,\n menuGap = 8,\n menuClassName,\n menuStyle,\n ...props\n },\n ref\n ) => {\n const { isUnderTablet } = useBreakpoint();\n const generatedId = React.useId();\n const selectHeaderId = id || `select-header-${generatedId}`;\n const descriptionId = description\n ? `${selectHeaderId}-description`\n : undefined;\n\n // size prop이 있으면 medium/small 기준으로 우선, 없으면 breakpoint 기준으로 결정\n const resolvedSize: \"web-tab\" | \"mo\" =\n size === \"medium\"\n ? \"web-tab\"\n : size === \"small\"\n ? \"mo\"\n : isUnderTablet\n ? \"mo\"\n : \"web-tab\";\n\n const [internalValue, setInternalValue] = React.useState<\n string | string[] | undefined\n >(defaultValue);\n\n const isSelectMode = items != null && items.length > 0;\n\n const isControlled = valueProp !== undefined;\n\n // items가 있으면 풀 셀렉트: value/defaultValue/onChange로 선택 상태 관리\n let currentValueForSelect: string | string[] | undefined = undefined;\n if (isSelectMode) {\n currentValueForSelect = isControlled\n ? valueProp === null\n ? undefined\n : valueProp\n : internalValue;\n }\n\n const handleSelectChange = (next: string | string[] | undefined) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n };\n\n const displayValue: string | null = (() => {\n // Select + items 모드: label 기반 표시\n if (isSelectMode) {\n const v = currentValueForSelect;\n if (v == null || (Array.isArray(v) && v.length === 0)) return null;\n if (Array.isArray(v)) {\n return v\n .map(\n (value) => items!.find((i) => i.value === value)?.label ?? value\n )\n .filter(Boolean)\n .join(\", \");\n }\n const found = items!.find((i) => i.value === v)?.label;\n return found != null ? String(found) : v;\n }\n\n // 단순 헤더 모드: value를 문자열로만 표시\n if (valueProp == null) return null;\n if (Array.isArray(valueProp)) return valueProp.join(\", \");\n return typeof valueProp === \"string\" ? valueProp : null;\n })();\n\n const hasValue = Boolean(displayValue);\n const showClearButton =\n showClear !== undefined\n ? showClear\n : hasValue &&\n !disabled &&\n (isSelectMode ? Boolean(onChange) : Boolean(onClear));\n\n const iconNode =\n typeof accentIcon === \"boolean\" ? (\n accentIcon ? (\n error ? (\n <ExclamationCircleIcon className=\"help-text__icon-svg\" />\n ) : (\n <InformationCircleIcon className=\"help-text__icon-svg\" />\n )\n ) : null\n ) : (\n accentIcon\n );\n const helpVariant = error ? \"error\" : \"inform\";\n\n const baseClasses = [\n \"select-header\",\n `select-header--${resolvedSize}`,\n `select-header--${type}`,\n disabled && \"select-header--disabled\",\n error && \"select-header--error\",\n hasValue && \"select-header--has-value\",\n width && \"select-header--full\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClear = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (isSelectMode) {\n handleSelectChange(undefined);\n } else {\n onClear?.(e);\n }\n };\n\n const headerButton = (\n <button\n ref={ref}\n type=\"button\"\n id={selectHeaderId}\n className={baseClasses}\n disabled={disabled}\n onClick={onClick}\n aria-haspopup=\"listbox\"\n aria-describedby={descriptionId}\n {...props}\n >\n <span className=\"select-header__content\">\n {hasValue ? (\n <Text as=\"span\" variant=\"body-p2\">\n {displayValue}\n </Text>\n ) : (\n <Text as=\"span\" variant=\"body-p2\">\n {placeholder}\n </Text>\n )}\n </span>\n <span className=\"select-header__actions\">\n {showClearButton && (\n <span\n role=\"button\"\n tabIndex={0}\n className=\"select-header__clear\"\n onClick={handleClear}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClear(e as unknown as React.MouseEvent<HTMLButtonElement>);\n }\n }}\n aria-label=\"값 지우기\"\n >\n <XMarkIcon className=\"select-header__clear-icon\" />\n </span>\n )}\n <span className=\"select-header__icon\">\n {icon || <ChevronDownIcon className=\"select-header__chevron\" />}\n </span>\n </span>\n </button>\n );\n\n return (\n <div\n className={`select-header-wrapper ${wrapperClassName}`}\n style={{ ...wrapperStyle, ...(width ? { width } : {}) }}\n >\n {(title || required) && (\n <label htmlFor={selectHeaderId} className=\"select-header__label\">\n {title && (\n <Text as=\"span\" variant=\"subtitle-p3\">\n {title}\n </Text>\n )}\n {required && (\n <Text\n as=\"span\"\n variant=\"subtitle-p3\"\n className=\"text-info-negative\"\n >\n *\n </Text>\n )}\n </label>\n )}\n {isSelectMode ? (\n <SelectMenuOverlay\n items={items!}\n value={currentValueForSelect}\n multiple={multiple}\n onChange={handleSelectChange}\n menuContainerStyle={{ width: \"100%\", marginTop: menuGap }}\n itemTextProps={menuItemTextProps}\n suffixIcon={menuSuffixIcon}\n className={menuClassName}\n style={menuStyle}\n >\n {headerButton}\n </SelectMenuOverlay>\n ) : (\n headerButton\n )}\n {description && (\n <div id={descriptionId} className=\"select-header__footer\">\n <span className={`help-text help-text--${helpVariant}`}>\n {iconNode && <span className=\"help-text__icon\">{iconNode}</span>}\n <Text as=\"span\" variant=\"body-p3\">\n {description}\n </Text>\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nSelectHeader.displayName = \"SelectHeader\";\n","import React from \"react\";\nimport \"./select-menu.css\";\nimport { Text } from \"../../Typography/Typography\";\nimport { useBreakpoint } from \"../../../shared/hooks/useMediaQuery\";\nimport { RiCheckboxCircleFill } from \"@remixicon/react\";\n\nexport interface SelectMenuItem {\n value: string;\n label: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface SelectMenuProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** 메뉴 항목들 */\n items: SelectMenuItem[];\n /**\n * 메뉴 사이즈\n * - \"medium\": Web~Tab 권장 사이즈\n * - \"small\": Mo 권장 사이즈\n * - 지정하지 않으면 breakpoint에 따라 자동 결정됨.\n */\n size?: \"medium\" | \"small\";\n /** 선택된 값 (controlled) */\n value?: string | string[];\n /** 초기 선택 값 (uncontrolled) */\n defaultValue?: string | string[];\n /** 값 변경 핸들러 */\n onChange?: (value: string | string[] | undefined) => void;\n /** 다중 선택 허용 여부 */\n multiple?: boolean;\n /** 항목 텍스트 스타일 오버라이드 (옵션) */\n itemTextProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 선택된 항목 suffix 아이콘 (기본 체크 아이콘, 함수로 커스터마이즈 가능) */\n suffixIcon?: React.ReactNode | ((item: SelectMenuItem) => React.ReactNode);\n}\n\n/** SelectMenu는 옵션 리스트를 표시하고 값을 선택하는 메뉴 컴포넌트다. */\nexport const SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuProps>((props, ref) => {\n const {\n items,\n size,\n value,\n defaultValue,\n onChange,\n multiple,\n itemTextProps,\n suffixIcon,\n className = \"\",\n id,\n ...rest\n } = props;\n\n // value prop이 존재하면 (undefined 포함) controlled 로 간주\n const isControlled = Object.prototype.hasOwnProperty.call(props, \"value\");\n const [internalValue, setInternalValue] = React.useState<string | string[] | undefined>(\n defaultValue\n );\n const currentValue = isControlled ? value : internalValue;\n const isMultiple = !!multiple;\n\n const { isUnderTablet } = useBreakpoint();\n // size prop이 우선이며, 없으면 breakpoint 기준 자동 결정\n const resolvedSize: \"medium\" | \"small\" =\n size ?? (isUnderTablet ? \"small\" : \"medium\");\n\n const generatedId = React.useId();\n const menuId = id || `select-menu-${generatedId}`;\n\n const commitValue = (next: string) => {\n let newValue: string | string[] | undefined;\n\n if (isMultiple) {\n const prevArray = Array.isArray(currentValue)\n ? currentValue\n : currentValue\n ? [currentValue]\n : [];\n newValue = prevArray.includes(next)\n ? prevArray.filter((v) => v !== next)\n : [...prevArray, next];\n } else {\n newValue = currentValue === next ? undefined : next;\n }\n\n if (!isControlled) setInternalValue(newValue);\n onChange?.(newValue);\n };\n\n const baseClasses = [\"select-menu\", `select-menu--${resolvedSize}`, className]\n .filter(Boolean)\n .join(\" \");\n\n const resolvedItemTextProps = itemTextProps ?? {};\n const defaultVariant = resolvedSize === \"medium\" ? \"body-p2\" : \"body-p3\";\n\n return (\n <div\n ref={ref}\n id={menuId}\n className={baseClasses}\n role=\"listbox\"\n {...rest}\n >\n {items.map((item, idx) => {\n const isSelected = Array.isArray(currentValue)\n ? currentValue.includes(item.value)\n : currentValue === item.value;\n const optionId = `${menuId}-option-${item.value}`;\n\n const defaultSuffix = <RiCheckboxCircleFill className=\"select-menu__suffix-icon\" />;\n const suffixNode =\n typeof suffixIcon === \"function\" ? suffixIcon(item) : suffixIcon ?? defaultSuffix;\n\n return (\n <button\n key={item.value}\n id={optionId}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n disabled={item.disabled}\n className=\"select-menu__item\"\n onClick={() => !item.disabled && commitValue(item.value)}\n >\n <Text\n variant={resolvedItemTextProps.variant ?? defaultVariant}\n as={resolvedItemTextProps.as ?? \"span\"}\n {...resolvedItemTextProps}\n className={[\"select-menu__item-text\", resolvedItemTextProps.className]\n .filter(Boolean)\n .join(\" \")}\n >\n {item.label}\n </Text>\n {isSelected && <span className=\"select-menu__suffix\">{suffixNode}</span>}\n </button>\n );\n })}\n </div>\n );\n});\n\nSelectMenu.displayName = \"SelectMenu\";\n\nexport interface SelectMenuOverlayProps\n extends Omit<SelectMenuProps, \"onClose\"> {\n /** 메뉴를 열기 위한 트리거 요소 (버튼/텍스트/아이콘 등) */\n children: React.ReactNode;\n /** 열림 상태 (controlled) */\n open?: boolean;\n /** 초기 열림 상태 (uncontrolled) */\n defaultOpen?: boolean;\n /** 열림 상태 변경 핸들러 */\n onOpenChange?: (open: boolean) => void;\n /** 메뉴 컨테이너 스타일 (positioning 커스터마이즈용) */\n menuContainerStyle?: React.CSSProperties;\n}\n\n/** SelectMenuOverlay는 트리거(children)를 감싸고 SelectMenu를 토글하는 래퍼 컴포넌트다. */\nexport const SelectMenuOverlay = ({\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n menuContainerStyle,\n ...menuProps\n}: SelectMenuOverlayProps) => {\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n\n const setOpen = (next: boolean) => {\n if (!isControlled) {\n setInternalOpen(next);\n }\n onOpenChange?.(next);\n };\n\n // 메뉴 밖을 클릭하면 닫기\n React.useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!wrapperRef.current) return;\n if (!wrapperRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [open, setOpen]);\n\n const handleToggle = () => {\n setOpen(!open);\n };\n\n let triggerNode: React.ReactNode = children;\n\n if (React.isValidElement<React.HTMLAttributes<HTMLElement>>(children)) {\n const originalOnClick = children.props.onClick;\n\n triggerNode = React.cloneElement<React.HTMLAttributes<HTMLElement>>(children, {\n ...children.props,\n onClick: (event: React.MouseEvent<HTMLElement>) => {\n originalOnClick?.(event);\n handleToggle();\n },\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": open,\n });\n } else {\n triggerNode = (\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n {children}\n </button>\n );\n }\n\n return (\n <div\n ref={wrapperRef}\n style={{ position: \"relative\", display: \"inline-flex\" }}\n >\n {triggerNode}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: 4,\n zIndex: 1000,\n ...menuContainerStyle,\n }}\n >\n <SelectMenu\n {...menuProps}\n style={{\n ...menuProps.style,\n width: \"100%\",\n minWidth: 0,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\nSelectMenuOverlay.displayName = \"SelectMenuOverlay\";\n\n","import * as React from \"react\";\nfunction CheckCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ExclamationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ExclamationCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ExclamationTriangleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ExclamationTriangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction InformationCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(InformationCircleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction XCircleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-1.72 6.97a.75.75 0 1 0-1.06 1.06L10.94 12l-1.72 1.72a.75.75 0 1 0 1.06 1.06L12 13.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L13.06 12l1.72-1.72a.75.75 0 1 0-1.06-1.06L12 10.94l-1.72-1.72Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(XCircleIcon);\nexport default ForwardRef;","import React from \"react\";\nimport {\n SelectHeader,\n type SelectHeaderProps,\n type SelectHeaderType,\n} from \"../SelectHeader\";\nimport type { SelectMenuItem, SelectMenuProps } from \"../SelectMenu/SelectMenu\";\nimport { Text } from \"../../Typography/Typography\";\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n} from \"@heroicons/react/24/solid\";\nimport \"../SelectHeader/select-header.css\";\nimport \"../SelectMenu/select-menu.css\";\nimport \"./select-box.css\";\n\nexport type SelectBoxType = \"default\" | \"label\" | \"placeholder\";\nexport type SelectBoxSize = \"small\" | \"medium\" | \"large\" | \"full\";\nexport type SelectBoxState =\n | \"default\"\n | \"active\"\n | \"disabled\"\n | \"error\"\n | \"success\"\n | \"loading\";\n\n/** root/header/menu별 className 또는 전체 적용 */\nexport type SelectBoxClassName =\n | string\n | { root?: string; header?: string; menu?: string };\n\n/** root/header/menu별 style 또는 전체 적용 */\nexport type SelectBoxStyle =\n | React.CSSProperties\n | { root?: React.CSSProperties; header?: React.CSSProperties; menu?: React.CSSProperties };\n\n/** SelectBox 전용 props (label는 SelectHeader title에 매핑) */\ntype SelectBoxSpecificProps = {\n /** SelectBox 타입 (Default: 라벨 없음, Label: 라벨 있음, Placeholder: 라벨+플레이스홀더) */\n type?: SelectBoxType;\n /** SelectBox 사이즈 */\n size?: SelectBoxSize;\n /** SelectBox 상태 */\n state?: SelectBoxState;\n /** 라벨 텍스트 (SelectHeader title에 매핑) */\n label?: string;\n /** Helper text (에러/성공 시 표시) */\n helperText?: string;\n /**\n * className: 문자열이면 root에 적용, 객체면 root/header/menu 각각 적용\n * @example className=\"w-12\"\n * @example className={{ root: \"w-12\", header: \"border-red-500\", menu: \"border-red-500\" }}\n */\n className?: SelectBoxClassName;\n /**\n * style: 객체면 root/header/menu 각각 적용\n * @example style={{ root: { width: 48 }, header: { borderColor: \"red\" }, menu: { borderColor: \"red\" } }}\n */\n style?: SelectBoxStyle;\n};\n\n/** SelectHeader에서 SelectBox가 오버라이드하는 props 제외 */\ntype SelectHeaderPassThrough = Omit<\n SelectHeaderProps,\n | \"type\"\n | \"size\"\n | \"title\"\n | \"disabled\"\n | \"error\"\n | \"description\"\n | \"accentIcon\"\n | \"icon\"\n | \"wrapperClassName\"\n | \"menuClassName\"\n | \"menuStyle\"\n | \"style\"\n | \"className\"\n> & {\n /** SelectHeader 타입 (outlined | underlined) */\n headerType?: SelectHeaderType;\n};\n\n/** SelectMenu props (SelectHeader menuItemTextProps, menuSuffixIcon로 전달) */\ntype SelectMenuPassThrough = Pick<\n SelectMenuProps,\n \"itemTextProps\" | \"suffixIcon\"\n>;\n\nexport type SelectBoxProps = SelectBoxSpecificProps &\n SelectHeaderPassThrough &\n SelectMenuPassThrough;\n\nconst LoadingSpinner = () => (\n <span className=\"select-box__spinner\" aria-hidden=\"true\">\n <svg\n className=\"select-box__spinner-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n className=\"select-box__spinner-circle\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 40;40 40;0 40\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-40;-80\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n </span>\n);\n\n/** SelectBox는 SelectHeader와 SelectMenu를 하나로 통합한 컴포넌트로, 미리 정의된 목록에서 항목을 선택하도록 돕습니다. */\nexport const SelectBox = ({\n type = \"label\",\n size = \"medium\",\n state = \"default\",\n label,\n required = false,\n placeholder = \"선택하세요\",\n items,\n value,\n defaultValue,\n onChange,\n multiple,\n helperText,\n className,\n style,\n width,\n // SelectHeader pass-through\n headerType = \"outlined\",\n onClear,\n showClear,\n wrapperStyle,\n onClick,\n id,\n itemTextProps,\n suffixIcon,\n ...restHeaderProps\n}: SelectBoxProps) => {\n const isDisabled = state === \"disabled\" || state === \"loading\";\n const isError = state === \"error\";\n const isSuccess = state === \"success\";\n\n const showLabel = type === \"label\" || type === \"placeholder\";\n const showPlaceholder = type === \"placeholder\" || type === \"default\";\n const resolvedPlaceholder = showPlaceholder ? placeholder : \"선택하세요\";\n\n const resolvedWidth =\n size === \"full\"\n ? \"100%\"\n : width !== undefined\n ? typeof width === \"number\"\n ? `${width}px`\n : width\n : undefined;\n\n const iconNode = state === \"loading\" ? <LoadingSpinner /> : undefined;\n\n const isClassNameObj =\n typeof className === \"object\" &&\n className !== null &&\n (\"root\" in className || \"header\" in className || \"menu\" in className);\n const isStyleObj =\n typeof style === \"object\" &&\n style !== null &&\n !Array.isArray(style) &&\n (\"root\" in style || \"header\" in style || \"menu\" in style);\n\n const rootClassName = isClassNameObj ? className.root : (className as string | undefined);\n const headerClassName = isClassNameObj ? className.header : undefined;\n const menuClassName = isClassNameObj ? className.menu : undefined;\n\n const styleForParts = style as\n | { root?: React.CSSProperties; header?: React.CSSProperties; menu?: React.CSSProperties }\n | React.CSSProperties\n | undefined;\n const rootStyle: React.CSSProperties | undefined = isStyleObj\n ? (styleForParts as { root?: React.CSSProperties }).root\n : (styleForParts as React.CSSProperties | undefined);\n const headerStyle: React.CSSProperties | undefined = isStyleObj\n ? (styleForParts as { header?: React.CSSProperties }).header\n : undefined;\n const menuStyle: React.CSSProperties | undefined = isStyleObj\n ? (styleForParts as { menu?: React.CSSProperties }).menu\n : undefined;\n\n const baseClasses = [\n \"select-box\",\n `select-box--${size}`,\n `select-box--${state}`,\n isError && \"select-box--error\",\n isSuccess && \"select-box--success\",\n rootClassName,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const helperTextNode =\n helperText && (isError || isSuccess) ? (\n <div className=\"select-box__footer\">\n <span\n className={`help-text help-text--${isError ? \"error\" : \"success\"}`}\n >\n {(isError ? (\n <span className=\"help-text__icon\">\n <ExclamationCircleIcon className=\"help-text__icon-svg\" />\n </span>\n ) : (\n <span className=\"help-text__icon\">\n <CheckCircleIcon className=\"help-text__icon-svg\" />\n </span>\n ))}\n <Text as=\"span\" variant=\"body-p3\">\n {helperText}\n </Text>\n </span>\n </div>\n ) : null;\n\n return (\n <div className={baseClasses} style={rootStyle}>\n <SelectHeader\n type={headerType}\n size={size === \"small\" ? \"small\" : \"medium\"}\n title={showLabel ? label : undefined}\n required={required}\n placeholder={resolvedPlaceholder}\n items={items}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n multiple={multiple}\n disabled={isDisabled}\n error={isError}\n accentIcon={false}\n icon={iconNode}\n onClear={onClear}\n showClear={showClear}\n wrapperStyle={\n headerStyle || wrapperStyle\n ? { ...wrapperStyle, ...headerStyle }\n : undefined\n }\n wrapperClassName={[\"select-box__header-wrapper\", headerClassName].filter(Boolean).join(\" \")}\n menuClassName={menuClassName}\n menuStyle={menuStyle}\n onClick={onClick}\n id={id}\n menuItemTextProps={itemTextProps}\n menuSuffixIcon={suffixIcon}\n width={resolvedWidth}\n {...restHeaderProps}\n />\n {helperTextNode}\n </div>\n );\n};\n\nSelectBox.displayName = \"SelectBox\";\n","import React from \"react\";\n\nimport \"./pagination.css\";\nimport { Text } from \"../Typography/Typography\";\nimport {\n RiArrowLeftSLine,\n RiArrowRightSLine,\n RiMoreLine,\n} from \"@remixicon/react\";\n\nexport type PaginationType = \"basic\" | \"compact\";\n\ntype PaginationItemType =\n | \"page\"\n | \"ellipsis\"\n | \"prev\"\n | \"next\"\n | \"first\"\n | \"last\";\n\ninterface PaginationItem {\n type: PaginationItemType;\n page?: number;\n key: string;\n disabled?: boolean;\n selected?: boolean;\n}\n\nexport interface PaginationProps {\n /** 총 페이지 수 (1 이상) */\n totalPages: number;\n /** 현재 페이지 (1부터 시작) */\n currentPage: number;\n /** 페이지 변경 핸들러 */\n onChange?: (page: number) => void;\n /** Pagination 타입 (기본형 / 축약형) */\n type?: PaginationType;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\nconst range = (start: number, end: number): number[] => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => start + idx);\n};\n\nconst createPaginationItems = ({\n totalPages,\n currentPage,\n siblingCount,\n showEdgeButtons,\n showPrevNext,\n}: {\n totalPages: number;\n currentPage: number;\n siblingCount: number;\n showEdgeButtons: boolean;\n showPrevNext: boolean;\n}): PaginationItem[] => {\n if (totalPages <= 0) return [];\n\n const safeCurrent = Math.min(Math.max(currentPage, 1), totalPages);\n const items: PaginationItem[] = [];\n\n const add = (item: PaginationItem) => items.push(item);\n\n const isFirstPage = safeCurrent === 1;\n const isLastPage = safeCurrent === totalPages;\n\n if (showEdgeButtons) {\n add({\n type: \"first\",\n page: 1,\n key: \"first\",\n disabled: isFirstPage,\n });\n }\n\n if (showPrevNext) {\n add({\n type: \"prev\",\n page: Math.max(1, safeCurrent - 1),\n key: \"prev\",\n disabled: isFirstPage,\n });\n }\n\n // 페이지 번호들 + ... 계산 (MUI Pagination 로직과 유사)\n const totalPageNumbers = siblingCount * 2 + 5; // 1, last, current, 양옆, 그리고 두 개의 ellipsis 자리\n\n if (totalPages <= totalPageNumbers) {\n range(1, totalPages).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-${page}`,\n selected: page === safeCurrent,\n })\n );\n } else {\n const leftSiblingIndex = Math.max(safeCurrent - siblingCount, 2);\n const rightSiblingIndex = Math.min(\n safeCurrent + siblingCount,\n totalPages - 1\n );\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2;\n const shouldShowRightEllipsis = rightSiblingIndex < totalPages - 1;\n\n // 항상 첫 페이지\n add({\n type: \"page\",\n page: 1,\n key: \"page-1\",\n selected: safeCurrent === 1,\n });\n\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n // 왼쪽 ellipsis 없고 오른쪽만 필요\n const leftItemCount = 3 + 2 * siblingCount;\n const leftRange = range(2, leftItemCount);\n\n leftRange.forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n\n add({ type: \"ellipsis\", key: `ellipsis-right-${rightSiblingIndex}` });\n add({\n type: \"page\",\n page: totalPages,\n key: `page-${totalPages}`,\n selected: safeCurrent === totalPages,\n });\n } else if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n // 왼쪽만 필요하고 오른쪽 ellipsis 없음\n add({ type: \"ellipsis\", key: `ellipsis-left-${leftSiblingIndex}` });\n\n const rightItemCount = 3 + 2 * siblingCount;\n const rightRange = range(totalPages - rightItemCount + 1, totalPages - 1);\n\n rightRange.forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n\n add({\n type: \"page\",\n page: totalPages,\n key: `page-${totalPages}`,\n selected: safeCurrent === totalPages,\n });\n } else if (shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n // 양쪽 모두 필요할 때: 1 ... [left~right] ... last\n add({ type: \"ellipsis\", key: `ellipsis-left-${leftSiblingIndex}` });\n\n range(leftSiblingIndex, rightSiblingIndex).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n\n add({ type: \"ellipsis\", key: `ellipsis-right-${rightSiblingIndex}` });\n add({\n type: \"page\",\n page: totalPages,\n key: `page-${totalPages}`,\n selected: safeCurrent === totalPages,\n });\n } else {\n // ellipsis 둘 다 필요 없을 때 (fallback)\n range(1, totalPages).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-dynamic-${page}-${safeCurrent}`,\n selected: page === safeCurrent,\n })\n );\n }\n }\n\n if (showPrevNext) {\n add({\n type: \"next\",\n page: Math.min(totalPages, safeCurrent + 1),\n key: \"next\",\n disabled: isLastPage,\n });\n }\n\n if (showEdgeButtons) {\n add({\n type: \"last\",\n page: totalPages,\n key: \"last\",\n disabled: isLastPage,\n });\n }\n\n return items;\n};\n\nconst createBasicPaginationItems = ({\n totalPages,\n currentPage,\n}: {\n totalPages: number;\n currentPage: number;\n}): PaginationItem[] => {\n if (totalPages <= 0) return [];\n\n const safeCurrent = Math.min(Math.max(currentPage, 1), totalPages);\n const items: PaginationItem[] = [];\n\n const add = (item: PaginationItem) => items.push(item);\n\n const isFirstPage = safeCurrent === 1;\n const isLastPage = safeCurrent === totalPages;\n\n // 기본형: first/last, ellipsis 없이 이전/다음 + 모든 페이지 번호\n add({\n type: \"prev\",\n page: Math.max(1, safeCurrent - 1),\n key: \"prev\",\n disabled: isFirstPage,\n });\n\n range(1, totalPages).forEach((page) =>\n add({\n type: \"page\",\n page,\n key: `page-${page}`,\n selected: page === safeCurrent,\n })\n );\n\n add({\n type: \"next\",\n page: Math.min(totalPages, safeCurrent + 1),\n key: \"next\",\n disabled: isLastPage,\n });\n\n return items;\n};\n\n/** Pagination 컴포넌트는 리스트/테이블 등에서 여러 페이지를 탐색할 때 사용하는 페이지네이션 컴포넌트다. */\nexport const Pagination = ({\n totalPages,\n currentPage,\n onChange,\n type = \"basic\",\n className = \"\",\n ...rest\n}: PaginationProps) => {\n // 디자인은 데스크탑 기준 단일 사이즈만 사용\n const size = \"web-tab\" as const;\n\n const variant: PaginationType = type ?? \"basic\";\n\n const items = React.useMemo(() => {\n if (variant === \"basic\") {\n return createBasicPaginationItems({\n totalPages,\n currentPage,\n });\n }\n\n // compact: ellipsis + first/last 버튼 포함\n return createPaginationItems({\n totalPages,\n currentPage,\n siblingCount: 1,\n showEdgeButtons: false,\n showPrevNext: true,\n });\n }, [totalPages, currentPage, variant]);\n\n const handleItemClick = React.useCallback(\n (item: PaginationItem) => {\n if (item.disabled) return;\n if (!item.page) return;\n onChange?.(item.page);\n },\n [onChange]\n );\n\n const handleEllipsisClick = React.useCallback(\n (key: string) => {\n if (key === \"ellipsis-left\") {\n // 왼쪽 ellipsis 클릭 → 첫 페이지로 이동\n onChange?.(1);\n } else if (key === \"ellipsis-right\") {\n // 오른쪽 ellipsis 클릭 → 마지막 페이지로 이동\n onChange?.(totalPages);\n }\n },\n [onChange, totalPages]\n );\n\n const rootClasses = [\"pagination\", `pagination--${size}`, className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <nav className={rootClasses} aria-label=\"페이지네이션\" {...rest}>\n <ul className=\"pagination__list\">\n {items.map((item) => {\n const isPage = item.type === \"page\";\n const isSelected = Boolean(item.selected);\n const isDisabled = Boolean(item.disabled);\n\n const itemClasses = [\n \"pagination__button\",\n `pagination__button--${item.type}`,\n isPage && \"pagination__button--page\",\n isSelected && \"pagination__button--selected\",\n isDisabled && \"pagination__button--disabled\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const labelText =\n item.type === \"page\"\n ? String(item.page)\n : item.type === \"prev\"\n ? \"이전 페이지\"\n : item.type === \"next\"\n ? \"다음 페이지\"\n : item.type === \"first\"\n ? \"첫 페이지\"\n : item.type === \"last\"\n ? \"마지막 페이지\"\n : \"\";\n\n const ariaLabel =\n item.type === \"page\" ? `${item.page}페이지` : labelText;\n\n if (item.type === \"ellipsis\") {\n return (\n <li\n key={item.key}\n className=\"pagination__item pagination__item--ellipsis\"\n >\n <button\n type=\"button\"\n className=\"pagination__button pagination__button--ellipsis\"\n onClick={() => handleEllipsisClick(item.key)}\n aria-label={\n item.key === \"ellipsis-left\"\n ? \"첫 페이지로 이동\"\n : \"마지막 페이지로 이동\"\n }\n >\n <RiMoreLine />\n </button>\n </li>\n );\n }\n\n return (\n <li key={item.key} className=\"pagination__item\">\n <button\n type=\"button\"\n className={itemClasses}\n onClick={() => handleItemClick(item)}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-current={isPage && isSelected ? \"page\" : undefined}\n >\n {item.type === \"prev\" && (\n <RiArrowLeftSLine className=\"pagination__icon\" />\n )}\n {item.type === \"next\" && (\n <RiArrowRightSLine className=\"pagination__icon\" />\n )}\n {item.type === \"first\" && (\n <>\n <RiArrowLeftSLine className=\"pagination__icon pagination__icon--double\" />\n <RiArrowLeftSLine className=\"pagination__icon pagination__icon--double\" />\n </>\n )}\n {item.type === \"last\" && (\n <>\n <RiArrowRightSLine className=\"pagination__icon pagination__icon--double\" />\n <RiArrowRightSLine className=\"pagination__icon pagination__icon--double\" />\n </>\n )}\n {item.type === \"page\" && (\n <Text\n as=\"span\"\n variant={size === \"web-tab\" ? \"body-p2\" : \"body-p3\"}\n >\n {item.page}\n </Text>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n};\n\nPagination.displayName = \"Pagination\";\n","import React from \"react\";\nimport \"./radio-button.css\";\nimport { RiCircleLine, RiRadioButtonLine } from \"@remixicon/react\";\nimport { Text } from \"../Typography/Typography\";\n\nexport interface RadioButtonProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"onChange\"\n > {\n /** 라디오 라벨 */\n label?: React.ReactNode;\n /** label 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 라디오 설명 텍스트 */\n description?: React.ReactNode;\n /** 라디오 값 (RadioButton.Group에서 사용) */\n value?: string;\n /** 라디오 상태 변경 핸들러 */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\n/** RadioButton은 단일 선택(라디오) 입력 컴포넌트다. */\nexport const RadioButton = React.forwardRef<HTMLInputElement, RadioButtonProps>(\n (\n {\n label,\n labelProps,\n description,\n value,\n checked: checkedProp,\n defaultChecked = false,\n onChange,\n disabled,\n className = \"\",\n id,\n name,\n onClick,\n ...props\n },\n ref\n ) => {\n // Controlled/Uncontrolled 패턴\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (!isControlled) {\n setInternalChecked(e.target.checked);\n }\n\n onChange?.(e);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n if (checked && !disabled) {\n e.preventDefault();\n if (!isControlled) setInternalChecked(false);\n const syntheticEvent = {\n ...e,\n target: { ...e.target, checked: false },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n }\n onClick?.(e);\n };\n\n const generatedId = React.useId();\n const radioId = id || generatedId;\n const descriptionId = description ? `${radioId}-description` : undefined;\n\n const [isHovered, setIsHovered] = React.useState(false);\n\n const baseClasses = [\"radio-button\", disabled && \"radio-button--disabled\", className]\n .filter(Boolean)\n .join(\" \");\n\n const labelWrapperClasses = [\n \"radio-button__label-wrapper\",\n isHovered && !checked && !disabled && \"radio-button__label-wrapper--hovered\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const resolvedLabelProps = labelProps ?? {};\n const labelClassName = [\"radio-button__label-text\", resolvedLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={baseClasses} data-checked={checked}>\n <div className=\"radio-button__wrapper\">\n <input\n ref={ref}\n type=\"radio\"\n id={radioId}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={handleChange}\n onClick={handleClick}\n disabled={disabled}\n value={value}\n aria-describedby={descriptionId || undefined}\n className=\"radio-button__input\"\n {...props}\n />\n <label\n htmlFor={radioId}\n className={labelWrapperClasses}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <span className=\"radio-button__icon-wrapper\" aria-hidden=\"true\">\n {checked ? (\n <RiRadioButtonLine className=\"radio-button__icon\" />\n ) : (\n <RiCircleLine className=\"radio-button__icon\" />\n )}\n </span>\n {label && (\n <Text\n variant={resolvedLabelProps.variant ?? \"body-p2\"}\n as={resolvedLabelProps.as ?? \"span\"}\n {...resolvedLabelProps}\n className={labelClassName}\n >\n {label}\n </Text>\n )}\n </label>\n </div>\n {description && (\n <div id={descriptionId} className=\"radio-button__description\">\n {description}\n </div>\n )}\n </div>\n );\n }\n);\n\nRadioButton.displayName = \"RadioButton\";\n\n// RadioButton.Group\nexport interface RadioButtonGroupProps {\n /** 그룹 라벨 */\n label?: React.ReactNode;\n /** 그룹 라벨 스타일 오버라이드 (옵션) */\n labelProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 그룹 설명 */\n description?: React.ReactNode;\n /** 그룹 설명 스타일 오버라이드 (옵션) */\n descriptionProps?: Omit<React.ComponentProps<typeof Text>, \"children\" | \"variant\"> & {\n variant?: React.ComponentProps<typeof Text>[\"variant\"];\n };\n /** 선택된 값 (controlled) */\n value?: string;\n /** 초기 선택 값 (uncontrolled) */\n defaultValue?: string;\n /** 값 변경 핸들러 (선택 해제 시 value는 undefined) */\n onChange?: (value: string | undefined) => void;\n /** 비활성화 상태 */\n disabled?: boolean;\n /** name (미지정 시 내부 생성) */\n name?: string;\n /** 자식 RadioButton 컴포넌트들 */\n children: React.ReactNode;\n /** 추가 CSS 클래스명 */\n className?: string;\n}\n\n/** RadioButton.Group은 여러 RadioButton을 그룹화하여 단일 선택을 관리한다. */\nexport const RadioButtonGroup = ({\n label,\n labelProps,\n description,\n descriptionProps,\n value: valueProp,\n defaultValue,\n onChange,\n disabled,\n name,\n children,\n className = \"\",\n}: RadioButtonGroupProps) => {\n const [internalValue, setInternalValue] = React.useState<string | undefined>(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : internalValue;\n\n const groupId = React.useId();\n const groupName = name || `radio-group-${groupId}`;\n const descriptionId = description ? `${groupId}-description` : undefined;\n const resolvedGroupLabelProps = labelProps ?? {};\n const resolvedGroupDescriptionProps = descriptionProps ?? {};\n\n const groupLabelClassName = [\"radio-button-group__label\", resolvedGroupLabelProps.className]\n .filter(Boolean)\n .join(\" \");\n const groupDescriptionClassName = [\n \"radio-button-group__description\",\n resolvedGroupDescriptionProps.className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const baseClasses = [\n \"radio-button-group\",\n disabled && \"radio-button-group--disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement<RadioButtonProps>(child) && child.type === RadioButton) {\n const radioValue = child.props.value;\n if (radioValue === undefined) {\n console.warn(\"RadioButton.Group 내부의 RadioButton은 value prop이 필요합니다.\");\n return child;\n }\n\n const isChecked = value === radioValue;\n\n return React.cloneElement(child, {\n name: groupName,\n checked: isChecked,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n if (!isControlled) setInternalValue(radioValue);\n onChange?.(radioValue);\n } else {\n if (!isControlled) setInternalValue(undefined);\n onChange?.(undefined);\n }\n child.props.onChange?.(e);\n },\n disabled: disabled || child.props.disabled,\n });\n }\n return child;\n });\n\n return (\n <div className={baseClasses} role=\"radiogroup\" aria-describedby={descriptionId || undefined}>\n {label && (\n <Text\n variant={resolvedGroupLabelProps.variant ?? \"subtitle-p2\"}\n as={resolvedGroupLabelProps.as ?? \"div\"}\n {...resolvedGroupLabelProps}\n className={groupLabelClassName}\n >\n {label}\n </Text>\n )}\n {description && (\n <Text\n id={descriptionId}\n variant={resolvedGroupDescriptionProps.variant ?? \"body-p3\"}\n as={resolvedGroupDescriptionProps.as ?? \"div\"}\n {...resolvedGroupDescriptionProps}\n className={groupDescriptionClassName}\n >\n {description}\n </Text>\n )}\n <div className=\"radio-button-group__content\">{enhancedChildren}</div>\n </div>\n );\n};\n\nRadioButtonGroup.displayName = \"RadioButtonGroup\";\n\n// RadioButton.Group을 RadioButton의 정적 프로퍼티로 추가\n(RadioButton as typeof RadioButton & { Group: typeof RadioButtonGroup }).Group = RadioButtonGroup;\n\n","import React from \"react\";\nimport \"./tag.css\";\nimport { Text } from \"../Typography/Typography\";\n\nexport type TagType = \"solid\" | \"outline\" | \"weak\";\nexport type TagSize = \"medium\" | \"small\";\nexport type TagState = \"enabled\" | \"error\" | \"progress\" | \"warning\" | \"success\";\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 태그 타입 (solid, outline, weak) */\n type?: TagType;\n /** 태그 크기 */\n size?: TagSize;\n /** 태그 상태 (type이 weak일 때만 사용 가능) */\n state?: TagState;\n /** 태그 라벨 */\n label: React.ReactNode;\n /** Prefix 아이콘 */\n prefixIcon?: React.ReactNode;\n /** Suffix 아이콘 */\n suffixIcon?: React.ReactNode;\n}\n\n/** Tag 컴포넌트는 콘텐츠의 속성, 상태, 카테고리를 시각적으로 표현하는 읽기 전용 라벨 컴포넌트다. */\nexport const Tag = ({\n type = \"solid\",\n size = \"medium\",\n state = \"enabled\",\n label,\n prefixIcon,\n suffixIcon,\n className = \"\",\n ...props\n}: TagProps) => {\n // type이 weak가 아닐 때는 state를 무시하고 enabled로 처리\n const effectiveState = type === \"weak\" ? state : \"enabled\";\n\n // className은 마지막에 두고, tag.css는 타입/상태를 :where()로 넣어서 전달한 className이 우선 적용되도록 함\n const resolvedClassName = [\n \"tag\",\n `tag--${type}`,\n `tag--${size}`,\n `tag--${effectiveState}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n const textVariant = size === \"medium\" ? \"body-p2\" : \"body-p3\";\n\n return (\n <span {...props} className={resolvedClassName}>\n {prefixIcon && <span className=\"tag__prefix-icon\">{prefixIcon}</span>}\n <Text variant={textVariant}>{label}</Text>\n {suffixIcon && <span className=\"tag__suffix-icon\">{suffixIcon}</span>}\n </span>\n );\n};\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { Text } from \"../Typography/Typography\";\nimport \"./tooltip.css\";\n\nexport type TooltipPosition =\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport type TooltipType = \"word\" | \"sentence\";\n\nexport interface TooltipProps {\n /** 툴팁에 표시할 내용 */\n label: React.ReactNode;\n /** 툴팁 타입 (word: 단어형, sentence: 장문형) */\n type?: TooltipType;\n /** Prefix 아이콘 (왼쪽) */\n prefixIcon?: React.ReactNode;\n /** Close 버튼 클릭 핸들러 (제공 시 닫기 버튼이 표시됨) */\n onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n /** 툴팁이 표시될 방향 */\n direction?: TooltipPosition;\n /** 화살표 표시 여부 */\n withArrow?: boolean;\n /** 툴팁 열림 상태 (controlled) */\n opened?: boolean;\n /** 툴팁 초기 열림 상태 (uncontrolled) */\n defaultOpened?: boolean;\n /** 툴팁 비활성화 */\n disabled?: boolean;\n /** 툴팁 너비 */\n width?: number | string;\n /** 툴팁 오프셋 (px) */\n offset?: number;\n /** 포털 사용 여부 */\n withinPortal?: boolean;\n /** 툴팁 표시 지연 시간 (ms) */\n openDelay?: number;\n /** 툴팁 숨김 지연 시간 (ms) */\n closeDelay?: number;\n /** 툴팁이 표시될 대상 요소 */\n children: React.ReactElement;\n /** 추가 클래스명 */\n className?: string;\n}\n\n/** Tooltip 컴포넌트는 사용자에게 추가 정보나 설명을 제공하는 작은 팝오버입니다. */\nexport const Tooltip = ({\n label,\n type = \"word\",\n prefixIcon,\n onClose,\n direction = \"top\",\n withArrow = true,\n opened: openedProp,\n defaultOpened = false,\n disabled = false,\n width,\n offset = 8,\n withinPortal = true,\n openDelay = 0,\n closeDelay = 0,\n children,\n className = \"\",\n}: TooltipProps) => {\n const [opened, setOpened] = useState(defaultOpened);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const openTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const closeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isControlled = openedProp !== undefined;\n const isOpened = isControlled ? openedProp : opened;\n\n // 타임아웃 정리\n useEffect(() => {\n return () => {\n if (openTimeoutRef.current) {\n clearTimeout(openTimeoutRef.current);\n }\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n };\n }, []);\n\n const handleMouseEnter = () => {\n if (!disabled && !isControlled) {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n if (openDelay > 0) {\n openTimeoutRef.current = setTimeout(() => {\n setOpened(true);\n }, openDelay);\n } else {\n setOpened(true);\n }\n }\n };\n\n const handleMouseLeave = () => {\n if (!disabled && !isControlled) {\n if (openTimeoutRef.current) {\n clearTimeout(openTimeoutRef.current);\n openTimeoutRef.current = null;\n }\n if (closeDelay > 0) {\n closeTimeoutRef.current = setTimeout(() => {\n setOpened(false);\n }, closeDelay);\n } else {\n setOpened(false);\n }\n }\n };\n\n const handleFocus = () => {\n if (!disabled && !isControlled) {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n if (openDelay > 0) {\n openTimeoutRef.current = setTimeout(() => {\n setOpened(true);\n }, openDelay);\n } else {\n setOpened(true);\n }\n }\n };\n\n const handleBlur = () => {\n if (!disabled && !isControlled) {\n if (openTimeoutRef.current) {\n clearTimeout(openTimeoutRef.current);\n openTimeoutRef.current = null;\n }\n if (closeDelay > 0) {\n closeTimeoutRef.current = setTimeout(() => {\n setOpened(false);\n }, closeDelay);\n } else {\n setOpened(false);\n }\n }\n };\n\n const handleCloseClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (onClose) {\n onClose(e);\n }\n if (!disabled && !isControlled) {\n setOpened(false);\n }\n };\n\n const tooltipContent = (\n <div\n className={`tooltip tooltip--${type} tooltip--${direction} ${withArrow ? \"tooltip--with-arrow\" : \"\"} ${className}`}\n style={width ? { width: typeof width === \"number\" ? `${width}px` : width } : undefined}\n role=\"tooltip\"\n >\n <div className=\"tooltip__content\">\n {prefixIcon && (\n <div className=\"tooltip__prefix-icon\">\n {prefixIcon}\n </div>\n )}\n <div className=\"tooltip__label\">\n <Text variant=\"body-p3\">{label}</Text>\n </div>\n {onClose && (\n <button\n type=\"button\"\n className=\"tooltip__close-button\"\n onClick={handleCloseClick}\n aria-label=\"Close tooltip\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n {withArrow && (\n <div\n className={`tooltip__arrow tooltip__arrow--${direction.split(\"-\")[0]}`}\n />\n )}\n </div>\n );\n\n return (\n <div\n ref={wrapperRef}\n className=\"tooltip__wrapper\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n {children}\n {isOpened && !disabled && tooltipContent}\n </div>\n );\n};\n","import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n XCircleIcon,\n ExclamationTriangleIcon,\n CheckCircleIcon,\n InformationCircleIcon,\n} from \"@heroicons/react/24/solid\";\nimport { useBreakpoint } from \"../../shared/hooks/useMediaQuery\";\nimport { Text } from \"../Typography/Typography\";\nimport \"./toast.css\";\n\nexport type ToastSize = \"medium\" | \"small\";\nexport type ToastState =\n | \"default\"\n | \"error\"\n | \"warning\"\n | \"success\"\n | \"information\";\nexport type ToastPosition = \"top\" | \"bottom\";\nexport type ToastHorizontalAlign = \"center\" | \"left\" | \"right\";\n\nexport interface ToastProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"style\"> {\n /** Toast 크기. 미지정 시 breakpoint 기준(tablet 미만: small, 이상: medium). 지정 시 해당 값으로 오버라이드 */\n size?: ToastSize;\n /** Toast 상태 (default, error, warning, success, information) */\n state?: ToastState;\n /** Toast 메시지 */\n label: React.ReactNode;\n /** State 아이콘 (state에 따라 자동으로 표시되지만, 커스텀 아이콘을 전달할 수 있음) */\n icon?: React.ReactNode;\n /** Toast 위치 (top: 상단, bottom: 하단) - 기본값: top */\n position?: ToastPosition;\n /** 수평 정렬 (center: 중앙, left: 왼쪽, right: 오른쪽) - 기본값: center */\n horizontalAlign?: ToastHorizontalAlign;\n /** 상단 여백 (px) - 기본값: medium일 때 60px, small일 때 20px */\n topOffset?: number;\n /** 하단 여백 (px) - 기본값: 20px */\n bottomOffset?: number;\n /** 좌우 여백 (px) - small 사이즈일 때만 적용, 기본값: 16px */\n horizontalPadding?: number;\n /** 추가 스타일 (position이 명시되면 fixed position 로직을 건너뜁니다) */\n style?: React.CSSProperties;\n}\n\n/** Toast 컴포넌트는 화면에 짧은 시간 동안 나타났다가 자동으로 사라지는 경량 알림 컴포넌트다. */\nexport const Toast = (props: ToastProps) => {\n const {\n size: sizeProp,\n state = \"default\",\n label,\n icon,\n position = \"top\",\n horizontalAlign = \"center\",\n topOffset,\n bottomOffset,\n horizontalPadding,\n className = \"\",\n style,\n ...rest\n } = props;\n\n const { isUnderTablet } = useBreakpoint();\n /** breakpoint 우선, size prop 있으면 오버라이드 (Dialog/TextInput과 동일) */\n const size: ToastSize = sizeProp ?? (isUnderTablet ? \"small\" : \"medium\");\n\n const baseClasses = [\"toast\", `toast--${size}`, `toast--${state}`, className]\n .filter(Boolean)\n .join(\" \");\n\n // 기본 위치 값 계산 (Layout 스펙: desktop/tablet 60px, mobile 20px)\n const defaultTopOffset = size === \"medium\" ? 60 : 20;\n const defaultBottomOffset = size === \"medium\" ? 60 : 20;\n const defaultHorizontalPadding = 16;\n\n // style prop에 position이 명시되어 있으면 fixed position 로직을 건너뜀\n const hasCustomPosition = style?.position !== undefined;\n\n // 위치 스타일 계산\n const positionStyles: React.CSSProperties = hasCustomPosition\n ? {\n // style prop에 position이 있으면 그대로 사용 (문서/스토리북용)\n ...style,\n }\n : {\n // 실제 사용: fixed position\n position: \"fixed\",\n zIndex: 1000,\n ...style,\n };\n\n // 커스텀 position이 없을 때만 위치 스타일 적용\n if (!hasCustomPosition) {\n // 수직 위치\n if (position === \"top\") {\n positionStyles.top = `${topOffset ?? defaultTopOffset}px`;\n positionStyles.bottom = \"auto\";\n } else {\n positionStyles.bottom = `${bottomOffset ?? defaultBottomOffset}px`;\n positionStyles.top = \"auto\";\n }\n\n // 수평 정렬\n if (size === \"small\") {\n // Mobile: 좌우 패딩 적용\n const padding = horizontalPadding ?? defaultHorizontalPadding;\n positionStyles.left = `${padding}px`;\n positionStyles.right = `${padding}px`;\n positionStyles.transform = \"none\";\n positionStyles.width = `calc(100% - ${padding * 2}px)`;\n } else {\n // Desktop/Tablet: 중앙 정렬 또는 좌우 정렬\n if (horizontalAlign === \"center\") {\n positionStyles.left = \"50%\";\n positionStyles.right = \"auto\";\n positionStyles.transform = \"translateX(-50%)\";\n positionStyles.width = \"auto\";\n positionStyles.minWidth = \"540px\";\n positionStyles.maxWidth = \"760px\";\n } else if (horizontalAlign === \"left\") {\n positionStyles.left = \"16px\";\n positionStyles.right = \"auto\";\n positionStyles.transform = \"none\";\n positionStyles.width = \"auto\";\n positionStyles.minWidth = \"540px\";\n positionStyles.maxWidth = \"760px\";\n } else {\n positionStyles.right = \"16px\";\n positionStyles.left = \"auto\";\n positionStyles.transform = \"none\";\n positionStyles.width = \"auto\";\n positionStyles.minWidth = \"540px\";\n positionStyles.maxWidth = \"760px\";\n }\n }\n }\n\n // State에 따른 기본 아이콘 (icon prop이 제공되지 않은 경우)\n const defaultIcon =\n !icon && state !== \"default\" ? (\n <div className=\"toast__icon\">\n {state === \"error\" && (\n <XCircleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n {state === \"warning\" && (\n <ExclamationTriangleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n {state === \"success\" && (\n <CheckCircleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n {state === \"information\" && (\n <InformationCircleIcon style={{ width: \"100%\", height: \"100%\" }} />\n )}\n </div>\n ) : icon ? (\n <div className=\"toast__icon\">{icon}</div>\n ) : null;\n\n return (\n <div className={baseClasses} style={positionStyles} {...rest}>\n {defaultIcon}\n <Text variant={size === \"medium\" ? \"heading-h6\" : \"subtitle-p2\"}>\n {label}\n </Text>\n </div>\n );\n};\n\n// useToast hook 관련 타입 및 인터페이스\nexport interface ToastOptions {\n /** Toast 상태 */\n state?: ToastState;\n /** Toast 크기 */\n size?: ToastSize;\n /** 자동으로 사라지는 시간 (ms) - 기본값: 3000 */\n duration?: number;\n /** Toast 위치 */\n position?: ToastPosition;\n /** 수평 정렬 */\n horizontalAlign?: ToastHorizontalAlign;\n /** 상단 여백 */\n topOffset?: number;\n /** 하단 여백 */\n bottomOffset?: number;\n /** 좌우 여백 */\n horizontalPadding?: number;\n}\n\nconst TOAST_EXIT_MS = 250;\n\ninterface ToastItem {\n id: string;\n message: string;\n state: ToastState;\n /** 미지정 시 Toast 내부에서 breakpoint 기준 적용 */\n size?: ToastSize;\n duration: number;\n position: ToastPosition;\n horizontalAlign: ToastHorizontalAlign;\n topOffset?: number;\n bottomOffset?: number;\n horizontalPadding?: number;\n exiting?: boolean;\n}\n\ninterface ToastContextType {\n showToast: (message: string, options?: ToastOptions) => void;\n hideToast: (id: string) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextType | undefined>(\n undefined\n);\n\n/**\n * ToastProvider\n *\n * 앱의 최상위(Root)에 선언하여 전역 Toast 기능을 제공합니다.\n * Portal을 사용하여 document.body에 Toast를 렌더링합니다.\n */\nexport const ToastProvider = ({ children }: { children: React.ReactNode }) => {\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n const showToast = React.useCallback(\n (message: string, options: ToastOptions = {}) => {\n const id = `toast-${Date.now()}-${Math.random()}`;\n const {\n state = \"default\",\n size,\n duration = 3000,\n position = \"top\",\n horizontalAlign = \"center\",\n topOffset,\n bottomOffset,\n horizontalPadding,\n } = options;\n\n const newToast: ToastItem = {\n id,\n message,\n state,\n ...(size !== undefined && { size }),\n duration,\n position,\n horizontalAlign,\n topOffset,\n bottomOffset,\n horizontalPadding,\n };\n\n setToasts((prev) => [...prev, newToast]);\n\n if (duration > 0) {\n setTimeout(() => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, exiting: true } : t))\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, TOAST_EXIT_MS);\n }, duration);\n }\n },\n []\n );\n\n const hideToast = React.useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n return (\n <ToastContext.Provider value={{ showToast, hideToast }}>\n {children}\n {mounted &&\n createPortal(\n <>\n {toasts.map((toast) => (\n <Toast\n key={toast.id}\n state={toast.state}\n size={toast.size}\n label={toast.message}\n position={toast.position}\n horizontalAlign={toast.horizontalAlign}\n topOffset={toast.topOffset}\n bottomOffset={toast.bottomOffset}\n horizontalPadding={toast.horizontalPadding}\n {...(toast.exiting && { className: \"toast--exiting\" })}\n />\n ))}\n </>,\n document.body\n )}\n </ToastContext.Provider>\n );\n};\n\n/**\n * useToast Hook\n *\n * ToastProvider 내부의 컴포넌트에서 호출하여 사용합니다.\n * { showToast } 함수를 반환합니다.\n *\n * @example\n * const { showToast } = useToast();\n * showToast(\"메시지\", { state: \"success\" });\n */\nexport function useToast() {\n const context = React.useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n","/**\n * 로고 SVG 에셋 - 번들에 포함되어 패키지 사용 시 별도 복사 불필요\n */\nimport likelionEngPrimary from \"../assets/logo/likelion-eng-primary.svg\";\nimport likelionEngBlack from \"../assets/logo/likelion-eng-black.svg\";\nimport likelionEngWhite from \"../assets/logo/likelion-eng-white.svg\";\nimport likelionKrPrimary from \"../assets/logo/likelion-kr-primary.svg\";\nimport likelionKrBlack from \"../assets/logo/likelion-kr-black.svg\";\nimport likelionKrWhite from \"../assets/logo/likelion-kr-white.svg\";\nimport bootcampPrimary from \"../assets/logo/bootcamp-primary.svg\";\nimport bootcampBlack from \"../assets/logo/bootcamp-black.svg\";\nimport bootcampWhite from \"../assets/logo/bootcamp-white.svg\";\nimport symbolPrimary from \"../assets/logo/symbol-primary.svg\";\nimport symbolBlack from \"../assets/logo/symbol-black.svg\";\nimport symbolWhite from \"../assets/logo/symbol-white.svg\";\nimport faviconPrimary from \"../assets/logo/favicon-primary.svg\";\nimport faviconBlack from \"../assets/logo/favicon-black.svg\";\n\nexport type LogoColor = \"primary\" | \"black\" | \"white\";\n\nexport const LOGO_URLS: Record<\n string,\n Record<LogoColor, string>\n> = {\n \"likelion-eng\": {\n primary: likelionEngPrimary,\n black: likelionEngBlack,\n white: likelionEngWhite,\n },\n \"likelion-kr\": {\n primary: likelionKrPrimary,\n black: likelionKrBlack,\n white: likelionKrWhite,\n },\n bootcamp: {\n primary: bootcampPrimary,\n black: bootcampBlack,\n white: bootcampWhite,\n },\n symbol: {\n primary: symbolPrimary,\n black: symbolBlack,\n white: symbolWhite,\n },\n favicon: {\n primary: faviconPrimary,\n black: faviconBlack,\n white: faviconPrimary,\n },\n};\n","import React from \"react\";\nimport \"./logo.css\";\nimport { LOGO_URLS } from \"./logo-assets\";\n\nexport type LogoType =\n | \"likelion-eng\"\n | \"likelion-kr\"\n | \"bootcamp\"\n | \"symbol\"\n | \"favicon\"\n | \"og-image\";\n\nexport type LogoColor = \"primary\" | \"black\" | \"white\";\n\nexport type LogoSize = \"large\" | \"medium\" | \"small\" | \"favicon\" | \"og-image\";\n\nexport interface LogoProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 로고 타입 */\n type?: LogoType;\n /** 로고 색상 */\n color?: LogoColor;\n /** 로고 크기 */\n size?: LogoSize;\n /** 서비스 타입 (og-image용) */\n service?: \"likelion\" | \"bootcamp\";\n}\n\nconst getLogoSrc = (type: LogoType, color: LogoColor) => {\n if (type in LOGO_URLS) {\n return LOGO_URLS[type][color];\n }\n return \"\";\n};\n\nconst LionIcon = ({ className: iconClassName }: { className?: string }) => (\n <img\n src={LOGO_URLS.symbol.white}\n alt=\"Lion Icon\"\n className={iconClassName}\n />\n);\n\n/**\n * Logo 컴포넌트는 브랜드 아이덴티티를 표현하는 로고 컴포넌트다.\n * `size` 외에 `className` 또는 `style`로 너비/높이를 직접 지정할 수 있다.\n */\nexport const Logo = ({\n type = \"likelion-kr\",\n color = \"primary\",\n size = \"medium\",\n service = \"likelion\",\n className = \"\",\n style,\n ...props\n}: LogoProps) => {\n const logoClasses = [\n \"logo\",\n `logo--${type}`,\n `logo--${color}`,\n `logo--${size}`,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const hasCustomSize = !!(className || style);\n const rootProps = hasCustomSize\n ? { ...props, className, style }\n : { ...props, className: `${logoClasses} ${className}`.trim(), style };\n\n const imgStyle = hasCustomSize\n ? { width: \"100%\", height: \"100%\", display: \"block\" as const, objectFit: \"contain\" as const }\n : { width: \"100%\", height: \"100%\", display: \"block\" as const };\n const innerStyle = hasCustomSize\n ? { width: \"100%\", height: \"100%\", display: \"flex\" as const, alignItems: \"center\", justifyContent: \"center\" }\n : undefined;\n\n const renderLogo = (content: React.ReactNode) => {\n if (hasCustomSize) {\n return (\n <div {...rootProps}>\n <div className={logoClasses} style={innerStyle}>\n {content}\n </div>\n </div>\n );\n }\n return <div {...rootProps}>{content}</div>;\n };\n\n // 멋쟁이사자처럼_ENG\n if (type === \"likelion-eng\") {\n return renderLogo(\n <img\n src={getLogoSrc(\"likelion-eng\", color)}\n alt=\"멋쟁이사자처럼_ENG\"\n style={imgStyle}\n />\n );\n }\n\n // 멋쟁이사자처럼_KR\n if (type === \"likelion-kr\") {\n return renderLogo(\n <img\n src={getLogoSrc(\"likelion-kr\", color)}\n alt=\"멋쟁이사자처럼_KR\"\n style={imgStyle}\n />\n );\n }\n\n // 멋사 부트캠프\n if (type === \"bootcamp\") {\n return renderLogo(\n <img\n src={getLogoSrc(\"bootcamp\", color)}\n alt=\"멋사 부트캠프\"\n style={imgStyle}\n />\n );\n }\n\n const getText = () => null;\n\n // 심볼\n if (type === \"symbol\") {\n return renderLogo(\n <img\n src={getLogoSrc(\"symbol\", color)}\n alt=\"심볼\"\n style={imgStyle}\n />\n );\n }\n\n // 파비콘\n if (type === \"favicon\") {\n return renderLogo(\n <img\n src={getLogoSrc(\"favicon\", color)}\n alt=\"파비콘\"\n style={imgStyle}\n />\n );\n }\n\n // OG 이미지\n if (type === \"og-image\") {\n const ogText = service === \"likelion\" ? \"멋쟁이사자처럼\" : \"멋사 부트캠프\";\n const ogLogoSrc =\n service === \"likelion\"\n ? getLogoSrc(\"likelion-kr\", \"white\")\n : getLogoSrc(\"bootcamp\", \"white\");\n const ogContent = (\n <div className=\"logo__og-container\">\n <img\n src={ogLogoSrc}\n alt={ogText}\n style={{ width: \"auto\", height: \"37.8px\", display: \"block\" }}\n />\n </div>\n );\n return hasCustomSize ? (\n <div {...rootProps}>\n <div className={logoClasses} style={innerStyle}>\n {ogContent}\n </div>\n </div>\n ) : (\n <div {...rootProps}>{ogContent}</div>\n );\n }\n\n const text = getText();\n const fallbackContent = (\n <>\n <div className=\"logo__icon\">\n <LionIcon />\n </div>\n {text && <span className=\"logo__text\">{text}</span>}\n </>\n );\n return hasCustomSize ? (\n <div {...rootProps}>\n <div className={logoClasses} style={innerStyle}>\n {fallbackContent}\n </div>\n </div>\n ) : (\n <div {...rootProps}>{fallbackContent}</div>\n );\n};\n","// Screen Foundation - 브레이크포인트 관련 유틸리티 export\nexport { useBreakpoint, useMediaQuery, BreakpointProvider } from \"../../shared/hooks/useMediaQuery\";\n\n// 브레이크포인트 상수 (기본 - Mobile/Tablet/Desktop)\nexport const BREAKPOINTS = {\n mobile: {\n min: 375,\n max: 743,\n },\n tablet: {\n min: 744,\n max: 1279,\n },\n desktop: {\n min: 1280,\n },\n} as const;\n\n// Tailwind Screens 설정 - 주요 브레이크포인트 (mo, tb, pc)\nexport const TAILWIND_SCREENS = {\n mo: \"375px\", // Mobile\n tb: \"744px\", // Tablet\n pc: \"1280px\", // Desktop\n} as const;\n\n// 미디어 쿼리 문자열\nexport const MEDIA_QUERIES = {\n mobile: \"(min-width: 375px) and (max-width: 743px)\",\n tablet: \"(min-width: 744px) and (max-width: 1279px)\",\n desktop: \"(min-width: 1280px)\",\n underTablet: \"(max-width: 743px)\",\n} as const;\n\n// 레이아웃 시스템 (Margin, Column, Gutter)\nexport const LAYOUT_SYSTEM = {\n mobile: {\n margin: 16, // 화면 가장자리 여백\n column: 4, // 컬럼 수\n gutter: 16, // 컬럼 사이 간격\n },\n tablet: {\n margin: 24,\n column: 8,\n gutter: 24,\n },\n desktop: {\n margin: 24,\n column: 12,\n gutter: 24,\n },\n} as const;\n"],"mappings":"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","names":["React","React","Text","_a","_b","variant","decoration","as","children","className","props","__objRest","defaultTag","level","Tag","baseClasses","React","__spreadValues","jsx","jsxs","ensureTextAsSpan","node","React","Text","_a","children","rest","__objRest","__spreadProps","__spreadValues","ActionButton","_b","size","color","type","htmlType","state","label","prefixIcon","suffixIcon","loading","className","disabled","props","isDisabled","actualState","baseClasses","textVariant","jsx","IconButton","_a","_b","size","color","type","state","icon","className","disabled","htmlType","propsStyle","customColor","props","__objRest","isDisabled","isWeakType","actualState","colorClass","typeClass","baseClasses","shouldHide","customStyle","__spreadValues","__spreadProps","React","useState","jsx","Badge","_a","_b","type","variant","value","maxValue","className","props","__objRest","baseClasses","displayValue","__spreadProps","__spreadValues","Text","jsx","jsxs","Tab","_a","_b","type","size","badge","label","mode","className","selected","disabled","onClick","props","__objRest","internalPressed","setInternalPressed","useState","isControlled","isPressed","handleClick","e","prev","state","baseClasses","__spreadProps","__spreadValues","Badge","TabGroup","valueProp","defaultValue","onChange","children","internalValue","setInternalValue","React","value","enhancedChildren","child","_c","tabValue","isSelected","React","React","CheckIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","CheckIcon_default","React","ChevronDownIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ChevronDownIcon_default","React","XMarkIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","XMarkIcon_default","jsx","jsxs","ChipComponent","_a","_b","type","size","variant","value","onChange","checkedProp","defaultChecked","selectedValue","selectedValues","label","prefixIcon","suffixIcon","showCheck","showClose","onClose","className","disabled","onClick","props","__objRest","internalChecked","setInternalChecked","React","isControlled","checked","shouldRenderCheckIcon","displayLeftIcon","CheckIcon_default","hasPrefix","hasSuffix","paddingClass","baseClasses","handleClick","e","prev","handleClose","__spreadProps","__spreadValues","Text","ChipGroup","valueProp","defaultValue","multiple","children","rest","internalValue","setInternalValue","handleChange","chipValue","arr","next","v","enhancedChildren","child","_c","_d","Chip","React","createPortal","createContext","useContext","useSyncExternalStore","BreakpointContext","BreakpointProvider","useMediaQuery","query","callback","matchMedia","useBreakpoint","_a","_b","_c","_d","contextValue","isMobileQuery","isTabletQuery","isDesktopQuery","isUnderTabletQuery","Fragment","jsx","jsxs","DialogContext","React","DialogRoot","_a","_b","open","onClose","closeOnOverlayClick","closeOnEsc","withClose","variant","align","title","description","icon","actionItems","footerLayout","content","className","children","props","__objRest","isUnderTablet","useBreakpoint","mounted","setMounted","originalStyle","handleKeyDown","e","resolvedAlign","baseClasses","handleOverlayClick","contentNode","DialogHeader","DialogBody","DialogFooter","item","idx","DialogButton","dialogOverlay","__spreadProps","__spreadValues","XMarkIcon_default","createPortal","Text","layout","layoutClass","label","color","type","size","prefixIcon","suffixIcon","loading","disabled","onClick","closeOnClick","style","context","buttonWidth","defaultSize","defaultType","defaultColor","handleClick","ActionButton","Dialog","GlobalDialogContext","DialogProvider","dialogs","setDialogs","close","id","prev","d","closeAll","options","alert","resolve","confirm","_c","dialog","useDialog","useState","useId","React","ExclamationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ExclamationCircleIcon_default","React","InformationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","InformationCircleIcon_default","Fragment","jsx","jsxs","TextInput","_a","_b","required","size","error","description","maxLength","prefixIcon","suffixIcon","suffixUnit","title","accentIcon","className","style","id","value","defaultValue","readOnly","onChange","onFocus","onBlur","props","__objRest","generatedId","useId","inputId","focused","setFocused","useState","effectiveSize","isControlled","internalValue","setInternalValue","currentValue","inputState","count","showCount","countValue","countTotal","iconNode","ExclamationCircleIcon_default","helpVariant","handleFocus","e","handleBlur","handleChange","next","inputClasses","Text","__spreadProps","__spreadValues","React","jsx","jsxs","Toggle","React","_a","ref","_b","size","label","labelPosition","description","checkedProp","defaultChecked","onChange","disabled","className","id","props","__objRest","inputRef","combinedRef","node","internalChecked","setInternalChecked","isControlled","checked","handleChange","e","generatedId","toggleId","descriptionId","baseClasses","__spreadValues","Text","React","RiCheckboxBlankLine","RiCheckboxFill","RiCheckboxIndeterminateFill","jsx","jsxs","Checkbox","React","_a","ref","_b","label","labelProps","description","value","checkedProp","defaultChecked","onChange","disabled","indeterminate","className","id","props","__objRest","inputRef","combinedRef","node","internalChecked","setInternalChecked","isControlled","checked","handleChange","e","generatedId","checkboxId","descriptionId","baseClasses","resolvedLabelProps","labelClassName","__spreadValues","RiCheckboxIndeterminateFill","RiCheckboxFill","RiCheckboxBlankLine","Text","__spreadProps","CheckboxGroup","descriptionProps","multiple","valueProp","defaultValue","children","_c","_d","internalValue","setInternalValue","checkboxValue","newValue","v","groupId","resolvedGroupLabelProps","resolvedGroupDescriptionProps","groupLabelClassName","groupDescriptionClassName","enhancedChildren","child","isChecked","React","useCheckboxGroup","config","options","defaultValue","valueProp","onChangeProp","internalValue","setInternalValue","isControlled","value","onChange","newValue","allSelected","someSelected","selectAllChecked","selectAllIndeterminate","handleSelectAll","e","React","React","RiCheckboxCircleFill","jsx","jsxs","SelectMenu","React","props","ref","_a","items","size","value","defaultValue","onChange","multiple","itemTextProps","suffixIcon","className","id","rest","__objRest","isControlled","internalValue","setInternalValue","currentValue","isMultiple","isUnderTablet","useBreakpoint","resolvedSize","generatedId","menuId","commitValue","next","newValue","prevArray","v","baseClasses","resolvedItemTextProps","defaultVariant","__spreadProps","__spreadValues","item","idx","_b","isSelected","optionId","defaultSuffix","RiCheckboxCircleFill","suffixNode","Text","SelectMenuOverlay","children","openProp","defaultOpen","onOpenChange","menuContainerStyle","menuProps","internalOpen","setInternalOpen","open","wrapperRef","setOpen","handleClickOutside","event","handleToggle","triggerNode","originalOnClick","jsx","jsxs","SelectHeader","React","_a","ref","_b","type","title","required","valueProp","placeholder","disabled","error","description","accentIcon","onClick","onClear","icon","className","id","items","defaultValue","onChange","multiple","showClear","wrapperClassName","wrapperStyle","width","size","menuItemTextProps","menuSuffixIcon","menuGap","menuClassName","menuStyle","props","__objRest","isUnderTablet","useBreakpoint","generatedId","selectHeaderId","descriptionId","resolvedSize","internalValue","setInternalValue","isSelectMode","isControlled","currentValueForSelect","handleSelectChange","next","displayValue","v","value","i","found","hasValue","showClearButton","iconNode","ExclamationCircleIcon_default","InformationCircleIcon_default","helpVariant","baseClasses","handleClear","e","headerButton","__spreadProps","__spreadValues","Text","XMarkIcon_default","ChevronDownIcon_default","SelectMenuOverlay","React","CheckCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","CheckCircleIcon_default","React","ExclamationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ExclamationCircleIcon_default","React","ExclamationTriangleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","ExclamationTriangleIcon_default","React","InformationCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","InformationCircleIcon_default","React","XCircleIcon","_a","svgRef","_b","title","titleId","props","__objRest","ForwardRef","XCircleIcon_default","jsx","jsxs","LoadingSpinner","SelectBox","_a","_b","type","size","state","label","required","placeholder","items","value","defaultValue","onChange","multiple","helperText","className","style","width","headerType","onClear","showClear","wrapperStyle","onClick","id","itemTextProps","suffixIcon","restHeaderProps","__objRest","isDisabled","isError","isSuccess","showLabel","resolvedPlaceholder","resolvedWidth","iconNode","isClassNameObj","isStyleObj","rootClassName","headerClassName","menuClassName","styleForParts","rootStyle","headerStyle","menuStyle","baseClasses","helperTextNode","ExclamationCircleIcon_default","CheckCircleIcon_default","Text","SelectHeader","__spreadValues","React","RiArrowLeftSLine","RiArrowRightSLine","RiMoreLine","Fragment","jsx","jsxs","range","start","end","length","_","idx","createPaginationItems","totalPages","currentPage","siblingCount","showEdgeButtons","showPrevNext","safeCurrent","items","add","item","isFirstPage","isLastPage","totalPageNumbers","page","leftSiblingIndex","rightSiblingIndex","shouldShowLeftEllipsis","shouldShowRightEllipsis","leftItemCount","rightItemCount","createBasicPaginationItems","Pagination","_a","_b","onChange","type","className","rest","__objRest","size","variant","React","handleItemClick","handleEllipsisClick","key","rootClasses","__spreadProps","__spreadValues","isPage","isSelected","isDisabled","itemClasses","labelText","ariaLabel","RiMoreLine","RiArrowLeftSLine","RiArrowRightSLine","Text","React","RiCircleLine","RiRadioButtonLine","jsx","jsxs","RadioButton","React","_a","ref","_b","label","labelProps","description","value","checkedProp","defaultChecked","onChange","disabled","className","id","name","onClick","props","__objRest","internalChecked","setInternalChecked","isControlled","checked","handleChange","e","handleClick","syntheticEvent","__spreadProps","__spreadValues","generatedId","radioId","descriptionId","isHovered","setIsHovered","baseClasses","labelWrapperClasses","resolvedLabelProps","labelClassName","RiRadioButtonLine","RiCircleLine","Text","RadioButtonGroup","descriptionProps","valueProp","defaultValue","children","_c","_d","internalValue","setInternalValue","groupId","groupName","resolvedGroupLabelProps","resolvedGroupDescriptionProps","groupLabelClassName","groupDescriptionClassName","enhancedChildren","child","radioValue","isChecked","jsx","jsxs","Tag","_a","_b","type","size","state","label","prefixIcon","suffixIcon","className","props","__objRest","effectiveState","resolvedClassName","textVariant","__spreadProps","__spreadValues","Text","useState","useRef","useEffect","jsx","jsxs","Tooltip","label","type","prefixIcon","onClose","direction","withArrow","openedProp","defaultOpened","disabled","width","offset","withinPortal","openDelay","closeDelay","children","className","opened","setOpened","useState","wrapperRef","useRef","openTimeoutRef","closeTimeoutRef","isControlled","isOpened","useEffect","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","handleCloseClick","e","tooltipContent","Text","React","createPortal","Fragment","jsx","jsxs","Toast","props","_a","sizeProp","state","label","icon","position","horizontalAlign","topOffset","bottomOffset","horizontalPadding","className","style","rest","__objRest","isUnderTablet","useBreakpoint","size","baseClasses","defaultTopOffset","defaultBottomOffset","defaultHorizontalPadding","hasCustomPosition","positionStyles","__spreadValues","padding","defaultIcon","XCircleIcon_default","ExclamationTriangleIcon_default","CheckCircleIcon_default","InformationCircleIcon_default","__spreadProps","Text","TOAST_EXIT_MS","ToastContext","React","ToastProvider","children","toasts","setToasts","mounted","setMounted","showToast","message","options","id","duration","newToast","prev","t","toast","hideToast","createPortal","useToast","context","LOGO_URLS","likelion_eng_primary_default","likelion_eng_black_default","likelion_eng_white_default","likelion_kr_primary_default","likelion_kr_black_default","likelion_kr_white_default","bootcamp_primary_default","bootcamp_black_default","bootcamp_white_default","symbol_primary_default","symbol_black_default","symbol_white_default","favicon_primary_default","favicon_black_default","Fragment","jsx","jsxs","getLogoSrc","type","color","LOGO_URLS","LionIcon","iconClassName","Logo","_a","_b","size","service","className","style","props","__objRest","logoClasses","hasCustomSize","rootProps","__spreadProps","__spreadValues","imgStyle","innerStyle","renderLogo","content","getText","ogText","ogLogoSrc","ogContent","text","fallbackContent","BREAKPOINTS","TAILWIND_SCREENS","MEDIA_QUERIES","LAYOUT_SYSTEM"]}