{"version":3,"sources":["../src/components/Button.tsx","../src/utils/cn.ts","../src/components/Badge.tsx","../src/components/Input.tsx","../src/components/Breadcrumb.tsx","../src/components/Tabs.tsx","../src/components/PillTabs.tsx","../src/components/SidebarNav.tsx","../src/components/Card.tsx","../src/components/Table.tsx","../src/components/Modal.tsx","../src/components/Toast.tsx","../src/components/Avatar.tsx","../src/components/DropdownMenu.tsx","../src/components/UserMenu.tsx","../src/components/IntegrationStatusCard.tsx","../src/components/Tooltip.tsx","../src/components/DescriptionList.tsx","../src/components/Upload.tsx","../src/components/BulkActionBar.tsx","../src/components/Callout.tsx","../src/components/Stepper.tsx"],"sourcesContent":["import React from 'react'\nimport { cn } from '@/utils/cn'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  variant?: ButtonVariant\n  size?: ButtonSize\n  isLoading?: boolean\n  leftIcon?: string\n  rightIcon?: string\n  children?: React.ReactNode\n}\n\nconst variantStyles: Record<ButtonVariant, string> = {\n  primary:\n    'bg-teal-500 hover:bg-teal-600 active:bg-teal-700 text-white font-bold shadow-soft-md hover:shadow-soft-lg focus:outline-2 focus:outline-teal-400 focus:outline-offset-2',\n  secondary:\n    'bg-teal-50 hover:bg-teal-100 active:bg-teal-200 text-teal-600 font-bold shadow-soft-md hover:shadow-soft-lg focus:outline-2 focus:outline-teal-400 focus:outline-offset-2',\n  outline:\n    'border-[1.5px] border-slate-200 hover:border-slate-300 hover:bg-slate-50 active:bg-slate-100 text-slate-800 font-bold focus:outline-2 focus:outline-teal-400 focus:outline-offset-2',\n  ghost:\n    'text-slate-500 hover:text-slate-800 hover:bg-slate-100 active:bg-slate-200 font-semibold focus:outline-2 focus:outline-teal-400 focus:outline-offset-2',\n  danger:\n    'bg-red-500 hover:bg-red-600 active:bg-red-700 text-white font-bold shadow-soft-md hover:shadow-soft-lg focus:outline-2 focus:outline-red-400 focus:outline-offset-2',\n}\n\nconst sizeStyles: Record<ButtonSize, string> = {\n  sm: 'text-caption px-3 py-1.5 rounded-lg',\n  md: 'text-body-sm px-5 py-2.5 rounded-[10px]',\n  lg: 'text-sm px-7 py-3.5 rounded-xl',\n}\n\nconst iconOnlyStyles: Record<ButtonSize, string> = {\n  sm: 'w-8 h-8 rounded-lg',\n  md: 'w-10 h-10 rounded-[10px]',\n  lg: 'w-12 h-12 rounded-xl',\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  (\n    {\n      variant = 'primary',\n      size = 'md',\n      isLoading = false,\n      leftIcon,\n      rightIcon,\n      className,\n      children,\n      disabled,\n      ...props\n    },\n    ref\n  ) => {\n    const isIconOnly = !children && (leftIcon || rightIcon)\n\n    return (\n      <button\n        ref={ref}\n        className={cn(\n          'inline-flex items-center justify-center gap-1.5 transition-all duration-150 cursor-pointer',\n          variantStyles[variant],\n          isIconOnly ? iconOnlyStyles[size] : sizeStyles[size],\n          isLoading && 'opacity-70 cursor-not-allowed',\n          disabled && !isLoading && 'opacity-50 cursor-not-allowed',\n          className\n        )}\n        disabled={disabled || isLoading}\n        aria-busy={isLoading || undefined}\n        {...props}\n      >\n        {isLoading ? (\n          <>\n            <svg className=\"animate-spin h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\">\n              <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n              <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n            </svg>\n            {children}\n          </>\n        ) : (\n          <>\n            {leftIcon && (\n              <span className=\"material-symbols-outlined text-body-lg\">{leftIcon}</span>\n            )}\n            {children}\n            {rightIcon && (\n              <span className=\"material-symbols-outlined text-body-lg\">{rightIcon}</span>\n            )}\n          </>\n        )}\n      </button>\n    )\n  }\n)\n\nButton.displayName = 'Button'\n","import { clsx, type ClassValue } from 'clsx'\nimport { extendTailwindMerge } from 'tailwind-merge'\n\n/**\n * 커스텀 typography 토큰을 font-size 그룹으로 등록.\n * 등록하지 않으면 twMerge가 text-caption / text-body-sm 등을 font-color 와\n * 같은 그룹으로 잘못 묶어서 text-white 가 사라지는 문제가 생김.\n */\nconst twMerge = extendTailwindMerge({\n  extend: {\n    classGroups: {\n      'font-size': [\n        'text-caption',\n        'text-body-sm',\n        'text-body-md',\n        'text-body-lg',\n        'text-h1',\n        'text-h2',\n        'text-h3',\n        'text-display-sm',\n        'text-display-md',\n        'text-display-lg',\n      ],\n    },\n  },\n})\n\n/**\n * Tailwind CSS 클래스와 clsx 를 조합하여 동적으로 클래스명 처리\n * - 중복된 클래스 자동 병합 (tailwind-merge)\n * - 조건부 클래스 적용 (clsx)\n */\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n","import React from 'react'\n\nexport type BadgeStatus = 'active' | 'in-progress' | 'pending' | 'error' | 'inactive'\n\nconst statusStyles: Record<BadgeStatus, { bg: string; text: string }> = {\n  active: { bg: 'bg-green-50', text: 'text-green-600' },\n  'in-progress': { bg: 'bg-teal-50', text: 'text-teal-600' },\n  pending: { bg: 'bg-yellow-50', text: 'text-amber-700' },\n  error: { bg: 'bg-red-50', text: 'text-red-600' },\n  inactive: { bg: 'bg-slate-100', text: 'text-slate-500' },\n}\n\nexport const BadgeStatus: React.FC<{\n  status: BadgeStatus\n  children: React.ReactNode\n  leftIcon?: string\n  rightIcon?: string\n  className?: string\n}> = ({ status, children, leftIcon, rightIcon, className = '' }) => {\n  const { bg, text } = statusStyles[status]\n  return (\n    <span className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-lg text-caption font-bold ${bg} ${text} ${className}`}>\n      {leftIcon && <span className=\"material-symbols-outlined text-caption\">{leftIcon}</span>}\n      {children}\n      {rightIcon && <span className=\"material-symbols-outlined text-caption\">{rightIcon}</span>}\n    </span>\n  )\n}\n\nexport const DotLabel: React.FC<{\n  color: string\n  children: React.ReactNode\n}> = ({ color, children }) => (\n  <div className=\"flex items-center gap-1.5 text-xs font-semibold text-slate-800\">\n    <span className={`w-1.5 h-1.5 rounded-full ${color}`} />\n    {children}\n  </div>\n)\n\nexport const CountBadge: React.FC<{\n  value: number | string\n  variant?: 'red' | 'teal' | 'default'\n  size?: 'sm' | 'md'\n}> = ({ value, variant = 'default', size = 'sm' }) => {\n  const variantClass = { red: 'bg-red-500', teal: 'bg-teal-500', default: 'bg-slate-500' }[variant]\n  const sizeClass = size === 'sm' ? 'h-[18px] min-w-[18px] px-1 text-caption' : 'h-5 min-w-[20px] px-1.5 text-caption'\n  return (\n    <span className={`text-white rounded-full flex items-center justify-center font-bold ${variantClass} ${sizeClass}`}>\n      {value}\n    </span>\n  )\n}\n\nexport const NotificationDot: React.FC<{\n  variant?: 'red' | 'teal' | 'default'\n}> = ({ variant = 'red' }) => {\n  const variantClass = { red: 'bg-red-500', teal: 'bg-teal-500', default: 'bg-slate-500' }[variant]\n  return (\n    <span className={`absolute -top-0.5 -right-0.5 w-2 h-2 rounded-full ${variantClass} border-2 border-white`} />\n  )\n}\n\nexport const FeatureTag: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n  <span className=\"px-2 py-0.5 bg-slate-100 text-slate-500 rounded-md text-caption font-semibold\">\n    {children}\n  </span>\n)\n","import React, { forwardRef } from 'react'\n\n// ─── Input ────────────────────────────────────────────────────────────────────\n\nexport interface InputProps {\n  type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n  label?: string | React.ReactNode\n  placeholder?: string\n  error?: string\n  helpText?: string\n  disabled?: boolean\n  required?: boolean\n  leftIcon?: string\n  rightIcon?: string\n  leftSlot?: React.ReactNode\n  rightSlot?: React.ReactNode\n  className?: string\n  labelClassName?: string\n  inputClassName?: string\n  value?: string\n  defaultValue?: string\n  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n  id?: string\n  name?: string\n  pattern?: string\n  minLength?: number\n  maxLength?: number\n  step?: number\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n  (\n    {\n      type = 'text',\n      label,\n      placeholder,\n      error,\n      helpText,\n      disabled = false,\n      required = false,\n      leftIcon,\n      rightIcon,\n      leftSlot,\n      rightSlot,\n      className = '',\n      labelClassName = '',\n      inputClassName = '',\n      value,\n      defaultValue,\n      onChange,\n      id,\n      name,\n      pattern,\n      minLength,\n      maxLength,\n      step,\n    },\n    ref\n  ) => {\n    const hasLeft = leftIcon || leftSlot\n    const hasRight = rightIcon || rightSlot\n\n    return (\n      <div className={className}>\n        {label && (\n          <label htmlFor={id} className={`block text-xs font-semibold text-slate-800 mb-1 ${labelClassName}`}>\n            {label}\n            {required && <span className=\"text-red-500 ml-1\">*</span>}\n          </label>\n        )}\n\n        <div className=\"relative\">\n          {leftIcon && (\n            <span className=\"material-symbols-outlined absolute left-3 top-1/2 -translate-y-1/2 text-slate-400 text-body-lg pointer-events-none\">\n              {leftIcon}\n            </span>\n          )}\n          {leftSlot && (\n            <div className=\"absolute left-3 top-1/2 -translate-y-1/2\">{leftSlot}</div>\n          )}\n          {rightIcon && (\n            <span className=\"material-symbols-outlined absolute right-3.5 top-1/2 -translate-y-1/2 text-slate-400 text-body-lg pointer-events-none\">\n              {rightIcon}\n            </span>\n          )}\n          {rightSlot && (\n            <div className=\"absolute right-3.5 top-1/2 -translate-y-1/2 pointer-events-none\">\n              {rightSlot}\n            </div>\n          )}\n\n          <input\n            ref={ref}\n            type={type}\n            placeholder={placeholder}\n            disabled={disabled}\n            required={required}\n            value={value}\n            defaultValue={defaultValue}\n            onChange={onChange}\n            id={id}\n            name={name}\n            pattern={pattern}\n            minLength={minLength}\n            maxLength={maxLength}\n            step={step}\n            className={`\n              w-full bg-slate-50 rounded-[10px]\n              ${hasLeft ? 'pl-9' : 'pl-3.5'} ${hasRight ? 'pr-9' : 'pr-3.5'} py-2.5\n              text-body-sm text-slate-800 placeholder:text-slate-400\n              transition-all duration-150 outline-none\n              disabled:bg-slate-100 disabled:text-slate-400 disabled:cursor-not-allowed\n              ${error\n                ? 'bg-red-50 border-[1.5px] border-red-300'\n                : 'border-[1.5px] border-slate-200 focus:ring-1 focus:ring-teal-500 focus:border-teal-300'\n              }\n              ${inputClassName}\n            `}\n          />\n        </div>\n\n        {error && (\n          <p className=\"mt-1 text-caption font-semibold text-red-500\">{error}</p>\n        )}\n        {helpText && !error && (\n          <p className=\"mt-1 text-caption text-slate-500\">{helpText}</p>\n        )}\n      </div>\n    )\n  }\n)\nInput.displayName = 'Input'\n\n// ─── SearchInput ──────────────────────────────────────────────────────────────\n\nexport const SearchInput = forwardRef<HTMLInputElement, {\n  placeholder?: string\n  error?: string\n  helpText?: string\n  disabled?: boolean\n  className?: string\n  value?: string\n  defaultValue?: string\n  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n  id?: string\n  name?: string\n}>(\n  (\n    {\n      placeholder = '검색...',\n      error,\n      helpText,\n      disabled = false,\n      className = '',\n      value,\n      defaultValue,\n      onChange,\n      id,\n      name,\n    },\n    ref\n  ) => (\n    <div className={className}>\n      <div className=\"relative\">\n        <span className=\"material-symbols-outlined absolute left-3 top-1/2 -translate-y-1/2 text-slate-400 text-body-lg pointer-events-none\">\n          search\n        </span>\n        <input\n          ref={ref}\n          type=\"text\"\n          placeholder={placeholder}\n          disabled={disabled}\n          value={value}\n          defaultValue={defaultValue}\n          onChange={onChange}\n          id={id}\n          name={name}\n          className={`\n            w-full bg-slate-50 rounded-[10px]\n            pl-9 pr-3.5 py-2.5 text-body-sm text-slate-800\n            placeholder:text-slate-400 transition-all duration-150 outline-none\n            disabled:bg-slate-100 disabled:text-slate-400 disabled:cursor-not-allowed\n            ${error ? 'bg-red-50 border-[1.5px] border-red-300' : 'border-[1.5px] border-slate-200 focus:ring-1 focus:ring-teal-500 focus:border-teal-300'}\n          `}\n        />\n      </div>\n      {error && <p className=\"mt-1 text-caption font-semibold text-red-500\">{error}</p>}\n      {helpText && !error && <p className=\"mt-1 text-caption text-slate-500\">{helpText}</p>}\n    </div>\n  )\n)\nSearchInput.displayName = 'SearchInput'\n\n// ─── Select ───────────────────────────────────────────────────────────────────\n\nexport const Select = forwardRef<HTMLSelectElement, {\n  label?: string | React.ReactNode\n  children?: React.ReactNode\n  error?: string\n  helpText?: string\n  disabled?: boolean\n  required?: boolean\n  className?: string\n  selectClassName?: string\n  defaultValue?: string\n  value?: string\n  onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void\n  id?: string\n  name?: string\n}>(\n  (\n    {\n      label,\n      children,\n      error,\n      helpText,\n      disabled = false,\n      required = false,\n      className = '',\n      selectClassName = '',\n      defaultValue,\n      value,\n      onChange,\n      id,\n      name,\n    },\n    ref\n  ) => (\n    <div className={className}>\n      {label && (\n        <label htmlFor={id} className=\"block text-xs font-semibold text-slate-800 mb-1\">\n          {label}\n          {required && <span className=\"text-red-500 ml-1\">*</span>}\n        </label>\n      )}\n      <div className=\"relative\">\n        <select\n          ref={ref}\n          value={value}\n          defaultValue={defaultValue}\n          onChange={onChange}\n          disabled={disabled}\n          required={required}\n          id={id}\n          name={name}\n          className={`\n            w-full bg-slate-50 rounded-[10px]\n            pl-3.5 pr-9 py-2.5 text-body-sm text-slate-800 appearance-none outline-none\n            disabled:bg-slate-100 disabled:text-slate-400 disabled:cursor-not-allowed\n            ${error ? 'bg-red-50 border-[1.5px] border-red-300' : 'border-[1.5px] border-slate-200 focus:ring-1 focus:ring-teal-500 focus:border-teal-300'}\n            ${selectClassName}\n          `}\n        >\n          {children}\n        </select>\n        <span className=\"material-symbols-outlined absolute right-3.5 top-1/2 -translate-y-1/2 text-slate-400 text-body-lg pointer-events-none\">\n          expand_more\n        </span>\n      </div>\n      {error && <p className=\"mt-1 text-caption font-semibold text-red-500\">{error}</p>}\n      {helpText && !error && <p className=\"mt-1 text-caption text-slate-500\">{helpText}</p>}\n    </div>\n  )\n)\nSelect.displayName = 'Select'\n\n// ─── Toggle ───────────────────────────────────────────────────────────────────\n\nexport const Toggle: React.FC<{\n  checked: boolean\n  onChange?: (checked: boolean) => void\n  disabled?: boolean\n  label?: string | React.ReactNode\n  className?: string\n  labelClassName?: string\n}> = ({ checked, onChange, disabled = false, label, className = '', labelClassName = '' }) => (\n  <div className=\"flex items-center gap-2.5\">\n    <button\n      type=\"button\"\n      role=\"switch\"\n      aria-checked={checked}\n      onClick={() => !disabled && onChange?.(!checked)}\n      disabled={disabled}\n      className={`\n        relative w-11 h-6 rounded-full transition-colors duration-150\n        ${checked ? 'bg-teal-500' : 'bg-slate-200'}\n        ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}\n        ${className}\n      `}\n    >\n      <span\n        className={`\n          absolute top-0.5 left-0.5 w-5 h-5 bg-white rounded-full shadow-soft-sm\n          transition-transform duration-150\n          ${checked ? 'translate-x-5' : 'translate-x-0'}\n        `}\n      />\n    </button>\n    {label && (\n      <span className={`text-body-sm font-semibold text-slate-800 ${labelClassName}`}>\n        {label}\n      </span>\n    )}\n  </div>\n)\n\n// ─── Checkbox ─────────────────────────────────────────────────────────────────\n\nexport const Checkbox: React.FC<{\n  checked: boolean\n  onChange?: (checked: boolean) => void\n  disabled?: boolean\n  label?: string | React.ReactNode\n  className?: string\n  labelClassName?: string\n}> = ({ checked, onChange, disabled = false, label, className = '', labelClassName = '' }) => (\n  <label className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n    <div\n      onClick={() => !disabled && onChange?.(!checked)}\n      className={`\n        w-[18px] h-[18px] rounded flex items-center justify-center transition-colors duration-150\n        ${checked ? 'bg-teal-500' : 'bg-white border-2 border-slate-200'}\n        ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}\n        ${className}\n      `}\n    >\n      {checked && (\n        <svg className=\"w-3 h-3 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"3\">\n          <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n        </svg>\n      )}\n    </div>\n    {label && (\n      <span className={`text-body-sm font-semibold ${checked ? 'text-slate-800' : 'text-slate-500'} ${labelClassName}`}>\n        {label}\n      </span>\n    )}\n  </label>\n)\n\n// ─── Radio ────────────────────────────────────────────────────────────────────\n\nexport const Radio: React.FC<{\n  checked: boolean\n  onChange?: (checked: boolean) => void\n  disabled?: boolean\n  label?: string | React.ReactNode\n  labelClassName?: string\n  name?: string\n  value?: string\n}> = ({ checked, onChange, disabled = false, label, labelClassName = '', name, value }) => (\n  <label className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n    <input\n      type=\"radio\"\n      name={name}\n      value={value}\n      checked={checked}\n      onChange={() => !disabled && onChange?.(true)}\n      disabled={disabled}\n      className=\"sr-only\"\n    />\n    <div\n      className={`\n        w-[18px] h-[18px] rounded-full flex items-center justify-center\n        border-2 transition-colors duration-150\n        ${checked ? 'border-teal-500 bg-white' : 'border-slate-200 bg-white'}\n        ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}\n      `}\n    >\n      {checked && <span className=\"w-2.5 h-2.5 bg-teal-500 rounded-full\" />}\n    </div>\n    {label && (\n      <span className={`text-body-sm font-semibold ${checked ? 'text-slate-800' : 'text-slate-500'} ${labelClassName}`}>\n        {label}\n      </span>\n    )}\n  </label>\n)\n\n// ─── NumberInput ──────────────────────────────────────────────────────────────\n\nexport const NumberInput = forwardRef<HTMLInputElement, {\n  label?: string | React.ReactNode\n  value?: number\n  defaultValue?: number\n  onChange?: (value: number) => void\n  min?: number\n  max?: number\n  step?: number\n  unit?: string\n  error?: string\n  helpText?: string\n  disabled?: boolean\n  required?: boolean\n  className?: string\n  id?: string\n  name?: string\n}>(\n  (\n    {\n      label,\n      value,\n      defaultValue,\n      onChange,\n      min,\n      max,\n      step = 1,\n      unit,\n      error,\n      helpText,\n      disabled = false,\n      required = false,\n      className = '',\n      id,\n      name,\n    },\n    ref\n  ) => {\n    const handleStep = (dir: 1 | -1) => {\n      if (disabled || onChange == null) return\n      const current = value ?? defaultValue ?? 0\n      const next = current + dir * step\n      if (min != null && next < min) return\n      if (max != null && next > max) return\n      onChange(next)\n    }\n\n    return (\n      <div className={className}>\n        {label && (\n          <label htmlFor={id} className=\"block text-xs font-semibold text-slate-800 mb-1\">\n            {label}\n            {required && <span className=\"text-red-500 ml-1\">*</span>}\n          </label>\n        )}\n        <div className=\"relative w-32\">\n          <input\n            ref={ref}\n            type=\"number\"\n            min={min}\n            max={max}\n            step={step}\n            value={value}\n            defaultValue={defaultValue}\n            onChange={(e) => onChange?.(parseFloat(e.target.value))}\n            disabled={disabled}\n            required={required}\n            id={id}\n            name={name}\n            className={`\n              w-full bg-slate-50 rounded-[10px]\n              pl-3.5 ${unit ? 'pr-10' : 'pr-8'} py-2.5\n              text-body-sm text-slate-800 outline-none\n              [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\n              disabled:bg-slate-100 disabled:text-slate-400 disabled:cursor-not-allowed\n              ${error ? 'bg-red-50 border-[1.5px] border-red-300' : 'border-[1.5px] border-slate-200 focus:ring-1 focus:ring-teal-500 focus:border-teal-300'}\n            `}\n          />\n          {unit ? (\n            <span className=\"absolute right-3.5 top-1/2 -translate-y-1/2 text-caption font-semibold text-slate-400 pointer-events-none\">\n              {unit}\n            </span>\n          ) : (\n            <div className=\"absolute right-1.5 top-1/2 -translate-y-1/2 flex flex-col\">\n              <button\n                type=\"button\"\n                onClick={() => handleStep(1)}\n                disabled={disabled}\n                className=\"text-slate-400 hover:text-teal-500 transition-colors cursor-pointer disabled:opacity-40 disabled:cursor-not-allowed\"\n                aria-label=\"증가\"\n              >\n                <span className=\"material-symbols-outlined text-body-md\">expand_less</span>\n              </button>\n              <button\n                type=\"button\"\n                onClick={() => handleStep(-1)}\n                disabled={disabled}\n                className=\"text-slate-400 hover:text-teal-500 transition-colors -mt-1 cursor-pointer disabled:opacity-40 disabled:cursor-not-allowed\"\n                aria-label=\"감소\"\n              >\n                <span className=\"material-symbols-outlined text-body-md\">expand_more</span>\n              </button>\n            </div>\n          )}\n        </div>\n        {error && <p className=\"mt-1 text-caption font-semibold text-red-500\">{error}</p>}\n        {helpText && !error && <p className=\"mt-1 text-caption text-slate-500\">{helpText}</p>}\n      </div>\n    )\n  }\n)\nNumberInput.displayName = 'NumberInput'\n\n// ─── Slider ───────────────────────────────────────────────────────────────────\n\nexport const Slider: React.FC<{\n  value: number\n  onChange?: (value: number) => void\n  min?: number\n  max?: number\n  step?: number\n  disabled?: boolean\n  showValue?: boolean\n  label?: string\n  className?: string\n}> = ({\n  value,\n  onChange,\n  min = 0,\n  max = 100,\n  step = 1,\n  disabled = false,\n  showValue = true,\n  label,\n  className = '',\n}) => (\n  <div className={className}>\n    {(label || showValue) && (\n      <div className=\"flex justify-between items-center mb-2\">\n        {label && <span className=\"text-xs font-semibold text-slate-800\">{label}</span>}\n        {showValue && (\n          <span className={`text-body-sm font-bold text-teal-600 ${!label ? 'ml-auto' : ''}`}>\n            {value}\n          </span>\n        )}\n      </div>\n    )}\n    <input\n      type=\"range\"\n      min={min}\n      max={max}\n      step={step}\n      value={value}\n      onChange={(e) => onChange?.(parseFloat(e.target.value))}\n      disabled={disabled}\n      className=\"\n        w-full h-1.5 bg-slate-200 rounded-full appearance-none cursor-pointer\n        disabled:opacity-50 disabled:cursor-not-allowed\n        [&::-webkit-slider-thumb]:appearance-none\n        [&::-webkit-slider-thumb]:w-4\n        [&::-webkit-slider-thumb]:h-4\n        [&::-webkit-slider-thumb]:rounded-full\n        [&::-webkit-slider-thumb]:bg-teal-500\n        [&::-webkit-slider-thumb]:shadow-soft-sm\n        [&::-webkit-slider-thumb]:cursor-pointer\n        [&::-webkit-slider-thumb]:border-2\n        [&::-webkit-slider-thumb]:border-white\n      \"\n    />\n    <div className=\"flex justify-between mt-1\">\n      <span className=\"text-caption text-slate-400\">{min}</span>\n      <span className=\"text-caption text-slate-400\">{max}</span>\n    </div>\n  </div>\n)\n\n// ─── Textarea ─────────────────────────────────────────────────────────────────\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, {\n  label?: string | React.ReactNode\n  placeholder?: string\n  error?: string\n  helpText?: string\n  disabled?: boolean\n  required?: boolean\n  rows?: number\n  className?: string\n  textareaClassName?: string\n  value?: string\n  defaultValue?: string\n  onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void\n  id?: string\n  name?: string\n  minLength?: number\n  maxLength?: number\n}>(\n  (\n    {\n      label,\n      placeholder,\n      error,\n      helpText,\n      disabled = false,\n      required = false,\n      rows = 3,\n      className = '',\n      textareaClassName = '',\n      value,\n      defaultValue,\n      onChange,\n      id,\n      name,\n      minLength,\n      maxLength,\n    },\n    ref\n  ) => (\n    <div className={className}>\n      {label && (\n        <label htmlFor={id} className=\"block text-xs font-semibold text-slate-800 mb-1\">\n          {label}\n          {required && <span className=\"text-red-500 ml-1\">*</span>}\n        </label>\n      )}\n      <textarea\n        ref={ref}\n        placeholder={placeholder}\n        disabled={disabled}\n        required={required}\n        rows={rows}\n        value={value}\n        defaultValue={defaultValue}\n        onChange={onChange}\n        id={id}\n        name={name}\n        minLength={minLength}\n        maxLength={maxLength}\n        className={`\n          w-full bg-slate-50 rounded-[10px]\n          px-3.5 py-3 text-body-sm text-slate-800\n          placeholder:text-slate-400 transition-all duration-150 outline-none\n          disabled:bg-slate-100 disabled:text-slate-400 disabled:cursor-not-allowed\n          resize-y min-h-[72px]\n          ${error ? 'bg-red-50 border-[1.5px] border-red-300' : 'border-[1.5px] border-slate-200 focus:ring-1 focus:ring-teal-500 focus:border-teal-300'}\n          ${textareaClassName}\n        `}\n      />\n      {error && <p className=\"mt-1 text-caption font-semibold text-red-500\">{error}</p>}\n      {helpText && !error && <p className=\"mt-1 text-caption text-slate-500\">{helpText}</p>}\n    </div>\n  )\n)\nTextarea.displayName = 'Textarea'\n","import React from 'react'\n\nexport interface BreadcrumbItem {\n  label: string\n  href?: string\n}\n\nexport const Breadcrumb: React.FC<{ items: BreadcrumbItem[] }> = ({ items }) => {\n  return (\n    <nav className=\"flex items-center gap-1.5 text-xs\" aria-label=\"breadcrumb\">\n      {items.map((item, index) => {\n        const isLast = index === items.length - 1\n        return (\n          <React.Fragment key={index}>\n            {index > 0 && <span className=\"text-slate-300\">/</span>}\n            {isLast ? (\n              <span className=\"font-bold text-slate-900\">{item.label}</span>\n            ) : (\n              <a\n                href={item.href ?? '#'}\n                className=\"text-slate-400 hover:text-slate-600 transition-colors\"\n              >\n                {item.label}\n              </a>\n            )}\n          </React.Fragment>\n        )\n      })}\n    </nav>\n  )\n}\n","import React, { createContext, useContext, useLayoutEffect, useRef, useState } from 'react'\n\nconst TabsContext = createContext<{\n  value: string\n  onChange: (value: string) => void\n} | null>(null)\n\nfunction useTabsContext() {\n  const ctx = useContext(TabsContext)\n  if (!ctx) throw new Error('Tab components must be used inside <Tabs>')\n  return ctx\n}\n\nexport const Tabs: React.FC<{\n  defaultValue: string\n  children: React.ReactNode\n  onValueChange?: (value: string) => void\n}> = ({ defaultValue, children, onValueChange }) => {\n  const [value, setValue] = useState(defaultValue)\n\n  const handleChange = (newValue: string) => {\n    setValue(newValue)\n    onValueChange?.(newValue)\n  }\n\n  return (\n    <TabsContext.Provider value={{ value, onChange: handleChange }}>\n      {children}\n    </TabsContext.Provider>\n  )\n}\n\nexport const TabList: React.FC<{ children: React.ReactNode; className?: string }> = ({\n  children,\n  className = '',\n}) => {\n  const { value } = useTabsContext()\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [indicator, setIndicator] = useState<{ left: number; width: number } | null>(null)\n\n  useLayoutEffect(() => {\n    const el = containerRef.current\n    if (!el) return\n    const updateIndicator = () => {\n      const active = el.querySelector<HTMLElement>('[data-active=\"true\"]')\n      if (!active) return\n      const cRect = el.getBoundingClientRect()\n      const aRect = active.getBoundingClientRect()\n      if (aRect.width === 0) return\n      setIndicator({ left: aRect.left - cRect.left, width: aRect.width })\n    }\n    updateIndicator()\n    const ro = new ResizeObserver(updateIndicator)\n    ro.observe(el)\n    return () => ro.disconnect()\n  }, [value])\n\n  return (\n    <div ref={containerRef} className={`relative border-b-2 border-slate-100 flex gap-0 ${className}`}>\n      {indicator && (\n        <div\n          className=\"absolute bottom-[-2px] h-0.5 bg-teal-500 pointer-events-none\"\n          style={{ left: indicator.left, width: indicator.width, transition: 'left 0.2s ease-out, width 0.2s ease-out' }}\n        />\n      )}\n      {children}\n    </div>\n  )\n}\n\nexport const Tab: React.FC<{\n  value: string\n  children: React.ReactNode\n  className?: string\n}> = ({ value, children, className = '' }) => {\n  const { value: activeValue, onChange } = useTabsContext()\n  const isActive = activeValue === value\n\n  return (\n    <button\n      type=\"button\"\n      data-active={isActive}\n      className={`px-4 py-2 text-xs transition-colors cursor-pointer ${\n        isActive ? 'font-extrabold text-teal-600' : 'font-semibold text-slate-400 hover:text-slate-600'\n      } ${className}`}\n      onClick={() => onChange(value)}\n    >\n      {children}\n    </button>\n  )\n}\n\nexport const TabContent: React.FC<{\n  value: string\n  children: React.ReactNode\n  className?: string\n}> = ({ value, children, className = '' }) => {\n  const { value: activeValue } = useTabsContext()\n  if (activeValue !== value) return null\n  return <div className={className}>{children}</div>\n}\n\nexport type TabItem = { value: string; label: string }\n","import React, { createContext, useContext, useLayoutEffect, useRef, useState } from 'react'\nimport { cn } from '../utils/cn'\n\n// ─── Primary Pill Tabs ────────────────────────────────────────────────────────\n\nconst PillTabsContext = createContext<{\n  value: string\n  onChange: (value: string) => void\n} | null>(null)\n\nfunction usePillTabsContext() {\n  const ctx = useContext(PillTabsContext)\n  if (!ctx) throw new Error('PillTab must be used inside <PillTabs>')\n  return ctx\n}\n\nexport const PillTabs: React.FC<{\n  defaultValue?: string\n  value?: string\n  children: React.ReactNode\n  onValueChange?: (value: string) => void\n}> = ({ defaultValue, value: controlledValue, children, onValueChange }) => {\n  const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n  const isControlled = controlledValue !== undefined\n  const value = isControlled ? controlledValue : internalValue\n\n  const handleChange = (newValue: string) => {\n    if (!isControlled) setInternalValue(newValue)\n    onValueChange?.(newValue)\n  }\n\n  return (\n    <PillTabsContext.Provider value={{ value, onChange: handleChange }}>\n      {children}\n    </PillTabsContext.Provider>\n  )\n}\n\nexport const PillTabsList: React.FC<{ children: React.ReactNode; className?: string }> = ({\n  children,\n  className = '',\n}) => {\n  const { value } = usePillTabsContext()\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [indicator, setIndicator] = useState<{ left: number; width: number } | null>(null)\n\n  useLayoutEffect(() => {\n    const el = containerRef.current\n    if (!el) return\n    const updateIndicator = () => {\n      const active = el.querySelector<HTMLElement>('[data-active=\"true\"]')\n      if (!active) return\n      const cRect = el.getBoundingClientRect()\n      const aRect = active.getBoundingClientRect()\n      if (aRect.width === 0) return\n      setIndicator({ left: aRect.left - cRect.left, width: aRect.width })\n    }\n    updateIndicator()\n    const ro = new ResizeObserver(updateIndicator)\n    ro.observe(el)\n    return () => ro.disconnect()\n  }, [value])\n\n  return (\n    <div ref={containerRef} className={`relative inline-flex gap-1 bg-slate-100 p-0.5 rounded-[10px] ${className}`}>\n      {indicator && (\n        <div\n          className=\"absolute top-0.5 bottom-0.5 bg-teal-500 rounded-lg shadow-soft-sm pointer-events-none\"\n          style={{ left: indicator.left, width: indicator.width, transition: 'left 0.2s ease-out, width 0.2s ease-out' }}\n        />\n      )}\n      {children}\n    </div>\n  )\n}\n\nexport const PillTab: React.FC<{\n  value: string\n  children: React.ReactNode\n  className?: string\n}> = ({ value, children, className = '' }) => {\n  const { value: activeValue, onChange } = usePillTabsContext()\n  const isActive = activeValue === value\n\n  return (\n    <button\n      type=\"button\"\n      data-active={isActive}\n      className={cn(\n        'relative z-10 px-4 py-1.5 text-caption transition-colors duration-150 rounded-lg cursor-pointer',\n        isActive ? 'text-white font-bold' : 'text-slate-500 font-semibold hover:text-slate-800',\n        className\n      )}\n      onClick={() => onChange(value)}\n    >\n      {children}\n    </button>\n  )\n}\n\n// ─── Neutral Pill Tabs ────────────────────────────────────────────────────────\n\nconst NeutralPillTabsContext = createContext<{\n  value: string\n  onChange: (value: string) => void\n} | null>(null)\n\nfunction useNeutralPillTabsContext() {\n  const ctx = useContext(NeutralPillTabsContext)\n  if (!ctx) throw new Error('NeutralPillTab must be used inside <NeutralPillTabs>')\n  return ctx\n}\n\nexport const NeutralPillTabs: React.FC<{\n  defaultValue?: string\n  value?: string\n  children: React.ReactNode\n  onValueChange?: (value: string) => void\n}> = ({ defaultValue, value: controlledValue, children, onValueChange }) => {\n  const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n  const isControlled = controlledValue !== undefined\n  const value = isControlled ? controlledValue : internalValue\n\n  const handleChange = (newValue: string) => {\n    if (!isControlled) setInternalValue(newValue)\n    onValueChange?.(newValue)\n  }\n\n  return (\n    <NeutralPillTabsContext.Provider value={{ value, onChange: handleChange }}>\n      {children}\n    </NeutralPillTabsContext.Provider>\n  )\n}\n\nexport const NeutralPillTabsList: React.FC<{ children: React.ReactNode; className?: string }> = ({\n  children,\n  className = '',\n}) => {\n  const { value } = useNeutralPillTabsContext()\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [indicator, setIndicator] = useState<{ left: number; width: number } | null>(null)\n\n  useLayoutEffect(() => {\n    const el = containerRef.current\n    if (!el) return\n    const updateIndicator = () => {\n      const active = el.querySelector<HTMLElement>('[data-active=\"true\"]')\n      if (!active) return\n      const cRect = el.getBoundingClientRect()\n      const aRect = active.getBoundingClientRect()\n      if (aRect.width === 0) return\n      setIndicator({ left: aRect.left - cRect.left, width: aRect.width })\n    }\n    updateIndicator()\n    const ro = new ResizeObserver(updateIndicator)\n    ro.observe(el)\n    return () => ro.disconnect()\n  }, [value])\n\n  return (\n    <div ref={containerRef} className={`relative inline-flex gap-1 bg-slate-100 p-0.5 rounded-[10px] ${className}`}>\n      {indicator && (\n        <div\n          className=\"absolute top-0.5 bottom-0.5 bg-white rounded-lg shadow-soft-sm pointer-events-none\"\n          style={{ left: indicator.left, width: indicator.width, transition: 'left 0.2s ease-out, width 0.2s ease-out' }}\n        />\n      )}\n      {children}\n    </div>\n  )\n}\n\nexport const NeutralPillTab: React.FC<{\n  value: string\n  children: React.ReactNode\n  className?: string\n}> = ({ value, children, className = '' }) => {\n  const { value: activeValue, onChange } = useNeutralPillTabsContext()\n  const isActive = activeValue === value\n\n  return (\n    <button\n      type=\"button\"\n      data-active={isActive}\n      className={cn(\n        'relative z-10 px-4 py-1.5 text-caption transition-colors duration-150 rounded-lg cursor-pointer',\n        isActive ? 'text-slate-800 font-bold' : 'text-slate-500 font-semibold hover:text-slate-800',\n        className\n      )}\n      onClick={() => onChange(value)}\n    >\n      {children}\n    </button>\n  )\n}\n\nexport type TabItem = { value: string; label: string }\n","import React, { useLayoutEffect, useRef, useState } from 'react'\n\nexport interface SidebarNavItem {\n  label: string\n  icon: string\n  href?: string\n  badge?: number\n  children?: SidebarNavItem[]\n  disabled?: boolean\n  active?: boolean\n}\n\nexport interface SidebarNavGroup {\n  title?: string\n  children: SidebarNavItem[]\n}\n\nexport interface SidebarNavProps {\n  items: SidebarNavGroup[]\n  activePath?: string\n  onItemClick?: (item: SidebarNavItem) => void\n  header?: React.ReactNode\n  footer?: React.ReactNode\n  showLogo?: boolean\n  showUser?: boolean\n}\n\nexport const SidebarNav: React.FC<SidebarNavProps> = ({\n  items,\n  activePath,\n  onItemClick,\n  header,\n  footer,\n  showLogo = true,\n  showUser = true,\n}) => {\n  const [expanded, setExpanded] = useState<Set<number>>(new Set())\n  const navRef = useRef<HTMLElement>(null)\n  const [indicator, setIndicator] = useState<{ top: number; left: number; width: number; height: number } | null>(null)\n\n  const toggleExpanded = (key: number) => {\n    setExpanded(prev => {\n      const next = new Set(prev)\n      if (next.has(key)) next.delete(key)\n      else next.add(key)\n      return next\n    })\n  }\n\n  useLayoutEffect(() => {\n    const nav = navRef.current\n    if (!nav) return\n    const active = nav.querySelector<HTMLElement>('[data-active=\"true\"]')\n    if (!active) { setIndicator(null); return }\n    const navRect = nav.getBoundingClientRect()\n    const aRect = active.getBoundingClientRect()\n    setIndicator({\n      top: aRect.top - navRect.top + nav.scrollTop,\n      left: aRect.left - navRect.left,\n      width: aRect.width,\n      height: aRect.height,\n    })\n  }, [activePath, expanded, items])\n\n  return (\n    <aside className=\"w-[220px] bg-slate-50 border-r border-slate-100 flex flex-col py-4 flex-shrink-0\">\n      {header ?? (showLogo && (\n        <div className=\"px-4 mb-5 flex items-center gap-2.5\">\n          <div className=\"w-8 h-8 rounded-[10px] bg-gradient-to-br from-teal-400 to-teal-500 flex items-center justify-center\">\n            <span className=\"text-white text-sm font-black\">CP</span>\n          </div>\n          <div>\n            <div className=\"text-body-sm font-extrabold text-slate-900\">Console</div>\n            <div className=\"text-caption text-slate-400 font-semibold\">Admin Panel</div>\n          </div>\n        </div>\n      ))}\n\n      <nav ref={navRef} className=\"relative flex-1 px-2 overflow-y-auto\">\n        {indicator && (\n          <div\n            className=\"absolute bg-teal-50 rounded-[10px] pointer-events-none\"\n            style={{\n              top: indicator.top,\n              left: indicator.left,\n              width: indicator.width,\n              height: indicator.height,\n              transition: 'top 0.2s ease-out, left 0.2s ease-out',\n            }}\n          />\n        )}\n        {items.map((group, groupIndex) => (\n          <div key={groupIndex} className={groupIndex > 0 ? 'mt-4' : ''}>\n            {group.title && (\n              <p className=\"px-3 mb-1.5 text-caption text-slate-400 font-bold uppercase tracking-widest\">\n                {group.title}\n              </p>\n            )}\n            {group.children?.map((item, itemIndex) => {\n              const key = groupIndex * 1000 + itemIndex\n              const isActive = item.active ?? (activePath ? activePath === item.href : false)\n              const hasChildren = (item.children?.length ?? 0) > 0\n              const isExpanded = expanded.has(key)\n              const isDisabled = item.disabled ?? false\n              const useButton = !!onItemClick || isDisabled\n\n              const itemClass = `relative z-10 flex items-center gap-2.5 px-3 py-2 rounded-[10px] mb-0.5 transition-colors w-full text-left\n                ${isActive ? 'text-teal-600' : isDisabled ? 'text-slate-300 cursor-not-allowed' : 'text-slate-500 hover:text-slate-800 hover:bg-slate-100 cursor-pointer'}\n              `\n\n              const handleClick = (e: React.MouseEvent) => {\n                if (isDisabled) return\n                if (hasChildren) { e.preventDefault(); toggleExpanded(key); return }\n                onItemClick?.(item)\n              }\n\n              const navItemContent = (\n                <>\n                  <span className={`material-symbols-outlined text-h2 ${isActive ? 'text-teal-600' : ''}`}>\n                    {item.icon}\n                  </span>\n                  <span className={`text-xs flex-1 ${isActive ? 'font-bold' : 'font-semibold'}`}>\n                    {item.label}\n                  </span>\n                  {item.badge != null && (\n                    <span className=\"text-caption bg-teal-500 text-white rounded-full px-1.5 py-0.5 font-bold\">\n                      {item.badge}\n                    </span>\n                  )}\n                  {hasChildren && (\n                    <span className={`material-symbols-outlined text-body-lg transition-transform duration-150 ${isExpanded ? 'rotate-180' : ''}`}>\n                      expand_more\n                    </span>\n                  )}\n                </>\n              )\n\n              return (\n                <div key={itemIndex}>\n                  {useButton ? (\n                    <button\n                      type=\"button\"\n                      data-active={isActive || undefined}\n                      disabled={isDisabled}\n                      onClick={handleClick}\n                      className={itemClass}\n                    >\n                      {navItemContent}\n                    </button>\n                  ) : (\n                    <a\n                      data-active={isActive || undefined}\n                      href={hasChildren ? undefined : (item.href ?? '#')}\n                      onClick={hasChildren ? (e) => { e.preventDefault(); toggleExpanded(key) } : undefined}\n                      className={itemClass}\n                    >\n                      {navItemContent}\n                    </a>\n                  )}\n                  {hasChildren && isExpanded && (\n                    <div className=\"ml-4 mb-0.5\">\n                      {item.children!.map((child, childIndex) => {\n                        const isChildActive = child.active ?? (activePath ? activePath === child.href : false)\n                        return (\n                          <a\n                            key={childIndex}\n                            data-active={isChildActive || undefined}\n                            href={child.href ?? '#'}\n                            className={`relative z-10 flex items-center gap-2 px-3 py-1.5 rounded-[10px] mb-0.5 transition-colors ${\n                              isChildActive\n                                ? 'text-teal-600'\n                                : 'text-slate-400 hover:text-slate-700 hover:bg-slate-100'\n                            }`}\n                          >\n                            <span className={`material-symbols-outlined text-body-lg ${isChildActive ? 'text-teal-600' : ''}`}>\n                              {child.icon}\n                            </span>\n                            <span className={`text-caption flex-1 ${isChildActive ? 'font-bold' : 'font-semibold'}`}>\n                              {child.label}\n                            </span>\n                            {child.badge != null && (\n                              <span className=\"text-caption bg-teal-500 text-white rounded-full px-1.5 py-0.5 font-bold\">\n                                {child.badge}\n                              </span>\n                            )}\n                          </a>\n                        )\n                      })}\n                    </div>\n                  )}\n                </div>\n              )\n            })}\n          </div>\n        ))}\n      </nav>\n\n      {footer ?? (showUser && (\n        <div className=\"px-2 border-t border-slate-100 pt-3\">\n          <div className=\"flex items-center gap-2.5 px-3 py-2\">\n            <div className=\"w-7 h-7 rounded-lg bg-slate-200 flex items-center justify-center text-caption font-bold text-slate-500\">\n              사\n            </div>\n            <div>\n              <div className=\"text-caption font-bold text-slate-900\">사용자</div>\n              <div className=\"text-caption text-slate-400\">팀</div>\n            </div>\n          </div>\n        </div>\n      ))}\n    </aside>\n  )\n}\n","import React from 'react'\n\n// ─── StatCard ─────────────────────────────────────────────────────────────────\n\ntype IconGradient = 'teal' | 'green' | 'amber' | 'red'\ntype ChangeType = 'positive' | 'negative' | 'neutral'\n\nconst gradientClass: Record<IconGradient, string> = {\n  teal: 'from-teal-400 to-teal-500',\n  green: 'from-green-400 to-green-500',\n  amber: 'from-amber-400 to-amber-500',\n  red: 'from-red-400 to-red-500',\n}\n\nconst changeClass: Record<ChangeType, string> = {\n  positive: 'text-green-500',\n  negative: 'text-red-500',\n  neutral: 'text-slate-400',\n}\n\nexport interface StatCardProps {\n  icon: string\n  iconGradient?: IconGradient\n  label: string\n  value: string | number\n  change?: string | number\n  changeType?: ChangeType\n  progress?: number\n  className?: string\n}\n\nexport const StatCard: React.FC<StatCardProps> = ({\n  icon,\n  iconGradient = 'teal',\n  label,\n  value,\n  change,\n  changeType = 'neutral',\n  progress,\n  className = '',\n}) => (\n  <div className={`bg-white rounded-[14px] p-5 shadow-soft-md border border-teal-50 ${className}`}>\n    <div className=\"flex items-center gap-2.5 mb-3\">\n      <div className={`w-10 h-10 rounded-[10px] bg-gradient-to-br ${gradientClass[iconGradient]} flex items-center justify-center`}>\n        <span className=\"material-symbols-outlined text-white text-h2\">{icon}</span>\n      </div>\n      <div>\n        <p className=\"text-caption text-slate-400 font-bold uppercase tracking-wider\">{label}</p>\n        <p className=\"text-h1 font-black text-slate-900 leading-none mt-0.5\">\n          {value}\n          {change != null && (\n            <span className={`text-caption font-bold ml-1.5 ${changeClass[changeType]}`}>\n              {change}\n            </span>\n          )}\n        </p>\n      </div>\n    </div>\n    {progress != null && (\n      <div className=\"w-full h-1 bg-slate-100 rounded-full\">\n        <div\n          className=\"h-full bg-gradient-to-r from-teal-400 to-teal-500 rounded-full\"\n          style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n        />\n      </div>\n    )}\n  </div>\n)\n\n// ─── ToolCard ─────────────────────────────────────────────────────────────────\n\nimport type { BadgeStatus as BadgeStatusType } from './Badge'\nimport { BadgeStatus } from './Badge'\n\nconst statusLabel: Record<BadgeStatusType, string> = {\n  active: '활성',\n  'in-progress': '진행 중',\n  pending: '대기',\n  error: '오류',\n  inactive: '비활성',\n}\n\nexport interface ToolCardProps {\n  icon: string\n  status?: BadgeStatusType\n  title: string\n  description?: string\n  tags?: string[]\n  onClick?: () => void\n  className?: string\n}\n\nexport const ToolCard: React.FC<ToolCardProps> = ({\n  icon,\n  status,\n  title,\n  description,\n  tags,\n  onClick,\n  className = '',\n}) => (\n  <div\n    className={`bg-white rounded-[14px] p-5 shadow-soft-md border border-slate-100 ${onClick ? 'cursor-pointer hover:shadow-soft-lg transition-shadow' : ''} ${className}`}\n    onClick={onClick}\n  >\n    <div className=\"flex justify-between items-start mb-3\">\n      <div className=\"w-10 h-10 rounded-[10px] bg-teal-50 flex items-center justify-center\">\n        <span className=\"material-symbols-outlined text-teal-500 text-h2\">{icon}</span>\n      </div>\n      {status && (\n        <BadgeStatus status={status}>{statusLabel[status]}</BadgeStatus>\n      )}\n    </div>\n    <h3 className=\"text-sm font-bold text-slate-900 mb-1\">{title}</h3>\n    {description && (\n      <p className=\"text-body-sm text-slate-500 leading-relaxed mb-3\">{description}</p>\n    )}\n    {tags && tags.length > 0 && (\n      <div className=\"flex gap-1.5 flex-wrap\">\n        {tags.map((tag) => (\n          <span key={tag} className=\"px-2 py-0.5 bg-slate-100 text-slate-500 rounded-md text-caption font-semibold\">\n            {tag}\n          </span>\n        ))}\n      </div>\n    )}\n  </div>\n)\n\n// ─── EmptyCard ────────────────────────────────────────────────────────────────\n\nexport interface EmptyCardProps {\n  icon?: string\n  label?: string\n  description?: string\n  onClick?: () => void\n  minHeight?: string\n  className?: string\n}\n\nexport const EmptyCard: React.FC<EmptyCardProps> = ({\n  icon = 'add',\n  label = '새 항목 등록',\n  description = '클릭하여 추가',\n  onClick,\n  minHeight = 'min-h-[160px]',\n  className = '',\n}) => (\n  <div\n    className={`bg-white rounded-[14px] border-2 border-dashed border-slate-200\n      flex flex-col items-center justify-center text-center\n      hover:border-teal-300 hover:bg-teal-50/30 transition-all duration-150\n      ${onClick ? 'cursor-pointer' : ''}\n      ${minHeight} ${className}`}\n    onClick={onClick}\n  >\n    <div className=\"w-12 h-12 rounded-xl bg-slate-50 flex items-center justify-center mb-2.5\">\n      <span className=\"material-symbols-outlined text-slate-300 text-h1\">{icon}</span>\n    </div>\n    <p className=\"text-body-sm font-bold text-slate-500\">{label}</p>\n    {description && (\n      <p className=\"text-caption text-slate-400 mt-0.5\">{description}</p>\n    )}\n  </div>\n)\n","import React from 'react'\nimport { Button } from './Button'\n\n// ─── Pagination ───────────────────────────────────────────────────────────────\n\nexport interface PaginationProps {\n  currentPage: number\n  totalPages: number\n  totalCount?: number\n  pageSize?: number\n  onPageChange: (page: number) => void\n  className?: string\n}\n\nfunction buildPages(current: number, total: number): (number | '...')[] {\n  if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1)\n  const pages: (number | '...')[] = [1]\n  if (current > 3) pages.push('...')\n  for (let i = Math.max(2, current - 1); i <= Math.min(total - 1, current + 1); i++) {\n    pages.push(i)\n  }\n  if (current < total - 2) pages.push('...')\n  pages.push(total)\n  return pages\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n  currentPage,\n  totalPages,\n  totalCount,\n  pageSize = 10,\n  onPageChange,\n  className = '',\n}) => {\n  const start = (currentPage - 1) * pageSize + 1\n  const end = Math.min(currentPage * pageSize, totalCount ?? currentPage * pageSize)\n  const pages = buildPages(currentPage, totalPages)\n\n  return (\n    <div className={`flex justify-between items-center ${className}`}>\n      {totalCount != null && (\n        <span className=\"text-caption text-slate-400 font-semibold\">\n          {start}-{end} / {totalCount}건\n        </span>\n      )}\n      <div className=\"flex gap-1 ml-auto\">\n        <button\n          onClick={() => onPageChange(currentPage - 1)}\n          disabled={currentPage <= 1}\n          className=\"w-8 h-8 rounded-lg border border-slate-200 flex items-center justify-center text-xs text-slate-400 cursor-pointer hover:bg-slate-100 disabled:opacity-40 disabled:cursor-not-allowed\"\n        >\n          <span className=\"material-symbols-outlined text-body-lg\">chevron_left</span>\n        </button>\n\n        {pages.map((p, i) =>\n          p === '...' ? (\n            <span key={`ellipsis-${i}`} className=\"w-8 h-8 flex items-center justify-center text-xs text-slate-400\">\n              ...\n            </span>\n          ) : (\n            <button\n              key={p}\n              onClick={() => onPageChange(p as number)}\n              className={`w-8 h-8 rounded-lg flex items-center justify-center text-xs font-bold transition-colors cursor-pointer ${\n                p === currentPage\n                  ? 'bg-teal-500 text-white'\n                  : 'border border-slate-200 text-slate-500 font-semibold hover:bg-slate-100'\n              }`}\n            >\n              {p}\n            </button>\n          )\n        )}\n\n        <button\n          onClick={() => onPageChange(currentPage + 1)}\n          disabled={currentPage >= totalPages}\n          className=\"w-8 h-8 rounded-lg border border-slate-200 flex items-center justify-center text-xs text-slate-400 cursor-pointer hover:bg-slate-100 disabled:opacity-40 disabled:cursor-not-allowed\"\n        >\n          <span className=\"material-symbols-outlined text-body-lg\">chevron_right</span>\n        </button>\n      </div>\n    </div>\n  )\n}\n\n// ─── Table ────────────────────────────────────────────────────────────────────\n\nexport interface TableColumn<T = Record<string, unknown>> {\n  key: string\n  label: string\n  width?: string\n  render?: (value: unknown, row: T, index: number) => React.ReactNode\n}\n\nexport interface TableProps<T = Record<string, unknown>> {\n  columns: TableColumn<T>[]\n  data: T[]\n  title?: string\n  totalCount?: number\n  onSearch?: (query: string) => void\n  onFilter?: () => void\n  searchPlaceholder?: string\n  currentPage?: number\n  totalPages?: number\n  pageSize?: number\n  onPageChange?: (page: number) => void\n  className?: string\n  emptyMessage?: string\n}\n\nexport function Table<T = Record<string, unknown>>({\n  columns,\n  data,\n  title,\n  totalCount,\n  onSearch,\n  onFilter,\n  searchPlaceholder = '검색...',\n  currentPage,\n  totalPages,\n  pageSize,\n  onPageChange,\n  className = '',\n  emptyMessage = '데이터가 없습니다.',\n}: TableProps<T>) {\n  const gridCols = columns.map((c) => c.width ?? '1fr').join(' ')\n\n  return (\n    <div className={`bg-white rounded-[14px] shadow-soft-md border border-slate-100 overflow-hidden ${className}`}>\n      {/* Toolbar */}\n      {(title || onSearch || onFilter) && (\n        <div className=\"flex justify-between items-center px-5 py-4 border-b border-slate-100\">\n          <div className=\"flex items-center gap-2\">\n            {title && <h3 className=\"text-sm font-bold text-slate-900\">{title}</h3>}\n            {totalCount != null && (\n              <span className=\"min-w-[20px] h-5 px-1.5 bg-teal-50 text-teal-600 rounded-md text-caption font-bold flex items-center justify-center\">\n                {totalCount}\n              </span>\n            )}\n          </div>\n          <div className=\"flex gap-2\">\n            {onSearch && (\n              <div className=\"relative\">\n                <span className=\"material-symbols-outlined absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400 text-body-md\">\n                  search\n                </span>\n                <input\n                  className=\"bg-slate-50 border border-slate-200 rounded-lg pl-8 pr-3 py-1.5 text-caption w-48 focus:ring-1 focus:ring-teal-500 outline-none\"\n                  placeholder={searchPlaceholder}\n                  onChange={(e) => onSearch(e.target.value)}\n                />\n              </div>\n            )}\n            {onFilter && (\n              <Button variant=\"outline\" size=\"sm\" onClick={onFilter} leftIcon=\"filter_list\">\n                필터\n              </Button>\n            )}\n          </div>\n        </div>\n      )}\n\n      {/* Header */}\n      <div\n        className=\"grid px-5 py-2.5 bg-slate-50 border-b border-slate-100\"\n        style={{ gridTemplateColumns: gridCols }}\n      >\n        {columns.map((col) => (\n          <span key={col.key} className=\"text-caption font-semibold uppercase tracking-wider text-slate-400\">\n            {col.label}\n          </span>\n        ))}\n      </div>\n\n      {/* Rows */}\n      <div className=\"divide-y divide-slate-50\">\n        {data.length === 0 ? (\n          <div className=\"px-5 py-10 text-center text-body-sm text-slate-400\">{emptyMessage}</div>\n        ) : (\n          data.map((row, rowIndex) => (\n            <div\n              key={rowIndex}\n              className=\"grid px-5 py-3 items-center hover:bg-slate-50/50 transition-colors\"\n              style={{ gridTemplateColumns: gridCols }}\n            >\n              {columns.map((col) => (\n                <div key={col.key}>\n                  {col.render\n                    ? col.render((row as Record<string, unknown>)[col.key], row, rowIndex)\n                    : String((row as Record<string, unknown>)[col.key] ?? '')}\n                </div>\n              ))}\n            </div>\n          ))\n        )}\n      </div>\n\n      {/* Pagination */}\n      {currentPage != null && totalPages != null && onPageChange && (\n        <div className=\"px-5 py-3 bg-slate-50 border-t border-slate-100\">\n          <Pagination\n            currentPage={currentPage}\n            totalPages={totalPages}\n            totalCount={totalCount}\n            pageSize={pageSize}\n            onPageChange={onPageChange}\n          />\n        </div>\n      )}\n    </div>\n  )\n}\n","import React, { useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Button, type ButtonVariant } from './Button'\n\n// ─── Modal ────────────────────────────────────────────────────────────────────\n\nexport interface ModalProps {\n  open: boolean\n  onClose: () => void\n  title?: string\n  children: React.ReactNode\n  footer?: React.ReactNode\n  size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClass = { sm: 'max-w-sm', md: 'max-w-md', lg: 'max-w-lg' }\n\nexport const Modal: React.FC<ModalProps> = ({\n  open,\n  onClose,\n  title,\n  children,\n  footer,\n  size = 'md',\n}) => {\n  const dialogRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    if (!open) return\n    const handleKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onClose()\n    }\n    document.addEventListener('keydown', handleKey)\n    document.body.style.overflow = 'hidden'\n    return () => {\n      document.removeEventListener('keydown', handleKey)\n      document.body.style.overflow = ''\n    }\n  }, [open, onClose])\n\n  useEffect(() => {\n    if (!open || !dialogRef.current) return\n    const el = dialogRef.current\n    const focusable = el.querySelectorAll<HTMLElement>(\n      'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n    )\n    const first = focusable[0]\n    const last = focusable[focusable.length - 1]\n    first?.focus()\n    const trap = (e: KeyboardEvent) => {\n      if (e.key !== 'Tab') return\n      if (e.shiftKey) {\n        if (document.activeElement === first) { e.preventDefault(); last?.focus() }\n      } else {\n        if (document.activeElement === last) { e.preventDefault(); first?.focus() }\n      }\n    }\n    document.addEventListener('keydown', trap)\n    return () => document.removeEventListener('keydown', trap)\n  }, [open])\n\n  if (!open) return null\n\n  return createPortal(\n    <div\n      className=\"fixed inset-0 bg-slate-900/40 z-50 flex items-center justify-center\"\n      onClick={(e) => e.target === e.currentTarget && onClose()}\n    >\n      <div\n        ref={dialogRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby={title ? 'modal-title' : undefined}\n        className={`bg-white rounded-2xl p-6 shadow-soft-xl w-full ${sizeClass[size]} mx-4`}\n      >\n        <div className=\"flex justify-between items-center mb-4\">\n          {title && (\n            <h2 id=\"modal-title\" className=\"text-base font-extrabold text-slate-900\">\n              {title}\n            </h2>\n          )}\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            onClick={onClose}\n            aria-label=\"닫기\"\n            leftIcon=\"close\"\n            className=\"ml-auto\"\n          />\n        </div>\n\n        <div className=\"text-body-sm text-slate-500 leading-relaxed\">{children}</div>\n\n        {footer && <div className=\"flex justify-end gap-2 mt-5\">{footer}</div>}\n      </div>\n    </div>,\n    document.body\n  )\n}\n\n// ─── SectionedModal ───────────────────────────────────────────────────────────\n// 헤더/바디/푸터가 border로 분리되고 children이 자유롭게 들어가는 모달.\n// 풍부한 콘텐츠(폼, 리스트, 테이블, 경고/안내 박스 등)에 적합.\n\nconst sectionedSizeClass = {\n  sm: 'max-w-md',     // 448px\n  md: 'max-w-lg',     // 512px\n  lg: 'max-w-2xl',    // 672px\n  xl: 'max-w-4xl',    // 896px\n  '2xl': 'max-w-6xl', // 1152px\n}\n\nexport interface SectionedModalProps {\n  open: boolean\n  onClose: () => void\n  /** 헤더 좌측 제목. ReactNode 허용 (아이콘+텍스트 조합 등) */\n  title?: React.ReactNode\n  /** 제목 좌측에 표시할 material icon 이름 (선택) */\n  headerIcon?: string\n  /** 제목 우측에 표시할 부가 메타 (파일명·페이지 정보 등) */\n  headerExtra?: React.ReactNode\n  /** 모달 본문 */\n  children: React.ReactNode\n  /** 푸터 영역. 비우면 footer 자체가 렌더되지 않음 */\n  footer?: React.ReactNode\n  /** 푸터 정렬. 기본 'end' (우측 정렬) */\n  footerAlign?: 'start' | 'end' | 'between'\n  /** 모달 크기. 기본 'md'. xl/2xl은 풍부한 콘텐츠용 */\n  size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n  /** body 영역 className override (기본 'px-5 py-4'). padding/style 커스터마이징용 */\n  bodyClassName?: string\n}\n\nexport const SectionedModal: React.FC<SectionedModalProps> = ({\n  open,\n  onClose,\n  title,\n  headerIcon,\n  headerExtra,\n  children,\n  footer,\n  footerAlign = 'end',\n  size = 'md',\n  bodyClassName = 'px-5 py-4',\n}) => {\n  const dialogRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    if (!open) return\n    const handleKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onClose()\n    }\n    document.addEventListener('keydown', handleKey)\n    document.body.style.overflow = 'hidden'\n    return () => {\n      document.removeEventListener('keydown', handleKey)\n      document.body.style.overflow = ''\n    }\n  }, [open, onClose])\n\n  useEffect(() => {\n    if (!open || !dialogRef.current) return\n    const el = dialogRef.current\n    const focusable = el.querySelectorAll<HTMLElement>(\n      'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n    )\n    const first = focusable[0]\n    const last = focusable[focusable.length - 1]\n    first?.focus()\n    const trap = (e: KeyboardEvent) => {\n      if (e.key !== 'Tab') return\n      if (e.shiftKey) {\n        if (document.activeElement === first) { e.preventDefault(); last?.focus() }\n      } else {\n        if (document.activeElement === last) { e.preventDefault(); first?.focus() }\n      }\n    }\n    document.addEventListener('keydown', trap)\n    return () => document.removeEventListener('keydown', trap)\n  }, [open])\n\n  if (!open) return null\n\n  const footerJustify =\n    footerAlign === 'start' ? 'justify-start' :\n    footerAlign === 'between' ? 'justify-between' :\n    'justify-end'\n\n  return createPortal(\n    <div\n      className=\"fixed inset-0 bg-slate-900/40 z-50 flex items-center justify-center\"\n      onClick={(e) => e.target === e.currentTarget && onClose()}\n    >\n      <div\n        ref={dialogRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby={title ? 'sectioned-modal-title' : undefined}\n        className={`bg-white rounded-[14px] shadow-soft-md w-full ${sectionedSizeClass[size]} mx-4 max-h-[95vh] flex flex-col`}\n      >\n        {/* Header */}\n        <div className=\"flex items-center justify-between px-5 py-4 border-b border-slate-100 shrink-0\">\n          <div className=\"flex items-center gap-1.5 min-w-0\">\n            {headerIcon && (\n              <span className=\"material-symbols-outlined text-h2 text-teal-500 shrink-0\">{headerIcon}</span>\n            )}\n            {title && (\n              <h2 id=\"sectioned-modal-title\" className=\"text-body-md font-bold text-slate-900 truncate\">\n                {title}\n              </h2>\n            )}\n            {headerExtra && (\n              <div className=\"text-caption text-slate-400 ml-2 truncate\">{headerExtra}</div>\n            )}\n          </div>\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            onClick={onClose}\n            aria-label=\"닫기\"\n            leftIcon=\"close\"\n            className=\"w-7 h-7 p-0 shrink-0\"\n          />\n        </div>\n\n        {/* Body */}\n        <div className={`flex-1 overflow-y-auto ${bodyClassName}`}>\n          {children}\n        </div>\n\n        {/* Footer */}\n        {footer && (\n          <div className={`flex items-center ${footerJustify} gap-2 px-5 py-3.5 border-t border-slate-100 shrink-0`}>\n            {footer}\n          </div>\n        )}\n      </div>\n    </div>,\n    document.body\n  )\n}\n\n// ─── ConfirmModal ─────────────────────────────────────────────────────────────\n\ntype ConfirmVariant = 'delete' | 'reset' | 'confirm'\n\nconst confirmConfig: Record<\n  ConfirmVariant,\n  { icon: string; iconBg: string; iconColor: string; btnVariant: ButtonVariant; btnClassName?: string }\n> = {\n  delete: {\n    icon: 'warning',\n    iconBg: 'bg-red-50',\n    iconColor: 'text-red-500',\n    btnVariant: 'danger',\n  },\n  reset: {\n    icon: 'restart_alt',\n    iconBg: 'bg-amber-50',\n    iconColor: 'text-amber-500',\n    btnVariant: 'primary',\n    btnClassName: 'bg-amber-500 hover:bg-amber-600 active:bg-amber-700',\n  },\n  confirm: {\n    icon: 'help',\n    iconBg: 'bg-teal-50',\n    iconColor: 'text-teal-500',\n    btnVariant: 'primary',\n  },\n}\n\nexport interface ConfirmModalProps {\n  open: boolean\n  onClose: () => void\n  onConfirm: () => void\n  title: string\n  description: string\n  confirmLabel?: string\n  cancelLabel?: string\n  variant?: ConfirmVariant\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n  open,\n  onClose,\n  onConfirm,\n  title,\n  description,\n  confirmLabel = '확인',\n  cancelLabel = '취소',\n  variant = 'confirm',\n}) => {\n  const cfg = confirmConfig[variant]\n\n  useEffect(() => {\n    if (!open) return\n    const handleKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onClose()\n    }\n    document.addEventListener('keydown', handleKey)\n    document.body.style.overflow = 'hidden'\n    return () => {\n      document.removeEventListener('keydown', handleKey)\n      document.body.style.overflow = ''\n    }\n  }, [open, onClose])\n\n  if (!open) return null\n\n  return createPortal(\n    <div\n      className=\"fixed inset-0 bg-slate-900/40 z-50 flex items-center justify-center\"\n      onClick={(e) => e.target === e.currentTarget && onClose()}\n    >\n      <div\n        role=\"alertdialog\"\n        aria-modal=\"true\"\n        aria-labelledby=\"confirm-title\"\n        aria-describedby=\"confirm-desc\"\n        className=\"bg-white rounded-2xl p-6 shadow-soft-xl w-full max-w-md mx-4\"\n      >\n        <div className={`w-12 h-12 rounded-full ${cfg.iconBg} flex items-center justify-center mx-auto mb-4`}>\n          <span className={`material-symbols-outlined ${cfg.iconColor} text-h1`}>{cfg.icon}</span>\n        </div>\n\n        <h2 id=\"confirm-title\" className=\"text-base font-extrabold text-slate-900 text-center mb-2\">\n          {title}\n        </h2>\n        <p id=\"confirm-desc\" className=\"text-body-sm text-slate-500 leading-relaxed text-center mb-6\">\n          {description}\n        </p>\n\n        <div className=\"flex gap-2\">\n          <Button variant=\"ghost\" size=\"md\" onClick={onClose} className=\"flex-1\">\n            {cancelLabel}\n          </Button>\n          <Button\n            variant={cfg.btnVariant}\n            size=\"md\"\n            onClick={() => { onConfirm(); onClose(); }}\n            className={`flex-1 ${cfg.btnClassName ?? ''}`}\n          >\n            {confirmLabel}\n          </Button>\n        </div>\n      </div>\n    </div>,\n    document.body\n  )\n}\n","import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface ToastItem {\n  id: string\n  type: ToastType\n  title: string\n  description?: string\n  duration?: number\n}\n\ninterface ToastContextValue {\n  toast: (item: Omit<ToastItem, 'id'>) => void\n  dismiss: (id: string) => void\n}\n\n// ─── Config ───────────────────────────────────────────────────────────────────\n\nconst toastConfig: Record<\n  ToastType,\n  {\n    accent: string\n    iconBg: string\n    iconRing: string\n    iconColor: string\n    icon: string\n    autoDismiss: boolean\n  }\n> = {\n  success: {\n    accent: 'bg-green-500',\n    iconBg: 'bg-green-50',\n    iconRing: 'ring-green-100',\n    iconColor: 'text-green-500',\n    icon: 'check',\n    autoDismiss: true,\n  },\n  error: {\n    accent: 'bg-red-500',\n    iconBg: 'bg-red-50',\n    iconRing: 'ring-red-100',\n    iconColor: 'text-red-500',\n    icon: 'error',\n    autoDismiss: false,\n  },\n  warning: {\n    accent: 'bg-amber-500',\n    iconBg: 'bg-amber-50',\n    iconRing: 'ring-amber-100',\n    iconColor: 'text-amber-500',\n    icon: 'warning',\n    autoDismiss: true,\n  },\n  info: {\n    accent: 'bg-blue-500',\n    iconBg: 'bg-blue-50',\n    iconRing: 'ring-blue-100',\n    iconColor: 'text-blue-500',\n    icon: 'info',\n    autoDismiss: true,\n  },\n}\n\nconst DEFAULT_TOAST_DURATION = 5000\n\nexport const getToastDismissDuration = (item: ToastItem): number | null => {\n  const cfg = toastConfig[item.type]\n  if (item.duration !== undefined) {\n    return item.duration > 0 ? item.duration : null\n  }\n  return cfg.autoDismiss ? DEFAULT_TOAST_DURATION : null\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nconst ToastContext = createContext<ToastContextValue | null>(null)\n\nexport function useToast(): ToastContextValue {\n  const ctx = useContext(ToastContext)\n  if (!ctx) throw new Error('useToast must be used inside <ToastProvider>')\n  return ctx\n}\n\n// ─── Individual Toast ─────────────────────────────────────────────────────────\n\nconst ToastItem: React.FC<{ item: ToastItem; onDismiss: (id: string) => void }> = ({\n  item,\n  onDismiss,\n}) => {\n  const cfg = toastConfig[item.type]\n  const timerRef = useRef<ReturnType<typeof setTimeout>>()\n  const duration = getToastDismissDuration(item)\n\n  useEffect(() => {\n    if (duration !== null) {\n      timerRef.current = setTimeout(() => onDismiss(item.id), duration)\n    }\n    return () => clearTimeout(timerRef.current)\n  }, [item.id, duration, onDismiss])\n\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      className=\"cp-toast-enter relative flex w-full max-w-sm overflow-hidden rounded-[10px] border border-slate-200/80 bg-white px-3.5 py-3.5 pr-2.5 shadow-soft-lg\"\n    >\n      <span className={`absolute left-0 top-0 h-full w-0.5 ${cfg.accent}`} aria-hidden=\"true\" />\n      <div\n        className={`ml-1 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg ring-1 ring-inset ${cfg.iconBg} ${cfg.iconRing}`}\n      >\n        <span className={`material-symbols-outlined text-[16px] leading-none ${cfg.iconColor}`}>\n          {cfg.icon}\n        </span>\n      </div>\n      <div className=\"min-w-0 flex-1 px-3\">\n        <p className=\"text-[12px] font-extrabold leading-5 text-slate-900\">{item.title}</p>\n        {item.description && (\n          <p className=\"mt-0.5 text-[11px] leading-snug text-slate-500\">{item.description}</p>\n        )}\n      </div>\n      <button\n        type=\"button\"\n        onClick={() => onDismiss(item.id)}\n        className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg text-slate-300 transition-colors hover:bg-slate-100 hover:text-slate-600 focus:outline-2 focus:outline-teal-400 focus:outline-offset-2\"\n        aria-label=\"닫기\"\n      >\n        <span className=\"material-symbols-outlined text-[16px] leading-none\">close</span>\n      </button>\n      {duration !== null && (\n        <span\n          className={`cp-toast-progress absolute bottom-0 left-0 h-0.5 w-full ${cfg.accent}`}\n          style={{ animationDuration: `${duration}ms` }}\n          aria-hidden=\"true\"\n        />\n      )}\n    </div>\n  )\n}\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\nconst TOAST_STYLE_ID = 'cp-toast-styles'\nconst TOAST_KEYFRAMES = `\n@keyframes cpSlideInFromRight {\n  from { transform: translateX(calc(100% + 16px)); opacity: 0; }\n  to   { transform: translateX(0); opacity: 1; }\n}\n@keyframes cpToastProgress {\n  from { transform: scaleX(1); }\n  to   { transform: scaleX(0); }\n}\n.cp-toast-enter { animation: cpSlideInFromRight 0.3s ease-out both; }\n.cp-toast-progress {\n  animation-name: cpToastProgress;\n  animation-timing-function: linear;\n  animation-fill-mode: forwards;\n  transform-origin: left;\n}\n`\n\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n  const [toasts, setToasts] = useState<ToastItem[]>([])\n\n  useEffect(() => {\n    if (typeof document === 'undefined' || document.getElementById(TOAST_STYLE_ID)) return\n    const style = document.createElement('style')\n    style.id = TOAST_STYLE_ID\n    style.textContent = TOAST_KEYFRAMES\n    document.head.appendChild(style)\n  }, [])\n\n  const dismiss = useCallback((id: string) => {\n    setToasts((prev) => prev.filter((t) => t.id !== id))\n  }, [])\n\n  const toast = useCallback((item: Omit<ToastItem, 'id'>) => {\n    const id = `${Date.now()}-${Math.random()}`\n    setToasts((prev) => {\n      const next = [...prev, { ...item, id }]\n      return next.slice(-3)\n    })\n  }, [])\n\n  return (\n    <ToastContext.Provider value={{ toast, dismiss }}>\n      {children}\n      {typeof document !== 'undefined' &&\n        createPortal(\n          <div\n            className=\"fixed right-4 top-4 z-50 flex w-[calc(100vw-2rem)] max-w-sm flex-col gap-2\"\n            aria-live=\"polite\"\n            role=\"region\"\n            aria-label=\"알림\"\n          >\n            {toasts.map((item) => (\n              <ToastItem key={item.id} item={item} onDismiss={dismiss} />\n            ))}\n          </div>,\n          document.body\n        )}\n    </ToastContext.Provider>\n  )\n}\n","import React, { useEffect, useState } from 'react'\nimport { cn } from '@/utils/cn'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg'\nexport type AvatarStatus = 'online' | 'offline' | 'warning' | 'none'\n\nexport interface AvatarProps {\n  src?: string | null\n  name?: string | null\n  email?: string | null\n  alt?: string\n  size?: AvatarSize\n  status?: AvatarStatus\n  className?: string\n}\n\nconst sizeStyles: Record<AvatarSize, { box: string; text: string; dot: string; dotOffset: string }> = {\n  xs: { box: 'h-6 w-6', text: 'text-[10px]', dot: 'h-2 w-2', dotOffset: '-bottom-0.5 -right-0.5' },\n  sm: { box: 'h-8 w-8', text: 'text-[12px]', dot: 'h-2.5 w-2.5', dotOffset: '-bottom-0.5 -right-0.5' },\n  md: { box: 'h-10 w-10', text: 'text-[14px]', dot: 'h-3 w-3', dotOffset: '-bottom-0.5 -right-0.5' },\n  lg: { box: 'h-12 w-12', text: 'text-[16px]', dot: 'h-3.5 w-3.5', dotOffset: '-bottom-0.5 -right-0.5' },\n}\n\nconst statusStyles: Record<Exclude<AvatarStatus, 'none'>, string> = {\n  online: 'bg-teal-500',\n  offline: 'bg-slate-300',\n  warning: 'bg-amber-500',\n}\n\nexport function getAvatarInitial(name?: string | null, email?: string | null): string {\n  const source = name?.trim() || email?.trim() || 'User'\n  return Array.from(source)[0]?.toLocaleUpperCase() || 'U'\n}\n\nexport const Avatar: React.FC<AvatarProps> = ({\n  src,\n  name,\n  email,\n  alt,\n  size = 'md',\n  status = 'none',\n  className,\n}) => {\n  const [showImage, setShowImage] = useState(Boolean(src))\n  const label = alt ?? name ?? email ?? '사용자'\n  const sizeClass = sizeStyles[size]\n\n  useEffect(() => {\n    setShowImage(Boolean(src))\n  }, [src])\n\n  return (\n    <span className={cn('relative inline-flex shrink-0', sizeClass.box, className)}>\n      {src && showImage ? (\n        <img\n          src={src}\n          alt={label}\n          onError={() => setShowImage(false)}\n          className={cn(\n            'h-full w-full rounded-full border border-slate-200 bg-slate-100 object-cover',\n            'shadow-soft-sm'\n          )}\n        />\n      ) : (\n        <span\n          role=\"img\"\n          aria-label={label}\n          className={cn(\n            'flex h-full w-full items-center justify-center rounded-full border border-teal-100',\n            'bg-teal-50 font-extrabold text-teal-700 shadow-soft-sm',\n            sizeClass.text\n          )}\n        >\n          {getAvatarInitial(name, email)}\n        </span>\n      )}\n\n      {status !== 'none' && (\n        <span\n          aria-label={status}\n          className={cn(\n            'absolute rounded-full border-2 border-white shadow-soft-sm',\n            sizeClass.dot,\n            sizeClass.dotOffset,\n            statusStyles[status]\n          )}\n        />\n      )}\n    </span>\n  )\n}\n","import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn } from '@/utils/cn'\n\nexport interface DropdownMenuProps {\n  trigger: React.ReactNode\n  children: React.ReactNode\n  open?: boolean\n  defaultOpen?: boolean\n  onOpenChange?: (open: boolean) => void\n  align?: 'start' | 'center' | 'end'\n  side?: 'top' | 'right' | 'bottom' | 'left'\n  width?: 'trigger' | 'sm' | 'md' | 'lg'\n  className?: string\n}\n\nexport interface DropdownMenuItemProps {\n  leftIcon?: string\n  rightIcon?: string\n  rightSlot?: React.ReactNode\n  description?: string\n  disabled?: boolean\n  tone?: 'default' | 'danger'\n  onSelect?: () => void\n  children: React.ReactNode\n}\n\ninterface DropdownMenuContextValue {\n  closeMenu: (restoreFocus?: boolean) => void\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\n\nconst widthStyles: Record<Exclude<DropdownMenuProps['width'], undefined | 'trigger'>, string> = {\n  sm: 'w-48',\n  md: 'w-60',\n  lg: 'w-80',\n}\n\ntype MenuPosition = {\n  top: number\n  left: number\n  minWidth?: number\n}\n\ntype TriggerElementProps = React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>\n\nfunction assignRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n  if (!ref) return\n  if (typeof ref === 'function') {\n    ref(value)\n    return\n  }\n  ;(ref as React.MutableRefObject<T | null>).current = value\n}\n\nfunction composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n  return (value: T | null) => {\n    refs.forEach((ref) => assignRef(ref, value))\n  }\n}\n\nfunction getEnabledItems(menu: HTMLElement | null): HTMLElement[] {\n  if (!menu) return []\n  return Array.from(\n    menu.querySelectorAll<HTMLElement>('[data-cp-dropdown-item=\"true\"]:not([aria-disabled=\"true\"])')\n  )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max)\n}\n\nconst DropdownMenuRoot: React.FC<DropdownMenuProps> = ({\n  trigger,\n  children,\n  open,\n  defaultOpen = false,\n  onOpenChange,\n  align = 'start',\n  side = 'bottom',\n  width = 'sm',\n  className,\n}) => {\n  const isControlled = open !== undefined\n  const [internalOpen, setInternalOpen] = useState(defaultOpen)\n  const isOpen = isControlled ? Boolean(open) : internalOpen\n  const triggerRef = useRef<HTMLElement>(null)\n  const menuRef = useRef<HTMLDivElement>(null)\n  const focusOnOpenRef = useRef<'first' | 'last' | null>(null)\n  const [position, setPosition] = useState<MenuPosition>({ top: 0, left: 0 })\n\n  const setOpen = useCallback(\n    (nextOpen: boolean) => {\n      if (!isControlled) setInternalOpen(nextOpen)\n      onOpenChange?.(nextOpen)\n    },\n    [isControlled, onOpenChange]\n  )\n\n  const closeMenu = useCallback(\n    (restoreFocus = true) => {\n      setOpen(false)\n      if (restoreFocus) triggerRef.current?.focus()\n    },\n    [setOpen]\n  )\n\n  const updatePosition = useCallback(() => {\n    const triggerEl = triggerRef.current\n    const menuEl = menuRef.current\n    if (!triggerEl || !menuEl || typeof window === 'undefined') return\n\n    const margin = 8\n    const gap = 6\n    const rect = triggerEl.getBoundingClientRect()\n    const menuWidth = width === 'trigger' ? rect.width : menuEl.offsetWidth\n    const menuHeight = menuEl.offsetHeight\n\n    let top = rect.bottom + gap\n    let left = rect.left\n\n    if (side === 'top') {\n      top = rect.top - menuHeight - gap\n    } else if (side === 'right') {\n      top = rect.top + rect.height / 2 - menuHeight / 2\n      left = rect.right + gap\n    } else if (side === 'left') {\n      top = rect.top + rect.height / 2 - menuHeight / 2\n      left = rect.left - menuWidth - gap\n    }\n\n    if (side === 'top' || side === 'bottom') {\n      if (align === 'center') left = rect.left + rect.width / 2 - menuWidth / 2\n      if (align === 'end') left = rect.right - menuWidth\n    } else {\n      if (align === 'center') top = rect.top + rect.height / 2 - menuHeight / 2\n      if (align === 'end') top = rect.bottom - menuHeight\n    }\n\n    setPosition({\n      top: clamp(top, margin, window.innerHeight - menuHeight - margin),\n      left: clamp(left, margin, window.innerWidth - menuWidth - margin),\n      minWidth: width === 'trigger' ? rect.width : undefined,\n    })\n  }, [align, side, width])\n\n  const focusMenuItem = useCallback((target: 'first' | 'last' = 'first') => {\n    const enabledItems = getEnabledItems(menuRef.current)\n    const item = target === 'last' ? enabledItems[enabledItems.length - 1] : enabledItems[0]\n    item?.focus()\n  }, [])\n\n  useLayoutEffect(() => {\n    if (!isOpen) return\n    updatePosition()\n  }, [isOpen, updatePosition, children])\n\n  useLayoutEffect(() => {\n    if (!isOpen || !focusOnOpenRef.current) return\n    const target = focusOnOpenRef.current\n    focusOnOpenRef.current = null\n    focusMenuItem(target)\n  }, [focusMenuItem, isOpen, children])\n\n  useEffect(() => {\n    if (!isOpen || typeof document === 'undefined') return\n\n    const handlePointerDown = (event: MouseEvent) => {\n      const target = event.target as Node\n      if (triggerRef.current?.contains(target) || menuRef.current?.contains(target)) return\n      closeMenu(false)\n    }\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') {\n        event.preventDefault()\n        closeMenu(true)\n      }\n    }\n\n    document.addEventListener('mousedown', handlePointerDown)\n    document.addEventListener('keydown', handleKeyDown)\n    window.addEventListener('resize', updatePosition)\n    window.addEventListener('scroll', updatePosition, true)\n\n    return () => {\n      document.removeEventListener('mousedown', handlePointerDown)\n      document.removeEventListener('keydown', handleKeyDown)\n      window.removeEventListener('resize', updatePosition)\n      window.removeEventListener('scroll', updatePosition, true)\n    }\n  }, [closeMenu, isOpen, updatePosition])\n\n  const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n    const enabledItems = getEnabledItems(menuRef.current)\n    if (enabledItems.length === 0) return\n\n    const activeIndex = enabledItems.indexOf(document.activeElement as HTMLElement)\n\n    if (event.key === 'ArrowDown') {\n      event.preventDefault()\n      enabledItems[(activeIndex + 1) % enabledItems.length]?.focus()\n    } else if (event.key === 'ArrowUp') {\n      event.preventDefault()\n      enabledItems[(activeIndex - 1 + enabledItems.length) % enabledItems.length]?.focus()\n    } else if (event.key === 'Home') {\n      event.preventDefault()\n      enabledItems[0]?.focus()\n    } else if (event.key === 'End') {\n      event.preventDefault()\n      enabledItems[enabledItems.length - 1]?.focus()\n    } else if (event.key === 'Enter' || event.key === ' ') {\n      if (document.activeElement instanceof HTMLElement && enabledItems.includes(document.activeElement)) {\n        event.preventDefault()\n        document.activeElement.click()\n      }\n    }\n  }\n\n  const handleTriggerKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n    if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return\n    event.preventDefault()\n    const target = event.key === 'ArrowUp' ? 'last' : 'first'\n    if (isOpen) {\n      focusMenuItem(target)\n      return\n    }\n    focusOnOpenRef.current = target\n    setOpen(true)\n  }\n\n  const contextValue = useMemo<DropdownMenuContextValue>(() => ({ closeMenu }), [closeMenu])\n\n  const triggerElement = React.isValidElement(trigger)\n    ? (() => {\n        const element = trigger as React.ReactElement<TriggerElementProps> & { ref?: React.Ref<HTMLElement> }\n        return React.cloneElement<TriggerElementProps>(element, {\n          ref: composeRefs(element.ref, triggerRef),\n          'aria-haspopup': 'menu',\n          'aria-expanded': isOpen,\n          onClick: (event: React.MouseEvent<HTMLElement>) => {\n            element.props.onClick?.(event)\n            if (!event.defaultPrevented) setOpen(!isOpen)\n          },\n          onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => {\n            element.props.onKeyDown?.(event)\n            if (!event.defaultPrevented) handleTriggerKeyDown(event)\n          },\n        })\n      })()\n    : (\n        <button\n          ref={triggerRef as React.RefObject<HTMLButtonElement>}\n          type=\"button\"\n          aria-haspopup=\"menu\"\n          aria-expanded={isOpen}\n          onClick={() => setOpen(!isOpen)}\n          onKeyDown={handleTriggerKeyDown}\n        >\n          {trigger}\n        </button>\n      )\n\n  const menu = isOpen ? (\n    <DropdownMenuContext.Provider value={contextValue}>\n      <div\n        ref={menuRef}\n        role=\"menu\"\n        tabIndex={-1}\n        onKeyDown={handleMenuKeyDown}\n        className={cn(\n          'fixed z-40 rounded-[10px] border border-slate-200/80 bg-white p-1.5 shadow-soft-lg',\n          'outline-none',\n          width !== 'trigger' && widthStyles[width],\n          className\n        )}\n        style={{\n          top: position.top,\n          left: position.left,\n          minWidth: position.minWidth,\n        }}\n      >\n        {children}\n      </div>\n    </DropdownMenuContext.Provider>\n  ) : null\n\n  return (\n    <>\n      {triggerElement}\n      {typeof document !== 'undefined' && menu ? createPortal(menu, document.body) : menu}\n    </>\n  )\n}\n\nconst DropdownMenuItem: React.FC<DropdownMenuItemProps> = ({\n  leftIcon,\n  rightIcon,\n  rightSlot,\n  description,\n  disabled = false,\n  tone = 'default',\n  onSelect,\n  children,\n}) => {\n  const context = React.useContext(DropdownMenuContext)\n\n  const handleClick = () => {\n    if (disabled) return\n    onSelect?.()\n    context?.closeMenu(true)\n  }\n\n  return (\n    <button\n      type=\"button\"\n      role=\"menuitem\"\n      tabIndex={disabled ? -1 : -1}\n      aria-disabled={disabled ? 'true' : undefined}\n      data-cp-dropdown-item=\"true\"\n      onClick={handleClick}\n      className={cn(\n        'flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors',\n        'focus:outline-2 focus:outline-teal-400 focus:outline-offset-1',\n        disabled && 'cursor-not-allowed opacity-45',\n        !disabled && tone === 'default' && 'text-slate-700 hover:bg-slate-50 focus:bg-slate-50',\n        !disabled && tone === 'danger' && 'text-red-600 hover:bg-red-50 focus:bg-red-50'\n      )}\n    >\n      {leftIcon && (\n        <span className=\"material-symbols-outlined text-[18px] leading-none text-current\" aria-hidden=\"true\">\n          {leftIcon}\n        </span>\n      )}\n      <span className=\"min-w-0 flex-1\">\n        <span className=\"block truncate font-semibold\">{children}</span>\n        {description && <span className=\"block truncate text-[11px] font-medium text-slate-400\">{description}</span>}\n      </span>\n      {rightSlot ?? (\n        rightIcon ? (\n          <span className=\"material-symbols-outlined text-[18px] leading-none text-current\" aria-hidden=\"true\">\n            {rightIcon}\n          </span>\n        ) : null\n      )}\n    </button>\n  )\n}\n\nconst DropdownMenuLabel: React.FC<{ children: React.ReactNode; className?: string }> = ({\n  children,\n  className,\n}) => (\n  <div className={cn('px-2.5 py-1.5 text-[11px] font-extrabold uppercase text-slate-400', className)}>\n    {children}\n  </div>\n)\n\nconst DropdownMenuSeparator: React.FC<{ className?: string }> = ({ className }) => (\n  <div role=\"separator\" className={cn('my-1 h-px bg-slate-100', className)} />\n)\n\nconst DropdownMenuGroup: React.FC<{ children: React.ReactNode; className?: string }> = ({\n  children,\n  className,\n}) => (\n  <div role=\"group\" className={className}>\n    {children}\n  </div>\n)\n\nexport const DropdownMenu = Object.assign(DropdownMenuRoot, {\n  Item: DropdownMenuItem,\n  Label: DropdownMenuLabel,\n  Separator: DropdownMenuSeparator,\n  Group: DropdownMenuGroup,\n})\n","import React from 'react'\nimport { Avatar } from './Avatar'\nimport { DropdownMenu, type DropdownMenuItemProps } from './DropdownMenu'\nimport { cn } from '@/utils/cn'\n\nexport interface UserMenuUser {\n  name?: string | null\n  email: string\n  avatarUrl?: string | null\n}\n\nexport interface UserMenuIntegration {\n  label: string\n  status: 'connected' | 'disconnected' | 'warning'\n  helperText?: string\n}\n\nexport interface UserMenuExtraItem {\n  label: string\n  leftIcon?: string\n  description?: string\n  tone?: DropdownMenuItemProps['tone']\n  disabled?: boolean\n  onSelect?: () => void\n}\n\nexport interface UserMenuProps {\n  user: UserMenuUser\n  integrations?: UserMenuIntegration[]\n  placement?: 'sidebar' | 'topbar'\n  onSettingsClick?: () => void\n  onLogout?: () => void\n  extraItems?: UserMenuExtraItem[]\n  className?: string\n}\n\nconst integrationConfig: Record<\n  UserMenuIntegration['status'],\n  { label: string; dot: string; text: string; avatarStatus: 'online' | 'offline' | 'warning' }\n> = {\n  connected: {\n    label: '연결됨',\n    dot: 'bg-teal-500',\n    text: 'text-teal-700',\n    avatarStatus: 'online',\n  },\n  disconnected: {\n    label: '미연결',\n    dot: 'bg-slate-300',\n    text: 'text-slate-500',\n    avatarStatus: 'offline',\n  },\n  warning: {\n    label: '확인 필요',\n    dot: 'bg-amber-500',\n    text: 'text-amber-700',\n    avatarStatus: 'warning',\n  },\n}\n\nconst getAvatarStatus = (integrations: UserMenuIntegration[]): 'online' | 'offline' | 'warning' | 'none' => {\n  if (integrations.some((integration) => integration.status === 'warning')) return 'warning'\n  if (integrations.some((integration) => integration.status === 'connected')) return 'online'\n  if (integrations.length > 0) return 'offline'\n  return 'none'\n}\n\nexport const UserMenu: React.FC<UserMenuProps> = ({\n  user,\n  integrations = [],\n  placement = 'sidebar',\n  onSettingsClick,\n  onLogout,\n  extraItems = [],\n  className,\n}) => {\n  const displayName = user.name || user.email\n  const avatarStatus = getAvatarStatus(integrations)\n  const isSidebar = placement === 'sidebar'\n\n  const trigger = (\n    <button\n      type=\"button\"\n      className={cn(\n        'flex min-w-0 items-center gap-2.5 rounded-[10px] border border-slate-200 bg-white text-left transition-all duration-150',\n        'hover:border-teal-200 hover:bg-teal-50/30 hover:shadow-soft-md',\n        'focus:outline-2 focus:outline-teal-400 focus:outline-offset-2',\n        isSidebar ? 'w-full px-3 py-2.5' : 'max-w-[260px] px-2.5 py-2',\n        className\n      )}\n      aria-label={`계정 메뉴: ${displayName}`}\n    >\n      <Avatar src={user.avatarUrl} name={user.name} email={user.email} size=\"sm\" status={avatarStatus} />\n      <span className=\"min-w-0 flex-1\">\n        <span className=\"block truncate text-[13px] font-bold text-slate-900\">{displayName}</span>\n        <span className=\"block truncate text-[11px] font-medium text-slate-500\">{user.email}</span>\n      </span>\n      <span className=\"material-symbols-outlined shrink-0 text-[18px] leading-none text-slate-400\" aria-hidden=\"true\">\n        expand_more\n      </span>\n    </button>\n  )\n\n  return (\n    <DropdownMenu trigger={trigger} align=\"end\" width={isSidebar ? 'trigger' : 'md'}>\n      <div className=\"px-2 py-2\">\n        <div className=\"flex min-w-0 items-center gap-2.5\">\n          <Avatar src={user.avatarUrl} name={user.name} email={user.email} size=\"md\" status={avatarStatus} />\n          <div className=\"min-w-0\">\n            <p className=\"truncate text-[13px] font-bold text-slate-900\">{displayName}</p>\n            <p className=\"truncate text-[11px] font-medium text-slate-500\">{user.email}</p>\n          </div>\n        </div>\n      </div>\n\n      {integrations.length > 0 && (\n        <>\n          <DropdownMenu.Separator />\n          <DropdownMenu.Label>연동 상태</DropdownMenu.Label>\n          <div className=\"space-y-1 px-2 py-1\">\n            {integrations.map((integration) => {\n              const cfg = integrationConfig[integration.status]\n              return (\n                <div key={integration.label} className=\"flex min-w-0 items-start gap-2 rounded-lg bg-slate-50 px-2.5 py-2\">\n                  <span className={cn('mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full', cfg.dot)} />\n                  <div className=\"min-w-0 flex-1\">\n                    <div className=\"flex min-w-0 items-center justify-between gap-2\">\n                      <span className=\"truncate text-[12px] font-bold text-slate-700\">{integration.label}</span>\n                      <span className={cn('shrink-0 text-[11px] font-bold', cfg.text)}>{cfg.label}</span>\n                    </div>\n                    {integration.helperText && (\n                      <p className=\"mt-0.5 truncate text-[11px] text-slate-400\">{integration.helperText}</p>\n                    )}\n                  </div>\n                </div>\n              )\n            })}\n          </div>\n        </>\n      )}\n\n      {(extraItems.length > 0 || onSettingsClick || onLogout) && <DropdownMenu.Separator />}\n\n      {extraItems.map((item) => (\n        <DropdownMenu.Item\n          key={item.label}\n          leftIcon={item.leftIcon}\n          description={item.description}\n          tone={item.tone}\n          disabled={item.disabled}\n          onSelect={item.onSelect}\n        >\n          {item.label}\n        </DropdownMenu.Item>\n      ))}\n\n      {onSettingsClick && (\n        <DropdownMenu.Item leftIcon=\"settings\" onSelect={onSettingsClick}>\n          계정 설정\n        </DropdownMenu.Item>\n      )}\n\n      {onLogout && (\n        <DropdownMenu.Item leftIcon=\"logout\" tone=\"danger\" onSelect={onLogout}>\n          로그아웃\n        </DropdownMenu.Item>\n      )}\n    </DropdownMenu>\n  )\n}\n","import React from 'react'\nimport { Button } from './Button'\nimport { cn } from '@/utils/cn'\n\nexport type IntegrationStatus = 'connected' | 'disconnected' | 'warning' | 'error'\n\nexport interface IntegrationStatusCardProps {\n  icon?: string\n  title: string\n  status: IntegrationStatus\n  description?: string\n  metadata?: React.ReactNode\n  primaryAction?: {\n    label: string\n    onClick: () => void\n    isLoading?: boolean\n  }\n  secondaryAction?: {\n    label: string\n    onClick: () => void\n    tone?: 'default' | 'danger'\n  }\n  className?: string\n}\n\nconst statusConfig: Record<\n  IntegrationStatus,\n  { label: string; badge: string; dot: string; icon: string; iconWrap: string; iconText: string }\n> = {\n  connected: {\n    label: '연결됨',\n    badge: 'bg-teal-50 text-teal-700',\n    dot: 'bg-teal-500',\n    icon: 'check_circle',\n    iconWrap: 'bg-teal-50',\n    iconText: 'text-teal-500',\n  },\n  disconnected: {\n    label: '미연결',\n    badge: 'bg-slate-100 text-slate-600',\n    dot: 'bg-slate-400',\n    icon: 'link_off',\n    iconWrap: 'bg-slate-100',\n    iconText: 'text-slate-500',\n  },\n  warning: {\n    label: '다시 연결 필요',\n    badge: 'bg-amber-50 text-amber-700',\n    dot: 'bg-amber-500',\n    icon: 'warning',\n    iconWrap: 'bg-amber-50',\n    iconText: 'text-amber-500',\n  },\n  error: {\n    label: '오류',\n    badge: 'bg-red-50 text-red-600',\n    dot: 'bg-red-500',\n    icon: 'error',\n    iconWrap: 'bg-red-50',\n    iconText: 'text-red-500',\n  },\n}\n\nexport const IntegrationStatusCard: React.FC<IntegrationStatusCardProps> = ({\n  icon,\n  title,\n  status,\n  description,\n  metadata,\n  primaryAction,\n  secondaryAction,\n  className,\n}) => {\n  const cfg = statusConfig[status]\n\n  return (\n    <div className={cn('rounded-[14px] border border-slate-100 bg-white p-5 shadow-soft-md', className)}>\n      <div className=\"flex items-start gap-3\">\n        <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-[10px] bg-teal-50\">\n          <span className=\"material-symbols-outlined text-[20px] leading-none text-teal-500\" aria-hidden=\"true\">\n            {icon ?? cfg.icon}\n          </span>\n        </div>\n\n        <div className=\"min-w-0 flex-1\">\n          <div className=\"flex min-w-0 items-start justify-between gap-3\">\n            <div className=\"min-w-0\">\n              <h3 className=\"truncate text-sm font-bold text-slate-900\">{title}</h3>\n              {description && (\n                <p className=\"mt-1 text-[13px] leading-relaxed text-slate-500\">{description}</p>\n              )}\n            </div>\n            <span className={cn('inline-flex shrink-0 items-center gap-1.5 rounded-lg px-2.5 py-1 text-[11px] font-bold', cfg.badge)}>\n              <span className={cn('h-1.5 w-1.5 rounded-full', cfg.dot)} />\n              {cfg.label}\n            </span>\n          </div>\n\n          {metadata && (\n            <div className=\"mt-3 rounded-[10px] bg-slate-50 px-3 py-2 text-[12px] font-medium text-slate-500\">\n              {metadata}\n            </div>\n          )}\n\n          {(primaryAction || secondaryAction) && (\n            <div className=\"mt-4 flex flex-wrap justify-end gap-2\">\n              {secondaryAction && (\n                <Button\n                  type=\"button\"\n                  size=\"sm\"\n                  variant={secondaryAction.tone === 'danger' ? 'danger' : 'outline'}\n                  onClick={secondaryAction.onClick}\n                >\n                  {secondaryAction.label}\n                </Button>\n              )}\n              {primaryAction && (\n                <Button\n                  type=\"button\"\n                  size=\"sm\"\n                  variant=\"primary\"\n                  isLoading={primaryAction.isLoading}\n                  onClick={primaryAction.onClick}\n                >\n                  {primaryAction.label}\n                </Button>\n              )}\n            </div>\n          )}\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from 'react'\n\ntype TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\nconst placementStyles: Record<\n  TooltipPlacement,\n  { wrapper: string; arrow: string }\n> = {\n  top: {\n    wrapper: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n    arrow: 'top-full left-1/2 -translate-x-1/2 border-4 border-transparent border-t-slate-800',\n  },\n  bottom: {\n    wrapper: 'top-full left-1/2 -translate-x-1/2 mt-2',\n    arrow: 'bottom-full left-1/2 -translate-x-1/2 border-4 border-transparent border-b-slate-800',\n  },\n  left: {\n    wrapper: 'right-full top-1/2 -translate-y-1/2 mr-2',\n    arrow: 'left-full top-1/2 -translate-y-1/2 border-4 border-transparent border-l-slate-800',\n  },\n  right: {\n    wrapper: 'left-full top-1/2 -translate-y-1/2 ml-2',\n    arrow: 'right-full top-1/2 -translate-y-1/2 border-4 border-transparent border-r-slate-800',\n  },\n}\n\nexport interface TooltipProps {\n  content: string\n  placement?: TooltipPlacement\n  maxWidth?: boolean\n  children: React.ReactNode\n  className?: string\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n  content,\n  placement = 'top',\n  maxWidth = false,\n  children,\n  className = '',\n}) => {\n  const { wrapper, arrow } = placementStyles[placement]\n\n  return (\n    <div className={`relative group inline-flex ${className}`}>\n      {children}\n      <div\n        className={`\n          absolute ${wrapper} z-50\n          px-3 py-1.5 bg-slate-800 text-white text-caption font-medium rounded-lg\n          shadow-soft-lg ${maxWidth ? 'max-w-xs text-center leading-relaxed' : 'whitespace-nowrap'}\n          opacity-0 invisible group-hover:opacity-100 group-hover:visible\n          transition-all duration-150 pointer-events-none\n        `}\n      >\n        {content}\n        <div className={`absolute ${arrow}`} />\n      </div>\n    </div>\n  )\n}\n","import React from 'react'\n\nexport interface DescriptionItem {\n  label: string\n  value: React.ReactNode\n}\n\nexport interface DescriptionListProps {\n  items: DescriptionItem[]\n  layout?: 'vertical' | 'grid'\n  divider?: boolean\n  className?: string\n}\n\nexport const DescriptionList: React.FC<DescriptionListProps> = ({\n  items,\n  layout = 'vertical',\n  divider = false,\n  className = '',\n}) => {\n  const isGrid = layout === 'grid'\n\n  const itemClass = divider\n    ? 'flex justify-between items-center text-body-sm py-3'\n    : 'flex justify-between items-center text-body-sm'\n\n  const containerClass = isGrid\n    ? `grid grid-cols-2 gap-x-8 gap-y-3 ${className}`\n    : divider\n      ? `divide-y divide-slate-100 ${className}`\n      : `space-y-3 ${className}`\n\n  return (\n    <dl className={containerClass}>\n      {items.map((item, index) => (\n        <div key={index} className={itemClass}>\n          <dt className=\"text-slate-500\">{item.label}</dt>\n          <dd className=\"font-semibold text-slate-800\">{item.value}</dd>\n        </div>\n      ))}\n    </dl>\n  )\n}\n","import React, { useRef, useState } from 'react'\nimport { Button } from './Button'\n\n// ─── DropZone ─────────────────────────────────────────────────────────────────\n\nexport interface DropZoneProps {\n  onFileSelect?: (files: FileList) => void\n  accept?: string\n  multiple?: boolean\n  label?: string\n  description?: string\n  className?: string\n  disabled?: boolean\n  isLoading?: boolean\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({\n  onFileSelect,\n  accept,\n  multiple = false,\n  label = '파일을 드래그하거나 클릭하여 업로드',\n  description = 'CSV, XLSX (최대 10MB)',\n  className = '',\n  disabled = false,\n  isLoading = false,\n}) => {\n  const [isDragging, setIsDragging] = useState(false)\n  const inputRef = useRef<HTMLInputElement>(null)\n\n  const isDisabled = disabled || isLoading\n\n  const handleDrop = (e: React.DragEvent) => {\n    e.preventDefault()\n    setIsDragging(false)\n    if (isDisabled) return\n    if (e.dataTransfer.files.length > 0) onFileSelect?.(e.dataTransfer.files)\n  }\n\n  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.files?.length) onFileSelect?.(e.target.files)\n  }\n\n  return (\n    <div\n      onClick={() => !isDisabled && inputRef.current?.click()}\n      onDragOver={(e) => { e.preventDefault(); if (!isDisabled) setIsDragging(true) }}\n      onDragLeave={() => setIsDragging(false)}\n      onDrop={handleDrop}\n      className={`\n        border-2 border-dashed rounded-[14px] p-8\n        flex flex-col items-center justify-center text-center\n        transition-all duration-150\n        ${isDisabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}\n        ${isDragging\n          ? 'border-teal-400 bg-teal-50/30'\n          : 'border-slate-200 hover:border-teal-300 hover:bg-teal-50/20'\n        }\n        ${className}\n      `}\n    >\n      <input\n        ref={inputRef}\n        type=\"file\"\n        accept={accept}\n        multiple={multiple}\n        className=\"hidden\"\n        onChange={handleChange}\n        disabled={isDisabled}\n      />\n      {isLoading ? (\n        <>\n          <span className=\"material-symbols-outlined text-teal-400 text-h1 mb-3 animate-spin\">\n            progress_activity\n          </span>\n          <p className=\"text-body-sm font-bold text-slate-500\">업로드 중...</p>\n        </>\n      ) : (\n        <>\n          <div className={`w-12 h-12 rounded-xl flex items-center justify-center mb-3 ${isDragging ? 'bg-teal-50' : 'bg-slate-50'}`}>\n            <span className={`material-symbols-outlined text-h1 ${isDragging ? 'text-teal-500' : 'text-slate-400'}`}>\n              {isDragging ? 'download' : 'upload_file'}\n            </span>\n          </div>\n          {isDragging ? (\n            <p className=\"text-body-sm font-bold text-teal-600\">여기에 놓으세요</p>\n          ) : (\n            <>\n              <p className=\"text-body-sm font-bold text-slate-700 mb-1\">{label}</p>\n              <p className=\"text-caption text-slate-400\">{description}</p>\n            </>\n          )}\n        </>\n      )}\n    </div>\n  )\n}\n\n// ─── FileItem ─────────────────────────────────────────────────────────────────\n\nexport type FileItemStatus = 'uploading' | 'complete' | 'error'\n\nexport interface FileItemProps {\n  name: string\n  size?: string\n  status?: FileItemStatus\n  progress?: number\n  onRemove?: () => void\n}\n\nexport const FileItem: React.FC<FileItemProps> = ({\n  name,\n  size,\n  status = 'complete',\n  progress,\n  onRemove,\n}) => (\n  <div className={`border-[1.5px] rounded-[14px] p-4 ${status === 'error' ? 'border-red-300 bg-red-50/20' : 'border-slate-200'}`}>\n    <div className=\"flex items-center gap-3\">\n      <div className=\"w-10 h-10 rounded-[10px] bg-teal-50 flex items-center justify-center flex-shrink-0\">\n        <span className=\"material-symbols-outlined text-teal-500 text-h2\">description</span>\n      </div>\n      <div className=\"flex-1 min-w-0\">\n        <p className=\"text-body-sm font-bold text-slate-800 truncate\">{name}</p>\n        {size && <p className=\"text-caption text-slate-400\">{size}</p>}\n      </div>\n      {status === 'complete' && (\n        <span className=\"material-symbols-outlined text-green-500 text-h2 flex-shrink-0\">check_circle</span>\n      )}\n      {status === 'error' && (\n        <span className=\"material-symbols-outlined text-red-500 text-h2 flex-shrink-0\">error</span>\n      )}\n      {onRemove && (\n        <Button\n          variant=\"ghost\"\n          size=\"sm\"\n          onClick={onRemove}\n          aria-label=\"삭제\"\n          leftIcon=\"close\"\n          className=\"flex-shrink-0 hover:text-red-500\"\n        />\n      )}\n    </div>\n    {status === 'uploading' && progress != null && (\n      <div className=\"mt-2 h-1 bg-slate-100 rounded-full overflow-hidden\">\n        <div\n          className=\"h-full bg-gradient-to-r from-teal-400 to-teal-500 rounded-full transition-all duration-300\"\n          style={{ width: `${progress}%` }}\n        />\n      </div>\n    )}\n  </div>\n)\n","import React from 'react'\nimport { Button } from './Button'\n\nexport interface BulkAction {\n  label: string\n  icon?: string\n  onClick: () => void\n  variant?: 'primary' | 'secondary' | 'danger'\n}\n\nexport interface BulkActionBarProps {\n  selectedCount: number\n  onClearSelection: () => void\n  actions: BulkAction[]\n  position?: 'bottom-floating' | 'bottom-sticky' | 'top-floating'\n  theme?: 'dark' | 'light'\n  className?: string\n}\n\n\nconst positionClass: Record<NonNullable<BulkActionBarProps['position']>, string> = {\n  'bottom-floating': 'fixed bottom-4 left-1/2 -translate-x-1/2',\n  'bottom-sticky': 'sticky bottom-4',\n  'top-floating': 'fixed top-16 left-1/2 -translate-x-1/2',\n}\n\nexport const BulkActionBar: React.FC<BulkActionBarProps> = ({\n  selectedCount,\n  onClearSelection,\n  actions,\n  position = 'bottom-floating',\n  theme = 'dark',\n  className = '',\n}) => {\n  const isDark = theme === 'dark'\n\n  const containerClass = isDark\n    ? 'bg-slate-900 text-white'\n    : 'bg-white border border-slate-200 text-slate-800'\n\n  const countClass = isDark ? 'text-teal-300' : 'text-teal-600'\n\n  return (\n    <div\n      className={`\n        ${positionClass[position]} z-40 max-w-3xl w-full mx-auto\n        transition-all duration-200\n        ${selectedCount > 0 ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4 pointer-events-none'}\n        ${className}\n      `}\n      role=\"region\"\n      aria-label=\"일괄 액션\"\n    >\n      <div className={`${containerClass} rounded-[14px] shadow-soft-xl px-3 py-2 md:px-5 md:py-3 flex items-center justify-between gap-2 md:gap-4`}>\n        {/* Count + Clear */}\n        <div className=\"flex items-center gap-2 md:gap-3\">\n          <span className=\"text-caption md:text-body-sm font-bold\" aria-live=\"polite\">\n            <span className={countClass}>{selectedCount}</span>개 선택\n            <span className=\"hidden md:inline\">됨</span>\n          </span>\n          <button\n            type=\"button\"\n            className={`text-caption font-semibold ${isDark ? 'text-slate-400 hover:text-white' : 'text-slate-400 hover:text-slate-600'} transition-colors`}\n            onClick={onClearSelection}\n          >\n            해제\n          </button>\n        </div>\n\n        {/* Actions */}\n        <div className=\"flex items-center gap-1 md:gap-2\">\n          {actions.map((action, index) => {\n            const variant = action.variant ?? 'secondary'\n            const dsVariant = variant === 'secondary' ? 'ghost' : variant\n            const darkSecondaryClass = isDark && variant === 'secondary'\n              ? 'text-slate-300 hover:text-white hover:bg-slate-700'\n              : ''\n            return (\n              <Button\n                key={index}\n                variant={dsVariant}\n                size=\"sm\"\n                onClick={action.onClick}\n                leftIcon={action.icon}\n                className={`text-caption ${darkSecondaryClass}`}\n              >\n                {action.label}\n              </Button>\n            )\n          })}\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from 'react'\n\nexport type CalloutVariant = 'info' | 'warning' | 'error' | 'tip'\n\nexport interface CalloutProps {\n  variant?: CalloutVariant\n  children: React.ReactNode\n  className?: string\n}\n\nconst config: Record<CalloutVariant, { wrapper: string; icon: string; iconColor: string }> = {\n  info:    { wrapper: 'bg-teal-50 border-teal-200 text-teal-700',   iconColor: 'text-teal-500',  icon: 'info'     },\n  warning: { wrapper: 'bg-amber-50 border-amber-200 text-amber-700', iconColor: 'text-amber-500', icon: 'warning'  },\n  error:   { wrapper: 'bg-red-50 border-red-200 text-red-700',       iconColor: 'text-red-500',   icon: 'error'    },\n  tip:     { wrapper: 'bg-blue-50 border-blue-200 text-blue-700',    iconColor: 'text-blue-500',  icon: 'lightbulb'},\n}\n\nexport const Callout: React.FC<CalloutProps> = ({ variant = 'info', children, className = '' }) => {\n  const { wrapper, icon, iconColor } = config[variant]\n  return (\n    <div className={`flex items-center gap-2 p-2.5 border rounded-[10px] text-caption leading-relaxed ${wrapper} ${className}`}>\n      <span className={`material-symbols-outlined text-body-md shrink-0 leading-none ${iconColor}`}>{icon}</span>\n      <span>{children}</span>\n    </div>\n  )\n}\n","import React from 'react'\n\nexport interface StepperStep {\n  label: string\n}\n\nexport interface StepperProps {\n  steps: StepperStep[]\n  currentStep: number\n  compact?: boolean\n  className?: string\n}\n\nexport const Stepper: React.FC<StepperProps> = ({ steps, currentStep, compact = false, className = '' }) => (\n  <div className={`flex items-center ${className}`}>\n    {steps.map((step, i) => {\n      const num = i + 1\n      const isDone = num < currentStep\n      const isCurrent = num === currentStep\n      const lineAfter = i < steps.length - 1\n      const active = isDone || isCurrent\n\n      return (\n        <React.Fragment key={i}>\n          <div className=\"flex items-center\">\n            <div className={`\n              ${compact ? 'w-6 h-6' : 'w-8 h-8'} rounded-full flex items-center justify-center flex-shrink-0\n              ${active ? 'bg-teal-500' : 'border-2 border-slate-200'}\n            `}>\n              {isDone ? (\n                <span className={`material-symbols-outlined text-white ${compact ? 'text-caption' : 'text-body-lg'}`}>check</span>\n              ) : (\n                <span className={`font-bold ${compact ? 'text-caption' : 'text-body-sm'} ${isCurrent ? 'text-white' : 'text-slate-400'}`}>\n                  {num}\n                </span>\n              )}\n            </div>\n            {!compact && (\n              <span className={`ml-2 text-body-sm whitespace-nowrap ${active ? 'font-bold text-teal-600' : 'font-semibold text-slate-400'}`}>\n                {step.label}\n              </span>\n            )}\n          </div>\n\n          {lineAfter && (\n            <div className={`\n              ${compact ? 'w-8 mx-2' : 'flex-1 mx-4'} h-0.5\n              ${isDone ? 'bg-teal-500' : 'bg-slate-200'}\n            `} />\n          )}\n        </React.Fragment>\n      )\n    })}\n  </div>\n)\n"],"mappings":"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","names":["jsx","jsxs","sizeClass","jsx","jsxs","React","jsx","jsxs","jsx","jsxs","createContext","useContext","useLayoutEffect","useRef","useState","jsx","jsxs","createContext","useContext","useState","useRef","useLayoutEffect","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","useRef","jsx","jsxs","useRef","createContext","useContext","useEffect","useRef","useState","createPortal","jsx","jsxs","useEffect","useState","jsx","jsxs","sizeStyles","statusStyles","useState","sizeClass","useEffect","React","useCallback","useEffect","useLayoutEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","React","useState","useRef","useCallback","useLayoutEffect","useEffect","createPortal","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useRef","useState","Fragment","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs","React","jsx","jsxs"]}