{"version":3,"sources":["../src/lib/cn.ts","../src/lib/color.ts","../src/components/SIcon/icons.gen.tsx","../src/components/SIcon/SIcon.tsx","../src/components/SBadge/SBadge.tsx","../src/components/SCard/SCard.tsx","../src/lib/display-name.ts","../src/lib/z-index.ts","../src/components/SDraggableItem/SDraggableItem.tsx","../src/components/SList/SList.tsx","../src/components/SDraggableList/SDraggableGroup.tsx","../src/components/SDraggableList/SDraggableList.tsx","../src/components/SExpansionItem/SExpansionItem.tsx","../src/components/SListItem/SListItem.tsx","../src/components/SExpansionList/SExpansionList.tsx","../src/components/SCheckbox/SCheckbox.tsx","../src/lib/floating-anim.ts","../src/lib/portal-container.tsx","../src/components/STag/tag.config.ts","../src/components/STag/STag.tsx","../src/components/SGhostButton/SGhostButton.tsx","../src/components/STree/STree.tsx","../src/lib/sanitize-inline-html.ts","../src/components/STooltip/STooltip.tsx","../src/components/SSectionHeaderCard/SSectionHeaderCard.tsx","../src/components/SDivider/SDivider.tsx","../src/lib/scrollbar.ts","../src/components/SScrollArea/SScrollArea.tsx","../src/components/SScrollArea/scrollArea.config.ts","../src/components/SSplitter/splitter.config.ts","../src/components/SSplitter/SSplitter.tsx","../src/components/SButton/button.config.ts","../src/components/SButton/SButton.tsx","../src/components/SCallout/SCallout.tsx","../src/components/SLinearProgress/SLinearProgress.tsx","../src/components/SCircleProgress/SCircleProgress.tsx","../src/lib/global-overlay.ts","../src/components/SLoadingContainer/SLoadingContainer.tsx","../src/components/SLoadingContainer/loading.tsx","../src/components/STextLink/STextLink.tsx","../src/components/SDropdownButton/SDropdownButton.tsx","../src/components/SSwitch/SSwitch.tsx","../src/components/SToggle/SToggle.tsx","../src/components/SPopover/SPopover.tsx","../src/components/SPortal/SPortal.tsx","../src/components/SFooter/SFooter.tsx","../src/components/SPopup/SPopup.tsx","../src/components/SGuide/SGuide.tsx","../src/lib/modal-stack.ts","../src/components/SModalContainer/SModalContainer.tsx","../src/components/SConfirmModal/SConfirmModal.tsx","../src/components/SOverlayHeader/SOverlayHeader.tsx","../src/components/SActionModal/SActionModal.tsx","../src/components/SLoadingModal/SLoadingModal.tsx","../src/components/SDrawer/SDrawer.tsx","../src/lib/is-dev.ts","../src/lib/modal-outlet.ts","../src/components/SModal/SModal.tsx","../src/components/SModal/SModalOutlet.tsx","../src/lib/isomorphic-layout-effect.ts","../src/components/SLayout/SLayout.tsx","../src/components/SGnb/gnb.config.ts","../src/components/SGnb/SGnb.tsx","../src/components/SPage/SPage.tsx","../src/components/SPage/page.config.ts","../src/components/STabs/tabs.config.ts","../src/components/STabs/STabs.tsx","../src/components/SPagination/SPagination.tsx","../src/components/SStepper/stepper.config.ts","../src/components/SStepper/SStepper.tsx","../src/lib/form.ts","../src/components/SField/SField.tsx","../src/components/SSelect/select.config.ts","../src/components/SSelect/SSelect.tsx","../src/components/STable/STable.tsx","../src/components/STableBar/STableBar.tsx","../src/lib/autofill.ts","../src/components/SInput/SInput.tsx","../src/components/STextarea/STextarea.tsx","../src/components/SNumberInput/SNumberInput.tsx","../src/components/SRadio/SRadio.tsx","../src/components/SRadio/SRadioGroup.tsx","../src/lib/date.ts","../src/components/SCalendar/SCalendar.tsx","../src/components/SDatePicker/SDatePicker.tsx","../src/components/SDateRangePicker/SDateRangePicker.tsx","../src/components/SChip/SChip.tsx","../src/components/SFilePicker/SFilePicker.tsx","../src/components/SKeyValueTable/SKeyValueTable.tsx","../src/components/SToast/SToast.tsx","../src/components/SToast/SToastContainer.tsx","../src/components/SForm/SForm.tsx","../src/components/SRadioButton/SRadioButton.tsx","../src/components/SChipInput/SChipInput.tsx","../src/components/SBarcodeInput/SBarcodeInput.tsx","../src/components/STimePicker/timepicker.config.ts","../src/components/STimePicker/STimePicker.tsx","../src/components/STimeRangePicker/time-range-picker.config.ts","../src/components/STimeRangePicker/STimeRangePicker.tsx"],"names":["extendTailwindMerge","clsx","jsx","jsxs","forwardRef","SIcon","SBadge","SCard","state","SDraggableItemView","useState","useRef","useEffect","Fragment","createPortal","SDraggableItem","SList","createContext","useContext","useCallback","SExpansionItem","useMemo","useId","SListItem","isValidElement","Children","depth","itemKey","cloneElement","SExpansionList","RCheckbox","STag","RPopover","STreeItem","STree","useImperativeHandle","RPopover2","STooltip","SSectionHeaderCardHeader","SSectionHeaderCardBody","SSectionHeaderCard","SDivider","SScrollArea","clamp","SSplitterBefore","SSplitterAfter","SSplitter","SButton","SCallout","SLinearProgress","SCircleProgress","SLoadingContainer","mounted","useSyncExternalStore","createRoot","STextLink","RTooltip","SIZE","RDropdown","SDropdownButton","RSwitch","RPopover3","RPopover4","SPopup","RPopover5","RDialog","CLOSE_ANIMATION_DURATION","RDialog2","entries","listeners","nextId","emit","Component","useLayoutEffect","SLayout","SGnb","RPopover6","SPage","V","SStepper","SField","SSelect","STable","STableBar","SInput","PAD","STextarea","SNumberInput","setRefs","parsed","RPopover7","RPopover8","SChip","Ariakit","cssLen","SToastContainer","SForm","SChipInput","loading","FONT","SBarcodeInput","clamped","displayDraft","RPopover9","getTimeMinutes","RPopover10"],"mappings":"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","file":"index.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/** `sd-16` 처럼 디자인 시스템 간격 스케일을 가리키는 값인지 (p-sd-16 → 'sd-16') */\nconst isSdSpacing = (value: string) => /^sd-\\d+$/.test(value);\n\n/**\n * 간격 스케일은 `--spacing-sd-*` 로 나가므로 클래스가 `p-sd-16` 형태다.\n * tailwind-merge 는 이 값을 모르기 때문에 등록하지 않으면 `p-sd-8` 과 `p-sd-24` 가\n * 둘 다 살아남아 소비자의 className 오버라이드가 조용히 무시된다.\n * (등록하면 소비자가 표준 `p-4` 로도 덮어쓸 수 있다 — 같은 그룹으로 인식되므로.)\n */\nconst SD_SPACING_GROUPS = [\n  'inset',\n  'inset-x',\n  'inset-y',\n  'start',\n  'end',\n  'top',\n  'right',\n  'bottom',\n  'left',\n  'basis',\n  'gap',\n  'gap-x',\n  'gap-y',\n  'p',\n  'px',\n  'py',\n  'ps',\n  'pe',\n  'pt',\n  'pr',\n  'pb',\n  'pl',\n  'm',\n  'mx',\n  'my',\n  'ms',\n  'me',\n  'mt',\n  'mr',\n  'mb',\n  'ml',\n  'space-x',\n  'space-y',\n  'size',\n  'w',\n  'min-w',\n  'max-w',\n  'h',\n  'min-h',\n  'max-h',\n  'leading',\n  'indent',\n  'translate',\n  'translate-x',\n  'translate-y',\n  'scroll-m',\n  'scroll-mx',\n  'scroll-my',\n  'scroll-mt',\n  'scroll-mr',\n  'scroll-mb',\n  'scroll-ml',\n  'scroll-p',\n  'scroll-px',\n  'scroll-py',\n  'scroll-pt',\n  'scroll-pr',\n  'scroll-pb',\n  'scroll-pl',\n] as const;\n\nconst sdSpacingClassGroups = Object.fromEntries(\n  SD_SPACING_GROUPS.map(group => [group, [{ [group]: [isSdSpacing] }]]),\n);\n\n/**\n * theme.css 의 --text-* 는 기본 Tailwind 폰트사이즈 스케일(xs/sm/base...)이 아닌\n * 숫자 스케일(10~32)이라, 확장 없이는 tailwind-merge 가 이를 텍스트 컬러 그룹으로\n * 오인해 text-12 같은 클래스를 text-(--color-var) 뒤에서 충돌 제거해버린다.\n *\n * --shadow-* 도 마찬가지로 커스텀 이름(normal-sm, spread-md ...)이라 그림자 그룹으로\n * 인식되지 않아, 등록하지 않으면 소비자의 shadow-none 이 내부 그림자를 못 지운다.\n */\nconst twMerge = extendTailwindMerge({\n  extend: {\n    classGroups: {\n      ...sdSpacingClassGroups,\n      'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n      'shadow': [\n        {\n          shadow: [\n            'normal-xs',\n            'normal-sm',\n            'normal-md',\n            'spread-sm',\n            'spread-md',\n            'dialog',\n            'floating',\n            'focus',\n            'overlay',\n          ],\n        },\n      ],\n    },\n  },\n});\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n  return twMerge(clsx(inputs));\n}\n","/**\n * 컬러 팔레트 키 해석 유틸 (stencil `utils/color` 포팅).\n *\n * 컴포넌트의 `color` prop 은 팔레트 키(`grey_65`, `red_95` …)와\n * 임의의 CSS 색상 값(`#FF0000`, `rgb(...)`, `var(--foo)` …)을 모두 받는다.\n * 팔레트 키가 들어오면 대응하는 `var(--color-*)` 로 변환하고,\n * 그 외의 값은 그대로 통과시킨다.\n *\n * 팔레트 원본은 theme.css 의 `--color-*` 프리미티브(토큰 자동 생성) 다.\n * 키 목록은 그와 1:1 로 대응하며, 값은 var() 참조로 단일 소스를 유지한다.\n */\n\n/** theme.css 의 `--color-*` 프리미티브와 1:1 대응하는 팔레트 키 */\nexport const COLOR_KEYS = [\n  'white',\n  'black',\n  'grey_10',\n  'grey_20',\n  'grey_25',\n  'grey_30',\n  'grey_35',\n  'grey_45',\n  'grey_50',\n  'grey_55',\n  'grey_60',\n  'grey_65',\n  'grey_70',\n  'grey_80',\n  'grey_85',\n  'grey_90',\n  'grey_95',\n  'grey_05',\n  'red_15',\n  'red_20',\n  'red_30',\n  'red_45',\n  'red_60',\n  'red_70',\n  'red_75',\n  'red_80',\n  'red_85',\n  'red_90',\n  'red_95',\n  'red_99',\n  'orange_10',\n  'orange_20',\n  'orange_35',\n  'orange_45',\n  'orange_55',\n  'orange_60',\n  'orange_65',\n  'orange_75',\n  'orange_85',\n  'orange_90',\n  'orange_95',\n  'orange_99',\n  'yellow_10',\n  'yellow_20',\n  'yellow_25',\n  'yellow_30',\n  'yellow_40',\n  'yellow_45',\n  'yellow_50',\n  'yellow_60',\n  'yellow_70',\n  'yellow_80',\n  'yellow_90',\n  'yellow_95',\n  'olive_10',\n  'olive_15',\n  'olive_20',\n  'olive_30',\n  'olive_45',\n  'olive_55',\n  'olive_65',\n  'olive_70',\n  'olive_80',\n  'olive_90',\n  'olive_95',\n  'olive_05',\n  'green_15',\n  'green_25',\n  'green_45',\n  'green_55',\n  'green_65',\n  'green_70',\n  'green_75',\n  'green_80',\n  'green_85',\n  'green_90',\n  'green_95',\n  'green_99',\n  'steelblue_10',\n  'steelblue_25',\n  'steelblue_45',\n  'steelblue_60',\n  'steelblue_65',\n  'steelblue_70',\n  'steelblue_75',\n  'steelblue_80',\n  'steelblue_85',\n  'steelblue_90',\n  'steelblue_95',\n  'steelblue_99',\n  'oceanblue_15',\n  'oceanblue_25',\n  'oceanblue_50',\n  'oceanblue_60',\n  'oceanblue_65',\n  'oceanblue_70',\n  'oceanblue_75',\n  'oceanblue_80',\n  'oceanblue_85',\n  'oceanblue_90',\n  'oceanblue_95',\n  'oceanblue_99',\n  'brilliantblue_10',\n  'brilliantblue_20',\n  'brilliantblue_25',\n  'brilliantblue_40',\n  'brilliantblue_50',\n  'brilliantblue_60',\n  'brilliantblue_70',\n  'brilliantblue_75',\n  'brilliantblue_80',\n  'brilliantblue_85',\n  'brilliantblue_90',\n  'brilliantblue_95',\n  'brilliantblue_99',\n  'brilliantblue_05',\n] as const;\n\n/** 팔레트 키 유니온 (`'grey_65' | 'red_95' | ...`) */\nexport type SColorKey = (typeof COLOR_KEYS)[number];\n\n/**\n * `color` prop 타입. 팔레트 키 자동완성을 제공하면서 임의 CSS 색상 문자열도 허용한다.\n * `(string & {})` 는 유니온 리터럴 자동완성을 유지하기 위한 관용 표현이다.\n */\nexport type SColor = SColorKey | (string & {});\n\nconst KEY_SET = new Set<string>(COLOR_KEYS);\n\n/** 문자열이 팔레트 키인지 판별하는 타입 가드 */\nexport function isColorKey(input: string): input is SColorKey {\n  return KEY_SET.has(input);\n}\n\n/**\n * 팔레트 키면 대응하는 `var(--color-*)` 로 변환하고, 그 외 값은 원문 그대로 반환한다.\n * 값이 비어 있으면 `fallback`(기본 `undefined`) 을 반환한다.\n * (SIcon 처럼 미지정 시 currentColor 를 상속해야 하는 곳을 위해 fallback 기본값은 undefined)\n */\nexport function resolveColor(\n  input: string | undefined | null,\n  fallback?: string,\n): string | undefined {\n  if (input === null || input === undefined || input === '') return fallback;\n  return isColorKey(input) ? `var(--color-${input.replace(/_/g, '-')})` : input;\n}\n","import type { SVGProps } from 'react';\n\nexport type IconRenderProps = { size?: number | string } & SVGProps<SVGSVGElement>;\n\nconst Icon_add = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.0005 3.98682C12.4146 3.98682 12.7503 4.32273 12.7505 4.73682V11.2505H19.2632C19.6774 11.2505 20.0132 11.5863 20.0132 12.0005C20.0132 12.4147 19.6774 12.7505 19.2632 12.7505H12.7505V19.2632C12.7505 19.6774 12.4147 20.0132 12.0005 20.0132C11.5863 20.0132 11.2505 19.6774 11.2505 19.2632V12.7505H4.73682C4.32273 12.7503 3.98682 12.4146 3.98682 12.0005C3.98682 11.5864 4.32273 11.2506 4.73682 11.2505H11.2505V4.73682C11.2506 4.32273 11.5864 3.98682 12.0005 3.98682Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_alert = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12.4755 3.338C13.642 2.65802 15.107 3.49955 15.1073 4.84972V19.1495C15.1071 20.4613 13.7164 21.3068 12.5516 20.7032L5.90027 17.2569H4.77332C3.25468 17.2568 2.02338 16.0256 2.02332 14.5069V9.93273C2.02332 8.41402 3.25464 7.18286 4.77332 7.18273H5.87878L12.4755 3.338ZM13.6073 4.84972C13.607 4.65712 13.3978 4.53707 13.2313 4.6339L6.83289 8.36241V16.0499L13.2421 19.3712C13.4084 19.4573 13.6071 19.3368 13.6073 19.1495V4.84972ZM4.77332 8.68273C4.08307 8.68286 3.52332 9.24245 3.52332 9.93273V14.5069C3.52338 15.1972 4.08311 15.7568 4.77332 15.7569H5.33289V8.68273H4.77332Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M18.7274 7.16124C19.0245 6.87261 19.5065 6.87261 19.8036 7.16124C22.7006 9.97598 22.7006 14.5398 19.8036 17.3546C19.5065 17.643 19.0245 17.643 18.7274 17.3546C18.4304 17.066 18.4305 16.5983 18.7274 16.3097C21.0306 14.0721 21.0306 10.4437 18.7274 8.20616C18.4304 7.91753 18.4303 7.44986 18.7274 7.16124Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M16.5214 9.3048C16.8184 9.01632 17.2995 9.01632 17.5966 9.3048C19.2754 10.9358 19.2754 13.5801 17.5966 15.211C17.2995 15.4994 16.8184 15.4994 16.5214 15.211C16.2243 14.9225 16.2244 14.4548 16.5214 14.1661C17.6058 13.1124 17.6058 11.4034 16.5214 10.3497C16.2243 10.0611 16.2243 9.59343 16.5214 9.3048Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_alignKorean = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M7.74994 11.5C8.16415 11.5 8.49994 11.8358 8.49994 12.25V13.5H10.7499C11.1642 13.5 11.4999 13.8358 11.4999 14.25C11.4999 14.6642 11.1642 15 10.7499 15H8.49994C9.88065 15 10.9999 16.1193 10.9999 17.5C10.9999 18.8807 9.88065 20 8.49994 20H6.74994C5.36923 20 4.24994 18.8807 4.24994 17.5C4.24994 16.1193 5.36923 15 6.74994 15H4.24994C3.83573 15 3.49994 14.6642 3.49994 14.25C3.49994 13.8358 3.83573 13.5 4.24994 13.5H6.99994V12.25C6.99994 11.8358 7.33573 11.5 7.74994 11.5ZM6.74994 16.5C6.19765 16.5 5.74994 16.9477 5.74994 17.5C5.74994 18.0523 6.19765 18.5 6.74994 18.5H8.49994C9.05222 18.5 9.49994 18.0523 9.49994 17.5C9.49994 16.9477 9.05222 16.5 8.49994 16.5H6.74994Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M17.2499 4C17.6642 4 17.9999 4.33579 17.9999 4.75V17.3047L19.1943 15.9873C19.4724 15.6803 19.9469 15.6565 20.2538 15.9346C20.5608 16.2127 20.5837 16.6872 20.3056 16.9941L17.8056 19.7539C17.6634 19.9107 17.4616 20 17.2499 20C17.0383 20 16.8364 19.9107 16.6943 19.7539L14.1943 16.9941C13.9162 16.6872 13.9391 16.2127 14.246 15.9346C14.553 15.6565 15.0275 15.6803 15.3056 15.9873L16.4999 17.3047V4.75C16.4999 4.33579 16.8357 4 17.2499 4Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M9.24994 4C10.2164 4 10.9999 4.7835 10.9999 5.75V10.25C10.9999 10.6642 10.6642 11 10.2499 11C9.83573 11 9.49994 10.6642 9.49994 10.25V5.75C9.49994 5.61193 9.38801 5.5 9.24994 5.5H4.24994C3.83573 5.5 3.49994 5.16421 3.49994 4.75C3.49994 4.33579 3.83573 4 4.24994 4H9.24994Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_archive = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M4.7998 2.0498C5.21396 2.0498 5.54971 2.38568 5.5498 2.7998V6.64258H10.4502V5.91797C10.4502 5.48024 10.6226 5.05999 10.9297 4.74805C11.2431 4.42976 11.6715 4.25 12.1182 4.25H14.7422C15.4983 4.25008 16.1694 4.73573 16.4053 5.4541L16.4873 5.70312C16.5211 5.8056 16.6167 5.875 16.7246 5.875H18.2002C19.1666 5.8751 19.9502 6.65856 19.9502 7.625V10.5C19.9502 11.4664 19.1666 12.2499 18.2002 12.25H12.2002C11.2337 12.25 10.4502 11.4665 10.4502 10.5V8.14258H5.5498V17.2998C5.5498 17.4378 5.66182 17.5497 5.7998 17.5498H10.4502V15.6182C10.4502 15.1804 10.6226 14.7602 10.9297 14.4482C11.2431 14.1299 11.6714 13.9502 12.1182 13.9502H14.7422C15.4983 13.9503 16.1694 14.4359 16.4053 15.1543L16.4873 15.4033C16.5211 15.5057 16.6167 15.5752 16.7246 15.5752H18.2002C19.1666 15.5753 19.9502 16.3588 19.9502 17.3252V20.2002C19.9501 21.1665 19.1665 21.9501 18.2002 21.9502H12.2002C11.2338 21.9502 10.4503 21.1666 10.4502 20.2002V19.0498H5.7998C4.83339 19.0497 4.0498 18.2662 4.0498 17.2998V2.7998C4.0499 2.38574 4.38574 2.0499 4.7998 2.0498ZM12.1182 15.4502C12.0733 15.4502 12.0295 15.468 11.998 15.5C11.9672 15.5313 11.9502 15.5742 11.9502 15.6182V20.2002C11.9503 20.3382 12.0622 20.4502 12.2002 20.4502H18.2002C18.3381 20.4501 18.4501 20.3381 18.4502 20.2002V17.3252C18.4502 17.1872 18.3382 17.0753 18.2002 17.0752H16.7246C15.9685 17.0752 15.2974 16.5894 15.0615 15.8711L14.9805 15.6221C14.9468 15.5195 14.8501 15.4503 14.7422 15.4502H12.1182ZM12.1182 5.75C12.0733 5.75 12.0295 5.76787 11.998 5.7998C11.9672 5.83115 11.9502 5.874 11.9502 5.91797V10.5C11.9502 10.6381 12.0621 10.75 12.2002 10.75H18.2002C18.3382 10.7499 18.4502 10.638 18.4502 10.5V7.625C18.4502 7.48699 18.3382 7.3751 18.2002 7.375H16.7246C15.9684 7.375 15.2974 6.88934 15.0615 6.1709L14.9805 5.92188C14.9468 5.81931 14.8501 5.75008 14.7422 5.75H12.1182Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_arrowDown = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.2502 2.77502C11.2502 2.36081 11.586 2.02502 12.0002 2.02502C12.4143 2.02513 12.7502 2.36088 12.7502 2.77502V19.4147L18.6701 13.4948C18.963 13.2021 19.4378 13.2019 19.7307 13.4948C20.0233 13.7876 20.0233 14.2625 19.7307 14.5553L12.5305 21.7555C12.3899 21.8961 12.199 21.9752 12.0002 21.9752C11.8014 21.9752 11.6105 21.896 11.4699 21.7555L4.26972 14.5553C3.97683 14.2624 3.97683 13.7876 4.26972 13.4948C4.56261 13.2019 5.03737 13.2019 5.33027 13.4948L11.2502 19.4147V2.77502Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_arrowLeft = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M9.44492 4.26967C9.73782 3.97687 10.2126 3.97681 10.5055 4.26967C10.7982 4.56254 10.7982 5.03735 10.5055 5.33022L4.58554 11.2501H21.2252C21.6393 11.2502 21.9752 11.586 21.9752 12.0001C21.9751 12.4142 21.6392 12.75 21.2252 12.7501H4.58554L10.5055 18.6701C10.7981 18.963 10.7983 19.4378 10.5055 19.7306C10.2127 20.0233 9.7378 20.0232 9.44492 19.7306L2.24472 12.5304C2.10411 12.3898 2.02505 12.199 2.02499 12.0001C2.02499 11.8013 2.10413 11.6105 2.24472 11.4699L9.44492 4.26967Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_arrowRight = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M13.4947 4.26972C13.7876 3.97683 14.2624 3.97683 14.5553 4.26972L21.7555 11.4699C21.896 11.6105 21.9752 11.8014 21.9752 12.0002C21.9751 12.199 21.8961 12.3899 21.7555 12.5305L14.5553 19.7307C14.2624 20.0233 13.7876 20.0233 13.4947 19.7307C13.2019 19.4378 13.202 18.963 13.4947 18.6701L19.4146 12.7502H2.77499C2.36085 12.7502 2.0251 12.4143 2.02499 12.0002C2.02499 11.586 2.36078 11.2502 2.77499 11.2502H19.4146L13.4947 5.33027C13.2018 5.03737 13.2018 4.56261 13.4947 4.26972Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_arrowUp = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.2502 21.2252V4.58557L5.33025 10.5055C5.03738 10.7983 4.56257 10.7983 4.2697 10.5055C3.97684 10.2126 3.9769 9.73785 4.2697 9.44495L11.4699 2.24475L11.5842 2.151C11.7064 2.06953 11.8511 2.02502 12.0002 2.02502C12.199 2.02508 12.3898 2.10414 12.5304 2.24475L19.7306 9.44495C20.0232 9.73783 20.0233 10.2127 19.7306 10.5055C19.4378 10.7983 18.963 10.7981 18.6701 10.5055L12.7502 4.58557V21.2252C12.7501 21.6393 12.4142 21.9751 12.0002 21.9752C11.586 21.9752 11.2503 21.6393 11.2502 21.2252Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_asterisk = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.1736 2.91895C12.3072 2.91895 12.4174 3.02382 12.4236 3.15723L12.7644 10.6738L19.4461 7.21191C19.5647 7.15042 19.7112 7.19288 19.7781 7.30859L19.9519 7.61035C20.0184 7.72598 19.9822 7.87332 19.8699 7.94531L13.53 11.999L19.8699 16.0547C19.9822 16.1267 20.0184 16.274 19.9519 16.3896L19.7781 16.6914C19.7113 16.8071 19.5647 16.8496 19.4461 16.7881L12.7654 13.3252L12.4236 20.8428C12.4174 20.9762 12.3072 21.0811 12.1736 21.0811H11.8259C11.6925 21.0809 11.5831 20.9761 11.5769 20.8428L11.2341 13.3252L4.55445 16.7881C4.43582 16.8496 4.28927 16.8071 4.22242 16.6914L4.04859 16.3896C3.98202 16.2739 4.01814 16.1266 4.13063 16.0547L10.4695 12L4.13063 7.94531C4.01813 7.87336 3.98201 7.72606 4.04859 7.61035L4.22242 7.30859C4.28928 7.19292 4.43582 7.15043 4.55445 7.21191L11.2341 10.6738L11.5769 3.15723C11.5831 3.02392 11.6925 2.91909 11.8259 2.91895H12.1736Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_attachFile = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.6523 3.07379C14.3559 1.37019 17.1185 1.37033 18.8222 3.07379C20.5259 4.77745 20.5259 7.54005 18.8222 9.24371L11.2519 16.814C10.1291 17.9368 8.30824 17.9368 7.18548 16.814C6.06307 15.6913 6.06305 13.8713 7.18548 12.7486L14.2509 5.68316C14.5438 5.39039 15.0186 5.39041 15.3115 5.68316C15.6043 5.97602 15.6043 6.45081 15.3115 6.74371L8.24603 13.8091C7.70938 14.346 7.7094 15.2166 8.24603 15.7535C8.783 16.2904 9.65437 16.2904 10.1913 15.7535L17.7617 8.18316C18.8794 7.06538 18.8792 5.25321 17.7617 4.13531C16.6438 3.01743 14.8317 3.01743 13.7138 4.13531L5.11614 12.732C3.45641 14.3917 3.45641 17.083 5.11614 18.7427L5.25677 18.8843C6.91645 20.544 9.60777 20.5439 11.2675 18.8843L18.748 11.4039C19.0409 11.1112 19.5157 11.1111 19.8085 11.4039C20.1013 11.6967 20.1012 12.1715 19.8085 12.4644L12.3281 19.9449C10.0825 22.1903 6.44169 22.1904 4.19622 19.9449L4.0556 19.8033C1.81008 17.5578 1.81008 13.917 4.0556 11.6714L12.6523 3.07379Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_barcode = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M5.25 3C5.66421 3 6 3.33579 6 3.75V20.25C6 20.6642 5.66421 21 5.25 21H3.75C3.33579 21 3 20.6642 3 20.25V3.75C3 3.33579 3.33579 3 3.75 3H5.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M7.5 3C7.91421 3 8.25 3.33579 8.25 3.75V20.25C8.25 20.6642 7.91421 21 7.5 21C7.08579 21 6.75 20.6642 6.75 20.25V3.75C6.75 3.33579 7.08579 3 7.5 3Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M9.75 3C10.1642 3 10.5 3.33579 10.5 3.75V20.25C10.5 20.6642 10.1642 21 9.75 21C9.33579 21 9 20.6642 9 20.25V3.75C9 3.33579 9.33579 3 9.75 3Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M13.5 3C13.9142 3 14.25 3.33579 14.25 3.75V20.25C14.25 20.6642 13.9142 21 13.5 21H12C11.5858 21 11.25 20.6642 11.25 20.25V3.75C11.25 3.33579 11.5858 3 12 3H13.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M15.75 3C16.1642 3 16.5 3.33579 16.5 3.75V20.25C16.5 20.6642 16.1642 21 15.75 21C15.3358 21 15 20.6642 15 20.25V3.75C15 3.33579 15.3358 3 15.75 3Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M20.25 3C20.6642 3 21 3.33579 21 3.75V20.25C21 20.6642 20.6642 21 20.25 21H18.75C18.3358 21 18 20.6642 18 20.25V3.75C18 3.33579 18.3358 3 18.75 3H20.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_bell = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.9997 2C12.8281 2 13.4997 2.67157 13.4997 3.5V4.16504C16.4633 4.82344 18.6734 7.38936 18.6735 10.4561V14.1465L18.6843 14.3301C18.7846 15.2926 19.607 16.8595 20.2468 17.4785C20.9292 18.1386 20.1161 19 19.1511 19H14.9938C14.9938 19.0028 14.994 19.0059 14.9938 19.0088C14.8967 20.6781 13.5933 22 11.9997 22C10.4062 21.9998 9.10269 20.678 9.00556 19.0088C9.00539 19.0059 9.00559 19.0028 9.00556 19H4.84833L4.66962 18.9902C3.78764 18.8932 3.11313 18.0974 3.75263 17.4785C4.39237 16.8596 5.21478 15.2927 5.31513 14.3301L5.32587 14.1465V10.4561C5.32596 7.38957 7.53635 4.82365 10.4997 4.16504V3.5C10.4997 2.67167 11.1714 2.00016 11.9997 2ZM11.9997 5.5C9.0949 5.50016 6.82597 7.76554 6.82587 10.4561V14.1465C6.82577 14.9672 6.47479 15.89 6.14423 16.5703C5.99522 16.8769 5.81805 17.1956 5.6247 17.5H18.3747C18.1813 17.1956 18.0042 16.8769 17.8552 16.5703C17.5246 15.89 17.1736 14.9671 17.1735 14.1465V10.4561C17.1734 7.76545 14.9046 5.5 11.9997 5.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_bill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M16.2891 8.7998C16.4208 8.40733 16.8457 8.19563 17.2383 8.32715C17.6309 8.45871 17.8423 8.88369 17.7109 9.27637L16.8818 11.75H18C18.4142 11.75 18.75 12.0858 18.75 12.5C18.75 12.9142 18.4142 13.25 18 13.25H16.3799L15.6035 15.5664C15.2492 16.6239 13.7487 16.6085 13.416 15.5439L12.6992 13.25H11.3008L10.584 15.5439C10.2513 16.6085 8.7508 16.6239 8.39648 15.5664L7.62012 13.25H6C5.58579 13.25 5.25 12.9142 5.25 12.5C5.25 12.0858 5.58579 11.75 6 11.75H7.11816L6.28906 9.27637C6.15765 8.88369 6.36905 8.45871 6.76172 8.32715C7.15433 8.19563 7.57919 8.40733 7.71094 8.7998L8.69922 11.75H10.1982L10.9023 9.49805L10.9375 9.40039C11.3201 8.45471 12.6799 8.45472 13.0625 9.40039L13.0977 9.49805L13.8018 11.75H15.3008L16.2891 8.7998ZM9.47461 14.0645L9.72949 13.25H9.20215L9.47461 14.0645ZM14.5244 14.0645L14.7979 13.25H14.2705L14.5244 14.0645ZM11.7695 11.75H12.2305L12 11.0137L11.7695 11.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M19.5 4.25C20.7426 4.25 21.75 5.25736 21.75 6.5V17.5C21.75 18.7426 20.7426 19.75 19.5 19.75H4.5C3.25736 19.75 2.25 18.7426 2.25 17.5L2.25 6.5C2.25 5.25736 3.25736 4.25 4.5 4.25H19.5ZM4.5 5.75C4.08579 5.75 3.75 6.08579 3.75 6.5V17.5C3.75 17.9142 4.08579 18.25 4.5 18.25H19.5C19.9142 18.25 20.25 17.9142 20.25 17.5V6.5C20.25 6.08579 19.9142 5.75 19.5 5.75H4.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_board = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M15 14.25C15.4142 14.25 15.75 14.5858 15.75 15C15.75 15.4142 15.4142 15.75 15 15.75H9C8.58579 15.75 8.25 15.4142 8.25 15C8.25 14.5858 8.58579 14.25 9 14.25H15Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M15 10.25C15.4142 10.25 15.75 10.5858 15.75 11C15.75 11.4142 15.4142 11.75 15 11.75H9C8.58579 11.75 8.25 11.4142 8.25 11C8.25 10.5858 8.58579 10.25 9 10.25H15Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13.75 2.0498C14.5699 2.0498 15.2733 2.54394 15.582 3.25H18.2002C19.1665 3.25021 19.9502 4.03363 19.9502 5V20.2002C19.9501 21.1665 19.1664 21.95 18.2002 21.9502H5.7998C4.83346 21.9501 4.04991 21.1665 4.0498 20.2002V5C4.0498 4.03356 4.83339 3.2501 5.7998 3.25H8.41797C8.72672 2.54394 9.43009 2.0498 10.25 2.0498H13.75ZM5.7998 4.75C5.66182 4.7501 5.5498 4.86199 5.5498 5V20.2002C5.54991 20.3381 5.66188 20.4501 5.7998 20.4502H18.2002C18.338 20.45 18.4501 20.338 18.4502 20.2002V5C18.4502 4.86206 18.3381 4.75021 18.2002 4.75H15.6211C15.3371 5.50881 14.6079 6.0498 13.75 6.0498H10.25C9.39207 6.0498 8.66292 5.50881 8.37891 4.75H5.7998ZM10.25 3.5498C9.97392 3.5498 9.7501 3.77375 9.75 4.0498C9.75 4.32595 9.97386 4.5498 10.25 4.5498H13.75C14.0261 4.5498 14.25 4.32595 14.25 4.0498C14.2499 3.77375 14.0261 3.5498 13.75 3.5498H10.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_box = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.4014 2.21916C11.7875 2.07874 12.2115 2.07886 12.5977 2.21916L20.7979 5.20158C21.4894 5.45308 21.9502 6.11024 21.9502 6.84612V17.1547C21.95 17.8904 21.4893 18.5478 20.7979 18.7992L12.5977 21.7807C12.2114 21.9211 11.7876 21.9211 11.4014 21.7807L3.20215 18.7992C2.51079 18.5478 2.04997 17.8904 2.0498 17.1547V6.84612C2.0498 6.1103 2.51067 5.45312 3.20215 5.20158L11.4014 2.21916ZM3.5498 17.1547C3.54997 17.2596 3.61626 17.3532 3.71484 17.3891L11.25 20.1293V9.66545L8.15039 8.63225V11.4252C8.15018 11.8391 7.81429 12.175 7.40039 12.1752C6.98631 12.1752 6.6506 11.8393 6.65039 11.4252V8.13225L3.5498 7.09905V17.1547ZM12.75 9.66545V20.1293L20.2852 17.3891C20.3838 17.3532 20.45 17.2597 20.4502 17.1547V7.09905L12.75 9.66545ZM15.9854 5.04729C15.914 5.12066 15.8279 5.18189 15.7266 5.22209L9.75195 7.5844L12 8.3344L18.7949 6.06877L15.9854 5.04729ZM12.085 3.62932C12.0299 3.6094 11.9691 3.6093 11.9141 3.62932L5.2041 6.06877L7.54004 6.84709L13.9561 4.30901L12.085 3.62932Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_camera = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 7.75C14.6234 7.75 16.75 9.87665 16.75 12.5C16.75 15.1234 14.6234 17.25 12 17.25C9.37665 17.25 7.25 15.1234 7.25 12.5C7.25 9.87665 9.37665 7.75 12 7.75ZM12 9.25C10.2051 9.25 8.75 10.7051 8.75 12.5C8.75 14.2949 10.2051 15.75 12 15.75C13.7949 15.75 15.25 14.2949 15.25 12.5C15.25 10.7051 13.7949 9.25 12 9.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M19.1426 8.17871C19.6685 8.17871 20.0947 8.60492 20.0947 9.13086C20.0947 9.65685 19.6686 10.083 19.1426 10.083C18.6167 10.0829 18.1904 9.65677 18.1904 9.13086C18.1905 8.605 18.6167 8.17884 19.1426 8.17871Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M14.5352 2.66699C15.1603 2.66705 15.7382 3.00059 16.0508 3.54199L17.123 5.39941C17.1677 5.47635 17.2499 5.52428 17.3389 5.52441H20C21.5188 5.52441 22.75 6.75563 22.75 8.27441V18.084C22.7497 19.6025 21.5186 20.834 20 20.834H4C2.48141 20.834 1.25031 19.6025 1.25 18.084V8.27441C1.25 6.75563 2.48122 5.52441 4 5.52441H6.43945C6.52862 5.52441 6.61154 5.47653 6.65625 5.39941L7.72852 3.54199C8.04113 3.00055 8.61893 2.66699 9.24414 2.66699H14.5352ZM9.24414 4.16699C9.15482 4.16699 9.072 4.21464 9.02734 4.29199L7.95508 6.14941C7.64241 6.69058 7.06448 7.02441 6.43945 7.02441H4C3.30964 7.02441 2.75 7.58406 2.75 8.27441V18.084C2.75031 18.7741 3.30984 19.334 4 19.334H20C20.6902 19.334 21.2497 18.7741 21.25 18.084V8.27441C21.25 7.58406 20.6904 7.02441 20 7.02441H17.3389C16.7139 7.02428 16.1358 6.69064 15.8232 6.14941L14.752 4.29199C14.7073 4.21469 14.6244 4.16705 14.5352 4.16699H9.24414Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_cancelFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M15.9697 6.96973C16.2626 6.67683 16.7374 6.67683 17.0303 6.96973C17.3232 7.26262 17.3232 7.73738 17.0303 8.03027L13.0605 12L17.0303 15.9697C17.3229 16.2626 17.3231 16.7375 17.0303 17.0303C16.7375 17.3231 16.2626 17.3229 15.9697 17.0303L12 13.0605L8.03027 17.0303C7.73736 17.3229 7.26253 17.3231 6.96973 17.0303C6.67692 16.7375 6.6771 16.2626 6.96973 15.9697L10.9395 12L6.96973 8.03027C6.67683 7.73738 6.67683 7.26262 6.96973 6.96973C7.26262 6.67683 7.73738 6.67683 8.03027 6.96973L12 10.9395L15.9697 6.96973Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 1.0498C18.0474 1.04991 22.9501 5.95263 22.9502 12C22.9501 18.0474 18.0474 22.9501 12 22.9502C5.95266 22.9501 1.04991 18.0473 1.0498 12C1.0499 5.95265 5.95265 1.04994 12 1.0498ZM12 2.5498C6.78108 2.54994 2.5499 6.78107 2.5498 12C2.54991 17.2189 6.78109 21.4501 12 21.4502C17.2189 21.4501 21.4501 17.2189 21.4502 12C21.4501 6.78106 17.2189 2.54991 12 2.5498Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_cancelOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1ZM17.0303 6.96973C16.7374 6.67684 16.2626 6.67684 15.9697 6.96973L12 10.9395L8.03027 6.96973C7.73738 6.67684 7.26262 6.67684 6.96973 6.96973C6.67683 7.26262 6.67684 7.73738 6.96973 8.03027L10.9395 12L6.96973 15.9697C6.67711 16.2626 6.67693 16.7375 6.96973 17.0303C7.26253 17.323 7.73738 17.3229 8.03027 17.0303L12 13.0605L15.9697 17.0303C16.2626 17.3228 16.7375 17.3231 17.0303 17.0303C17.3231 16.7375 17.3228 16.2626 17.0303 15.9697L13.0605 12L17.0303 8.03027C17.3231 7.7374 17.3231 7.26262 17.0303 6.96973Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_caretDown = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M19.2188 8.25C19.9555 8.25 20.2813 9.44246 19.7061 10.0342L12.4874 17.46C12.2028 17.7526 11.7974 17.7526 11.5127 17.46L4.294 10.0342C3.71879 9.44247 4.04461 8.25 4.7813 8.25H19.2188Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_caretLeft = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M14.1423 4.29416C14.7698 3.71888 16.0358 4.04475 16.0358 4.78146V19.219C16.0358 19.9557 14.7698 20.2815 14.1423 19.7063L6.26827 12.4865C5.95813 12.2019 5.95791 11.7975 6.26827 11.5129L14.1423 4.29416Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_caretRight = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M8.25 4.78127C8.25 4.04456 9.44248 3.71871 10.0342 4.29397L17.46 11.5127C17.7526 11.7973 17.7526 12.2027 17.46 12.4873L10.0342 19.7061C9.44249 20.2814 8.25 19.9555 8.25 19.2188V4.78127Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_caretUp = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.6252 6.44362C11.8583 6.27919 12.1422 6.27906 12.3752 6.44362L12.4865 6.5403L19.7063 13.9651C20.2815 14.5568 19.9557 15.7503 19.219 15.7503H4.78146C4.04475 15.7503 3.71888 14.5568 4.29416 13.9651L11.5129 6.5403L11.6252 6.44362Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_check = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M20.6621 5.86456C20.955 5.57167 21.4298 5.57168 21.7227 5.86456C22.0156 6.15746 22.0156 6.63222 21.7227 6.92511L10.5859 18.0618C10.1954 18.4523 9.56241 18.4523 9.17188 18.0618L2.27735 11.1683C1.98445 10.8754 1.98445 10.3996 2.27735 10.1068C2.57018 9.81416 3.04506 9.81416 3.3379 10.1068L9.87891 16.6478L20.6621 5.86456Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_checkFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1ZM18.1299 8.46973C17.837 8.17703 17.3622 8.1769 17.0693 8.46973L10.8125 14.7275L7.09961 11.0146C6.80684 10.7221 6.33191 10.7223 6.03906 11.0146C5.74625 11.3075 5.7464 11.7823 6.03906 12.0752L10.1045 16.1416C10.495 16.5321 11.129 16.5321 11.5195 16.1416L18.1299 9.53027C18.4228 9.23738 18.4228 8.76262 18.1299 8.46973Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_checkOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M17.0693 8.46973C17.3622 8.1769 17.837 8.17703 18.1299 8.46973C18.4228 8.76262 18.4228 9.23738 18.1299 9.53027L11.5195 16.1416C11.129 16.5321 10.495 16.5321 10.1045 16.1416L6.03906 12.0752C5.7464 11.7823 5.74625 11.3075 6.03906 11.0146C6.33191 10.7223 6.80684 10.7221 7.09961 11.0146L10.8125 14.7275L17.0693 8.46973Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 0.25C18.4893 0.25 23.75 5.51065 23.75 12C23.75 18.4893 18.4893 23.75 12 23.75C5.51065 23.75 0.25 18.4893 0.25 12C0.25 5.51065 5.51065 0.25 12 0.25ZM12 1.75C6.33908 1.75 1.75 6.33908 1.75 12C1.75 17.6609 6.33908 22.25 12 22.25C17.6609 22.25 22.25 17.6609 22.25 12C22.25 6.33908 17.6609 1.75 12 1.75Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_checkboxCheck = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 12 12\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M10.5962 3.19751L5.02773 8.76598C4.97891 8.81479 4.89977 8.81479 4.85095 8.76598L1.40381 5.31883\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n        strokeLinecap=\"round\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_checkboxIndeterminate = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 12 12\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path d=\"M2 6H10\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n    </svg>\n  );\n};\n\nconst Icon_chevronDown = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M20.676 6.96383C20.9721 6.6744 21.447 6.67953 21.7365 6.97555C22.0259 7.2716 22.0207 7.7465 21.7248 8.03609L12.6994 16.8652C12.3108 17.2453 11.6897 17.2452 11.301 16.8652L2.27559 8.03609C1.97951 7.74645 1.97425 7.27164 2.26388 6.97555C2.55352 6.67946 3.02833 6.6742 3.32442 6.96383L12.0002 15.4502L20.676 6.96383Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_chevronLeft = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M15.964 2.2756C16.2536 1.97953 16.7285 1.97423 17.0245 2.26388C17.3206 2.55351 17.3258 3.02834 17.0363 3.32443L8.54895 12.0002L17.0363 20.676C17.3256 20.9721 17.3205 21.447 17.0245 21.7365C16.7285 22.026 16.2536 22.0206 15.964 21.7248L7.13489 12.6994C6.75471 12.3108 6.75481 11.6897 7.13489 11.301L15.964 2.2756Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_chevronLeftEnd = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.9141 2.27542C13.2037 1.97944 13.6786 1.97411 13.9746 2.2637C14.2706 2.55332 14.2759 3.02816 13.9864 3.32425L5.50003 12L13.9864 20.6758C14.2757 20.9719 14.2705 21.4468 13.9746 21.7364C13.6786 22.0257 13.2037 22.0205 12.9141 21.7246L4.08499 12.6993C3.70484 12.3106 3.70497 11.6895 4.08499 11.3008L12.9141 2.27542Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M18.9141 2.27542C19.2037 1.97944 19.6786 1.97411 19.9746 2.2637C20.2706 2.55332 20.2759 3.02816 19.9864 3.32425L11.5 12L19.9864 20.6758C20.2757 20.9719 20.2705 21.4468 19.9746 21.7364C19.6786 22.0257 19.2037 22.0205 18.9141 21.7246L10.085 12.6993C9.70484 12.3106 9.70497 11.6895 10.085 11.3008L18.9141 2.27542Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_chevronRight = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M6.97558 2.26388C7.27167 1.97425 7.74648 1.97951 8.03612 2.27559L16.8652 11.301C17.2452 11.6897 17.2454 12.3108 16.8652 12.6994L8.03612 21.7248C7.74653 22.0207 7.27163 22.0259 6.97558 21.7365C6.67956 21.447 6.67443 20.9721 6.96386 20.676L15.4502 12.0002L6.96386 3.32442C6.67423 3.02833 6.67949 2.55352 6.97558 2.26388Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_chevronRightEnd = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M4.02539 2.26357C4.32145 1.9742 4.79634 1.97944 5.08594 2.27529L13.915 11.3007C14.2949 11.6893 14.295 12.3105 13.915 12.6991L5.08594 21.7245C4.79636 22.0204 4.32145 22.0256 4.02539 21.7362C3.72936 21.4466 3.72421 20.9718 4.01367 20.6757L12.5 11.9999L4.01367 3.32412C3.7243 3.02806 3.72953 2.55317 4.02539 2.26357Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M10.0254 2.26357C10.3214 1.9742 10.7963 1.97944 11.0859 2.27529L19.915 11.3007C20.2949 11.6893 20.295 12.3105 19.915 12.6991L11.0859 21.7245C10.7964 22.0204 10.3215 22.0256 10.0254 21.7362C9.72936 21.4466 9.72421 20.9718 10.0137 20.6757L18.5 11.9999L10.0137 3.32412C9.7243 3.02806 9.72953 2.55317 10.0254 2.26357Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_chevronUp = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.3762 7.06845C11.7403 6.77705 12.2602 6.77692 12.6242 7.06845L12.6994 7.13486L21.7248 15.964C22.0206 16.2536 22.026 16.7285 21.7365 17.0245C21.447 17.3205 20.9721 17.3256 20.676 17.0362L12.0002 8.54892L3.32443 17.0362C3.02834 17.3258 2.55351 17.3205 2.26388 17.0245C1.97423 16.7284 1.97953 16.2536 2.2756 15.964L11.301 7.13486L11.3762 7.06845Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_clockFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1ZM12 4.25C11.5858 4.25 11.25 4.58579 11.25 5V12C11.25 12.4142 11.5858 12.75 12 12.75H19C19.4142 12.75 19.75 12.4142 19.75 12C19.75 11.5858 19.4142 11.25 19 11.25H12.75V5C12.75 4.58579 12.4142 4.25 12 4.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_clockOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 4.25C12.4141 4.2501 12.75 4.58585 12.75 5V11.25H19C19.4141 11.2501 19.75 11.5858 19.75 12C19.7499 12.4141 19.4141 12.7499 19 12.75H12C11.5858 12.75 11.2501 12.4141 11.25 12V5C11.25 4.58579 11.5858 4.25 12 4.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 1.0498C18.0474 1.04991 22.9502 5.95255 22.9502 12C22.9501 18.0474 18.0474 22.9501 12 22.9502C5.95255 22.9502 1.04991 18.0474 1.0498 12C1.0498 5.95248 5.95248 1.0498 12 1.0498ZM12 2.5498C6.78091 2.5498 2.5498 6.78091 2.5498 12C2.54991 17.219 6.78097 21.4502 12 21.4502C17.2189 21.4501 21.4501 17.2189 21.4502 12C21.4502 6.78097 17.219 2.54991 12 2.5498Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_close = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M18.8281 4.11135C19.121 3.81849 19.5958 3.81854 19.8887 4.11135C20.1816 4.40424 20.1816 4.879 19.8887 5.1719L13.0596 12L19.8887 18.8291C20.1815 19.122 20.1815 19.5968 19.8887 19.8897C19.5958 20.1822 19.1209 20.1824 18.8281 19.8897L12 13.0606L5.17188 19.8897C4.87911 20.1823 4.40422 20.1821 4.11133 19.8897C3.81844 19.5968 3.81844 19.121 4.11133 18.8281L10.9385 12L4.11133 5.1719C3.81844 4.879 3.81844 4.40424 4.11133 4.11135C4.40424 3.8186 4.87903 3.81851 5.17188 4.11135L11.999 10.9395L18.8281 4.11135Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_copy = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M20 7.54395C20.9664 7.54404 21.7499 8.32759 21.75 9.29395V20C21.7499 20.9664 20.9664 21.7499 20 21.75H9.29395C8.32756 21.7499 7.54404 20.9664 7.54395 20V9.29395C7.54404 8.32757 8.32757 7.54401 9.29395 7.54395H20ZM9.29395 9.04395C9.15599 9.04401 9.04404 9.156 9.04395 9.29395V20C9.04404 20.138 9.15599 20.2499 9.29395 20.25H20C20.1379 20.2499 20.2499 20.1379 20.25 20V9.29395C20.2499 9.15602 20.1379 9.04404 20 9.04395H9.29395Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M14.7061 2.25C15.6725 2.25009 16.4561 3.03356 16.4561 4V6C16.4561 6.41416 16.1202 6.74991 15.7061 6.75C15.2918 6.75 14.9561 6.41421 14.9561 6V4C14.9561 3.86199 14.844 3.75009 14.7061 3.75H4C3.86193 3.75 3.75 3.86193 3.75 4V14.7061C3.75009 14.844 3.86199 14.9561 4 14.9561H6C6.41421 14.9561 6.75 15.2918 6.75 15.7061C6.74991 16.1202 6.41416 16.4561 6 16.4561H4C3.03356 16.4561 2.25009 15.6725 2.25 14.7061V4C2.25 3.0335 3.0335 2.25 4 2.25H14.7061Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_coupon = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M15 13.5C15.8284 13.5 16.5 14.1716 16.5 15C16.5 15.8284 15.8284 16.5 15 16.5C14.1716 16.5 13.5 15.8284 13.5 15C13.5 14.1716 14.1716 13.5 15 13.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M14.9092 7.96973C15.2021 7.67705 15.6769 7.67691 15.9697 7.96973C16.2625 8.26255 16.2624 8.73738 15.9697 9.03027L9.03027 15.9697C8.73739 16.2625 8.26261 16.2625 7.96973 15.9697C7.67685 15.6769 7.67689 15.2021 7.96973 14.9092L14.9092 7.96973Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M9 7.5C9.82843 7.5 10.5 8.17157 10.5 9C10.5 9.82843 9.82843 10.5 9 10.5C8.17157 10.5 7.5 9.82843 7.5 9C7.5 8.17157 8.17157 7.5 9 7.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M19.5 4.25C20.7426 4.25 21.75 5.25736 21.75 6.5V9C21.75 9.5042 21.5307 9.91547 21.2715 10.2178C21.0155 10.5162 20.6946 10.7418 20.4014 10.9023C20.0117 11.1156 19.75 11.5278 19.75 12C19.75 12.4722 20.0117 12.8844 20.4014 13.0977C20.6946 13.2582 21.0155 13.4838 21.2715 13.7822C21.5307 14.0845 21.75 14.4958 21.75 15V17.5C21.75 18.7426 20.7426 19.75 19.5 19.75H4.5C3.25736 19.75 2.25 18.7426 2.25 17.5V15C2.25 14.4958 2.46932 14.0845 2.72852 13.7822C2.98448 13.4838 3.30543 13.2582 3.59863 13.0977C3.98828 12.8844 4.25 12.4722 4.25 12C4.25 11.5278 3.98828 11.1156 3.59863 10.9023C3.30543 10.7418 2.98448 10.5162 2.72852 10.2178C2.46932 9.91547 2.25 9.5042 2.25 9L2.25 6.5C2.25 5.25736 3.25736 4.25 4.5 4.25H19.5ZM4.5 5.75C4.08579 5.75 3.75 6.08579 3.75 6.5V9C3.75 9.04794 3.76826 9.12579 3.86719 9.24121C3.96955 9.36057 4.12814 9.48225 4.31934 9.58691C5.17022 10.0528 5.75 10.9581 5.75 12C5.75 13.0419 5.17022 13.9472 4.31934 14.4131C4.12814 14.5178 3.96955 14.6394 3.86719 14.7588C3.76826 14.8742 3.75 14.9521 3.75 15V17.5C3.75 17.9142 4.08579 18.25 4.5 18.25H19.5C19.9142 18.25 20.25 17.9142 20.25 17.5V15C20.25 14.9521 20.2317 14.8742 20.1328 14.7588C20.0304 14.6394 19.8719 14.5178 19.6807 14.4131C18.8298 13.9472 18.25 13.0419 18.25 12C18.25 10.9581 18.8298 10.0528 19.6807 9.58691C19.8719 9.48225 20.0304 9.36057 20.1328 9.24121C20.2317 9.12579 20.25 9.04794 20.25 9V6.5C20.25 6.08579 19.9142 5.75 19.5 5.75H4.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_dashboard = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11 13.25C11 13.5261 10.7761 13.75 10.5 13.75L6.5 13.75C6.22386 13.75 6 13.5261 6 13.25L6 7.25C6 6.97386 6.22386 6.75 6.5 6.75L10.5 6.75C10.7761 6.75 11 6.97386 11 7.25L11 13.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M18 9.25C18 9.52614 17.7761 9.75 17.5 9.75L13.5 9.75C13.2239 9.75 13 9.52614 13 9.25L13 7.25C13 6.97386 13.2239 6.75 13.5 6.75L17.5 6.75C17.7761 6.75 18 6.97386 18 7.25L18 9.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M18 13.25C18 13.5261 17.7761 13.75 17.5 13.75L13.5 13.75C13.2239 13.75 13 13.5261 13 13.25L13 11.25C13 10.9739 13.2239 10.75 13.5 10.75L17.5 10.75C17.7761 10.75 18 10.9739 18 11.25L18 13.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M21.9502 14.75C21.9502 15.9925 20.9427 16.9998 19.7002 17L12.75 17L12.75 19L15 19C15.4142 19 15.75 19.3358 15.75 19.75C15.75 20.1642 15.4142 20.5 15 20.5L9 20.5C8.58579 20.5 8.25 20.1642 8.25 19.75C8.25 19.3358 8.58579 19 9 19L11.25 19L11.25 17L4.29981 17C3.05725 16.9999 2.04981 15.9926 2.04981 14.75L2.04981 5.75C2.04981 4.50742 3.05725 3.5001 4.29981 3.5L19.7002 3.5C20.9427 3.50021 21.9502 4.50749 21.9502 5.75L21.9502 14.75ZM20.4502 5.75C20.4502 5.33592 20.1142 5.00021 19.7002 5L4.29981 5C3.88568 5.0001 3.54981 5.33585 3.54981 5.75L3.54981 14.75C3.54981 15.1642 3.88568 15.4999 4.29981 15.5L19.7002 15.5C20.1142 15.4998 20.4502 15.1641 20.4502 14.75L20.4502 5.75Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_date = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M18 14C18.5522 14.0001 19 14.4478 19 15V18C18.9999 18.5521 18.5521 18.9999 18 19H15C14.4478 19 14.0001 18.5522 14 18V15C14 14.4477 14.4477 14 15 14H18Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M17 2.0498C17.4141 2.0499 17.75 2.38565 17.75 2.7998V4.25H20.2002C21.1665 4.25021 21.9502 5.03363 21.9502 6V20.2002C21.95 21.1664 21.1664 21.95 20.2002 21.9502H3.7998C2.83344 21.9502 2.05002 21.1665 2.0498 20.2002V6C2.0498 5.0335 2.83331 4.25 3.7998 4.25H6.25V2.7998C6.25 2.38559 6.58579 2.0498 7 2.0498C7.41413 2.0499 7.75 2.38565 7.75 2.7998V4.25H16.25V2.7998C16.25 2.38559 16.5858 2.0498 17 2.0498ZM3.5498 20.2002C3.55002 20.3381 3.66187 20.4502 3.7998 20.4502H20.2002C20.338 20.45 20.45 20.338 20.4502 20.2002V9H3.5498V20.2002Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_delete = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M8.35254 10.7646C8.75858 10.6834 9.15395 10.9466 9.23535 11.3525L10.2354 16.3525C10.3166 16.7586 10.0534 17.1539 9.64746 17.2354C9.24142 17.3166 8.84605 17.0534 8.76465 16.6475L7.76465 11.6475C7.68344 11.2414 7.94658 10.8461 8.35254 10.7646Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 10.75C12.4142 10.75 12.75 11.0858 12.75 11.5V16.5C12.75 16.9142 12.4142 17.25 12 17.25C11.5858 17.25 11.25 16.9142 11.25 16.5V11.5C11.25 11.0858 11.5858 10.75 12 10.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M14.7646 11.3525C14.8461 10.9466 15.2414 10.6834 15.6475 10.7646C16.0534 10.8461 16.3166 11.2414 16.2354 11.6475L15.2354 16.6475C15.1539 17.0534 14.7586 17.3166 14.3525 17.2354C13.9466 17.1539 13.6834 16.7586 13.7646 16.3525L14.7646 11.3525Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13 2.0498C13.9664 2.0498 14.7499 2.8334 14.75 3.7998V4.25H20C20.4142 4.25 20.75 4.58579 20.75 5V8C20.75 8.41421 20.4142 8.75 20 8.75H19.6445L17.999 19.6123C17.7952 20.9565 16.6398 21.9502 15.2803 21.9502H8.71973C7.36018 21.9502 6.20481 20.9565 6.00098 19.6123L4.35547 8.75H4C3.58579 8.75 3.25 8.41421 3.25 8V5C3.25 4.58579 3.58579 4.25 4 4.25H8.75V3.7998C8.75011 2.8334 9.53357 2.0498 10.5 2.0498H13ZM7.48438 19.3877C7.57717 19.9985 8.10188 20.4502 8.71973 20.4502H15.2803C15.8981 20.4502 16.4228 19.9985 16.5156 19.3877L18.1279 8.75H5.87207L7.48438 19.3877ZM4.75 7.25H19.25V5.75H4.75V7.25ZM10.5 3.5498C10.362 3.5498 10.2501 3.66182 10.25 3.7998V4.25H13.25V3.7998C13.2499 3.66182 13.138 3.5498 13 3.5498H10.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_dot = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <circle cx=\"12\" cy=\"12\" r=\"6\" fill=\"currentColor\" />\n    </svg>\n  );\n};\n\nconst Icon_download = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M21.2002 19.3501C21.6142 19.3503 21.9502 19.686 21.9502 20.1001C21.9502 20.5142 21.6142 20.8499 21.2002 20.8501H2.7998C2.38568 20.85 2.0498 20.5142 2.0498 20.1001C2.0498 19.6859 2.38568 19.3502 2.7998 19.3501H21.2002Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 3.1499C12.4142 3.1499 12.7499 3.48577 12.75 3.8999V15.0581L17.4639 10.2329C17.7533 9.93678 18.2281 9.93094 18.5244 10.2202C18.8205 10.5096 18.8254 10.9845 18.5361 11.2808L12.5361 17.4243C12.395 17.5686 12.2018 17.6499 12 17.6499C11.7982 17.6499 11.605 17.5686 11.4639 17.4243L5.46387 11.2808C5.17461 10.9845 5.17951 10.5096 5.47559 10.2202C5.77186 9.93094 6.24673 9.93678 6.53613 10.2329L11.25 15.0581V3.8999C11.2501 3.48577 11.5858 3.1499 12 3.1499Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_drag = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M21.2002 16.25C21.6142 16.2502 21.9502 16.5859 21.9502 17C21.9502 17.4141 21.6142 17.7498 21.2002 17.75H2.7998C2.38568 17.7499 2.0498 17.4142 2.0498 17C2.0498 16.5858 2.38568 16.2501 2.7998 16.25H21.2002Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21.2002 11.25C21.6142 11.2502 21.9502 11.5859 21.9502 12C21.9502 12.4141 21.6142 12.7498 21.2002 12.75H2.7998C2.38568 12.7499 2.0498 12.4142 2.0498 12C2.0498 11.5858 2.38568 11.2501 2.7998 11.25H21.2002Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21.2002 6.25C21.6142 6.25021 21.9502 6.58592 21.9502 7C21.9502 7.41408 21.6142 7.74979 21.2002 7.75H2.7998C2.38568 7.7499 2.0498 7.41415 2.0498 7C2.0498 6.58585 2.38568 6.2501 2.7998 6.25H21.2002Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_edit = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M15.9649 2.33392C16.4231 1.96031 17.0849 1.96031 17.5431 2.33392L17.6378 2.41985L21.5802 6.36321C22.0683 6.85136 22.0683 7.64265 21.5802 8.13079L8.13095 21.58C7.89664 21.8143 7.57852 21.9461 7.24716 21.9462H3.3038C2.61353 21.9461 2.0538 21.3865 2.0538 20.6962V16.7538C2.05388 16.4225 2.1857 16.1044 2.42001 15.8701L15.8702 2.41985L15.9649 2.33392ZM3.5538 16.8574V20.4462H7.14365L17.6856 9.90325L14.0958 6.31341L3.5538 16.8574ZM15.1563 5.25286L18.7462 8.84271L20.3429 7.24603L16.753 3.65716L15.1563 5.25286Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_etc = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M3.5 10.5C4.32843 10.5 5 11.1716 5 12C5 12.8284 4.32843 13.5 3.5 13.5C2.67157 13.5 2 12.8284 2 12C2 11.1716 2.67157 10.5 3.5 10.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 10.5C12.8284 10.5 13.5 11.1716 13.5 12C13.5 12.8284 12.8284 13.5 12 13.5C11.1716 13.5 10.5 12.8284 10.5 12C10.5 11.1716 11.1716 10.5 12 10.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M20.5 10.5C21.3284 10.5 22 11.1716 22 12C22 12.8284 21.3284 13.5 20.5 13.5C19.6716 13.5 19 12.8284 19 12C19 11.1716 19.6716 10.5 20.5 10.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_event = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M17 2C17.5523 2 18 2.44772 18 3V4H20C21.1046 4 22 4.89543 22 6V19.25C22 20.7688 20.7688 22 19.25 22H4.75C3.23122 22 2 20.7688 2 19.25V6C2 4.89543 2.89543 4 4 4H6V3C6 2.44772 6.44772 2 7 2C7.55228 2 8 2.44772 8 3V4H16V3C16 2.44772 16.4477 2 17 2ZM3.5 19.25C3.5 19.9404 4.05964 20.5 4.75 20.5H19.25C19.9404 20.5 20.5 19.9404 20.5 19.25V9H3.5V19.25ZM11.5244 11.4639C11.6741 11.0032 12.3259 11.0032 12.4756 11.4639L13.0107 13.1094C13.0777 13.3153 13.2697 13.4551 13.4863 13.4551H15.2168C15.7008 13.4554 15.9021 14.0746 15.5107 14.3594L14.1104 15.377C13.9352 15.5043 13.8618 15.7296 13.9287 15.9355L14.4639 17.582C14.6129 18.0423 14.086 18.4249 13.6943 18.1406L12.2939 17.123C12.1187 16.9958 11.8813 16.9958 11.7061 17.123L10.3057 18.1406C9.91399 18.4249 9.3871 18.0423 9.53613 17.582L10.0713 15.9355C10.1382 15.7296 10.0648 15.5043 9.88965 15.377L8.48926 14.3594C8.09789 14.0746 8.29922 13.4554 8.7832 13.4551H10.5137C10.7303 13.4551 10.9223 13.3153 10.9893 13.1094L11.5244 11.4639Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_global = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM9.125 16.8799C9.64032 17.9189 10.337 18.9863 11.25 20.0742V17.1523C10.7225 17.128 10.2057 17.0736 9.70215 16.9902C9.50749 16.958 9.31532 16.92 9.125 16.8799ZM14.9121 16.8027C14.1771 16.9777 13.4556 17.0859 12.75 17.1348V20.0742C13.6855 18.9595 14.3932 17.8659 14.9121 16.8027ZM3.91699 14.6318C4.75232 17.1991 6.77577 19.2278 9.33887 20.0723C8.406 18.8112 7.72371 17.5643 7.25195 16.3447C6.00154 15.892 4.88041 15.2884 3.91699 14.6318ZM20.1475 14.4229C19.0161 15.1944 17.8973 15.7811 16.7998 16.21C16.3267 17.4726 15.6276 18.7645 14.6602 20.0723C17.2928 19.2052 19.3559 17.0889 20.1475 14.4229ZM8.27148 9.03809C8.18964 9.33885 8.11948 9.64601 8.0625 9.95898C7.77607 11.5325 7.81939 13.2821 8.41895 15.1494C8.91034 15.2977 9.41979 15.4225 9.94727 15.5098C10.3696 15.5797 10.8044 15.6272 11.25 15.6504V9.4502C10.1743 9.41607 9.17556 9.26314 8.27148 9.03809ZM15.6914 8.91309C14.6717 9.19136 13.6883 9.35314 12.75 9.41992V15.6309C13.6693 15.5589 14.6262 15.3728 15.6133 15.0449C16.1814 13.2167 16.2186 11.5032 15.9375 9.95898C15.8726 9.60231 15.7884 9.25381 15.6914 8.91309ZM4.73828 7.5791C3.95246 8.86713 3.5 10.3808 3.5 12C3.5 12.1441 3.50268 12.2874 3.50977 12.4297C4.3541 13.1664 5.43081 13.9024 6.68555 14.4873C6.30929 12.8054 6.31335 11.1932 6.58691 9.69043C6.65463 9.31845 6.73875 8.95434 6.83691 8.59863C6.01603 8.29416 5.30985 7.93704 4.73828 7.5791ZM19.2168 7.51172C18.5072 7.88586 17.8075 8.19668 17.1211 8.45312C17.2371 8.85494 17.3361 9.26747 17.4131 9.69043C17.6782 11.1467 17.6895 12.7055 17.3477 14.3311C18.3736 13.8258 19.4241 13.1586 20.4922 12.3008C20.4957 12.2009 20.5 12.1007 20.5 12C20.5 10.3518 20.0288 8.81454 19.2168 7.51172ZM11.25 3.74707C10.3153 4.76493 9.39782 6.08022 8.75977 7.61426C9.51644 7.7938 10.3507 7.91795 11.25 7.94922V3.74707ZM12.75 7.91602C13.5277 7.85413 14.3419 7.71825 15.1865 7.49512C14.5512 6.01251 13.6602 4.73821 12.75 3.74707V7.91602ZM9.09863 4.00781C7.75188 4.49683 6.56506 5.31783 5.63379 6.37012C6.09381 6.64946 6.66061 6.93072 7.31934 7.17773C7.79595 5.99524 8.4203 4.93108 9.09863 4.00781ZM14.9004 4.00781C15.5519 4.89444 16.1543 5.91046 16.623 7.03711C17.1727 6.83088 17.7316 6.58427 18.2998 6.29492C17.3786 5.27832 16.2154 4.48515 14.9004 4.00781Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_helpFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1ZM12 15.75C11.4477 15.75 11 16.1977 11 16.75C11 17.3023 11.4477 17.75 12 17.75C12.5523 17.75 13 17.3023 13 16.75C13 16.1977 12.5523 15.75 12 15.75ZM12 5.625C10.5844 5.625 9.61212 6.17361 9.01172 6.93164C8.43765 7.65648 8.25 8.51255 8.25 9.10254C8.25014 9.51663 8.58588 9.85254 9 9.85254C9.41412 9.85254 9.74986 9.51663 9.75 9.10254C9.75 8.78348 9.86166 8.27478 10.1875 7.86328C10.4871 7.485 11.0157 7.125 12 7.125C12.9843 7.125 13.5129 7.485 13.8125 7.86328C14.1383 8.27478 14.25 8.78348 14.25 9.10254C14.2499 9.68017 13.9247 10.6843 12.7969 10.9844C12.0595 11.1807 11.2502 11.8236 11.25 12.8291V13.875C11.25 14.2892 11.5858 14.625 12 14.625C12.4142 14.625 12.75 14.2892 12.75 13.875V12.8291C12.7501 12.7716 12.7715 12.7043 12.8428 12.6279C12.9188 12.5466 13.039 12.4719 13.1826 12.4336C15.2172 11.8923 15.7499 10.0616 15.75 9.10254C15.75 8.51255 15.5624 7.65648 14.9883 6.93164C14.3879 6.17361 13.4156 5.625 12 5.625Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_helpOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 15.75C12.5522 15.7501 13 16.1978 13 16.75C12.9999 17.3021 12.5521 17.7499 12 17.75C11.4478 17.75 11.0001 17.3022 11 16.75C11 16.1977 11.4477 15.75 12 15.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 5.625C13.4155 5.62505 14.3879 6.17365 14.9883 6.93164C15.5622 7.65643 15.75 8.51261 15.75 9.10254C15.7498 10.0616 15.2169 11.8923 13.1826 12.4336C13.039 12.4719 12.9188 12.5466 12.8428 12.6279C12.7715 12.7043 12.7501 12.7716 12.75 12.8291V13.875C12.7499 14.2891 12.4141 14.6249 12 14.625C11.5859 14.625 11.2501 14.2891 11.25 13.875V12.8291C11.2502 11.8236 12.0595 11.1807 12.7969 10.9844C13.9244 10.6843 14.2498 9.68018 14.25 9.10254C14.25 8.78353 14.1382 8.27475 13.8125 7.86328C13.5129 7.48502 12.9842 7.12504 12 7.125C11.0157 7.125 10.4871 7.485 10.1875 7.86328C9.86168 8.27478 9.75 8.78348 9.75 9.10254C9.74975 9.51648 9.41397 9.85244 9 9.85254C8.58594 9.85254 8.25025 9.51654 8.25 9.10254C8.25 8.51256 8.43767 7.65647 9.01172 6.93164C9.61212 6.17361 10.5844 5.625 12 5.625Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 1.0498C18.0474 1.04991 22.9502 5.95255 22.9502 12C22.9501 18.0474 18.0474 22.9501 12 22.9502C5.95255 22.9502 1.04991 18.0474 1.0498 12C1.0498 5.95248 5.95248 1.0498 12 1.0498ZM12 2.5498C6.78091 2.5498 2.5498 6.78091 2.5498 12C2.54991 17.219 6.78097 21.4502 12 21.4502C17.2189 21.4501 21.4501 17.2189 21.4502 12C21.4502 6.78097 17.219 2.54991 12 2.5498Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_history = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M4.03158 6.42485C6.84851 2.27052 12.4085 0.83851 16.9261 3.26665C21.7495 5.85932 23.5579 11.871 20.9652 16.6944C18.3724 21.5175 12.3607 23.326 7.53744 20.7334C6.16856 19.9976 5.04122 18.9844 4.18881 17.8008C3.94694 17.4648 4.02287 16.996 4.35873 16.754C4.6948 16.512 5.16452 16.5879 5.40658 16.9239C6.1288 17.9266 7.08352 18.7865 8.24741 19.4122C12.3409 21.6125 17.4433 20.0777 19.6439 15.9844C21.8443 11.8908 20.3098 6.78842 16.2162 4.58794C12.319 2.49324 7.50996 3.78468 5.15854 7.44536L7.62826 7.32426C8.04197 7.30373 8.39484 7.62247 8.41537 8.03618C8.43579 8.44979 8.11611 8.80178 7.70248 8.82231L3.85287 9.01274C3.55369 9.02734 3.27959 8.86299 3.1478 8.60258L3.09994 8.48637L1.88412 4.55278C1.76185 4.15702 1.98446 3.73658 2.38022 3.6143C2.77581 3.49235 3.19447 3.71389 3.31674 4.10942L4.03158 6.42485Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12.3167 6.76469C12.7309 6.76469 13.0667 7.10055 13.0667 7.51469V12.0547C13.0668 12.3134 13.1468 12.5663 13.2962 12.7774L14.929 15.0811C15.1684 15.4191 15.0883 15.8876 14.7503 16.127C14.4123 16.3662 13.9438 16.2862 13.7044 15.9483L12.0726 13.6446C11.7436 13.18 11.5668 12.624 11.5667 12.0547V7.51469C11.5668 7.10068 11.9028 6.7649 12.3167 6.76469Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_image = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M16 5.25C17.5188 5.25 18.75 6.48122 18.75 8C18.75 9.51878 17.5188 10.75 16 10.75C14.4812 10.75 13.25 9.51878 13.25 8C13.25 6.48122 14.4812 5.25 16 5.25ZM16 6.75C15.3096 6.75 14.75 7.30964 14.75 8C14.75 8.69036 15.3096 9.25 16 9.25C16.6904 9.25 17.25 8.69036 17.25 8C17.25 7.30964 16.6904 6.75 16 6.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M19.2002 2.0498C20.7187 2.05002 21.9501 3.28123 21.9502 4.7998V19.2002C21.95 20.7187 20.7187 21.95 19.2002 21.9502H4.7998C3.28124 21.9501 2.05001 20.7187 2.0498 19.2002V4.7998C2.0499 3.28117 3.28116 2.0499 4.7998 2.0498H19.2002ZM4.7998 3.5498C4.10959 3.5499 3.5499 4.10959 3.5498 4.7998V11.8037L6.76465 8.70801C7.1683 8.31972 7.81224 8.33867 8.19238 8.75L14.9121 16.0293C15.2496 16.3947 15.8042 16.457 16.2139 16.1748L19.4326 13.9561C19.7591 13.731 20.1435 13.7318 20.4502 13.8867V4.7998C20.4501 4.10966 19.8903 3.55002 19.2002 3.5498H4.7998Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_inline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.0801 2.0498C11.4941 2.04995 11.83 2.38577 11.8301 2.7998C11.8301 3.21393 11.4942 3.54966 11.0801 3.5498H3.7998C3.66191 3.54994 3.5499 3.6619 3.5498 3.7998V20.2002C3.55001 20.338 3.66197 20.4501 3.7998 20.4502H20.2002C20.338 20.45 20.45 20.338 20.4502 20.2002V12.9199C20.4503 12.5059 20.7862 12.1701 21.2002 12.1699C21.6142 12.1701 21.9501 12.5059 21.9502 12.9199V20.2002C21.95 21.1664 21.1664 21.95 20.2002 21.9502H3.7998C2.83355 21.9501 2.05001 21.1664 2.0498 20.2002V3.7998C2.0499 2.83347 2.83348 2.04994 3.7998 2.0498H11.0801Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M19.3252 4.66699C19.5765 4.21659 20.0655 4.07962 20.4551 4.17578C20.858 4.27538 21.248 4.65457 21.2051 5.21094L21.1475 5.79199C20.9808 7.18748 20.5611 8.83543 19.5479 10.2197C18.424 11.755 16.6276 12.8864 13.8779 13.0596V15.8457C13.8779 16.7061 12.8828 17.1403 12.2539 16.6279L12.1328 16.5127L7.59082 11.4375C7.25096 11.0578 7.25096 10.4832 7.59082 10.1035L12.1328 5.0293C12.7449 4.34543 13.8779 4.77847 13.8779 5.69629V8.55957C15.0735 8.59246 17.4617 8.00699 19.3252 4.66699ZM9.00684 10.7715L12.3779 14.5381V12.583C12.3781 12.0114 12.8468 11.5923 13.3662 11.5811C15.9616 11.5247 17.4486 10.5489 18.3379 9.33398C18.787 8.72044 19.0992 8.02407 19.3135 7.31152C17.0812 9.91545 14.4914 10.247 13.166 9.9873C12.6634 9.8888 12.3779 9.44604 12.3779 9.01953V7.00488L9.00684 10.7715Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_launcher = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M5 18C5.55228 18 6 18.4477 6 19V21C6 21.5523 5.55228 22 5 22H3C2.44772 22 2 21.5523 2 21V19C2 18.4477 2.44772 18 3 18H5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M13 18C13.5523 18 14 18.4477 14 19V21C14 21.5523 13.5523 22 13 22H11C10.4477 22 10 21.5523 10 21V19C10 18.4477 10.4477 18 11 18H13Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21 18C21.5523 18 22 18.4477 22 19V21C22 21.5523 21.5523 22 21 22H19C18.4477 22 18 21.5523 18 21V19C18 18.4477 18.4477 18 19 18H21Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M5 10C5.55228 10 6 10.4477 6 11V13C6 13.5523 5.55228 14 5 14H3C2.44772 14 2 13.5523 2 13V11C2 10.4477 2.44772 10 3 10H5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M13 10C13.5523 10 14 10.4477 14 11V13C14 13.5523 13.5523 14 13 14H11C10.4477 14 10 13.5523 10 13V11C10 10.4477 10.4477 10 11 10H13Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21 10C21.5523 10 22 10.4477 22 11V13C22 13.5523 21.5523 14 21 14H19C18.4477 14 18 13.5523 18 13V11C18 10.4477 18.4477 10 19 10H21Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M5 2C5.55228 2 6 2.44772 6 3V5C6 5.55228 5.55228 6 5 6H3C2.44772 6 2 5.55228 2 5V3C2 2.44772 2.44772 2 3 2H5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M13 2C13.5523 2 14 2.44772 14 3V5C14 5.55228 13.5523 6 13 6H11C10.4477 6 10 5.55228 10 5V3C10 2.44772 10.4477 2 11 2H13Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21 2C21.5523 2 22 2.44772 22 3V5C22 5.55228 21.5523 6 21 6H19C18.4477 6 18 5.55228 18 5V3C18 2.44772 18.4477 2 19 2H21Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_leftRight = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M6.46594 12.5001C6.7421 12.1916 7.21587 12.1655 7.52454 12.4415C7.83288 12.7177 7.85911 13.1915 7.58313 13.5001L4.67688 16.7501H21.0001C21.4142 16.7502 21.7501 17.086 21.7501 17.5001C21.75 17.9142 21.4142 18.25 21.0001 18.2501H4.67688L7.58313 21.5001C7.859 21.8088 7.83295 22.2826 7.52454 22.5587C7.21592 22.8347 6.74212 22.8085 6.46594 22.5001L2.44153 18.0001C2.18693 17.7154 2.18693 17.2848 2.44153 17.0001L6.46594 12.5001Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M16.4757 1.44153C16.7844 1.16552 17.2582 1.19163 17.5343 1.50013L21.5587 6.00013C21.8132 6.28481 21.8132 6.71549 21.5587 7.00013L17.5343 11.5001C17.2582 11.8086 16.7844 11.8346 16.4757 11.5587C16.1672 11.2826 16.1411 10.8088 16.4171 10.5001L19.3234 7.25013H3.00012C2.58596 7.25013 2.2502 6.91428 2.25012 6.50013C2.25012 6.08591 2.58591 5.75013 3.00012 5.75013H19.3234L16.4171 2.50013C16.1411 2.19146 16.1672 1.71769 16.4757 1.44153Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_line = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M4.25 13C4.66421 13 5 13.3358 5 13.75V21.25C5 21.6642 4.66421 22 4.25 22H2.75C2.33579 22 2 21.6642 2 21.25V13.75C2 13.3358 2.33579 13 2.75 13H4.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12.75 13C13.1642 13 13.5 13.3358 13.5 13.75V21.25C13.5 21.6642 13.1642 22 12.75 22H11.25C10.8358 22 10.5 21.6642 10.5 21.25V13.75C10.5 13.3358 10.8358 13 11.25 13H12.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M4.25 2C4.66421 2 5 2.33579 5 2.75V10.25C5 10.6642 4.66421 11 4.25 11H2.75C2.33579 11 2 10.6642 2 10.25V2.75C2 2.33579 2.33579 2 2.75 2H4.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12.75 2C13.1642 2 13.5 2.33579 13.5 2.75V10.25C13.5 10.6642 13.1642 11 12.75 11H11.25C10.8358 11 10.5 10.6642 10.5 10.25V2.75C10.5 2.33579 10.8358 2 11.25 2H12.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21.25 2C21.6642 2 22 2.33579 22 2.75V10.25C22 10.6642 21.6642 11 21.25 11H19.75C19.3358 11 19 10.6642 19 10.25V2.75C19 2.33579 19.3358 2 19.75 2H21.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_location = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.9583 22.5159C12.4583 23.1614 11.5 23.1614 11 22.5159C8.875 19.7188 4 13.0489 4 9.2621C4 4.70073 7.58333 1 12 1C16.4167 1 20 4.70073 20 9.2621C20 13.0489 15.125 19.7188 12.9583 22.5159ZM12 12.0161C13.4583 12.0161 14.6667 10.8112 14.6667 9.2621C14.6667 7.75599 13.4583 6.50807 12 6.50807C10.5 6.50807 9.33333 7.75599 9.33333 9.2621C9.33333 10.8112 10.5 12.0161 12 12.0161Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_logout = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.7899 2.0498C13.7563 2.0498 14.5398 2.83339 14.5399 3.7998V7.70605C14.5399 8.12027 14.2041 8.45605 13.7899 8.45605C13.3757 8.45596 13.0399 8.12021 13.0399 7.70605V3.7998C13.0398 3.66182 12.9279 3.5498 12.7899 3.5498H3.78986C3.65193 3.5499 3.53995 3.66188 3.53986 3.7998V20.2002C3.54007 20.338 3.652 20.4501 3.78986 20.4502H12.7899C12.9278 20.4502 13.0396 20.3381 13.0399 20.2002V16.5996C13.0401 16.1856 13.3759 15.8497 13.7899 15.8496C14.2039 15.8496 14.5397 16.1856 14.5399 16.5996V20.2002C14.5396 21.1665 13.7562 21.9502 12.7899 21.9502H3.78986C2.82357 21.9501 2.04007 21.1665 2.03986 20.2002V3.7998C2.03995 2.83345 2.8235 2.0499 3.78986 2.0498H12.7899Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M16.5877 6.58594C16.9098 6.3258 17.3821 6.37537 17.6424 6.69727L21.7938 11.8379L21.867 11.9473C22.0127 12.2111 21.9874 12.5428 21.7918 12.7832L17.658 17.8633C17.3966 18.1846 16.9236 18.234 16.6024 17.9727C16.2812 17.7113 16.2329 17.2383 16.494 16.917L19.6356 13.0557L8.6004 13.0381C8.18644 13.0372 7.85084 12.7011 7.85138 12.2871C7.85215 11.873 8.18925 11.5375 8.60333 11.5381L19.6385 11.5557L16.4754 7.64062C16.2153 7.31848 16.2658 6.84621 16.5877 6.58594Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_minus = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M20 11.25C20.4142 11.25 20.75 11.5858 20.75 12C20.75 12.4142 20.4142 12.75 20 12.75H4C3.58579 12.75 3.25 12.4142 3.25 12C3.25 11.5858 3.58579 11.25 4 11.25H20Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_monitor = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M21.9502 14.75C21.9502 15.9925 20.9426 16.9998 19.7002 17L12.75 17L12.75 19H15C15.4142 19 15.75 19.3358 15.75 19.75C15.75 20.1642 15.4142 20.5 15 20.5L8.99997 20.5C8.58576 20.5 8.24997 20.1642 8.24997 19.75C8.24997 19.3358 8.58576 19 8.99997 19H11.25L11.25 17H4.29977C3.05722 16.9999 2.04977 15.9926 2.04977 14.75L2.04977 5.75C2.04978 4.50742 3.05722 3.5001 4.29977 3.5L19.7002 3.5C20.9426 3.50021 21.9502 4.50749 21.9502 5.75L21.9502 14.75ZM20.4502 5.75C20.4502 5.33592 20.1142 5.00021 19.7002 5L4.29977 5C3.88565 5.0001 3.54978 5.33585 3.54977 5.75L3.54977 14.75C3.54977 15.1642 3.88565 15.4999 4.29977 15.5L19.7002 15.5C20.1142 15.4998 20.4502 15.1641 20.4502 14.75L20.4502 5.75Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_new = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M20 2C21.1046 2 22 2.89543 22 4V20C22 21.1046 21.1046 22 20 22H4C2.89543 22 2 21.1046 2 20V4C2 2.89543 2.89543 2 4 2H20ZM7.5 6.75V17.25H9.99902V11.082H10.0713L14.374 17.25H16.5V6.75H14.0059V12.9072H13.918L9.66211 6.75H7.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_notificationFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1ZM12 15.5C11.4477 15.5 11 15.9477 11 16.5C11 17.0523 11.4477 17.5 12 17.5C12.5523 17.5 13 17.0523 13 16.5C13 15.9477 12.5523 15.5 12 15.5ZM12 6.375C11.5858 6.375 11.25 6.71079 11.25 7.125V13.125C11.25 13.5392 11.5858 13.875 12 13.875C12.4142 13.875 12.75 13.5392 12.75 13.125V7.125C12.75 6.71079 12.4142 6.375 12 6.375Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_notificationOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 15.5C12.5523 15.5 13 15.9477 13 16.5C13 17.0523 12.5523 17.5 12 17.5C11.4477 17.5 11 17.0523 11 16.5C11 15.9477 11.4477 15.5 12 15.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 6.375C12.4142 6.375 12.75 6.71079 12.75 7.125V13.125C12.75 13.5392 12.4142 13.875 12 13.875C11.5858 13.875 11.25 13.5392 11.25 13.125V7.125C11.25 6.71079 11.5858 6.375 12 6.375Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 1.0498C18.0474 1.04991 22.9501 5.95264 22.9502 12C22.9501 18.0474 18.0474 22.9501 12 22.9502C5.95263 22.9501 1.04991 18.0474 1.0498 12C1.04991 5.95263 5.95263 1.0499 12 1.0498ZM12 2.5498C6.78106 2.5499 2.54991 6.78106 2.5498 12C2.54991 17.2189 6.78106 21.4501 12 21.4502C17.2189 21.4501 21.4501 17.2189 21.4502 12C21.4501 6.78107 17.2189 2.54991 12 2.5498Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_notion = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M5.44865 5.18238C6.0973 5.71282 6.33977 5.67237 7.5583 5.58993L19.0378 4.89616C19.2819 4.89616 19.0795 4.65194 18.9977 4.61149L17.0903 3.22239C16.7259 2.93617 16.2394 2.60951 15.3066 2.69195L4.18996 3.50861C3.78533 3.54906 3.70347 3.75283 3.86564 3.91616L5.44865 5.18238ZM6.13745 7.87658V20.0425C6.13745 20.6958 6.46178 20.9416 7.19228 20.9012L19.81 20.1654C20.539 20.1249 20.6208 19.6754 20.6208 19.145V7.05992C20.6208 6.53103 20.4185 6.24326 19.9722 6.2837L6.7861 7.05992C6.29961 7.10036 6.13745 7.34614 6.13745 7.87658ZM18.5931 8.52991C18.6734 8.89702 18.5931 9.26413 18.227 9.30613L17.6185 9.42746V18.4092C17.0919 18.6954 16.6039 18.8603 16.1977 18.8603C15.549 18.8603 15.3869 18.655 14.9004 18.0421L10.9236 11.7546V17.8383L12.1822 18.1245C12.1822 18.1245 12.1822 18.8587 11.1676 18.8587L8.36911 19.0221C8.28726 18.8587 8.36911 18.4512 8.65328 18.3687L9.38224 18.1665V10.1212L8.37066 10.0403C8.2888 9.67324 8.49112 9.1428 9.05946 9.1008L12.0618 8.89858L16.2008 15.267V9.63279L15.1459 9.5099C15.0641 9.06035 15.3884 8.73369 15.7946 8.69324L18.5946 8.52991H18.5931ZM3.25714 2.40573L14.8201 1.54862C16.2394 1.42418 16.6039 1.50818 17.4965 2.16151L21.1876 4.77482C21.7977 5.22282 22 5.34571 22 5.83571V20.1654C22 21.0645 21.6757 21.5965 20.539 21.6758L7.11197 22.4925C6.25946 22.5345 5.85328 22.4116 5.40695 21.8392L2.6888 18.2878C2.20232 17.6345 2 17.1445 2 16.5721V3.83372C2 3.0995 2.32432 2.48662 3.25714 2.40573Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_outline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.0801 2.0498C11.4942 2.04995 11.8301 2.38568 11.8301 2.7998C11.8301 3.21393 11.4942 3.54966 11.0801 3.5498H3.7998C3.66173 3.5498 3.5498 3.66173 3.5498 3.7998V20.2002C3.55001 20.3381 3.66186 20.4502 3.7998 20.4502H20.2002C20.338 20.45 20.45 20.338 20.4502 20.2002V12.9199C20.4502 12.5057 20.786 12.1699 21.2002 12.1699C21.6142 12.1701 21.9502 12.5058 21.9502 12.9199V20.2002C21.95 21.1664 21.1664 21.95 20.2002 21.9502H3.7998C2.83344 21.9502 2.05001 21.1665 2.0498 20.2002V3.7998C2.0498 2.83331 2.83331 2.0498 3.7998 2.0498H11.0801Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M14.6221 3.6543C14.6221 2.7939 15.6172 2.35966 16.2461 2.87207L16.3672 2.9873L20.9092 8.0625C21.2489 8.44219 21.249 9.01686 20.9092 9.39648L16.3672 14.4707C15.7551 15.1545 14.6222 14.7214 14.6221 13.8037V10.9404C13.4265 10.9075 11.0383 11.493 9.1748 14.833C8.92355 15.2833 8.43442 15.4203 8.04492 15.3242C7.64205 15.2246 7.2521 14.8453 7.29492 14.2891L7.35254 13.708C7.51917 12.3125 7.93893 10.6646 8.95215 9.28027C10.076 7.74497 11.8724 6.61358 14.6221 6.44043V3.6543ZM16.1221 6.91699C16.1218 7.48846 15.653 7.90758 15.1338 7.91895C12.5384 7.97534 11.0514 8.95111 10.1621 10.166C9.71303 10.7796 9.40079 11.4759 9.18652 12.1885C11.4188 9.58455 14.0086 9.253 15.334 9.5127C15.8365 9.61128 16.1221 10.054 16.1221 10.4805V12.4951L19.4932 8.72852L16.1221 4.96191V6.91699Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_pageEdit = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.0801 2.0498C11.4941 2.04995 11.83 2.38577 11.8301 2.7998C11.8301 3.21393 11.4942 3.54966 11.0801 3.5498H3.7998C3.66188 3.54991 3.5499 3.66188 3.5498 3.7998V20.2002C3.55001 20.338 3.66195 20.4501 3.7998 20.4502H20.2002C20.338 20.45 20.45 20.338 20.4502 20.2002V12.9199C20.4503 12.5059 20.7861 12.17 21.2002 12.1699C21.6142 12.1701 21.9501 12.5059 21.9502 12.9199V20.2002C21.95 21.1664 21.1664 21.95 20.2002 21.9502H3.7998C2.83353 21.9501 2.05001 21.1665 2.0498 20.2002V3.7998C2.0499 2.83346 2.83346 2.04991 3.7998 2.0498H11.0801Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M17.2109 2.7373C17.7019 2.33686 18.4261 2.36563 18.8838 2.82324L21.1768 5.11621C21.6649 5.60436 21.6649 6.39564 21.1768 6.88379L12.6768 15.3838C12.4424 15.6182 12.1245 15.75 11.793 15.75H9.5C8.80964 15.75 8.25 15.1904 8.25 14.5V12.207C8.25002 11.8755 8.38181 11.5576 8.61621 11.3232L17.1162 2.82324L17.2109 2.7373ZM9.75 12.3105V14.25H11.6895L19.9395 6L18 4.06055L9.75 12.3105Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_pageMove = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.0303 2C11.4443 2.00015 11.7802 2.33596 11.7803 2.75C11.7803 3.16412 11.4444 3.49985 11.0303 3.5H3.75C3.61208 3.50011 3.5001 3.61208 3.5 3.75V20.1504C3.50021 20.2882 3.61215 20.4003 3.75 20.4004H20.1504C20.2882 20.4002 20.4002 20.2882 20.4004 20.1504V12.8701C20.4005 12.4561 20.7363 12.1202 21.1504 12.1201C21.5644 12.1203 21.9003 12.4561 21.9004 12.8701V20.1504C21.9002 21.1166 21.1166 21.9002 20.1504 21.9004H3.75C2.78372 21.9003 2.00021 21.1166 2 20.1504V3.75C2.0001 2.78365 2.78365 2.00011 3.75 2H11.0303Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M19.9502 3.2002C20.3644 3.2002 20.7002 3.53598 20.7002 3.9502V8.5332C20.7002 8.94742 20.3644 9.2832 19.9502 9.2832C19.536 9.2832 19.2002 8.94742 19.2002 8.5332V5.76074L9.48047 15.4805C9.18758 15.7734 8.71282 15.7734 8.41992 15.4805C8.12703 15.1876 8.12703 14.7128 8.41992 14.4199L18.1396 4.7002H14.4502C14.036 4.7002 13.7002 4.36441 13.7002 3.9502C13.7002 3.53598 14.036 3.2002 14.4502 3.2002H19.9502Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_pdf = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.1797 6.87695C11.4061 6.82573 11.6711 6.86636 11.875 7.06543C11.9347 7.12378 11.9793 7.19655 12.0039 7.27637C12.4216 8.63633 12.3322 10.08 11.9766 11.4404C12.1014 11.6056 12.2402 11.7758 12.3955 11.9492C12.7514 12.3465 13.0857 12.6781 13.3965 12.9541C14.1016 12.8052 14.7041 12.7601 15.2148 12.792C16.4346 12.8682 17.1997 13.3953 17.4629 14.0371C17.5303 14.2016 17.5046 14.3901 17.3965 14.5312C17.0163 15.0263 16.2645 15.3668 15.2656 15.1533C14.6465 15.021 13.9371 14.6791 13.1387 14.0439C12.3609 14.2497 11.4279 14.5925 10.3203 15.1289C9.71521 16.0649 9.05595 16.8354 8.48535 17.3076C8.18934 17.5525 7.86476 17.763 7.55078 17.832C7.38638 17.8681 7.17884 17.8751 6.97754 17.7773C6.76533 17.6741 6.6383 17.4923 6.57422 17.3047C6.41329 16.8328 6.53139 16.3944 6.76562 16.041C6.99028 15.7024 7.33148 15.4202 7.68359 15.1924C8.30393 14.7911 9.06997 14.4854 9.65918 14.3018C10.1517 13.4941 10.5887 12.5773 10.8848 11.625C10.0705 10.3811 9.89538 9.2681 10.0508 8.41504C10.1465 7.89052 10.3704 7.45813 10.6523 7.18262C10.7911 7.0472 10.9703 6.92448 11.1797 6.87695ZM8.22656 16.0322C7.92821 16.2253 7.71507 16.4174 7.59863 16.5928C7.55409 16.6599 7.52902 16.7208 7.51465 16.7754C7.60106 16.7255 7.71281 16.6496 7.84766 16.5381C8.05763 16.3643 8.29203 16.1303 8.53809 15.8486C8.43046 15.9074 8.32518 15.9684 8.22656 16.0322ZM14.5391 13.7949C14.9007 14.0019 15.2125 14.1197 15.4746 14.1758C15.8409 14.2541 16.1087 14.2138 16.2959 14.1387C16.0903 13.9839 15.7376 13.8266 15.1523 13.79C14.9689 13.7786 14.7646 13.7788 14.5391 13.7949ZM11.6143 12.5732C11.4727 12.9491 11.3163 13.3152 11.1465 13.665C11.5386 13.5058 11.9101 13.3714 12.2607 13.2588C12.0623 13.0623 11.8592 12.8481 11.6514 12.6162C11.6387 12.6021 11.6267 12.5873 11.6143 12.5732ZM11.1855 8.13574C11.1255 8.25337 11.0695 8.40582 11.0352 8.59375C10.9666 8.96992 10.9859 9.48657 11.2217 10.1123C11.3075 9.4441 11.3052 8.7772 11.1855 8.13574Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M14.1592 2.0498C14.6213 2.0499 15.0648 2.23283 15.3926 2.55859L19.4336 6.57422C19.764 6.90262 19.9501 7.34957 19.9502 7.81543V20.2002C19.95 21.1664 19.1664 21.95 18.2002 21.9502H5.7998C4.83344 21.9502 4.05001 21.1665 4.0498 20.2002V3.7998C4.0498 2.83331 4.83331 2.0498 5.7998 2.0498H14.1592ZM5.7998 3.5498C5.66173 3.5498 5.5498 3.66173 5.5498 3.7998V20.2002C5.55001 20.3381 5.66186 20.4502 5.7998 20.4502H18.2002C18.338 20.45 18.45 20.338 18.4502 20.2002V8.25H14.75C14.1978 8.25 13.7501 7.8022 13.75 7.25V3.5498H5.7998ZM15.25 6.75H17.4814L15.25 4.53125V6.75Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_print = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M15.5 18C15.9142 18 16.25 18.3358 16.25 18.75C16.25 19.1642 15.9142 19.5 15.5 19.5H8.5C8.08579 19.5 7.75 19.1642 7.75 18.75C7.75 18.3358 8.08579 18 8.5 18H15.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M15.5 15.75C15.9142 15.75 16.25 16.0858 16.25 16.5C16.25 16.9142 15.9142 17.25 15.5 17.25H8.5C8.08579 17.25 7.75 16.9142 7.75 16.5C7.75 16.0858 8.08579 15.75 8.5 15.75H15.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M7 9.25C7.41421 9.25 7.75 9.58579 7.75 10C7.75 10.4142 7.41421 10.75 7 10.75H5C4.58579 10.75 4.25 10.4142 4.25 10C4.25 9.58579 4.58579 9.25 5 9.25H7Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M17 2C17.9665 2 18.75 2.7835 18.75 3.75V6.75H20.25C21.2165 6.75 22 7.5335 22 8.5V16C22 16.9665 21.2165 17.75 20.25 17.75H18.75V20.25C18.75 21.2165 17.9665 22 17 22H7C6.0335 22 5.25 21.2165 5.25 20.25V17.75H3.75C2.7835 17.75 2 16.9665 2 16V8.5C2 7.5335 2.7835 6.75 3.75 6.75H5.25V3.75C5.25 2.7835 6.0335 2 7 2H17ZM6.75 20.25C6.75 20.3881 6.86193 20.5 7 20.5H17C17.1381 20.5 17.25 20.3881 17.25 20.25V14.5H6.75V20.25ZM3.75 8.25C3.61193 8.25 3.5 8.36193 3.5 8.5V16C3.5 16.1381 3.61193 16.25 3.75 16.25H5.25V14.5H4.5C4.08579 14.5 3.75 14.1642 3.75 13.75C3.75 13.3358 4.08579 13 4.5 13H19.5C19.9142 13 20.25 13.3358 20.25 13.75C20.25 14.1642 19.9142 14.5 19.5 14.5H18.75V16.25H20.25C20.3881 16.25 20.5 16.1381 20.5 16V8.5C20.5 8.36193 20.3881 8.25 20.25 8.25H3.75ZM7 3.5C6.86193 3.5 6.75 3.61193 6.75 3.75V6.75H17.25V3.75C17.25 3.61193 17.1381 3.5 17 3.5H7Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_remove = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M8.35254 10.7646C8.75858 10.6834 9.15395 10.9466 9.23535 11.3525L10.2354 16.3525C10.3166 16.7586 10.0534 17.1539 9.64746 17.2354C9.24142 17.3166 8.84605 17.0534 8.76465 16.6475L7.76465 11.6475C7.68344 11.2414 7.94658 10.8461 8.35254 10.7646Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 10.75C12.4142 10.75 12.75 11.0858 12.75 11.5V16.5C12.75 16.9142 12.4142 17.25 12 17.25C11.5858 17.25 11.25 16.9142 11.25 16.5V11.5C11.25 11.0858 11.5858 10.75 12 10.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M14.7646 11.3525C14.8461 10.9466 15.2414 10.6834 15.6475 10.7646C16.0534 10.8461 16.3166 11.2414 16.2354 11.6475L15.2354 16.6475C15.1539 17.0534 14.7586 17.3166 14.3525 17.2354C13.9466 17.1539 13.6834 16.7586 13.7646 16.3525L14.7646 11.3525Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13 2.0498C13.9664 2.0498 14.7499 2.8334 14.75 3.7998V4.25H20C20.4142 4.25 20.75 4.58579 20.75 5V8C20.75 8.41421 20.4142 8.75 20 8.75H19.6445L17.999 19.6123C17.7952 20.9565 16.6398 21.9502 15.2803 21.9502H8.71973C7.36018 21.9502 6.20481 20.9565 6.00098 19.6123L4.35547 8.75H4C3.58579 8.75 3.25 8.41421 3.25 8V5C3.25 4.58579 3.58579 4.25 4 4.25H8.75V3.7998C8.75011 2.8334 9.53357 2.0498 10.5 2.0498H13ZM7.48438 19.3877C7.57717 19.9985 8.10188 20.4502 8.71973 20.4502H15.2803C15.8981 20.4502 16.4228 19.9985 16.5156 19.3877L18.1279 8.75H5.87207L7.48438 19.3877ZM4.75 7.25H19.25V5.75H4.75V7.25ZM10.5 3.5498C10.362 3.5498 10.2501 3.66182 10.25 3.7998V4.25H13.25V3.7998C13.2499 3.66182 13.138 3.5498 13 3.5498H10.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_reset = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M9.93091 2.10514C10.3434 2.06784 10.708 2.37233 10.7454 2.78483C10.7825 3.19722 10.4781 3.56195 10.0657 3.59928C8.83502 3.71078 7.60958 4.09642 6.47876 4.77995C2.50149 7.18422 1.226 12.3573 3.63013 16.3346C6.03441 20.312 11.2074 21.5865 15.1848 19.1823C18.9718 16.893 20.3071 12.0951 18.3508 8.20768L17.1995 10.3971C17.0067 10.7636 16.5533 10.9052 16.1868 10.7126C15.8202 10.5197 15.6795 10.0655 15.8723 9.69889L17.6672 6.28776C17.807 6.02295 18.088 5.87027 18.3792 5.88932L18.5042 5.90788L22.509 6.86296C22.9116 6.95923 23.1606 7.36456 23.0647 7.76725C22.9685 8.16981 22.564 8.41773 22.1614 8.32194L19.804 7.75846C21.947 12.2975 20.3505 17.8131 15.9612 20.4665C11.2748 23.2993 5.17978 21.7964 2.34693 17.11C-0.485604 12.4238 1.01627 6.32858 5.7024 3.49577C7.03242 2.69182 8.47831 2.23667 9.93091 2.10514Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_robot = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M13 15.75C13.4142 15.75 13.75 16.0858 13.75 16.5C13.75 16.9142 13.4142 17.25 13 17.25H11C10.5858 17.25 10.25 16.9142 10.25 16.5C10.25 16.0858 10.5858 15.75 11 15.75H13Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M9.5 12.5C10.0523 12.5 10.5 12.9477 10.5 13.5C10.5 14.0523 10.0523 14.5 9.5 14.5C8.94772 14.5 8.5 14.0523 8.5 13.5C8.5 12.9477 8.94772 12.5 9.5 12.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M14.5 12.5C15.0523 12.5 15.5 12.9477 15.5 13.5C15.5 14.0523 15.0523 14.5 14.5 14.5C13.9477 14.5 13.5 14.0523 13.5 13.5C13.5 12.9477 13.9477 12.5 14.5 12.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 2.75C12.9665 2.75 13.75 3.5335 13.75 4.5C13.75 5.19772 13.3407 5.79804 12.75 6.0791V7.75H18C18.9665 7.75 19.75 8.5335 19.75 9.5V10.1621C20.2902 10.2125 20.9697 10.4289 21.5527 10.9326C22.2571 11.5413 22.75 12.5087 22.75 13.9004C22.7499 15.292 22.2571 16.2596 21.5527 16.8682C20.9698 17.3717 20.2901 17.5863 19.75 17.6367V19.5C19.75 20.4665 18.9665 21.25 18 21.25H6C5.0335 21.25 4.25 20.4665 4.25 19.5V17.6367C3.70992 17.5863 3.03022 17.3717 2.44727 16.8682C1.74287 16.2596 1.2501 15.292 1.25 13.9004C1.25 12.5087 1.74291 11.5413 2.44727 10.9326C3.0303 10.4289 3.70984 10.2125 4.25 10.1621V9.5C4.25 8.5335 5.0335 7.75 6 7.75H11.25V6.0791C10.6593 5.79804 10.25 5.19772 10.25 4.5C10.25 3.5335 11.0335 2.75 12 2.75ZM6 9.25C5.86193 9.25 5.75 9.36193 5.75 9.5V19.5C5.75 19.6381 5.86193 19.75 6 19.75H18C18.1381 19.75 18.25 19.6381 18.25 19.5V9.5C18.25 9.36193 18.1381 9.25 18 9.25H6ZM4.25 11.6748C4.00027 11.7214 3.69323 11.839 3.42773 12.0684C3.09069 12.3598 2.75 12.8927 2.75 13.9004C2.7501 14.908 3.09067 15.4411 3.42773 15.7324C3.69311 15.9616 4.00037 16.0774 4.25 16.124V11.6748ZM19.75 16.124C19.9996 16.0774 20.3069 15.9616 20.5723 15.7324C20.9093 15.4411 21.2499 14.908 21.25 13.9004C21.25 12.8927 20.9093 12.3598 20.5723 12.0684C20.3068 11.839 19.9997 11.7214 19.75 11.6748V16.124ZM12 4.25C11.8619 4.25 11.75 4.36193 11.75 4.5C11.75 4.63807 11.8619 4.75 12 4.75C12.1381 4.75 12.25 4.63807 12.25 4.5C12.25 4.36193 12.1381 4.25 12 4.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_row = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M4.25 2C4.66421 2 5 2.33579 5 2.75V21.25C5 21.6642 4.66421 22 4.25 22H2.75C2.33579 22 2 21.6642 2 21.25V2.75C2 2.33579 2.33579 2 2.75 2H4.25Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12.75 2C13.1642 2 13.5 2.33579 13.5 2.75V21.25C13.5 21.6642 13.1642 22 12.75 22H11.25C10.8358 22 10.5 21.6642 10.5 21.25V2.75C10.5 2.33579 10.8358 2 11.25 2H12.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M21.25 2C21.6642 2 22 2.33579 22 2.75V21.25C22 21.6642 21.6642 22 21.25 22H19.75C19.3358 22 19 21.6642 19 21.25V2.75C19 2.33579 19.3358 2 19.75 2H21.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_save = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M16.1709 2.0498C16.9001 2.0498 17.6005 2.3399 18.1162 2.85547L21.1445 5.88379C21.6601 6.39941 21.9501 7.09898 21.9502 7.82812V19.2002C21.95 20.7187 20.7187 21.95 19.2002 21.9502H4.7998C3.28127 21.9501 2.05001 20.7187 2.0498 19.2002V4.7998C2.04994 3.28122 3.28121 2.04994 4.7998 2.0498H16.1709ZM4.7998 3.5498C4.10964 3.54994 3.54994 4.10964 3.5498 4.7998V19.2002C3.55001 19.8903 4.10969 20.4501 4.7998 20.4502H19.2002C19.8902 20.45 20.45 19.8902 20.4502 19.2002V7.82812C20.4501 7.4968 20.3182 7.17866 20.084 6.94434L17.0557 3.91602C16.965 3.82535 16.8618 3.74966 16.75 3.69141V6.5C16.75 7.4665 15.9665 8.25 15 8.25H8C7.0335 8.25 6.25 7.4665 6.25 6.5V3.5498H4.7998ZM17 10.25C17.9665 10.25 18.75 11.0335 18.75 12V18C18.75 18.9665 17.9665 19.75 17 19.75H7C6.0335 19.75 5.25 18.9665 5.25 18V12C5.25 11.0335 6.0335 10.25 7 10.25H17ZM7 11.75C6.86193 11.75 6.75 11.8619 6.75 12V18C6.75 18.1381 6.86193 18.25 7 18.25H17C17.1381 18.25 17.25 18.1381 17.25 18V12C17.25 11.8619 17.1381 11.75 17 11.75H7ZM7.75 6.5C7.75 6.63807 7.86193 6.75 8 6.75H15C15.1381 6.75 15.25 6.63807 15.25 6.5V3.5498H14.5V6H12.5V3.5498H7.75V6.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_search = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.1401 2.05029C15.6963 2.05049 19.3901 5.74407 19.3901 10.3003V11.1401C19.3901 13.1481 18.6716 14.9878 17.479 16.4185L21.73 20.6694C22.0229 20.9623 22.0229 21.4371 21.73 21.73C21.4371 22.0229 20.9623 22.0229 20.6694 21.73L16.4185 17.479C14.9878 18.6716 13.1481 19.3901 11.1401 19.3901H10.3003C5.74407 19.3901 2.05049 15.6963 2.05029 11.1401V10.3003C2.05029 5.74395 5.74395 2.05029 10.3003 2.05029H11.1401ZM10.3003 3.55029C6.57237 3.55029 3.55029 6.57237 3.55029 10.3003V11.1401C3.55049 14.8679 6.57249 17.8901 10.3003 17.8901H11.1401C14.8678 17.8899 17.8899 14.8678 17.8901 11.1401V10.3003C17.8901 6.57249 14.8679 3.55049 11.1401 3.55029H10.3003Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_send = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M19.8551 3.15204C20.1245 3.06242 20.4219 3.13291 20.6226 3.33368C20.8233 3.53455 20.8931 3.83186 20.8033 4.10126L15.3209 20.5485C14.8017 22.1061 12.6164 22.1561 12.0269 20.6237L9.61191 14.3434L3.33261 11.9284C1.80035 11.3391 1.84967 9.15489 3.40683 8.63544L19.8551 3.15204ZM11.067 13.9479L13.4273 20.0847C13.5115 20.3036 13.8239 20.2964 13.898 20.0739L18.3756 6.64032L11.067 13.9479ZM3.88144 10.0583C3.65915 10.1325 3.65209 10.4437 3.8707 10.528L10.0064 12.8874L17.3141 5.58075L3.88144 10.0583Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_setting = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M13.1858 1C13.5092 1 13.7985 1.2013 13.9074 1.5027L14.6839 3.65537C14.9622 3.72467 15.2009 3.79397 15.4033 3.86657C15.6244 3.94577 15.9093 4.06567 16.2613 4.22956L18.0696 3.27257C18.2172 3.19437 18.3862 3.16614 18.5512 3.19213C18.7162 3.21811 18.8683 3.2969 18.9848 3.41667L20.5753 5.06115C20.7865 5.28005 20.8459 5.60015 20.7271 5.87954L19.8791 7.86722C20.0198 8.12572 20.132 8.34681 20.2178 8.53161C20.3102 8.73291 20.4246 9.01011 20.561 9.3676L22.5377 10.2146C22.8346 10.3411 23.0183 10.6381 22.9985 10.956L22.8533 13.2385C22.8434 13.3867 22.7902 13.5288 22.7002 13.6471C22.6103 13.7654 22.4876 13.8547 22.3474 13.9039L20.4752 14.5694C20.4213 14.8279 20.3652 15.049 20.3058 15.236C20.21 15.5248 20.1006 15.8089 19.978 16.0874L20.9185 18.1664C20.9849 18.3125 21.0028 18.476 20.9695 18.6329C20.9363 18.7899 20.8536 18.9321 20.7337 19.0387L18.9452 20.6359C18.8274 20.7406 18.6804 20.8069 18.5239 20.8257C18.3674 20.8446 18.2089 20.8152 18.0696 20.7415L16.2261 19.7647C15.9377 19.9174 15.6401 20.0522 15.3351 20.1684L14.5299 20.4698L13.815 22.4497C13.762 22.5947 13.6664 22.7203 13.5408 22.81C13.4151 22.8998 13.2653 22.9494 13.111 22.9524L11.0211 22.9997C10.8626 23.0039 10.7068 22.9588 10.575 22.8708C10.4432 22.7827 10.342 22.656 10.2852 22.508L9.44261 20.2784C9.15513 20.1801 8.8705 20.0737 8.58904 19.9594C8.35884 19.8597 8.13211 19.7522 7.90927 19.6371L5.81934 20.5303C5.68163 20.589 5.52981 20.6065 5.38237 20.5805C5.23492 20.5545 5.09821 20.4862 4.98887 20.384L3.44232 18.9331C3.32718 18.8255 3.24876 18.6845 3.21817 18.5299C3.18757 18.3754 3.20634 18.2151 3.27183 18.0718L4.17049 16.1138C4.05098 15.8819 3.94017 15.6456 3.83831 15.4054C3.7194 15.1114 3.60936 14.8139 3.50832 14.5133L1.53939 13.9138C1.37934 13.8655 1.23975 13.7656 1.14229 13.6298C1.04483 13.4939 0.99495 13.3297 1.0004 13.1626L1.0774 11.0495C1.08288 10.9116 1.12595 10.7779 1.20195 10.6627C1.27795 10.5475 1.38398 10.4553 1.50859 10.3961L3.57431 9.4039C3.67001 9.053 3.75361 8.78021 3.82731 8.58111C3.93108 8.31518 4.04632 8.05387 4.17269 7.79792L3.27733 5.90594C3.20938 5.76227 3.18874 5.60074 3.21839 5.44459C3.24804 5.28845 3.32644 5.14573 3.44232 5.03695L4.98667 3.57837C5.09493 3.47626 5.23038 3.40761 5.37674 3.38068C5.5231 3.35375 5.67412 3.36969 5.81164 3.42657L7.89937 4.28896C8.13036 4.13496 8.33935 4.01067 8.52854 3.91057C8.75404 3.79067 9.05543 3.66527 9.43491 3.52997L10.1609 1.5049C10.2146 1.35669 10.3127 1.22867 10.4418 1.1383C10.571 1.04794 10.7248 0.999641 10.8825 1H13.1858ZM12.0264 8.72081C10.1928 8.72081 8.70674 10.1893 8.70674 12.0021C8.70674 13.8148 10.1928 15.2844 12.0264 15.2844C13.859 15.2844 15.345 13.8148 15.345 12.0021C15.345 10.1893 13.8601 8.72081 12.0264 8.72081Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_settingOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.9996 8C14.2087 8 15.9996 9.79086 15.9996 12C15.9996 14.2091 14.2087 16 11.9996 16C9.79065 15.9998 7.9996 14.209 7.9996 12C7.9996 9.791 9.79065 8.00022 11.9996 8ZM11.9996 9.5C10.6191 9.50022 9.4996 10.6194 9.4996 12C9.4996 13.3806 10.6191 14.4998 11.9996 14.5C13.3803 14.5 14.4996 13.3807 14.4996 12C14.4996 10.6193 13.3803 9.5 11.9996 9.5Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13.1851 1C13.5085 1 13.7979 1.20161 13.9068 1.50293L14.6832 3.65527C14.9613 3.72452 15.2006 3.79367 15.4029 3.86621C15.5134 3.90579 15.64 3.95628 15.7828 4.0166L16.2613 4.22949L18.0689 3.27246C18.2163 3.19438 18.3856 3.16661 18.5504 3.19238C18.7153 3.21835 18.8676 3.29735 18.984 3.41699L20.5748 5.06152C20.7859 5.28042 20.8459 5.60054 20.7271 5.87988L19.8785 7.86719C20.0192 8.12546 20.1316 8.34655 20.2174 8.53125C20.3097 8.73243 20.4239 9.01001 20.5601 9.36719L22.5377 10.2148L22.6432 10.2695C22.8771 10.4155 23.016 10.6779 22.9986 10.9561L22.8531 13.2383L22.8375 13.3486C22.8141 13.4565 22.7672 13.5589 22.6998 13.6475L22.6266 13.7305C22.5476 13.8076 22.4523 13.8674 22.3473 13.9043L20.4752 14.5693C20.4213 14.8278 20.3647 15.0493 20.3053 15.2363L20.1519 15.666C20.0973 15.8078 20.0394 15.9488 19.9781 16.0879L20.9185 18.166L20.9586 18.2793C20.9899 18.3941 20.9942 18.5153 20.9693 18.6328L20.9351 18.7471C20.8923 18.8584 20.823 18.959 20.733 19.0391L18.9449 20.6357L18.8512 20.707C18.753 20.7705 18.6411 20.812 18.524 20.8262L18.4059 20.8311C18.2889 20.8272 18.1732 20.7964 18.0689 20.7412L16.2262 19.7647C15.9378 19.9173 15.6394 20.0519 15.3346 20.168L14.5299 20.4697L13.815 22.4502L13.7672 22.5547C13.7121 22.6552 13.6346 22.7424 13.5406 22.8096L13.442 22.8701C13.3398 22.9219 13.2264 22.9498 13.1109 22.9522L11.0211 23C10.9023 23.0031 10.7841 22.9783 10.6773 22.9287L10.5748 22.8711C10.4431 22.7831 10.3415 22.6557 10.2848 22.5078L9.44198 20.2783C9.1547 20.1801 8.86973 20.0733 8.58847 19.959C8.35848 19.8594 8.13142 19.7518 7.90878 19.6367L5.81894 20.5303L5.71347 20.5664C5.64162 20.5854 5.56705 20.594 5.49276 20.5918L5.38241 20.5801C5.27208 20.5606 5.1671 20.5175 5.07577 20.4541L4.98886 20.3838L3.44198 18.9326C3.35574 18.8519 3.28988 18.7525 3.2496 18.6426L3.21737 18.5303C3.18685 18.376 3.20586 18.2154 3.27109 18.0723L4.1705 16.1143C4.05101 15.8824 3.93933 15.6454 3.83749 15.4053C3.71871 15.1116 3.60934 14.814 3.50839 14.5137L1.53866 13.9141C1.41879 13.8777 1.31002 13.8122 1.22226 13.7246L1.14218 13.6299C1.04481 13.4941 0.994151 13.3291 0.999601 13.1621L1.07675 11.0498C1.08222 10.9121 1.1259 10.7782 1.20175 10.6631C1.25874 10.5767 1.33262 10.5026 1.41855 10.4463L1.50839 10.3965L3.57382 9.4043C3.6695 9.05348 3.75306 8.78014 3.82675 8.58106C3.9305 8.31518 4.0461 8.05376 4.17245 7.79785L3.27694 5.90625C3.20906 5.76263 3.18873 5.6004 3.21835 5.44434C3.24057 5.3276 3.2899 5.21813 3.36191 5.125L3.44198 5.03711L4.98593 3.57813C5.09409 3.47611 5.23034 3.40784 5.37655 3.38086C5.52273 3.354 5.67376 3.37002 5.81112 3.42676L7.89901 4.28906C8.12988 4.13515 8.33881 4.01023 8.52792 3.91016C8.75326 3.79034 9.05504 3.66547 9.43417 3.53027L10.1607 1.50488C10.2143 1.35699 10.3122 1.22899 10.441 1.13867C10.57 1.04839 10.7249 0.999723 10.8824 1H13.1851ZM10.8463 4.03613C10.6946 4.45908 10.3613 4.79149 9.93808 4.94238C9.5875 5.06739 9.36381 5.16528 9.23202 5.23535L9.23007 5.23633C9.09075 5.31005 8.9247 5.40801 8.73105 5.53711C8.31531 5.81413 7.78855 5.86633 7.32675 5.67578L5.67343 4.99219L4.86484 5.75586L5.52792 7.15625C5.72387 7.57031 5.71997 8.05117 5.51718 8.46192C5.41394 8.67102 5.31944 8.88459 5.23398 9.10156L5.14218 9.37598C5.10686 9.491 5.06681 9.63118 5.02109 9.79883C4.90655 10.2184 4.6153 10.5675 4.22323 10.7559L2.55917 11.5547L2.51913 12.6436L3.94491 13.0781L4.11386 13.1416C4.49659 13.3106 4.79411 13.6335 4.92929 14.0352C5.01804 14.2992 5.11534 14.5609 5.21933 14.8193L5.35507 15.126C5.40249 15.2271 5.45233 15.3275 5.50351 15.4268C5.71457 15.8364 5.72588 16.3204 5.53378 16.7393L4.85898 18.2061L5.66659 18.9639L7.31894 18.2578L7.47616 18.2012C7.84698 18.0894 8.24932 18.125 8.59726 18.3047C8.78187 18.4001 8.97024 18.4892 9.16073 18.5723C9.28594 18.6231 9.41211 18.6724 9.53866 18.7197L9.92733 18.8594L10.0816 18.9219C10.4317 19.0869 10.7069 19.382 10.8453 19.748L11.5025 21.4883L12.5748 21.4639L13.1187 19.96L13.1832 19.8096C13.3508 19.4678 13.6433 19.2005 14.0035 19.0654L14.8004 18.7666L15.1676 18.6143C15.288 18.5597 15.4071 18.5013 15.524 18.4395L15.692 18.3623C16.0928 18.2097 16.5441 18.236 16.9283 18.4395L18.3238 19.1787L19.3248 18.2842L18.6109 16.7061C18.4355 16.318 18.4336 15.8732 18.6051 15.4834C18.7075 15.2508 18.7973 15.0126 18.8775 14.7715C18.9163 14.6479 18.9608 14.4825 19.0064 14.2637L19.0582 14.0762C19.2064 13.6503 19.5409 13.3098 19.9723 13.1563L21.3873 12.6523L21.4674 11.3877L19.9703 10.7461C19.5971 10.5861 19.3035 10.2817 19.1588 9.90234C19.0283 9.56034 18.9273 9.31663 18.8541 9.15723C18.7854 9.00988 18.689 8.81973 18.5611 8.58496C18.3418 8.18212 18.3187 7.70024 18.4986 7.27832L19.1519 5.74707L18.2867 4.85352L16.9625 5.55567C16.5475 5.77509 16.0531 5.78799 15.6275 5.58984C15.2974 5.43614 15.0582 5.33606 14.8971 5.27832C14.7581 5.22851 14.5701 5.17338 14.3209 5.11133C13.8356 4.99032 13.4418 4.63455 13.2721 4.16406L12.6715 2.5H11.3971L10.8463 4.03613Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_shield = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M16.2549 9.3486C16.5477 9.05582 17.0225 9.05602 17.3154 9.3486C17.6083 9.64149 17.6083 10.1163 17.3154 10.4091L12.0859 15.6386C11.6954 16.0291 11.0624 16.0291 10.6719 15.6386L7.46973 12.4365C7.17728 12.1436 7.17703 11.6687 7.46973 11.3759C7.76264 11.0833 8.23844 11.0831 8.53125 11.3759L11.3789 14.2246L16.2549 9.3486Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.501 1.4404C11.8718 1.27889 12.3024 1.30624 12.6533 1.52145L20.1533 6.12204C20.5238 6.34931 20.7499 6.75284 20.75 7.18747V10.5302C20.75 11.8881 20.6005 13.3051 20.0645 14.6425C19.5554 15.9124 18.7155 17.6378 17.4502 19.1894C16.1835 20.7426 14.4592 22.1581 12.1816 22.7275L12 22.7734L11.8184 22.7275C9.54076 22.1581 7.81646 20.7426 6.5498 19.1894C5.2845 17.6378 4.4446 15.9124 3.93555 14.6425C3.39949 13.3051 3.25 11.8881 3.25 10.5302V7.18747C3.25007 6.75284 3.47619 6.34931 3.84668 6.12204L11.3467 1.52145L11.501 1.4404ZM4.75 7.32712V10.5302C4.75 11.7887 4.89082 12.9929 5.32812 14.084C5.80497 15.2735 6.57635 16.8486 7.71191 18.2412C8.80911 19.5866 10.2182 20.7255 12 21.2216C13.7818 20.7255 15.1909 19.5866 16.2881 18.2412C17.4236 16.8486 18.195 15.2735 18.6719 14.084C19.1092 12.9929 19.25 11.7887 19.25 10.5302V7.32712L12 2.87985L4.75 7.32712Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_sidebar = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M19 3C20.6569 3 22 4.34315 22 6V18L21.9961 18.1543C21.9184 19.6883 20.6883 20.9184 19.1543 20.9961L19 21H5L4.8457 20.9961C3.31166 20.9184 2.08163 19.6883 2.00391 18.1543L2 18V6C2 4.34315 3.34315 3 5 3H19ZM5 4.5C4.17157 4.5 3.5 5.17157 3.5 6V18C3.5 18.8284 4.17157 19.5 5 19.5H8V4.5H5ZM9.5 19.5H19C19.8284 19.5 20.5 18.8284 20.5 18V6C20.5 5.17157 19.8284 4.5 19 4.5H9.5V19.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_store = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M18.3817 6C19.0445 6 19.6507 6.37497 19.9472 6.96777L21.9472 10.9678C22.5286 12.1313 21.6825 13.5 20.3817 13.5H19.7499V19.75C19.7499 20.1642 19.4141 20.5 18.9999 20.5C18.5858 20.4998 18.2499 20.1641 18.2499 19.75V13.5H13.7499V18.75C13.7499 19.7165 12.9664 20.5 11.9999 20.5H5.99991C5.03355 20.4998 4.24991 19.7164 4.24991 18.75V13.5H3.61807C2.3175 13.4998 1.47136 12.1312 2.05264 10.9678L4.05264 6.96777C4.34903 6.375 4.95534 6.00012 5.61807 6H18.3817ZM5.74991 18.75C5.74991 18.888 5.86198 18.9998 5.99991 19H11.9999C12.138 19 12.2499 18.8881 12.2499 18.75V13.5H5.74991V18.75ZM5.61807 7.5C5.5235 7.50012 5.43674 7.55407 5.39444 7.63867L3.39444 11.6387C3.31183 11.8047 3.43258 11.9998 3.61807 12H20.3817C20.5675 12 20.6882 11.8048 20.6054 11.6387L18.6054 7.63867C18.563 7.55405 18.4764 7.5 18.3817 7.5H5.61807Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M17.9999 4C18.4141 4 18.7499 4.33579 18.7499 4.75C18.7499 5.16421 18.4141 5.5 17.9999 5.5H5.99991C5.58584 5.49983 5.24991 5.16411 5.24991 4.75C5.24991 4.33589 5.58584 4.00017 5.99991 4H17.9999Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_synchronize = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M3.30769 10.8175C3.57806 10.5965 3.96606 10.5921 4.24226 10.8057L6.33991 12.4278C6.66706 12.6813 6.7261 13.1521 6.47272 13.4796C6.21918 13.8067 5.74841 13.8675 5.42097 13.6143L4.62116 12.9952C4.92795 14.8404 5.99601 17.3161 8.753 18.6602C12.4087 20.4424 15.8051 18.6615 17.0333 17.5479C17.34 17.2701 17.8136 17.2925 18.0919 17.5987C18.3701 17.9055 18.347 18.381 18.0401 18.6592C16.5549 20.0056 12.5074 22.16 8.09479 20.0089C4.62913 18.3191 3.39551 15.1712 3.09675 12.9298L2.27546 13.6016C1.95491 13.8639 1.48116 13.8165 1.21882 13.4962C0.956723 13.1758 1.00408 12.7028 1.32429 12.4405L3.30769 10.8175Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M5.96003 5.34089C7.44498 3.99457 11.4916 1.83985 15.9044 3.99128C19.3702 5.68114 20.6036 8.82876 20.9024 11.0704L21.7247 10.3985C22.0452 10.1363 22.518 10.1837 22.7803 10.504C23.0426 10.8245 22.9953 11.2973 22.6749 11.5596L20.6915 13.1827C20.4211 13.4035 20.034 13.408 19.7579 13.1944L17.6602 11.5723C17.333 11.3189 17.2732 10.8481 17.5264 10.5206C17.78 10.1931 18.2516 10.1324 18.5792 10.3858L19.379 11.005C19.0722 9.15965 18.0042 6.68321 15.2471 5.33893C11.5915 3.55662 8.19499 5.33864 6.96687 6.45222C6.66013 6.72978 6.1864 6.70667 5.90827 6.40046C5.63009 6.09371 5.65335 5.61916 5.96003 5.34089Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_thumbsDown = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13.5 21.25C14.7426 21.25 15.75 20.2426 15.75 19V15.5C15.75 15.3619 15.8619 15.25 16 15.25H18.8936C20.7018 15.25 22.0178 13.5347 21.5498 11.7881L20.1484 6.55762C19.5504 4.3259 17.4329 2.84845 15.1318 3.05664L8.05371 3.69727C7.76261 3.13498 7.17686 2.75 6.5 2.75H4.5C3.25736 2.75 2.25 3.75736 2.25 5V13C2.25 14.2426 3.25736 15.25 4.5 15.25H8.25V15.1689C8.57271 15.4885 8.90914 15.8467 9.23438 16.2344C10.0174 17.1678 10.7037 18.2229 11.0371 19.2568C11.3509 20.2303 12.2316 21.25 13.5 21.25ZM13.5 19.75C13.1116 19.75 12.6594 19.4004 12.4648 18.7969C12.0481 17.5041 11.2278 16.2778 10.3828 15.2705C9.6516 14.3988 8.87296 13.658 8.25 13.1416V5.18555L15.2676 4.55078C16.8419 4.40844 18.2901 5.41938 18.6992 6.94629L20.1006 12.1768C20.3132 12.9706 19.7154 13.75 18.8936 13.75H16C15.0335 13.75 14.25 14.5335 14.25 15.5V19C14.25 19.4142 13.9142 19.75 13.5 19.75Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_thumbsUp = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13.5 2.75C14.7426 2.75 15.75 3.75736 15.75 5V8.5C15.75 8.63807 15.8619 8.75 16 8.75H18.8936C20.7018 8.75 22.0178 10.4653 21.5498 12.2119L20.1484 17.4424C19.5504 19.6741 17.4329 21.1516 15.1318 20.9434L8.05371 20.3027C7.76261 20.865 7.17686 21.25 6.5 21.25H4.5C3.25736 21.25 2.25 20.2426 2.25 19V11C2.25 9.75736 3.25736 8.75 4.5 8.75H8.25V8.83105C8.57271 8.51149 8.90914 8.15334 9.23438 7.76562C10.0174 6.83217 10.7037 5.77712 11.0371 4.74316C11.3509 3.76975 12.2316 2.75 13.5 2.75ZM13.5 4.25C13.1116 4.25 12.6594 4.59961 12.4648 5.20312C12.0481 6.49588 11.2278 7.72217 10.3828 8.72949C9.6516 9.60115 8.87296 10.342 8.25 10.8584V18.8145L15.2676 19.4492C16.8419 19.5916 18.2901 18.5806 18.6992 17.0537L20.1006 11.8232C20.3132 11.0294 19.7154 10.25 18.8936 10.25H16C15.0335 10.25 14.25 9.4665 14.25 8.5V5C14.25 4.58579 13.9142 4.25 13.5 4.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_updown = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M6.00051 2.44141C6.2852 2.18705 6.71591 2.18689 7.00051 2.44141L11.5005 6.46582C11.8087 6.74194 11.8348 7.21583 11.5591 7.52441C11.283 7.83283 10.8092 7.8588 10.5005 7.58301L7.25051 4.67676V21C7.25051 21.4141 6.9145 21.7497 6.50051 21.75C6.0863 21.75 5.75051 21.4142 5.75051 21V4.67676L2.50051 7.58301C2.19192 7.85898 1.7181 7.8327 1.44192 7.52441C1.16587 7.21575 1.192 6.74198 1.50051 6.46582L6.00051 2.44141Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M17.5005 2.25C17.9145 2.25026 18.2505 2.58595 18.2505 3V19.3232L21.5005 16.417C21.8092 16.1412 22.283 16.1672 22.5591 16.4756C22.8348 16.7842 22.8087 17.2581 22.5005 17.5342L18.0005 21.5586C17.7159 21.8131 17.2852 21.813 17.0005 21.5586L12.5005 17.5342C12.192 17.258 12.1659 16.7843 12.4419 16.4756C12.7181 16.1673 13.1919 16.141 13.5005 16.417L16.7505 19.3232V3C16.7505 2.58579 17.0863 2.25 17.5005 2.25Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_user = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 12C9.78125 12 8 10.2188 8 8C8 5.8125 9.78125 4 12 4C14.1875 4 16 5.8125 16 8C16 10.2188 14.1875 12 12 12ZM10.5625 13.5H13.4062C16.5 13.5 19 16 19 19.0938C19 19.5938 18.5625 20 18.0625 20H5.90625C5.40625 20 5 19.5938 5 19.0938C5 16 7.46875 13.5 10.5625 13.5Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_users = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.4062 13.5C14.5 13.5 17 16 17 19.0938C17 19.5938 16.5625 20 16.0625 20H3.90625C3.40625 20 3 19.5938 3 19.0938C3 16 5.46875 13.5 8.5625 13.5H11.4062Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M15.4189 13.5C18.8153 13.5001 21.5 16.4402 21.5 20H20.5C20.5 16.9999 18.3097 14.6219 15.626 14.5049C15.1851 14.0929 14.6769 13.7528 14.1201 13.5H15.4189Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M10 4C12.1875 4 14 5.8125 14 8C14 10.2188 12.1875 12 10 12C7.78125 12 6 10.2188 6 8C6 5.8125 7.78125 4 10 4Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M14 4C16.1902 4 18 5.8098 18 8C18 10.2201 16.1877 12 14 12V11C15.6405 11 17 9.66273 17 8C17 6.36208 15.6379 5 14 5V4Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_visibilityOff = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.005 6.49997C14.765 6.49997 17.005 8.73997 17.005 11.5C17.005 12.0334 16.9175 12.5399 16.7589 13.0195C16.696 13.2099 16.7371 13.4221 16.8789 13.5639L19.2419 15.9269C19.4249 16.1098 19.718 16.1238 19.9101 15.9506C21.0646 14.9093 22.012 13.6433 22.6833 12.222C22.8991 11.7649 22.8987 11.2351 22.6824 10.7782C20.7868 6.77297 16.7164 3.99997 11.995 3.99997C10.8718 3.99997 9.78726 4.16089 8.76197 4.45689C8.41038 4.5584 8.31181 4.99675 8.57057 5.25552L9.94113 6.62608C10.0829 6.7679 10.2951 6.80902 10.4855 6.74607C10.9651 6.58753 11.4716 6.49997 12.005 6.49997ZM2.64003 3.13497C2.28933 3.48568 2.28933 4.05427 2.64003 4.40497L4.34436 6.10931C4.55708 6.32203 4.53453 6.6725 4.3061 6.86825C3.05274 7.94231 2.03087 9.27279 1.31825 10.777C1.10145 11.2347 1.10158 11.7654 1.31827 12.2231C3.21416 16.2276 7.28421 19 12.005 19C13.4381 19 14.8113 18.7435 16.0772 18.2781C16.265 18.2091 16.4767 18.2517 16.6182 18.3931L16.805 18.58L19.0995 20.8666C19.4507 21.2166 20.0189 21.2161 20.3695 20.8655C20.7205 20.5145 20.7205 19.9454 20.3695 19.5944L3.91003 3.13497C3.55933 2.78427 2.99073 2.78427 2.64003 3.13497ZM7.26719 9.94414C7.37767 9.6199 7.78645 9.5514 8.02867 9.79361L8.88746 10.6524C9.01024 10.7752 9.05723 10.9524 9.0326 11.1243C9.01484 11.2483 9.00503 11.3741 9.00503 11.5C9.00503 13.16 10.345 14.5 12.005 14.5C12.1309 14.5 12.2567 14.4902 12.3807 14.4724C12.5526 14.4478 12.7298 14.4948 12.8526 14.6175L13.7114 15.4763C13.9536 15.7185 13.8851 16.1273 13.5609 16.2378C13.0704 16.4049 12.5496 16.5 12.005 16.5C9.24503 16.5 7.00503 14.26 7.00503 11.5C7.00503 10.9554 7.10006 10.4346 7.26719 9.94414ZM12.015 8.50997C11.9492 8.51385 11.9188 8.59373 11.9654 8.64039L14.881 11.556C14.9274 11.6024 15.0069 11.5751 15.015 11.51C15.015 9.84997 13.675 8.50997 12.015 8.50997Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_visibilityOn = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12.0001 9C13.66 9.00011 15.0001 10.3401 15.0001 12C15.0001 13.6599 13.66 14.9999 12.0001 15C10.3401 15 9.00013 13.66 9.00013 12C9.00013 11.6916 9.04599 11.3941 9.13197 11.1143C9.36671 11.6362 9.8907 12 10.5001 12C11.3285 11.9999 12.0001 11.3284 12.0001 10.5C12.0001 9.8906 11.6363 9.3666 11.1144 9.13184C11.3941 9.04589 11.6918 9 12.0001 9Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12.0001 4.5C16.7207 4.50008 20.7907 7.27215 22.6867 11.2764C22.9034 11.7341 22.9034 12.2659 22.6867 12.7236C20.7907 16.7279 16.7207 19.4999 12.0001 19.5C7.27956 19.5 3.20962 16.7278 1.31361 12.7236C1.09688 12.2659 1.09688 11.7341 1.31361 11.2764C3.20962 7.27217 7.27956 4.5 12.0001 4.5ZM12.0001 7C9.24013 7 7.00013 9.24 7.00013 12C7.00013 14.76 9.24013 17 12.0001 17C14.76 16.9999 17.0001 14.7599 17.0001 12C17.0001 9.24007 14.76 7.00011 12.0001 7Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_warehouseFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.5791 3.79443C11.8489 3.68392 12.1511 3.68392 12.4209 3.79443L21.3105 7.437C21.7277 7.60805 22 8.01449 22 8.46532V19.7329C21.9998 20.0396 21.751 20.2886 21.4443 20.2886H19.8887C19.5821 20.2884 19.3332 20.0395 19.333 19.7329V10.8433C19.3328 10.2299 18.836 9.73314 18.2227 9.7329H5.77734C5.16402 9.73314 4.6672 10.2299 4.66699 10.8433V19.7329C4.66679 20.0395 4.41793 20.2885 4.11133 20.2886H2.55566C2.24896 20.2886 2.0002 20.0396 2 19.7329V8.46532C2 8.01449 2.27234 7.60806 2.68945 7.437L11.5791 3.79443Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M17.5557 18.0659C17.8625 18.066 18.1113 18.3148 18.1113 18.6216V19.7329C18.1111 20.0395 17.8623 20.2885 17.5557 20.2886H6.44434C6.13769 20.2885 5.88886 20.0395 5.88867 19.7329V18.6216C5.88867 18.3148 6.13757 18.066 6.44434 18.0659H17.5557Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M17.5557 14.1772C17.8625 14.1773 18.1113 14.4261 18.1113 14.7329V16.3989C18.1113 16.7057 17.8625 16.9545 17.5557 16.9546H6.44434C6.13757 16.9545 5.88867 16.7057 5.88867 16.3989V14.7329C5.88867 14.4261 6.13757 14.1773 6.44434 14.1772H17.5557Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M17.5557 10.8433C17.8624 10.8433 18.1112 11.0923 18.1113 11.3989V12.5102C18.1113 12.817 17.8625 13.0659 17.5557 13.0659H6.44434C6.13757 13.0658 5.88867 12.817 5.88867 12.5102V11.3989C5.88883 11.0923 6.13767 10.8433 6.44434 10.8433H17.5557Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_warehouseOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.3311 3.81877C11.7597 3.64309 12.2403 3.64309 12.6689 3.81877L20.7803 7.14298C21.4424 7.41452 21.875 8.05913 21.875 8.77482V19.5629C21.875 19.9771 21.5392 20.3129 21.125 20.3129C20.7108 20.3129 20.375 19.9771 20.375 19.5629V8.77482C20.375 8.66775 20.31 8.57129 20.2109 8.53068L12.0996 5.20646C12.0357 5.18039 11.9643 5.18039 11.9004 5.20646L3.78906 8.53068C3.69 8.57129 3.62502 8.66775 3.625 8.77482V19.5629C3.62496 19.9771 3.28919 20.3129 2.875 20.3129C2.46081 20.3129 2.12504 19.9771 2.125 19.5629V8.77482C2.12502 8.05913 2.55757 7.41452 3.21973 7.14298L11.3311 3.81877Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M17.0693 10.1947C17.7633 10.1949 18.3259 10.7577 18.3262 11.4516V19.0561C18.3261 19.7501 17.7633 20.3128 17.0693 20.3129H6.93066C6.23659 20.3128 5.67395 19.7501 5.67383 19.0561V11.4516C5.67407 10.7576 6.23668 10.1948 6.93066 10.1947H17.0693ZM7.17383 17.2719V18.8129H16.8262V17.2719H7.17383ZM7.17383 15.7719H16.8262V14.7367H7.17383V15.7719ZM7.17383 13.2367H16.8262V11.6947H7.17383V13.2367Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_warningFill = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M11.2158 3.74962C11.6119 3.24586 12.387 3.24593 12.7832 3.74962L12.8623 3.86583L21.8252 19.1217C22.2167 19.7883 21.7359 20.6285 20.9629 20.6285H3.0361C2.26345 20.6281 1.78266 19.7881 2.1738 19.1217L11.1377 3.86583L11.2158 3.74962ZM12 15.8785C11.4477 15.8785 11 16.3262 11 16.8785C11.0001 17.4307 11.4478 17.8785 12 17.8785C12.5521 17.8785 12.9998 17.4307 13 16.8785C13 16.3263 12.5522 15.8785 12 15.8785ZM12 9.12853C11.5858 9.12853 11.25 9.46431 11.25 9.87853V14.3785C11.2501 14.7926 11.5859 15.1285 12 15.1285C12.4141 15.1285 12.7498 14.7926 12.75 14.3785V9.87853C12.75 9.46433 12.4142 9.12855 12 9.12853Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_warningOutline = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M12 15.8785C12.5522 15.8785 13 16.3263 13 16.8785C12.9998 17.4307 12.5521 17.8785 12 17.8785C11.4478 17.8785 11.0001 17.4307 11 16.8785C11 16.3262 11.4477 15.8785 12 15.8785Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12 9.12853C12.4142 9.12855 12.75 9.46433 12.75 9.87853V14.3785C12.7498 14.7926 12.4141 15.1285 12 15.1285C11.5859 15.1285 11.2501 14.7926 11.25 14.3785V9.87853C11.25 9.46431 11.5858 9.12853 12 9.12853Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M11.2158 3.74962C11.6119 3.24586 12.387 3.24593 12.7832 3.74962L12.8623 3.86583L21.8252 19.1217C22.2167 19.7883 21.7359 20.6285 20.9629 20.6285H3.0361C2.26345 20.6281 1.78265 19.7881 2.1738 19.1217L11.1377 3.86583L11.2158 3.74962ZM3.91013 19.1285H20.0888L11.999 5.359L3.91013 19.1285Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nconst Icon_youtube = (p: IconRenderProps) => {\n  const { size = 24, ...rest } = p;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...rest}\n    >\n      <path\n        d=\"M20 5C21.1046 5 22 5.89543 22 7V17C22 18.1046 21.1046 19 20 19H4C2.89543 19 2 18.1046 2 17V7C2 5.89543 2.89543 5 4 5H20ZM10.5273 8.51855C10.1951 8.29704 9.75 8.53522 9.75 8.93457V15.0654C9.75 15.4648 10.1951 15.703 10.5273 15.4814L15.126 12.416C15.4228 12.2181 15.4228 11.7819 15.126 11.584L10.5273 8.51855Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nexport const ICONS = {\n  add: Icon_add,\n  alert: Icon_alert,\n  alignKorean: Icon_alignKorean,\n  archive: Icon_archive,\n  arrowDown: Icon_arrowDown,\n  arrowLeft: Icon_arrowLeft,\n  arrowRight: Icon_arrowRight,\n  arrowUp: Icon_arrowUp,\n  asterisk: Icon_asterisk,\n  attachFile: Icon_attachFile,\n  barcode: Icon_barcode,\n  bell: Icon_bell,\n  bill: Icon_bill,\n  board: Icon_board,\n  box: Icon_box,\n  camera: Icon_camera,\n  cancelFill: Icon_cancelFill,\n  cancelOutline: Icon_cancelOutline,\n  caretDown: Icon_caretDown,\n  caretLeft: Icon_caretLeft,\n  caretRight: Icon_caretRight,\n  caretUp: Icon_caretUp,\n  check: Icon_check,\n  checkFill: Icon_checkFill,\n  checkOutline: Icon_checkOutline,\n  checkboxCheck: Icon_checkboxCheck,\n  checkboxIndeterminate: Icon_checkboxIndeterminate,\n  chevronDown: Icon_chevronDown,\n  chevronLeft: Icon_chevronLeft,\n  chevronLeftEnd: Icon_chevronLeftEnd,\n  chevronRight: Icon_chevronRight,\n  chevronRightEnd: Icon_chevronRightEnd,\n  chevronUp: Icon_chevronUp,\n  clockFill: Icon_clockFill,\n  clockOutline: Icon_clockOutline,\n  close: Icon_close,\n  copy: Icon_copy,\n  coupon: Icon_coupon,\n  dashboard: Icon_dashboard,\n  date: Icon_date,\n  delete: Icon_delete,\n  dot: Icon_dot,\n  download: Icon_download,\n  drag: Icon_drag,\n  edit: Icon_edit,\n  etc: Icon_etc,\n  event: Icon_event,\n  global: Icon_global,\n  helpFill: Icon_helpFill,\n  helpOutline: Icon_helpOutline,\n  history: Icon_history,\n  image: Icon_image,\n  inline: Icon_inline,\n  launcher: Icon_launcher,\n  leftRight: Icon_leftRight,\n  line: Icon_line,\n  location: Icon_location,\n  logout: Icon_logout,\n  minus: Icon_minus,\n  monitor: Icon_monitor,\n  new: Icon_new,\n  notificationFill: Icon_notificationFill,\n  notificationOutline: Icon_notificationOutline,\n  notion: Icon_notion,\n  outline: Icon_outline,\n  pageEdit: Icon_pageEdit,\n  pageMove: Icon_pageMove,\n  pdf: Icon_pdf,\n  print: Icon_print,\n  remove: Icon_remove,\n  reset: Icon_reset,\n  robot: Icon_robot,\n  row: Icon_row,\n  save: Icon_save,\n  search: Icon_search,\n  send: Icon_send,\n  setting: Icon_setting,\n  settingOutline: Icon_settingOutline,\n  shield: Icon_shield,\n  sidebar: Icon_sidebar,\n  store: Icon_store,\n  synchronize: Icon_synchronize,\n  thumbsDown: Icon_thumbsDown,\n  thumbsUp: Icon_thumbsUp,\n  updown: Icon_updown,\n  user: Icon_user,\n  users: Icon_users,\n  visibilityOff: Icon_visibilityOff,\n  visibilityOn: Icon_visibilityOn,\n  warehouseFill: Icon_warehouseFill,\n  warehouseOutline: Icon_warehouseOutline,\n  warningFill: Icon_warningFill,\n  warningOutline: Icon_warningOutline,\n  youtube: Icon_youtube,\n} as const;\n\nexport type SIconName = keyof typeof ICONS;\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { resolveColor, type SColor } from '../../lib/color';\nimport { ICONS, type SIconName } from './icons.gen';\n\nexport interface SIconProps {\n  /** 아이콘명 */\n  name: SIconName;\n  /** 아이콘 크기(px 또는 CSS 길이) */\n  size?: number | string;\n  /** 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상. 미지정 시 currentColor 상속 */\n  color?: SColor;\n  /** 회전 각도 */\n  rotate?: 0 | 90 | 180 | 270;\n  /** 접근성 라벨. 없으면 aria-hidden 처리 */\n  label?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SIcon — sd-icon 포팅.\n * 94개 SVG(icons.gen.tsx)를 currentColor 기반으로 렌더한다.\n */\nexport const SIcon = forwardRef<HTMLSpanElement, SIconProps>(function SIcon(\n  { name, size = 24, color, rotate, label, className, style },\n  ref,\n) {\n  const Svg = ICONS[name];\n  if (!Svg) return null;\n\n  const rotateClass = rotate\n    ? { 90: 'rotate-90', 180: 'rotate-180', 270: '-rotate-90' }[rotate]\n    : undefined;\n\n  return (\n    <span\n      ref={ref}\n      className={cn('inline-flex items-center justify-center', rotateClass, className)}\n      style={{ color: resolveColor(color), ...style }}\n      role={label ? 'img' : undefined}\n      aria-label={label}\n      aria-hidden={label ? undefined : true}\n    >\n      <Svg size={size} />\n    </span>\n  );\n});\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport const BADGE_COLORS = [\n  'red',\n  'orange',\n  'yellow',\n  'green',\n  'blue',\n  'darkblue',\n  'indigo',\n  'grey',\n] as const;\nexport type SBadgeColor = (typeof BADGE_COLORS)[number];\n\nexport interface SBadgeProps extends HTMLAttributes<HTMLSpanElement> {\n  /** 뱃지 색상 */\n  color?: SBadgeColor;\n}\n\n/**\n * SBadge — sd-badge 포팅. 색상 점(dot) 인디케이터.\n * 색상은 컴포넌트 토큰 `--cmp-badge-<color>` 를 참조한다.\n */\nexport const SBadge = forwardRef<HTMLSpanElement, SBadgeProps>(function SBadge(\n  { color = 'blue', className, ...rest },\n  ref,\n) {\n  return (\n    <span ref={ref} className={cn('inline-flex items-center justify-center', className)} {...rest}>\n      <span\n        className=\"rounded-full\"\n        style={{\n          width: 'var(--cmp-badge-size, 6px)',\n          height: 'var(--cmp-badge-size, 6px)',\n          background: `var(--cmp-badge-${color})`,\n        }}\n      />\n    </span>\n  );\n});\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SCardProps extends HTMLAttributes<HTMLDivElement> {\n  /** 테두리 표시 여부 */\n  bordered?: boolean;\n}\n\n/** SCard — sd-card 포팅. 라운드 8px, 흰 배경, 옵션 테두리. */\nexport const SCard = forwardRef<HTMLDivElement, SCardProps>(function SCard(\n  { bordered = false, className, children, ...rest },\n  ref,\n) {\n  return (\n    <div\n      ref={ref}\n      className={cn('h-fit rounded-[8px] bg-white', bordered && 'border border-grey-30', className)}\n      {...rest}\n    >\n      {children}\n    </div>\n  );\n});\n","/**\n * React DevTools 에 노출할 이름을 붙인다.\n *\n * `SList.displayName = 'SList'` 처럼 **최상위 대입문**으로 쓰면 번들러가 이를\n * 부작용으로 보고 지우지 못한다. 그러면 그 컴포넌트와 컴포넌트가 참조하는 것\n * 전부(예: SIcon → 아이콘 89개)가 소비 앱 번들에 남는다.\n *\n * 선언식 안으로 밀어 넣으면 `/* @__PURE__ *\\/` 를 붙일 수 있어 안 쓰는 컴포넌트가\n * 통째로 제거된다. 주석은 scripts/annotate-pure.mjs 가 빌드 후 넣는다.\n *\n * ```ts\n * export const SList = withDisplayName(forwardRef(...), 'SList');\n * ```\n *\n * ⚠️ 방금 만든 컴포넌트에만 쓴다. 이미 다른 곳에서 쓰이는 값에 붙이면 pure 로\n * 표시한 것이 거짓이 되어, 지워지면 안 될 대입이 사라질 수 있다.\n */\nexport function withDisplayName<T>(component: T, name: string): T {\n  (component as { displayName?: string }).displayName = name;\n  return component;\n}\n","/**\n * 전역 Portal 레이어 순서.\n * 모달 내부의 깊이는 ModalHost 안에서만 관리하며, 이 값들과 직접 경쟁하지 않는다.\n */\nexport const Z_INDEX = {\n  baseFloating: 50,\n  modalHost: 1000,\n  toast: 1100,\n  loading: 1200,\n  drag: 1300,\n} as const;\n","'use client';\n\nimport {\n  forwardRef,\n  useEffect,\n  useRef,\n  useState,\n  type HTMLAttributes,\n  type MouseEvent,\n  type ReactNode,\n  type Ref,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../lib/cn';\nimport { withDisplayName } from '../../lib/display-name';\nimport { Z_INDEX } from '../../lib/z-index';\nimport { SIcon } from '../SIcon';\n\nexport interface SDraggableItemRenderState {\n  hovered: boolean;\n  dragging: boolean;\n  disabled: boolean;\n}\n\nexport type SDraggableItemRenderProp = (state: SDraggableItemRenderState) => ReactNode;\nexport type SDraggableItemSlot = ReactNode | SDraggableItemRenderProp;\nexport type SDraggableItemSupportingTextPosition = 'right' | 'bottom';\nexport type SDraggableItemSize = 'sm' | 'md';\n\ninterface DragOverlayState {\n  offsetX: number;\n  offsetY: number;\n  rect: DOMRect;\n  x: number;\n  y: number;\n}\n\nexport interface SDraggableItemProps extends Omit<\n  HTMLAttributes<HTMLDivElement>,\n  'children' | 'title'\n> {\n  /** 드래그 아이템 제목 */\n  title: SDraggableItemSlot;\n  /** 제목을 보조하는 텍스트 */\n  supportingText?: SDraggableItemSlot;\n  /** 보조 텍스트 위치 */\n  supportingTextPosition?: SDraggableItemSupportingTextPosition;\n  /** 타이틀 뒤에 표시할 태그/콘텐츠 */\n  trailing?: SDraggableItemSlot;\n  /** 아이템 왼쪽 accent stripe 표시 여부 */\n  accentStripe?: boolean;\n  /** 외곽 테두리 사용 여부 */\n  bordered?: boolean;\n  /** 선택 상태 여부 */\n  selected?: boolean;\n  /** 드래그 중인 스타일을 고정해서 표시할지 여부 */\n  dragging?: boolean;\n  /** 조밀한 높이 사용 여부 */\n  dense?: boolean;\n  /** 타이포그래피·세로 패딩 크기 */\n  size?: SDraggableItemSize;\n  /** 비활성 상태 여부 */\n  disabled?: boolean;\n  /** 드래그 시 마우스를 따라가는 overlay 표시 여부 */\n  dragOverlay?: boolean;\n  /** 드래그 overlay 투명도 */\n  dragOverlayOpacity?: number;\n  /** 드래그 핸들에 전달할 속성 */\n  dragHandleProps?: HTMLAttributes<HTMLDivElement>;\n  /** 드래그 핸들 mouse down 이벤트 */\n  onDragHandleMouseDown?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nconst setRefs = <T,>(refs: Array<Ref<T> | undefined>, value: T | null) => {\n  refs.forEach(ref => {\n    if (typeof ref === 'function') {\n      ref(value);\n      return;\n    }\n\n    if (ref) {\n      ref.current = value;\n    }\n  });\n};\n\nfunction renderSlot(slot: SDraggableItemSlot | undefined, state: SDraggableItemRenderState) {\n  return typeof slot === 'function' ? slot(state) : slot;\n}\n\ninterface SDraggableItemViewProps extends Omit<\n  HTMLAttributes<HTMLDivElement>,\n  'children' | 'title'\n> {\n  title: SDraggableItemSlot;\n  supportingText?: SDraggableItemSlot;\n  supportingTextPosition: SDraggableItemSupportingTextPosition;\n  trailing?: SDraggableItemSlot;\n  accentStripe: boolean;\n  bordered: boolean;\n  selected: boolean;\n  dense: boolean;\n  size: SDraggableItemSize;\n  dragging: boolean;\n  disabled: boolean;\n  hovered: boolean;\n  dragHandleProps?: HTMLAttributes<HTMLDivElement>;\n  onDragHandleMouseDown?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nconst SDraggableItemView = forwardRef<HTMLDivElement, SDraggableItemViewProps>(\n  function SDraggableItemView(\n    {\n      title,\n      supportingText,\n      supportingTextPosition,\n      trailing,\n      accentStripe,\n      bordered,\n      selected,\n      dense,\n      size,\n      dragging,\n      disabled,\n      hovered,\n      dragHandleProps,\n      onDragHandleMouseDown,\n      className,\n      ...rest\n    },\n    ref,\n  ) {\n    const renderState = { hovered, dragging, disabled };\n    const titleNode = renderSlot(title, renderState);\n    const supportingTextNode = renderSlot(supportingText, renderState);\n    const hasSupportingText = supportingTextNode != null && supportingTextNode !== '';\n    const trailingNode = renderSlot(trailing, renderState);\n    const titleTypo =\n      size === 'sm'\n        ? selected\n          ? 'typo-item-sm-selected'\n          : 'typo-item-sm-default'\n        : selected\n          ? 'typo-item-md-selected'\n          : 'typo-item-md-default';\n    const paddingYClass = dense\n      ? size === 'sm'\n        ? 'py-(--cmp-listDraggableItem-paddingY-sm-dense)'\n        : 'py-(--cmp-listDraggableItem-paddingY-md-dense)'\n      : size === 'sm'\n        ? 'py-(--cmp-listDraggableItem-paddingY-sm-normal)'\n        : 'py-(--cmp-listDraggableItem-paddingY-md-normal)';\n\n    return (\n      <div\n        ref={ref}\n        aria-disabled={disabled || undefined}\n        data-dragging={dragging || undefined}\n        className={cn(\n          'relative flex w-full items-center gap-(--cmp-listDraggableItem-gap) overflow-hidden px-(--cmp-listDraggableItem-paddingX)',\n          titleTypo,\n          disabled\n            ? 'bg-(--cmp-listDraggableItem-bg-default) text-(--sys-color-disabled-text)'\n            : selected\n              ? 'bg-(--cmp-listDraggableItem-bg-selected) text-(--cmp-listDraggableItem-text-selected)'\n              : 'bg-(--cmp-listDraggableItem-bg-default) text-(--cmp-listDraggableItem-text-default)',\n          !disabled && !selected && !dragging && 'hover:bg-(--cmp-listDraggableItem-bg-hover)',\n          hasSupportingText && supportingTextPosition === 'bottom'\n            ? dense\n              ? 'min-h-[52px]'\n              : 'min-h-[60px]'\n            : dense\n              ? 'h-[32px]'\n              : 'h-[40px]',\n          paddingYClass,\n          bordered\n            ? cn(\n                'rounded-(--cmp-listDraggableItem-radius-bordered) border border-(--cmp-listDraggableItem-border-default)',\n                !disabled &&\n                  !selected &&\n                  !dragging &&\n                  'hover:border-(--cmp-listDraggableItem-bordered-border-hover)',\n                !disabled &&\n                  selected &&\n                  !dragging &&\n                  'border-(--cmp-listDraggableItem-bordered-border-selected) bg-(--cmp-listDraggableItem-bordered-bg-selected)',\n                !disabled &&\n                  selected &&\n                  dragging &&\n                  'border-[length:var(--cmp-listDraggableItem-bordered-dragging-border-width)] border-(--cmp-listDraggableItem-bordered-dragging-border-color) bg-(--cmp-listDraggableItem-bordered-dragging-bg)',\n              )\n            : 'border-b border-(--cmp-listDraggableItem-border-default)',\n          disabled && 'cursor-not-allowed',\n          className,\n        )}\n        {...rest}\n      >\n        {accentStripe && selected && !bordered && !disabled && (\n          <span\n            aria-hidden=\"true\"\n            className=\"pointer-events-none absolute bottom-[-1px] left-0 top-0 w-(--cmp-listDraggableItem-accentStripe-width) bg-(--cmp-listDraggableItem-accentStripe-color)\"\n          />\n        )}\n        <div\n          {...dragHandleProps}\n          role={dragHandleProps?.role ?? 'button'}\n          tabIndex={dragHandleProps?.tabIndex ?? (disabled ? -1 : 0)}\n          aria-label={dragHandleProps?.['aria-label'] ?? '드래그 핸들'}\n          aria-disabled={disabled || undefined}\n          onMouseDown={onDragHandleMouseDown}\n          className={cn(\n            'flex size-[24px] shrink-0 select-none items-center justify-center rounded-[4px]',\n            disabled\n              ? 'cursor-not-allowed opacity-0'\n              : 'cursor-grab hover:bg-black/5 active:cursor-grabbing',\n            dragging && 'bg-black/5',\n            dragHandleProps?.className,\n          )}\n        >\n          <SIcon name=\"drag\" size={16} color=\"grey_65\" />\n        </div>\n        <div\n          className={cn(\n            'flex min-w-0 flex-1 items-center gap-[8px]',\n            dragging && 'opacity-(--cmp-listDraggableItem-dragging-content-opacity)',\n          )}\n        >\n          <span\n            className={cn(\n              'min-w-0 flex-1',\n              supportingTextPosition === 'bottom'\n                ? 'flex flex-col'\n                : 'flex items-center gap-[8px] whitespace-nowrap',\n            )}\n          >\n            <span className=\"min-w-0 truncate\">{titleNode}</span>\n            {hasSupportingText && (\n              <span\n                className={cn(\n                  'typo-body-sm-default min-w-0 truncate text-(--sys-color-fg-secondary)',\n                  supportingTextPosition === 'right' && 'flex-1',\n                )}\n              >\n                {supportingTextNode}\n              </span>\n            )}\n          </span>\n          {trailingNode}\n        </div>\n      </div>\n    );\n  },\n);\n\nconst SDraggableItemImpl = forwardRef<HTMLDivElement, SDraggableItemProps>(function SDraggableItem(\n  {\n    title,\n    supportingText,\n    supportingTextPosition = 'right',\n    trailing,\n    accentStripe = false,\n    bordered = false,\n    selected = false,\n    dragging = false,\n    dense = false,\n    size = 'sm',\n    disabled = false,\n    dragOverlay = true,\n    dragOverlayOpacity = 0.75,\n    dragHandleProps,\n    onDragHandleMouseDown,\n    className,\n    onMouseEnter,\n    onMouseLeave,\n    ...rest\n  },\n  ref,\n) {\n  const [hovered, setHovered] = useState(false);\n  const [overlay, setOverlay] = useState<DragOverlayState | null>(null);\n  const rootRef = useRef<HTMLDivElement>(null);\n  const overlayVisible = overlay != null;\n\n  const handleMouseEnter = (event: MouseEvent<HTMLDivElement>) => {\n    if (!disabled) setHovered(true);\n    onMouseEnter?.(event);\n  };\n\n  const handleMouseLeave = (event: MouseEvent<HTMLDivElement>) => {\n    setHovered(false);\n    onMouseLeave?.(event);\n  };\n\n  const handleDragMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n    if (disabled) return;\n    const rect = rootRef.current?.getBoundingClientRect();\n    if (dragOverlay && rect) {\n      setOverlay({\n        offsetX: event.clientX - rect.left,\n        offsetY: event.clientY - rect.top,\n        rect,\n        x: event.clientX,\n        y: event.clientY,\n      });\n    }\n    dragHandleProps?.onMouseDown?.(event);\n    onDragHandleMouseDown?.(event);\n  };\n\n  useEffect(() => {\n    if (!overlayVisible) return undefined;\n\n    const handleMouseMove = (event: globalThis.MouseEvent) => {\n      setOverlay(current =>\n        current\n          ? {\n              ...current,\n              x: event.clientX,\n              y: event.clientY,\n            }\n          : current,\n      );\n    };\n\n    const handleMouseUp = () => {\n      setOverlay(null);\n    };\n\n    window.addEventListener('mousemove', handleMouseMove);\n    window.addEventListener('mouseup', handleMouseUp);\n\n    return () => {\n      window.removeEventListener('mousemove', handleMouseMove);\n      window.removeEventListener('mouseup', handleMouseUp);\n    };\n  }, [overlayVisible]);\n\n  return (\n    <>\n      <SDraggableItemView\n        ref={node => setRefs([rootRef, ref], node)}\n        title={title}\n        supportingText={supportingText}\n        supportingTextPosition={supportingTextPosition}\n        trailing={trailing}\n        accentStripe={accentStripe}\n        bordered={bordered}\n        selected={selected}\n        dense={dense}\n        size={size}\n        dragging={dragging || overlayVisible}\n        disabled={disabled}\n        hovered={hovered}\n        dragHandleProps={dragHandleProps}\n        onDragHandleMouseDown={handleDragMouseDown}\n        onMouseEnter={handleMouseEnter}\n        onMouseLeave={handleMouseLeave}\n        className={className}\n        {...rest}\n      />\n      {overlay &&\n        typeof document !== 'undefined' &&\n        createPortal(\n          <div\n            className=\"pointer-events-none fixed\"\n            style={{\n              left: overlay.x - overlay.offsetX,\n              opacity: dragOverlayOpacity,\n              top: overlay.y - overlay.offsetY,\n              width: overlay.rect.width,\n              zIndex: Z_INDEX.drag,\n            }}\n          >\n            <SDraggableItemView\n              title={title}\n              supportingText={supportingText}\n              supportingTextPosition={supportingTextPosition}\n              trailing={trailing}\n              accentStripe={accentStripe}\n              bordered={bordered}\n              selected={selected}\n              dense={dense}\n              size={size}\n              dragging\n              disabled={disabled}\n              hovered\n              dragHandleProps={dragHandleProps}\n              className={className}\n            />\n          </div>,\n          document.body,\n        )}\n    </>\n  );\n});\n\nexport const SDraggableItem = withDisplayName(SDraggableItemImpl, 'SDraggableItem');\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { withDisplayName } from '../../lib/display-name';\n\nexport interface SListProps extends HTMLAttributes<HTMLDivElement> {\n  /** 리스트 컨테이너 내부에 렌더링할 내용 */\n  children?: ReactNode;\n  /** 리스트 아이템 사이 gap 토큰 적용 여부 */\n  useGap?: boolean;\n  /** 리스트 컨테이너 padding 토큰 적용 여부 */\n  usePadding?: boolean;\n}\n\nconst SListImpl = forwardRef<HTMLDivElement, SListProps>(function SList(\n  { className, children, useGap = false, usePadding = false, ...rest },\n  ref,\n) {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        useGap && 'flex flex-col gap-(--cmp-list-group-gap)',\n        usePadding && 'p-(--cmp-list-group-padding)',\n        className,\n      )}\n      {...rest}\n    >\n      {children}\n    </div>\n  );\n});\n\nexport const SList = withDisplayName(SListImpl, 'SList');\n","'use client';\n\nimport {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n  type HTMLAttributes,\n  type MouseEvent,\n  type ReactNode,\n} from 'react';\n\nexport interface SDraggableGroupMoveEvent {\n  group: string;\n  itemKey: string;\n  fromListId: string;\n  fromIndex: number;\n  toListId: string;\n  toIndex: number;\n}\n\ninterface RegisteredList {\n  element: HTMLDivElement;\n  items: unknown[];\n  onChange?: (items: unknown[]) => void;\n}\n\ninterface GroupContextValue {\n  defaultGroup?: string;\n  dragging: { group: string; listId: string; index: number; itemKey: string } | null;\n  drop: { group: string; listId: string; index: number } | null;\n  registerList: (\n    group: string,\n    listId: string,\n    element: HTMLDivElement | null,\n    items: unknown[],\n    onChange?: (items: unknown[]) => void,\n  ) => void;\n  startDrag: (\n    event: MouseEvent<HTMLDivElement>,\n    group: string,\n    listId: string,\n    index: number,\n    itemKey: string,\n  ) => void;\n}\n\nconst DraggableGroupContext = createContext<GroupContextValue | null>(null);\n\nexport function useSDraggableGroup() {\n  return useContext(DraggableGroupContext);\n}\n\nexport interface SDraggableGroupProps extends HTMLAttributes<HTMLDivElement> {\n  children: ReactNode;\n  onMove: (event: SDraggableGroupMoveEvent) => void;\n}\n\nexport interface SDraggableProviderProps {\n  children: ReactNode;\n}\n\ninterface SDraggableProviderInternalProps extends SDraggableProviderProps {\n  defaultGroup?: string;\n  legacyOnMove?: (event: SDraggableGroupMoveEvent) => void;\n}\n\nfunction SDraggableProviderInternal({\n  children,\n  defaultGroup,\n  legacyOnMove,\n}: SDraggableProviderInternalProps) {\n  const listsRef = useRef(new Map<string, RegisteredList>());\n  const legacyOnMoveRef = useRef(legacyOnMove);\n  const pointerRef = useRef<{ clientX: number; clientY: number } | null>(null);\n  const [dragging, setDragging] = useState<GroupContextValue['dragging']>(null);\n  const [drop, setDrop] = useState<GroupContextValue['drop']>(null);\n  const dropRef = useRef(drop);\n\n  legacyOnMoveRef.current = legacyOnMove;\n  dropRef.current = drop;\n\n  const registerList = useCallback(\n    (\n      group: string,\n      listId: string,\n      element: HTMLDivElement | null,\n      items: unknown[],\n      onChange?: (items: unknown[]) => void,\n    ) => {\n      const key = `${group}:${listId}`;\n      if (element) listsRef.current.set(key, { element, items, onChange });\n      else listsRef.current.delete(key);\n    },\n    [],\n  );\n\n  const startDrag = useCallback(\n    (\n      event: MouseEvent<HTMLDivElement>,\n      group: string,\n      listId: string,\n      index: number,\n      itemKey: string,\n    ) => {\n      event.preventDefault();\n      setDragging({ group, listId, index, itemKey });\n      setDrop({ group, listId, index });\n    },\n    [],\n  );\n\n  useEffect(() => {\n    if (!dragging) return undefined;\n\n    let autoScrollFrame: number | null = null;\n\n    const findListAtPointer = (clientX: number, clientY: number) => {\n      const element = document.elementFromPoint(clientX, clientY);\n      const listElement = element?.closest<HTMLElement>('[data-draggable-list-id]');\n      const group = listElement?.dataset.draggableGroup;\n      const listId = listElement?.dataset.draggableListId;\n      const list = group && listId ? listsRef.current.get(`${group}:${listId}`) : undefined;\n\n      return group && listId && list ? { group, listId, list } : null;\n    };\n\n    const updateDropTarget = (clientX: number, clientY: number) => {\n      const target = findListAtPointer(clientX, clientY);\n\n      if (!target) {\n        setDrop(null);\n        return;\n      }\n\n      const { group, listId, list } = target;\n      const itemElements = list.element.querySelectorAll<HTMLElement>('[data-draggable-list-item]');\n      let nextIndex = list.items.length;\n      itemElements.forEach((itemElement, index) => {\n        const rect = itemElement.getBoundingClientRect();\n        if (clientY < rect.top + rect.height / 2 && nextIndex === list.items.length) {\n          nextIndex = index;\n        }\n      });\n      setDrop({ group, listId, index: nextIndex });\n    };\n\n    const autoScroll = () => {\n      const pointer = pointerRef.current;\n      if (!pointer) return;\n\n      const target = findListAtPointer(pointer.clientX, pointer.clientY);\n      if (!target) {\n        autoScrollFrame = null;\n        return;\n      }\n\n      const rect = target.list.element.getBoundingClientRect();\n      const edgeSize = 40;\n      let scrollDelta = 0;\n\n      if (pointer.clientY < rect.top + edgeSize && target.list.element.scrollTop > 0) {\n        scrollDelta = -Math.min(12, Math.ceil((rect.top + edgeSize - pointer.clientY) / 3));\n      } else if (\n        pointer.clientY > rect.bottom - edgeSize &&\n        target.list.element.scrollTop + target.list.element.clientHeight <\n          target.list.element.scrollHeight\n      ) {\n        scrollDelta = Math.min(12, Math.ceil((pointer.clientY - (rect.bottom - edgeSize)) / 3));\n      }\n\n      if (scrollDelta === 0) {\n        autoScrollFrame = null;\n        return;\n      }\n\n      target.list.element.scrollTop += scrollDelta;\n      updateDropTarget(pointer.clientX, pointer.clientY);\n      autoScrollFrame = requestAnimationFrame(autoScroll);\n    };\n\n    const startAutoScroll = () => {\n      if (autoScrollFrame == null) autoScrollFrame = requestAnimationFrame(autoScroll);\n    };\n\n    const handleMouseMove = (event: globalThis.MouseEvent) => {\n      pointerRef.current = { clientX: event.clientX, clientY: event.clientY };\n      updateDropTarget(event.clientX, event.clientY);\n      startAutoScroll();\n    };\n\n    const handleMouseUp = () => {\n      if (dropRef.current) {\n        const source = listsRef.current.get(`${dragging.group}:${dragging.listId}`);\n        const target = listsRef.current.get(`${dropRef.current.group}:${dropRef.current.listId}`);\n\n        if (legacyOnMoveRef.current) {\n          legacyOnMoveRef.current({\n            itemKey: dragging.itemKey,\n            group: dropRef.current.group,\n            fromListId: dragging.listId,\n            fromIndex: dragging.index,\n            toListId: dropRef.current.listId,\n            toIndex: dropRef.current.index,\n          });\n        } else if (source && target) {\n          const movedItem = source.items[dragging.index];\n          if (movedItem !== undefined) {\n            if (source === target) {\n              const toIndex =\n                dropRef.current.index > dragging.index\n                  ? dropRef.current.index - 1\n                  : dropRef.current.index;\n              const nextItems = [...source.items];\n              nextItems.splice(dragging.index, 1);\n              nextItems.splice(toIndex, 0, movedItem);\n              source.onChange?.(nextItems);\n            } else {\n              const nextSourceItems = source.items.filter((_, index) => index !== dragging.index);\n              const nextTargetItems = [...target.items];\n              nextTargetItems.splice(dropRef.current.index, 0, movedItem);\n              source.onChange?.(nextSourceItems);\n              target.onChange?.(nextTargetItems);\n            }\n          }\n        }\n      }\n      pointerRef.current = null;\n      if (autoScrollFrame != null) cancelAnimationFrame(autoScrollFrame);\n      autoScrollFrame = null;\n      setDragging(null);\n      setDrop(null);\n    };\n\n    const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n      if (event.key === 'Escape') {\n        pointerRef.current = null;\n        if (autoScrollFrame != null) cancelAnimationFrame(autoScrollFrame);\n        autoScrollFrame = null;\n        setDragging(null);\n        setDrop(null);\n      }\n    };\n\n    window.addEventListener('mousemove', handleMouseMove);\n    window.addEventListener('mouseup', handleMouseUp);\n    window.addEventListener('keydown', handleKeyDown);\n    return () => {\n      window.removeEventListener('mousemove', handleMouseMove);\n      window.removeEventListener('mouseup', handleMouseUp);\n      window.removeEventListener('keydown', handleKeyDown);\n      pointerRef.current = null;\n      if (autoScrollFrame != null) cancelAnimationFrame(autoScrollFrame);\n    };\n  }, [dragging]);\n\n  return (\n    <DraggableGroupContext.Provider\n      value={{ defaultGroup, dragging, drop, registerList, startDrag }}\n    >\n      {children}\n    </DraggableGroupContext.Provider>\n  );\n}\n\nexport function SDraggableProvider({ children }: SDraggableProviderProps) {\n  return <SDraggableProviderInternal>{children}</SDraggableProviderInternal>;\n}\n\nexport function SDraggableGroup({ children, onMove, ...rest }: SDraggableGroupProps) {\n  return (\n    <SDraggableProviderInternal defaultGroup=\"__legacy\" legacyOnMove={onMove}>\n      <div {...rest}>{children}</div>\n    </SDraggableProviderInternal>\n  );\n}\n","'use client';\n\nimport {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  type ForwardedRef,\n  type MouseEvent,\n  type ReactElement,\n  type ReactNode,\n} from 'react';\nimport { SList, type SListProps } from '../SList';\nimport { useSDraggableGroup } from './SDraggableGroup';\n\nexport interface SDraggableListRenderState {\n  onDragHandleMouseDown: (event: MouseEvent<HTMLDivElement>) => void;\n  selected: boolean;\n}\n\nexport interface SDraggableListProps<T> extends Omit<SListProps, 'children' | 'onChange'> {\n  /** 현재 순서대로 렌더링할 아이템 목록 */\n  items: T[];\n  /** 아이템을 식별할 안정적인 key */\n  getKey: (item: T, index: number) => string;\n  /** 아이템 렌더링 함수 */\n  renderItem: (item: T, index: number, state: SDraggableListRenderState) => ReactNode;\n  /** 단독 리스트에서 드래그가 끝난 뒤 변경된 순서 */\n  onChange?: (items: T[]) => void;\n  /** 외부에서 제어하는 selected 아이템 key */\n  selectedKey?: string;\n  /** 초기 selected 아이템 key */\n  defaultSelectedKey?: string;\n  /** selected 아이템이 변경될 때 호출 */\n  onSelectedKeyChange?: (key: string) => void;\n  /** disabled 아이템은 선택 및 드래그에서 제외 */\n  getDisabled?: (item: T, index: number) => boolean;\n  /** Provider 안에서 사용할 리스트 식별자 */\n  listId?: string;\n  /** 같은 group 값을 가진 리스트끼리 드래그 이벤트를 공유 */\n  group?: string;\n}\n\nfunction reorder<T>(items: T[], fromIndex: number, toIndex: number) {\n  if (fromIndex === toIndex) return items;\n  const nextItems = [...items];\n  const [movedItem] = nextItems.splice(fromIndex, 1);\n  nextItems.splice(toIndex, 0, movedItem);\n  return nextItems;\n}\n\nfunction SDraggableListInner<T>(\n  {\n    items,\n    getKey,\n    renderItem,\n    onChange,\n    selectedKey,\n    defaultSelectedKey,\n    onSelectedKeyChange,\n    getDisabled,\n    listId,\n    group: groupName,\n    useGap,\n    className,\n    ...rest\n  }: SDraggableListProps<T>,\n  ref: ForwardedRef<HTMLDivElement>,\n) {\n  const dragContext = useSDraggableGroup();\n  const dragGroup = groupName ?? dragContext?.defaultGroup;\n  const [draggingIndex, setDraggingIndex] = useState<number | null>(null);\n  const [dropIndex, setDropIndex] = useState<number | null>(null);\n  const [internalSelectedKey, setInternalSelectedKey] = useState<string | undefined>(\n    defaultSelectedKey,\n  );\n  const listRef = useRef<HTMLDivElement>(null);\n  const fromIndexRef = useRef<number | null>(null);\n  const currentSelectedKey = selectedKey ?? internalSelectedKey;\n\n  const startDrag = useCallback((event: MouseEvent<HTMLDivElement>, index: number) => {\n    event.preventDefault();\n    fromIndexRef.current = index;\n    setDraggingIndex(index);\n    setDropIndex(index);\n  }, []);\n\n  useEffect(() => {\n    if (dragContext || draggingIndex == null) return undefined;\n\n    const handleMouseMove = (event: globalThis.MouseEvent) => {\n      const itemElements = listRef.current?.querySelectorAll<HTMLElement>(\n        '[data-draggable-list-item]',\n      );\n      if (!itemElements) return;\n\n      let nextDropIndex = items.length;\n      itemElements.forEach((itemElement, index) => {\n        const rect = itemElement.getBoundingClientRect();\n        if (event.clientY < rect.top + rect.height / 2 && nextDropIndex === items.length) {\n          nextDropIndex = index;\n        }\n      });\n      setDropIndex(nextDropIndex);\n    };\n\n    const handleMouseUp = () => {\n      const fromIndex = fromIndexRef.current;\n      const nextDropIndex = dropIndex;\n      if (fromIndex != null && nextDropIndex != null) {\n        const toIndex = nextDropIndex > fromIndex ? nextDropIndex - 1 : nextDropIndex;\n        if (fromIndex !== toIndex) onChange?.(reorder(items, fromIndex, toIndex));\n      }\n      fromIndexRef.current = null;\n      setDraggingIndex(null);\n      setDropIndex(null);\n    };\n\n    window.addEventListener('mousemove', handleMouseMove);\n    window.addEventListener('mouseup', handleMouseUp);\n    return () => {\n      window.removeEventListener('mousemove', handleMouseMove);\n      window.removeEventListener('mouseup', handleMouseUp);\n    };\n  }, [draggingIndex, dropIndex, items, onChange, dragContext]);\n\n  if (dragContext && (!listId || !dragGroup)) {\n    throw new Error('SDraggableList: Provider 안에서는 group과 listId가 필요합니다.');\n  }\n\n  const groupDrop = dragContext?.drop;\n  const currentDropIndex = dragContext\n    ? groupDrop?.group === dragGroup && groupDrop?.listId === listId\n      ? (groupDrop?.index ?? null)\n      : null\n    : dropIndex;\n  const isDropTarget = dragContext\n    ? groupDrop?.group === dragGroup && groupDrop?.listId === listId\n    : draggingIndex != null;\n  const showEmptyDrop = Boolean(dragContext && isDropTarget && items.length === 0);\n  const beforeIndicatorPosition = useGap ? 'before:top-[-5px]' : 'before:top-0';\n  const afterIndicatorPosition = useGap ? 'after:bottom-[-5px]' : 'after:bottom-[-1px]';\n\n  const setListRef = (node: HTMLDivElement | null) => {\n    listRef.current = node;\n    if (dragContext && dragGroup && listId) {\n      dragContext.registerList(\n        dragGroup,\n        listId,\n        node,\n        items,\n        onChange ? nextItems => onChange(nextItems as T[]) : undefined,\n      );\n    }\n    if (typeof ref === 'function') ref(node);\n    else if (ref) ref.current = node;\n  };\n\n  return (\n    <SList\n      ref={setListRef}\n      {...rest}\n      useGap={useGap}\n      className={`${className ?? ''} ${dragContext ? 'min-h-[40px]' : ''} ${\n        showEmptyDrop\n          ? \"relative before:absolute before:left-0 before:right-0 before:top-0 before:z-10 before:h-[2px] before:bg-(--sys-color-border-accent) before:content-['']\"\n          : ''\n      }`}\n      data-draggable-group={dragContext ? dragGroup : undefined}\n      data-draggable-list-id={dragContext ? listId : undefined}\n    >\n      {items.map((item, index) => {\n        const itemKey = getKey(item, index);\n        const disabled = getDisabled?.(item, index) ?? false;\n        const showBefore = isDropTarget && currentDropIndex === index;\n        const showAfter =\n          isDropTarget && currentDropIndex === items.length && index === items.length - 1;\n        return (\n          <div\n            key={itemKey}\n            data-draggable-list-item\n            aria-disabled={disabled || undefined}\n            onClick={() => {\n              if (disabled) return;\n              setInternalSelectedKey(itemKey);\n              onSelectedKeyChange?.(itemKey);\n            }}\n            className={`relative ${\n              showBefore\n                ? `before:absolute before:left-0 before:right-0 ${beforeIndicatorPosition} before:z-10 before:h-[2px] before:bg-(--sys-color-border-accent) before:content-['']`\n                : ''\n            } ${\n              showAfter\n                ? `after:absolute after:left-0 after:right-0 ${afterIndicatorPosition} after:z-10 after:h-[2px] after:bg-(--sys-color-border-accent) after:content-['']`\n                : ''\n            }`}\n          >\n            {renderItem(item, index, {\n              onDragHandleMouseDown: event => {\n                if (disabled) return;\n                if (dragContext && dragGroup && listId) {\n                  dragContext.startDrag(event, dragGroup, listId, index, itemKey);\n                } else startDrag(event, index);\n              },\n              selected: currentSelectedKey === itemKey,\n            })}\n          </div>\n        );\n      })}\n    </SList>\n  );\n}\n\nexport const SDraggableList = forwardRef(SDraggableListInner) as <T>(\n  props: SDraggableListProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> },\n) => ReactElement | null;\n","'use client';\n\nimport {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useId,\n  useMemo,\n  useState,\n  type HTMLAttributes,\n  type MouseEvent,\n  type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon } from '../SIcon';\n\nexport interface SExpansionItemRenderState {\n  expanded: boolean;\n  selected: boolean;\n  disabled: boolean;\n}\n\nexport type SExpansionItemRenderProp = (state: SExpansionItemRenderState) => ReactNode;\nexport type SExpansionItemInteraction = 'chevron';\nexport type SExpansionItemSupportingTextPosition = 'right' | 'bottom';\nexport type SExpansionItemSize = 'sm' | 'md';\n\nexport interface SExpansionItemProps extends Omit<\n  HTMLAttributes<HTMLDivElement>,\n  'onToggle' | 'title'\n> {\n  title: ReactNode;\n  /** 제목을 보조하는 텍스트 */\n  supportingText?: ReactNode;\n  /** 보조 텍스트 위치 */\n  supportingTextPosition?: SExpansionItemSupportingTextPosition;\n  /** 중첩 단계. Figma 기준 1~3단계 */\n  depth?: 1 | 2 | 3;\n  /** 타이틀 앞에 표시할 아이콘/콘텐츠 */\n  leading?: ReactNode | SExpansionItemRenderProp;\n  /** 타이틀 뒤에 표시할 태그/콘텐츠 */\n  trailing?: ReactNode;\n  /** body 내부 패딩 사용 여부 */\n  bodyPadding?: boolean;\n  /** 외곽 테두리 사용 여부 */\n  bordered?: boolean;\n  expanded?: boolean;\n  defaultExpanded?: boolean;\n  selected?: boolean;\n  /** hover/selected 상태에서 적용할 인터랙션 preset */\n  interaction?: SExpansionItemInteraction;\n  /** 아이템 왼쪽 accent stripe 표시 여부 */\n  accentStripe?: boolean;\n  dense?: boolean;\n  /** 타이포그래피 크기 */\n  size?: SExpansionItemSize;\n  disabled?: boolean;\n  onToggle?: (expanded: boolean, event: MouseEvent<HTMLButtonElement>) => void;\n}\n\ninterface SExpansionItemDescendantContextValue {\n  reportExpandedDescendant: (delta: number) => void;\n}\n\nconst SExpansionItemDescendantContext = createContext<SExpansionItemDescendantContextValue | null>(\n  null,\n);\n\nexport const SExpansionItem = forwardRef<HTMLDivElement, SExpansionItemProps>(\n  function SExpansionItem(\n    {\n      title,\n      supportingText,\n      supportingTextPosition = 'right',\n      depth = 1,\n      leading,\n      trailing,\n      bodyPadding = true,\n      bordered = false,\n      expanded,\n      defaultExpanded = false,\n      selected = false,\n      interaction,\n      accentStripe = false,\n      dense = false,\n      size = 'sm',\n      disabled = false,\n      onToggle,\n      className,\n      children,\n      ...rest\n    },\n    ref,\n  ) {\n    const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n    const [expandedDescendantCount, setExpandedDescendantCount] = useState(0);\n    const [hovered, setHovered] = useState(false);\n    const parentDescendantContext = useContext(SExpansionItemDescendantContext);\n    const isExpanded = expanded ?? internalExpanded;\n    const isSelected = isExpanded && (selected || expandedDescendantCount === 0);\n    const hasChevronInteraction = interaction === 'chevron';\n    const showInteractionChevron = hasChevronInteraction && !disabled && (isSelected || hovered);\n    const interactionChevronColor = isSelected\n      ? 'var(--sys-color-fg-brand)'\n      : 'var(--sys-color-fg-quaternary)';\n    const titleTypo =\n      size === 'sm'\n        ? isExpanded\n          ? 'typo-item-sm-selected'\n          : 'typo-item-sm-default'\n        : isExpanded\n          ? 'typo-item-md-selected'\n          : 'typo-item-md-default';\n    const reportExpandedDescendant = useCallback(\n      (delta: number) => {\n        setExpandedDescendantCount(current => Math.max(0, current + delta));\n        parentDescendantContext?.reportExpandedDescendant(delta);\n      },\n      [parentDescendantContext],\n    );\n    const descendantContextValue = useMemo<SExpansionItemDescendantContextValue>(\n      () => ({ reportExpandedDescendant }),\n      [reportExpandedDescendant],\n    );\n    const leadingNode =\n      typeof leading === 'function'\n        ? leading({ expanded: isExpanded, selected: isSelected, disabled })\n        : leading;\n    const hasSupportingText = supportingText != null && supportingText !== '';\n    const id = useId();\n\n    useEffect(() => {\n      if (!isExpanded) return;\n\n      parentDescendantContext?.reportExpandedDescendant(1);\n      return () => parentDescendantContext?.reportExpandedDescendant(-1);\n    }, [isExpanded, parentDescendantContext]);\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          'group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)',\n          !bordered && 'border-b border-(--cmp-listExpansionItem-border-default)',\n          // 보더 색은 시맨틱 토큰(border-default → hover strong → 펼침 accentLight)을 쓴다.\n          // TODO: expansionItem/bordered/radius 토큰 생성 후 rounded 고정값도 토큰으로 교체한다.\n          bordered &&\n            'rounded-[8px] border border-border-default hover:border-border-strong [&:has(>button:hover)]:border-border-strong',\n          bordered && isExpanded && '!border-border-accentLight',\n          className,\n        )}\n        {...rest}\n      >\n        {accentStripe && selected && !bordered && (\n          <span\n            aria-hidden=\"true\"\n            className=\"pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)\"\n          />\n        )}\n        <button\n          type=\"button\"\n          disabled={disabled}\n          aria-expanded={isExpanded}\n          aria-controls={id}\n          onMouseEnter={() => setHovered(true)}\n          onMouseLeave={() => setHovered(false)}\n          onClick={event => {\n            if (disabled) return;\n            const next = !isExpanded;\n            if (expanded === undefined) setInternalExpanded(next);\n            onToggle?.(next, event);\n          }}\n          className={cn(\n            'group/expansion-item-button flex w-full cursor-pointer items-center justify-between border-0 text-left text-(--cmp-listExpansionItem-title-text-default) focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent) disabled:cursor-not-allowed disabled:text-(--sys-color-disabled-text)',\n            titleTypo,\n            isExpanded && 'border-b border-(--cmp-listExpansionItem-title-border)',\n            hasChevronInteraction\n              ? 'hover:bg-(--sys-color-bg-neutralBright)'\n              : !isExpanded && 'hover:bg-(--cmp-listExpansionItem-title-bg-hover)',\n            hasSupportingText && supportingTextPosition === 'bottom'\n              ? dense\n                ? 'min-h-[52px] py-(--cmp-listExpansionItem-title-paddingY-dense)'\n                : 'min-h-[60px] py-(--cmp-listExpansionItem-title-paddingY-normal)'\n              : dense\n                ? 'h-[32px] py-(--cmp-listExpansionItem-title-paddingY-dense)'\n                : 'h-[40px] py-(--cmp-listExpansionItem-title-paddingY-normal)',\n            'gap-(--cmp-listExpansionItem-title-gap)',\n            'pr-(--cmp-listExpansionItem-title-paddingX)',\n            depth === 2 ? 'pl-[36px]' : depth === 3 ? 'pl-[56px]' : 'pl-[16px]',\n            isExpanded &&\n              cn(\n                'text-(--cmp-listExpansionItem-title-text-expanded)',\n                isSelected && 'bg-(--cmp-listExpansionItem-title-bg-expanded)',\n              ),\n          )}\n        >\n          {!leading && (\n            <span\n              className={cn(\n                'flex transition-transform duration-200 ease-out motion-reduce:transition-none',\n                isExpanded && 'rotate-180',\n              )}\n            >\n              <SIcon name=\"caretDown\" size={12} color=\"var(--sys-color-fg-quaternary)\" />\n            </span>\n          )}\n          {leadingNode}\n          <span\n            className={cn(\n              'min-w-0 flex-1',\n              supportingTextPosition === 'bottom'\n                ? 'flex flex-col'\n                : 'flex items-center gap-[8px] whitespace-nowrap',\n            )}\n          >\n            <span className=\"min-w-0 truncate\">{title}</span>\n            {hasSupportingText && (\n              <span\n                className={cn(\n                  'typo-body-sm-default min-w-0 truncate text-(--sys-color-fg-secondary)',\n                  supportingTextPosition === 'right' && 'flex-1',\n                )}\n              >\n                {supportingText}\n              </span>\n            )}\n          </span>\n          {trailing}\n          {showInteractionChevron && (\n            <SIcon name=\"chevronRight\" size={12} color={interactionChevronColor} />\n          )}\n        </button>\n        <SExpansionItemDescendantContext.Provider value={descendantContextValue}>\n          <div\n            id={id}\n            aria-hidden={!isExpanded}\n            className={cn(\n              'grid overflow-hidden bg-(--cmp-listExpansionItem-body-bg) transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none',\n              isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n            )}\n          >\n            <div className=\"min-h-0 overflow-hidden\">\n              <div className={cn(bodyPadding && 'p-(--cmp-listExpansionItem-body-padding)')}>\n                {children}\n              </div>\n            </div>\n          </div>\n        </SExpansionItemDescendantContext.Provider>\n      </div>\n    );\n  },\n);\n","'use client';\n\nimport { forwardRef, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SIcon } from '../SIcon';\n\nexport interface SListItemRenderState {\n  hovered: boolean;\n  disabled: boolean;\n}\n\nexport type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;\nexport type SListItemSlot = ReactNode | SListItemRenderProp;\nexport type SListItemInteraction = 'chevron';\nexport type SListItemSupportingTextPosition = 'right' | 'bottom';\nexport type SListItemSize = 'sm' | 'md';\n\nexport interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n  /** 리스트 아이템 제목 */\n  title: SListItemSlot;\n  /** 제목을 보조하는 텍스트 */\n  supportingText?: SListItemSlot;\n  /** 보조 텍스트 위치 */\n  supportingTextPosition?: SListItemSupportingTextPosition;\n  /** 중첩 단계. Figma 기준 1~3단계 */\n  depth?: 1 | 2 | 3;\n  /** 타이틀 앞에 표시할 아이콘/콘텐츠 */\n  leading?: SListItemSlot;\n  /** 타이틀 뒤에 표시할 태그/콘텐츠 */\n  trailing?: SListItemSlot;\n  /** 외곽 테두리 사용 여부 */\n  bordered?: boolean;\n  /** 선택 상태 여부 */\n  selected?: boolean;\n  /** 클릭 가능 상태 여부 */\n  clickable?: boolean;\n  /** hover/selected 상태에서 적용할 인터랙션 preset */\n  interaction?: SListItemInteraction;\n  /** 아이템 왼쪽 accent stripe 표시 여부 */\n  accentStripe?: boolean;\n  /** 조밀한 높이 사용 여부 */\n  dense?: boolean;\n  /** 타이포그래피 크기 */\n  size?: SListItemSize;\n  /** 비활성 상태 여부 */\n  disabled?: boolean;\n}\n\nconst SListItemImpl = forwardRef<HTMLDivElement, SListItemProps>(function SListItem(\n  {\n    title,\n    supportingText,\n    supportingTextPosition = 'right',\n    depth = 1,\n    leading,\n    trailing,\n    bordered = false,\n    selected = false,\n    clickable = true,\n    interaction,\n    accentStripe = false,\n    dense = false,\n    size = 'sm',\n    disabled = false,\n    className,\n    onMouseEnter,\n    onMouseLeave,\n    ...rest\n  },\n  ref,\n) {\n  const [hovered, setHovered] = useState(false);\n  const renderState = { hovered, disabled };\n  const titleNode = typeof title === 'function' ? title(renderState) : title;\n  const supportingTextNode =\n    typeof supportingText === 'function' ? supportingText(renderState) : supportingText;\n  const hasSupportingText = supportingTextNode != null && supportingTextNode !== '';\n  const leadingNode = typeof leading === 'function' ? leading(renderState) : leading;\n  const trailingNode = typeof trailing === 'function' ? trailing(renderState) : trailing;\n  const isInteractive = clickable && !disabled;\n  const isSelected = isInteractive && selected;\n  const hasChevronInteraction = interaction === 'chevron';\n  const showInteractionChevron = hasChevronInteraction && isInteractive && (isSelected || hovered);\n  const interactionChevronColor = isSelected\n    ? 'var(--sys-color-fg-brand)'\n    : 'var(--sys-color-fg-quaternary)';\n  const titleTypo =\n    size === 'sm'\n      ? isSelected\n        ? 'typo-item-sm-selected'\n        : 'typo-item-sm-default'\n      : isSelected\n        ? 'typo-item-md-selected'\n        : 'typo-item-md-default';\n\n  const handleMouseEnter = (event: MouseEvent<HTMLDivElement>) => {\n    if (isInteractive) setHovered(true);\n    onMouseEnter?.(event);\n  };\n\n  const handleMouseLeave = (event: MouseEvent<HTMLDivElement>) => {\n    setHovered(false);\n    onMouseLeave?.(event);\n  };\n\n  return (\n    <div\n      ref={ref}\n      aria-disabled={disabled || undefined}\n      onMouseEnter={handleMouseEnter}\n      onMouseLeave={handleMouseLeave}\n      className={cn(\n        'group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-(--cmp-listItem-text-default)',\n        titleTypo,\n        disabled\n          ? 'pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)'\n          : isSelected\n            ? cn(\n                'cursor-pointer text-(--cmp-listItem-text-selected)',\n                'bg-(--cmp-listItem-bg-selected)',\n              )\n            : isInteractive\n              ? cn(\n                  'cursor-pointer',\n                  hasChevronInteraction\n                    ? 'hover:bg-(--sys-color-bg-neutralBright)'\n                    : 'hover:bg-(--cmp-listItem-bg-hover)',\n                )\n              : 'cursor-default',\n        hasSupportingText && supportingTextPosition === 'bottom'\n          ? dense\n            ? 'min-h-[52px] py-(--cmp-listItem-paddingY-dense)'\n            : 'min-h-[60px] py-(--cmp-listItem-paddingY-normal)'\n          : dense\n            ? 'h-[32px] py-(--cmp-listItem-paddingY-dense)'\n            : 'h-[40px] py-(--cmp-listItem-paddingY-normal)',\n        'gap-(--cmp-listItem-gap)',\n        'pr-(--cmp-listItem-paddingX)',\n        depth === 2 ? 'pl-[36px]' : depth === 3 ? 'pl-[56px]' : 'pl-[16px]',\n        bordered\n          ? cn(\n              'overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default)',\n              isSelected\n                ? 'border-(--cmp-listItem-bordered-border-selected)'\n                : isInteractive && 'hover:border-(--cmp-listItem-bordered-border-hover)',\n            )\n          : 'border-b border-(--cmp-listItem-border-default)',\n        className,\n      )}\n      {...rest}\n    >\n      {accentStripe && isSelected && !bordered && (\n        <span\n          aria-hidden=\"true\"\n          className=\"pointer-events-none absolute bottom-[-1px] left-0 top-0 w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)\"\n        />\n      )}\n      {leadingNode}\n      <span\n        className={cn(\n          'min-w-0 flex-1',\n          supportingTextPosition === 'bottom'\n            ? 'flex flex-col'\n            : 'flex items-center gap-[8px] whitespace-nowrap',\n        )}\n      >\n        <span className=\"min-w-0 truncate\">{titleNode}</span>\n        {hasSupportingText && (\n          <span\n            className={cn(\n              'typo-body-sm-default min-w-0 truncate text-(--sys-color-fg-secondary)',\n              supportingTextPosition === 'right' && 'flex-1',\n            )}\n          >\n            {supportingTextNode}\n          </span>\n        )}\n      </span>\n      {trailingNode}\n      {showInteractionChevron && (\n        <SIcon name=\"chevronRight\" size={12} color={interactionChevronColor} />\n      )}\n    </div>\n  );\n});\n\nexport const SListItem = withDisplayName(SListItemImpl, 'SListItem');\n","'use client';\n\nimport {\n  Children,\n  cloneElement,\n  forwardRef,\n  isValidElement,\n  useState,\n  type ReactElement,\n  type ReactNode,\n} from 'react';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SList, type SListProps } from '../SList';\nimport { SExpansionItem, type SExpansionItemProps } from '../SExpansionItem';\nimport { SListItem, type SListItemProps } from '../SListItem';\n\ntype AccordionOpenKeys = Partial<Record<NonNullable<SExpansionItemProps['depth']>, string>>;\ntype SelectedKeys = Partial<Record<NonNullable<SListItemProps['depth']>, string>>;\n\nexport type SExpansionListProps = SListProps;\n\nfunction isExpansionItemElement(node: ReactNode): node is ReactElement<SExpansionItemProps> {\n  return isValidElement(node) && node.type === SExpansionItem;\n}\n\nfunction isListItemElement(node: ReactNode): node is ReactElement<SListItemProps> {\n  return isValidElement(node) && node.type === SListItem;\n}\n\nfunction getInitialOpenKeys(children: ReactNode): AccordionOpenKeys {\n  const openKeys: AccordionOpenKeys = {};\n  Children.forEach(children, (child, index) => {\n    if (!isExpansionItemElement(child)) return;\n    const depth = child.props.depth ?? 1;\n    if (openKeys[depth] != null) return;\n    if (child.props.expanded === true || child.props.defaultExpanded === true) {\n      openKeys[depth] = String(child.key ?? index);\n    }\n  });\n  return openKeys;\n}\n\nfunction getInitialSelectedKeys(children: ReactNode): SelectedKeys {\n  const selectedKeys: SelectedKeys = {};\n  Children.forEach(children, (child, index) => {\n    if (!isListItemElement(child) || !child.props.selected) return;\n    const depth = child.props.depth ?? 1;\n    if (selectedKeys[depth] == null) selectedKeys[depth] = String(child.key ?? index);\n  });\n  return selectedKeys;\n}\n\nconst SExpansionListImpl = forwardRef<HTMLDivElement, SExpansionListProps>(function SExpansionList(\n  { children, ...rest },\n  ref,\n) {\n  const [openKeys, setOpenKeys] = useState<AccordionOpenKeys>(() => getInitialOpenKeys(children));\n  const [selectedKeys, setSelectedKeys] = useState<SelectedKeys>(() =>\n    getInitialSelectedKeys(children),\n  );\n\n  const listChildren = Children.map(children, (child, index) => {\n    if (isListItemElement(child)) {\n      const depth = child.props.depth ?? 1;\n      const itemKey = String(child.key ?? index);\n      return cloneElement(child, {\n        selected: selectedKeys[depth] === itemKey,\n        onClick: event => {\n          setSelectedKeys(current => ({ ...current, [depth]: itemKey }));\n          child.props.onClick?.(event);\n        },\n      });\n    }\n\n    if (!isExpansionItemElement(child)) return child;\n\n    const depth = child.props.depth ?? 1;\n    const itemKey = String(child.key ?? index);\n    return cloneElement(child, {\n      expanded: openKeys[depth] === itemKey,\n      selected: undefined,\n      onToggle: (next, event) => {\n        setOpenKeys(current => ({\n          ...current,\n          [depth]: next ? itemKey : current[depth] === itemKey ? undefined : current[depth],\n        }));\n        child.props.onToggle?.(next, event);\n      },\n    });\n  });\n\n  return (\n    <SList ref={ref} {...rest}>\n      {listChildren}\n    </SList>\n  );\n});\n\nexport const SExpansionList = withDisplayName(SExpansionListImpl, 'SExpansionList');\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport * as RCheckbox from '@radix-ui/react-checkbox';\nimport { cn } from '../../lib/cn';\nimport { SIcon } from '../SIcon';\n\nexport type SCheckboxValue = boolean | unknown[] | null;\n\nexport interface SCheckboxProps {\n  /** 선택 상태. boolean(단일) / 배열(그룹) / null(indeterminate) */\n  value?: SCheckboxValue;\n  /** 배열(그룹) 모드에서 이 체크박스의 값 */\n  val?: unknown;\n  /** 값 변경 (sdUpdate) */\n  onValueChange?: (value: boolean | unknown[]) => void;\n  /** 라벨 */\n  label?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 어두운 배경용 흰색 스타일 */\n  inverse?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SCheckbox — sd-checkbox 포팅 (Radix SCheckbox).\n * boolean(단일)·배열(그룹, val 필요)·null(indeterminate) 지원, inverse 스타일.\n */\nexport function SCheckbox({\n  value = false,\n  val,\n  onValueChange,\n  label = '',\n  disabled = false,\n  inverse = false,\n  className,\n  style,\n}: SCheckboxProps) {\n  const state: boolean | 'indeterminate' =\n    value === null\n      ? 'indeterminate'\n      : typeof value === 'boolean'\n        ? value\n        : Array.isArray(value)\n          ? value.includes(val)\n          : false;\n\n  const isChecked = state === true || state === 'indeterminate';\n\n  const handleChange = () => {\n    if (disabled || !onValueChange) return;\n    if (Array.isArray(value)) {\n      const set = new Set(value);\n      if (set.has(val)) set.delete(val);\n      else set.add(val);\n      onValueChange(Array.from(set));\n    } else if (typeof value === 'boolean') {\n      onValueChange(!value);\n    } else {\n      onValueChange(false); // null → false (원본 동작)\n    }\n  };\n\n  // 색상은 전부 토큰(--cmp-checkbox-*) 참조 → token.json 변경이 전역 반영\n  const boxBg = disabled\n    ? 'var(--cmp-checkbox-bg-disabled)'\n    : inverse\n      ? 'transparent'\n      : isChecked\n        ? 'var(--cmp-checkbox-checked-bg-default)'\n        : 'var(--cmp-checkbox-unchecked-bg-default)';\n  const boxBorder = disabled\n    ? 'var(--cmp-checkbox-border-disabled)'\n    : inverse\n      ? 'var(--cmp-checkbox-checked-border-inverse)'\n      : isChecked\n        ? 'var(--cmp-checkbox-checked-bg-default)'\n        : 'var(--cmp-checkbox-unchecked-border-default)';\n  const iconColor = disabled\n    ? 'var(--cmp-checkbox-checked-icon-disabled)'\n    : 'var(--cmp-checkbox-checked-icon-default)';\n  const labelColor = disabled\n    ? 'var(--cmp-checkbox-label-disabled)'\n    : inverse\n      ? 'var(--cmp-checkbox-label-inverse)'\n      : 'var(--cmp-checkbox-label-default)';\n\n  return (\n    <label\n      className={cn(\n        'inline-flex items-center gap-[var(--cmp-checkbox-gap)] align-middle',\n        disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        className,\n      )}\n      style={style}\n    >\n      <RCheckbox.Root\n        checked={state}\n        disabled={disabled}\n        onCheckedChange={handleChange}\n        className={cn(\n          'flex h-[var(--cmp-checkbox-size)] w-[var(--cmp-checkbox-size)] items-center justify-center rounded-[var(--cmp-checkbox-radius)] border-[length:var(--cmp-checkbox-borderWidth)] border-solid bg-[var(--cb-bg)] border-[color:var(--cb-border)] outline-none',\n          disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n          !disabled &&\n            !isChecked &&\n            !inverse &&\n            'hover:border-[color:var(--cmp-checkbox-unchecked-border-hover)] hover:bg-[var(--cmp-checkbox-unchecked-bg-hover)]',\n        )}\n        style={{ '--cb-bg': boxBg, '--cb-border': boxBorder } as CSSProperties}\n      >\n        <RCheckbox.Indicator className=\"flex items-center justify-center leading-none\">\n          <SIcon\n            name={state === 'indeterminate' ? 'checkboxIndeterminate' : 'checkboxCheck'}\n            size={12}\n            color={iconColor}\n          />\n        </RCheckbox.Indicator>\n      </RCheckbox.Root>\n      {label && (\n        // 고스트(500) 텍스트로 너비를 고정 → 두께 400↔500 전환 시 레이아웃이 밀리지 않음\n        <span className=\"grid text-nowrap text-[12px] leading-[20px]\" style={{ color: labelColor }}>\n          <span aria-hidden className=\"invisible font-medium\" style={{ gridArea: '1 / 1' }}>\n            {label}\n          </span>\n          <span style={{ gridArea: '1 / 1', fontWeight: isChecked ? 500 : 400 }}>{label}</span>\n        </span>\n      )}\n    </label>\n  );\n}\n","/**\n * Radix Floating(SPopover/STooltip/RTooltip) Content 의 placement 방향별 슬라이드+페이드.\n * Radix 가 붙이는 data-side(실제 렌더 방향)·data-state 에 맞춰 열림/닫힘 애니메이션을 적용한다.\n * (sd-floating-portal 의 sd-floating-slide-* 포팅 — 키프레임은 theme.css `--animate-floating-*`)\n *\n * 예: side=top 이면 아래(4px)에서 위로 올라오며 나타나고, 닫힐 때 다시 내려가며 사라진다.\n *\n * @radix-ui/react-popover · react-dropdown-menu 의 data-state 는 open/closed 지만,\n * @radix-ui/react-tooltip 은 open 대신 delayed-open/instant-open 을 쓴다 — 두 케이스 모두 커버한다.\n * Tailwind JIT는 소스에 리터럴로 등장하는 클래스명만 스캔하므로 템플릿으로 조합하지 않고 전부 나열한다.\n */\nexport const FLOATING_SLIDE_ANIM = [\n  'data-[state=open]:data-[side=top]:animate-floating-in-top',\n  'data-[state=delayed-open]:data-[side=top]:animate-floating-in-top',\n  'data-[state=instant-open]:data-[side=top]:animate-floating-in-top',\n  'data-[state=closed]:data-[side=top]:animate-floating-out-top',\n  'data-[state=open]:data-[side=bottom]:animate-floating-in-bottom',\n  'data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom',\n  'data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom',\n  'data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom',\n  'data-[state=open]:data-[side=left]:animate-floating-in-left',\n  'data-[state=delayed-open]:data-[side=left]:animate-floating-in-left',\n  'data-[state=instant-open]:data-[side=left]:animate-floating-in-left',\n  'data-[state=closed]:data-[side=left]:animate-floating-out-left',\n  'data-[state=open]:data-[side=right]:animate-floating-in-right',\n  'data-[state=delayed-open]:data-[side=right]:animate-floating-in-right',\n  'data-[state=instant-open]:data-[side=right]:animate-floating-in-right',\n  'data-[state=closed]:data-[side=right]:animate-floating-out-right',\n].join(' ');\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Floating 컴포넌트(STooltip/SPopover/SSelect listbox/SDropdownButton/SDatePicker 등)가\n * 자신의 Portal 을 어디로 렌더할지 결정하는 컨텍스트.\n *\n * 기본값(null)이면 각 컴포넌트는 body 로 portal 한다.\n * SModalContainer 는 모달이 열려있는 동안 이 값을 해당 모달 Content 자손의 전용 노드로\n * 채워서, 모달 안에서 열린 floating 이 같은 모달의 딤 뒤에 가려지지 않고 위로 뜨게 한다.\n * 반대로 모달 밖(베이스 화면)에서 열린 floating 은 여전히 body(z-50)로 나가므로,\n * 나중에 뜬 모달이 정상적으로 그 위를 덮는다. (소속에 따라 상대적으로 결정)\n */\nconst PortalContainerContext = createContext<HTMLElement | null>(null);\nconst InsideModalContext = createContext(false);\n\nexport const PortalContainerProvider = PortalContainerContext.Provider;\nexport const InsideModalProvider = InsideModalContext.Provider;\n\n/**\n * 현재 소속된 Portal 컨테이너를 반환한다.\n * Radix `*.Portal` 의 `container`, Ariakit 의 `portalElement` 에 그대로 넘기면 되며,\n * 컨테이너가 없을 때(모달 밖)는 `undefined` 를 반환해 각 라이브러리 기본값(body)을 쓴다.\n */\nexport function usePortalContainer(): HTMLElement | undefined {\n  return useContext(PortalContainerContext) ?? undefined;\n}\n\n/**\n * 현재 floating 이 모달 내부 컨텍스트에서 렌더링되는지 반환한다.\n * portal target ref 가 아직 준비되지 않은 첫 렌더에서도 true를 유지해\n * 모달 내부 전용 우회 로직이 깜빡이지 않도록 한다.\n */\nexport function useInsideModal(): boolean {\n  return useContext(InsideModalContext);\n}\n","export const TAG_SHAPES = ['square', 'pill'] as const;\nexport const TAG_SIZES = ['xs', 'sm', 'md'] as const;\nexport const TAG_COLORS = [\n  'grey',\n  'red',\n  'orange',\n  'yellow',\n  'green',\n  'blue',\n  'darkblue',\n  'indigo',\n] as const;\n\nexport type STagShape = (typeof TAG_SHAPES)[number];\nexport type STagSize = (typeof TAG_SIZES)[number];\nexport type STagColor = (typeof TAG_COLORS)[number];\n\n/** 사이즈별 레이아웃/타이포 (token.json component.tag 기준) */\nexport const TAG_SIZE_CONFIG: Record<\n  STagSize,\n  {\n    height: number;\n    paddingX: number;\n    gap: number;\n    radius: number;\n    iconSize: number;\n    fontSize: number;\n    fontWeight: number;\n    lineHeight: number;\n  }\n> = {\n  xs: {\n    height: 20,\n    paddingX: 8,\n    gap: 4,\n    radius: 6,\n    iconSize: 12,\n    fontSize: 11,\n    fontWeight: 500,\n    lineHeight: 18,\n  },\n  sm: {\n    height: 24,\n    paddingX: 8,\n    gap: 4,\n    radius: 6,\n    iconSize: 16,\n    fontSize: 12,\n    fontWeight: 700,\n    lineHeight: 20,\n  },\n  md: {\n    height: 28,\n    paddingX: 12,\n    gap: 6,\n    radius: 8,\n    iconSize: 16,\n    fontSize: 14,\n    fontWeight: 700,\n    lineHeight: 24,\n  },\n};\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { TAG_SIZE_CONFIG, type STagShape, type STagSize, type STagColor } from './tag.config';\n\nexport interface STagProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {\n  /** 모양 */\n  shape?: STagShape;\n  /** 크기 */\n  size?: STagSize;\n  /** 색상 */\n  color?: STagColor;\n  /** 레이블 텍스트 */\n  label?: string;\n  /** 아이콘명 */\n  icon?: SIconName;\n  /** 아이콘을 레이블 왼쪽에 배치 */\n  iconLeft?: boolean;\n  /** 태그 너비 (숫자면 px, 문자열이면 그대로 적용). 미지정 시 콘텐츠 크기 */\n  width?: string | number;\n}\n\n/**\n * STag — sd-tag 포팅.\n * Stencil의 `name`(예: square_sm_grey) 프리셋을 shape/size/color 세 prop으로 분리.\n * 색상은 컴포넌트 토큰 `--cmp-tag-<color>-{bg,content}` 참조.\n */\nexport const STag = forwardRef<HTMLSpanElement, STagProps>(function STag(\n  {\n    shape = 'square',\n    size = 'sm',\n    color = 'grey',\n    label = '',\n    icon,\n    iconLeft = true,\n    width,\n    className,\n    style,\n    ...rest\n  },\n  ref,\n) {\n  const s = TAG_SIZE_CONFIG[size];\n  const contentColor = `var(--cmp-tag-${color}-content)`;\n  const iconNode = icon ? <SIcon name={icon} size={s.iconSize} color={contentColor} /> : null;\n  const resolvedWidth = typeof width === 'number' ? `${width}px` : width;\n\n  return (\n    <span\n      ref={ref}\n      aria-label={label || 'tag'}\n      className={cn(\n        'box-border inline-flex w-fit select-none items-center justify-center whitespace-nowrap',\n        className,\n      )}\n      style={{\n        minHeight: s.height,\n        padding: `0 ${s.paddingX}px`,\n        gap: s.gap,\n        borderRadius: shape === 'pill' ? 999 : s.radius,\n        fontSize: s.fontSize,\n        fontWeight: s.fontWeight,\n        lineHeight: `${s.lineHeight}px`,\n        background: `var(--cmp-tag-${color}-bg)`,\n        color: contentColor,\n        ...(resolvedWidth != null ? { width: resolvedWidth } : {}),\n        ...style,\n      }}\n      {...rest}\n    >\n      {icon && iconLeft && iconNode}\n      {label && <span className=\"inline-flex min-w-0 items-center justify-center\">{label}</span>}\n      {icon && !iconLeft && iconNode}\n    </span>\n  );\n});\n","'use client';\n\nimport { useRef, useState, type CSSProperties, type MouseEvent } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { STag } from '../STag';\n\nexport type SGhostButtonSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg';\nexport type SGhostButtonIntent = 'default' | 'danger' | 'action' | 'subAction' | 'inverse';\n\n// 원본 sd-ghost-button.config: size/icon/radius (component.ghostButton 토큰과 동일)\nconst SIZE: Record<SGhostButtonSize, { icon: number; radius: 'sm' | 'md' }> = {\n  xxs: { icon: 12, radius: 'sm' },\n  xs: { icon: 16, radius: 'sm' },\n  sm: { icon: 20, radius: 'sm' },\n  md: { icon: 24, radius: 'md' },\n  lg: { icon: 32, radius: 'md' },\n};\n\n/** mouseleave 후 닫힘까지의 유예 (STooltip HIDE_DELAY_MS와 동일) */\nconst TOOLTIP_HIDE_DELAY_MS = 100;\n\nexport interface SGhostButtonProps {\n  /** 표시할 아이콘명 (필수) */\n  icon: SIconName;\n  /** 버튼 크기 */\n  size?: SGhostButtonSize;\n  /** 색상 의도 */\n  intent?: SGhostButtonIntent;\n  /** 스크린리더용 접근성 레이블 */\n  ariaLabel?: string;\n  /** 토글 버튼일 때 눌림 상태 (aria-pressed). 미지정 시 속성 자체를 내보내지 않는다. */\n  ariaPressed?: boolean;\n  /** disclosure 버튼일 때 펼침 상태 (aria-expanded) */\n  ariaExpanded?: boolean;\n  /** 호버 시 표시할 툴팁 텍스트 */\n  tooltipText?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 클릭 (sdClick) */\n  onClick?: (e: MouseEvent<HTMLButtonElement>) => void;\n  /** tooltip anchor wrapper 클래스. tooltipText가 있을 때 위치 조정용으로 사용합니다. */\n  anchorClassName?: string;\n  /** tooltip anchor wrapper 스타일. tooltipText가 있을 때 위치 조정용으로 사용합니다. */\n  anchorStyle?: CSSProperties;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SGhostButton — sd-ghost-button 포팅. 아이콘 전용 투명 버튼.\n * hover 시 intent 색 오버레이(5%), focus-visible 링, 옵션 툴팁(회색 STag).\n */\nexport function SGhostButton({\n  icon,\n  size = 'sm',\n  intent = 'default',\n  ariaLabel = '',\n  ariaPressed,\n  ariaExpanded,\n  tooltipText,\n  disabled = false,\n  onClick,\n  anchorClassName,\n  anchorStyle,\n  className,\n  style,\n}: SGhostButtonProps) {\n  const portalContainer = usePortalContainer();\n  const [open, setOpen] = useState(false);\n  const hideTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const cancelHide = () => {\n    if (hideTimer.current) {\n      clearTimeout(hideTimer.current);\n      hideTimer.current = undefined;\n    }\n  };\n  const openNow = () => {\n    cancelHide();\n    setOpen(true);\n  };\n  // mouseleave 후 100ms 유예 뒤 닫힘 (본문 hover 시 취소됨)\n  const startHide = () => {\n    cancelHide();\n    hideTimer.current = setTimeout(() => setOpen(false), TOOLTIP_HIDE_DELAY_MS);\n  };\n  const s = SIZE[size];\n  const contentColor = disabled\n    ? intent === 'inverse'\n      ? 'var(--cmp-ghostButton-inverse-disabled)'\n      : 'var(--cmp-ghostButton-icon-disabled)'\n    : `var(--cmp-ghostButton-${intent}-content)`;\n  const text = (tooltipText ?? '').trim();\n  const hasTooltip = text !== '';\n\n  const btn = (\n    <button\n      type=\"button\"\n      disabled={disabled}\n      aria-disabled={disabled ? 'true' : undefined}\n      aria-label={ariaLabel.trim() || undefined}\n      aria-pressed={ariaPressed}\n      aria-expanded={ariaExpanded}\n      tabIndex={disabled ? -1 : undefined}\n      onClick={e => {\n        if (disabled) {\n          e.preventDefault();\n          return;\n        }\n        onClick?.(e);\n      }}\n      className={cn(\n        'group/ghost-button relative box-border inline-flex items-center justify-center border-none bg-transparent p-0 transition-shadow',\n        disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        'focus-visible:outline-none focus-visible:shadow-[0_0_0_2px_var(--cmp-ghostButton-action-hover-bg)]',\n        className,\n      )}\n      style={{\n        width: `var(--cmp-ghostButton-${size}-size)`,\n        height: `var(--cmp-ghostButton-${size}-size)`,\n        borderRadius: `var(--cmp-ghostButton-radius-${s.radius})`,\n        ...style,\n      }}\n    >\n      {/* hover 오버레이 (::before 대응) — 비활성 아닐 때만 */}\n      {!disabled && (\n        <span\n          aria-hidden\n          className=\"pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/ghost-button:opacity-5\"\n          style={{ background: `var(--cmp-ghostButton-${intent}-hover-bg)` }}\n        />\n      )}\n      <SIcon name={icon} size={s.icon} color={contentColor} />\n    </button>\n  );\n\n  if (!hasTooltip) return btn;\n\n  return (\n    <RPopover.Root open={open} onOpenChange={setOpen}>\n      {/* hover: 즉시 열림 + mouseleave 100ms 유예 (STooltip 인터랙션 미러). 클릭 토글 방지 위해 Anchor 사용 */}\n      <RPopover.Anchor asChild>\n        <span\n          className={cn('inline-flex', anchorClassName)}\n          style={anchorStyle}\n          onMouseEnter={openNow}\n          onMouseLeave={startHide}\n          onFocus={openNow}\n          onBlur={startHide}\n        >\n          {btn}\n        </span>\n      </RPopover.Anchor>\n      <RPopover.Portal container={portalContainer}>\n        <RPopover.Content\n          side=\"top\"\n          sideOffset={4}\n          className={cn('z-50', FLOATING_SLIDE_ANIM)}\n          aria-hidden\n          // 포커스 가로채지 않음 (툴팁은 포커스 이동 없음)\n          onOpenAutoFocus={e => e.preventDefault()}\n          // hover 브릿지: 태그 위로 마우스 이동 시 닫힘 취소, 벗어나면 유예 후 닫힘\n          onMouseEnter={cancelHide}\n          onMouseLeave={startHide}\n        >\n          <STag shape=\"square\" size=\"xs\" color=\"grey\" label={text} />\n        </RPopover.Content>\n      </RPopover.Portal>\n    </RPopover.Root>\n  );\n}\n","'use client';\n\nimport {\n  Fragment,\n  forwardRef,\n  useMemo,\n  useState,\n  type HTMLAttributes,\n  type MouseEvent,\n  type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SCheckbox } from '../SCheckbox';\nimport { SGhostButton } from '../SGhostButton';\n\nexport interface STreeNode {\n  /** 노드 고유 ID */\n  id: string;\n  /** 노드 라벨 */\n  label: ReactNode;\n  /** 하위 노드 */\n  children?: STreeNode[];\n  /** 비활성 상태 */\n  disabled?: boolean;\n}\n\nexport interface STreeItemRenderState {\n  node: STreeNode;\n  depth: number;\n  expanded: boolean;\n  selected: boolean;\n  indeterminate: boolean;\n  disabled: boolean;\n  hasChildren: boolean;\n}\n\nexport interface STreeItemProps extends Omit<\n  HTMLAttributes<HTMLDivElement>,\n  'children' | 'title' | 'onSelect' | 'onToggle'\n> {\n  /** 렌더링할 노드 */\n  node: STreeNode;\n  /** 중첩 단계 */\n  depth?: number;\n  /** 마지막 자식 여부 */\n  isLast?: boolean;\n  /** 상위 depth 별 마지막 자식 여부 */\n  ancestorLast?: boolean[];\n  /** 펼침 상태 */\n  expanded?: boolean;\n  /** 선택 상태 */\n  selected?: boolean;\n  /** depth 연결선 표시 여부 */\n  guideline?: boolean;\n  /** 아이템 하단 border 표시 여부 */\n  border?: boolean;\n  /** 일부 선택 상태 */\n  indeterminate?: boolean;\n  /** 체크박스 표시 여부 */\n  selectable?: boolean;\n  /** 사용자 지정 leading 콘텐츠 */\n  leading?: ReactNode | ((state: STreeItemRenderState) => ReactNode);\n  /** 사용자 지정 trailing 콘텐츠 */\n  trailing?: ReactNode | ((state: STreeItemRenderState) => ReactNode);\n  /** 아이템 확장/축소 토글 */\n  onToggle?: (node: STreeNode, event?: MouseEvent<HTMLElement>) => void;\n  /** 선택 토글 */\n  onTreeSelect?: (node: STreeNode, event?: MouseEvent<HTMLElement>) => void;\n}\n\nexport interface STreeProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n  /** 트리 노드 목록 */\n  items: STreeNode[];\n  /** 선택된 노드 ID 목록 */\n  value?: string[];\n  /** 비제어 선택 초기값 */\n  defaultValue?: string[];\n  /** 펼쳐진 노드 ID 목록 */\n  expandedIds?: string[];\n  /** 비제어 펼침 초기값 */\n  defaultExpandedIds?: string[];\n  /** 체크박스 표시 여부 */\n  selectable?: boolean;\n  /** depth 연결선 표시 여부 */\n  guideline?: boolean;\n  /** 아이템 하단 border 표시 여부 */\n  border?: boolean;\n  /** 부모 선택 시 하위 노드까지 함께 토글 */\n  cascadeSelection?: boolean;\n  /** 사용자 지정 leading 콘텐츠 */\n  leading?: ReactNode | ((state: STreeItemRenderState) => ReactNode);\n  /** 사용자 지정 trailing 콘텐츠 */\n  trailing?: ReactNode | ((state: STreeItemRenderState) => ReactNode);\n  /** 선택 변경 */\n  onValueChange?: (value: string[], node: STreeNode) => void;\n  /** 펼침 변경 */\n  onExpandedChange?: (expandedIds: string[], node: STreeNode) => void;\n}\n\nfunction collectIds(nodes: STreeNode[]): string[] {\n  return nodes.flatMap(node => [node.id, ...collectIds(node.children ?? [])]);\n}\n\nfunction collectSelectableIds(node: STreeNode): string[] {\n  if (node.disabled) return [];\n  return [node.id, ...(node.children ?? []).flatMap(collectSelectableIds)];\n}\n\nfunction toSelectedSet(value: string[] | undefined): Set<string> {\n  return new Set(value ?? []);\n}\n\ninterface TreeSelectionState {\n  selected: boolean;\n  indeterminate: boolean;\n}\n\nfunction getSelectionState(node: STreeNode, selectedSet: Set<string>): TreeSelectionState {\n  if (selectedSet.has(node.id)) {\n    return { selected: true, indeterminate: false };\n  }\n\n  const selectableChildren = (node.children ?? []).filter(\n    child => collectSelectableIds(child).length > 0,\n  );\n\n  if (selectableChildren.length === 0) {\n    return { selected: false, indeterminate: false };\n  }\n\n  const childStates: TreeSelectionState[] = selectableChildren.map(child =>\n    getSelectionState(child, selectedSet),\n  );\n  const selectedCount = childStates.filter(state => state.selected).length;\n\n  return {\n    selected: selectedCount === childStates.length,\n    indeterminate:\n      childStates.some(state => state.indeterminate) ||\n      (selectedCount > 0 && selectedCount < childStates.length),\n  };\n}\n\nfunction TreeConnector({\n  guideline,\n  depth,\n  hasChildren,\n  isLast,\n  ancestorLast,\n}: {\n  guideline: boolean;\n  depth: number;\n  hasChildren: boolean;\n  isLast: boolean;\n  ancestorLast: boolean[];\n}) {\n  if (depth <= 1) return null;\n  const ancestorConnectors = ancestorLast.slice(0, -1);\n\n  return (\n    <span aria-hidden=\"true\" className=\"flex self-stretch\">\n      {ancestorConnectors.map((last, index) => (\n        <span\n          key={index}\n          className=\"relative block w-[28px] shrink-0\"\n          data-tree-connector-parent={last ? undefined : 'through'}\n        >\n          {guideline && !last && (\n            <span className=\"absolute bottom-0 left-[6px] top-[-1px] w-px bg-(--cmp-tree-connector-line-color)\" />\n          )}\n        </span>\n      ))}\n      <span className=\"relative block w-[20px] shrink-0\">\n        {guideline && !isLast && (\n          <span className=\"absolute bottom-0 left-[6px] top-[-1px] w-px bg-(--cmp-tree-connector-line-color)\" />\n        )}\n        {guideline && (\n          <>\n            <span className=\"absolute left-[6px] top-[-1px] h-[17px] w-px bg-(--cmp-tree-connector-line-color)\" />\n            <span\n              data-tree-connector-branch={hasChildren ? 'parent' : 'leaf'}\n              className={cn(\n                'absolute left-[6px] top-[15px] h-px bg-(--cmp-tree-connector-line-color)',\n                hasChildren ? 'w-[14px]' : 'w-[calc(14px+var(--cmp-tree-item-arrow-icon))]',\n              )}\n            />\n          </>\n        )}\n      </span>\n    </span>\n  );\n}\n\nconst STreeItemImpl = forwardRef<HTMLDivElement, STreeItemProps>(function STreeItem(\n  {\n    node,\n    depth = 1,\n    isLast = true,\n    ancestorLast = [],\n    expanded = false,\n    selected = false,\n    guideline = true,\n    border = true,\n    indeterminate = false,\n    selectable = true,\n    leading,\n    trailing,\n    onToggle,\n    onTreeSelect,\n    className,\n    ...rest\n  },\n  ref,\n) {\n  const hasChildren = Boolean(node.children?.length);\n  const renderState = {\n    node,\n    depth,\n    expanded,\n    selected,\n    indeterminate,\n    disabled: Boolean(node.disabled),\n    hasChildren,\n  };\n  const leadingNode = typeof leading === 'function' ? leading(renderState) : leading;\n  const trailingNode = typeof trailing === 'function' ? trailing(renderState) : trailing;\n  const checkboxValue = indeterminate ? null : selected;\n\n  const handleSelect = (event?: MouseEvent<HTMLElement>) => {\n    if (node.disabled) return;\n    onTreeSelect?.(node, event);\n  };\n\n  const handleRowClick = (event: MouseEvent<HTMLDivElement>) => {\n    if (node.disabled) return;\n    if (hasChildren) onToggle?.(node, event);\n  };\n\n  return (\n    <div\n      ref={ref}\n      role=\"treeitem\"\n      aria-level={depth}\n      aria-expanded={hasChildren ? expanded : undefined}\n      aria-selected={selectable ? selected : undefined}\n      aria-disabled={node.disabled || undefined}\n      onClick={handleRowClick}\n      className={cn(\n        'group/tree-item flex min-h-[32px] w-full items-center gap-(--cmp-tree-item-rowGap) bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left',\n        border && 'border-b border-(--cmp-tree-item-border-default)',\n        !node.disabled && 'hover:bg-(--cmp-tree-item-bg-hover)',\n        node.disabled && 'cursor-not-allowed opacity-60',\n        !node.disabled && hasChildren && 'cursor-pointer',\n        className,\n      )}\n      {...rest}\n    >\n      <TreeConnector\n        guideline={guideline}\n        depth={depth}\n        hasChildren={hasChildren}\n        isLast={isLast}\n        ancestorLast={ancestorLast}\n      />\n      <div className=\"flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap) py-(--cmp-tree-item-paddingY)\">\n        {hasChildren ? (\n          <SGhostButton\n            icon={expanded ? 'caretDown' : 'caretRight'}\n            size=\"xxs\"\n            ariaLabel={expanded ? 'collapse tree item' : 'expand tree item'}\n            ariaExpanded={expanded}\n            disabled={node.disabled}\n            onClick={event => {\n              event.stopPropagation();\n              if (node.disabled) return;\n              onToggle?.(node, event);\n            }}\n          />\n        ) : (\n          <span className=\"size-(--cmp-tree-item-arrow-icon) shrink-0\" aria-hidden=\"true\" />\n        )}\n        {leadingNode}\n        {selectable && (\n          <span\n            onClick={event => event.stopPropagation()}\n            className=\"flex shrink-0\"\n            aria-hidden={node.disabled ? 'true' : undefined}\n          >\n            <SCheckbox\n              value={checkboxValue}\n              disabled={node.disabled}\n              onValueChange={() => handleSelect()}\n            />\n          </span>\n        )}\n        <span\n          className={cn(\n            'min-w-0 flex-1 text-[14px] leading-[24px]',\n            selected || indeterminate\n              ? 'font-bold text-(--cmp-tree-item-text-selected)'\n              : 'font-medium text-(--cmp-tree-item-text-default)',\n          )}\n        >\n          <span\n            onClick={event => {\n              if (!selectable) return;\n              event.stopPropagation();\n              if (!node.disabled && selectable) onTreeSelect?.(node, event);\n            }}\n            className={cn(\n              'inline-block max-w-full truncate',\n              node.disabled ? 'cursor-not-allowed' : selectable ? 'cursor-pointer' : undefined,\n            )}\n          >\n            {node.label}\n          </span>\n        </span>\n        {trailingNode}\n      </div>\n    </div>\n  );\n});\n\nexport const STreeItem = withDisplayName(STreeItemImpl, 'STreeItem');\n\nconst STreeImpl = forwardRef<HTMLDivElement, STreeProps>(function STree(\n  {\n    items,\n    value,\n    defaultValue,\n    expandedIds,\n    defaultExpandedIds,\n    selectable = true,\n    cascadeSelection = true,\n    guideline = true,\n    border = true,\n    leading,\n    trailing,\n    onValueChange,\n    onExpandedChange,\n    className,\n    ...rest\n  },\n  ref,\n) {\n  const [internalValue, setInternalValue] = useState<string[]>(defaultValue ?? []);\n  const [internalExpandedIds, setInternalExpandedIds] = useState<string[]>(\n    defaultExpandedIds ?? items.filter(item => item.children?.length).map(item => item.id),\n  );\n  const currentValue = value ?? internalValue;\n  const currentExpandedIds = expandedIds ?? internalExpandedIds;\n  const selectedSet = useMemo(() => toSelectedSet(currentValue), [currentValue]);\n  const expandedSet = useMemo(() => new Set(currentExpandedIds), [currentExpandedIds]);\n\n  const updateExpanded = (node: STreeNode) => {\n    const next = new Set(currentExpandedIds);\n    if (next.has(node.id)) next.delete(node.id);\n    else next.add(node.id);\n    const nextValue = Array.from(next);\n    if (expandedIds === undefined) setInternalExpandedIds(nextValue);\n    onExpandedChange?.(nextValue, node);\n  };\n\n  const updateSelected = (node: STreeNode) => {\n    if (node.disabled) return;\n\n    const targetIds = cascadeSelection ? collectSelectableIds(node) : [node.id];\n    const everySelected = getSelectionState(node, selectedSet).selected;\n    const next = new Set(selectedSet);\n    targetIds.forEach(id => {\n      if (everySelected) next.delete(id);\n      else next.add(id);\n    });\n    const orderedIds = collectIds(items).filter(id => next.has(id));\n    if (value === undefined) setInternalValue(orderedIds);\n    onValueChange?.(orderedIds, node);\n  };\n\n  const renderNodes = (nodes: STreeNode[], depth = 1, ancestorLast: boolean[] = []): ReactNode =>\n    nodes.map((node, index) => {\n      const isLast = index === nodes.length - 1;\n      const isExpanded = expandedSet.has(node.id);\n      const { selected, indeterminate } = getSelectionState(node, selectedSet);\n\n      return (\n        <Fragment key={node.id}>\n          <STreeItem\n            node={node}\n            depth={depth}\n            isLast={isLast}\n            ancestorLast={ancestorLast}\n            expanded={isExpanded}\n            selected={selected}\n            indeterminate={indeterminate}\n            selectable={selectable}\n            guideline={guideline}\n            border={border}\n            leading={leading}\n            trailing={trailing}\n            onToggle={updateExpanded}\n            onTreeSelect={updateSelected}\n          />\n          {node.children?.length ? (\n            <div\n              aria-hidden={!isExpanded}\n              className={cn(\n                'grid w-full overflow-hidden transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none',\n                isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n              )}\n            >\n              <div className=\"min-h-0 overflow-hidden\">\n                {renderNodes(node.children, depth + 1, [...ancestorLast, isLast])}\n              </div>\n            </div>\n          ) : null}\n        </Fragment>\n      );\n    });\n\n  return (\n    <div\n      ref={ref}\n      role=\"tree\"\n      className={cn('flex w-full flex-col items-start bg-(--cmp-tree-item-bg-default)', className)}\n      {...rest}\n    >\n      {renderNodes(items)}\n    </div>\n  );\n});\n\nexport const STree = withDisplayName(STreeImpl, 'STree');\n","/**\n * 인라인 HTML 살균기 (sd-select 등의 HTML 라벨용) — Stencil sanitize-inline-html 포팅.\n * 허용 인라인 태그(A/B/STRONG/I/EM/BR/SPAN) + class 속성만 남기고, 위험 태그/스킴을 제거한다.\n * DOM(template) 기반이라 브라우저에서만 살균; SSR(document 없음)에서는 전체 escape.\n */\nconst ALLOWED_INLINE_TAGS = new Set(['A', 'B', 'STRONG', 'I', 'EM', 'BR', 'SPAN']);\n\nconst ALLOWED_ATTRS_BY_TAG: Record<string, Set<string>> = {\n  A: new Set(['href', 'target', 'rel', 'class']),\n};\nconst COMMON_ALLOWED_ATTRS = new Set(['class']);\n\n// javascript:, data: 등 위험 프로토콜 차단 — 상대 URL과 안전한 스킴만 허용\nconst SAFE_HREF_RE = /^(https?:|mailto:|tel:|\\/|#|\\.)/i;\n\nconst DROP_CONTENT_TAGS = new Set([\n  'SCRIPT',\n  'STYLE',\n  'IFRAME',\n  'OBJECT',\n  'EMBED',\n  'META',\n  'LINK',\n  'BASE',\n  'NOSCRIPT',\n  // SVG/MATH 는 foreign-content 파싱 모드로 전환되어 재직렬화 시 다른 트리로\n  // 재파싱될 수 있다(mXSS 벡터). 인라인 라벨에 필요 없으므로 통째로 제거한다.\n  'SVG',\n  'MATH',\n  'TEMPLATE',\n]);\n\nconst escapeHtml = (value: string) =>\n  value\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n\nconst sanitizeNode = (node: ChildNode) => {\n  if (node.nodeType === Node.COMMENT_NODE) {\n    node.remove();\n    return;\n  }\n  if (node.nodeType !== Node.ELEMENT_NODE) return;\n\n  const element = node as HTMLElement;\n  const tagName = element.tagName;\n\n  if (DROP_CONTENT_TAGS.has(tagName)) {\n    element.remove();\n    return;\n  }\n\n  Array.from(element.childNodes).forEach(child => sanitizeNode(child));\n\n  if (ALLOWED_INLINE_TAGS.has(tagName)) {\n    // React HTML 문자열 호환: className → class 정규화\n    if (element.hasAttribute('className')) {\n      const val = element.getAttribute('className')!;\n      element.removeAttribute('className');\n      if (!element.hasAttribute('class')) element.setAttribute('class', val);\n    }\n    const allowedAttrs = ALLOWED_ATTRS_BY_TAG[tagName] ?? COMMON_ALLOWED_ATTRS;\n    Array.from(element.attributes).forEach(attr => {\n      if (!allowedAttrs.has(attr.name)) element.removeAttribute(attr.name);\n    });\n    if (tagName === 'A') {\n      const href = element.getAttribute('href');\n      if (href !== null && href !== '' && !SAFE_HREF_RE.test(href)) element.removeAttribute('href');\n      // target(특히 _blank) 이 있으면 reverse-tabnabbing 방지를 위해 rel 을 강제한다.\n      if (element.hasAttribute('target')) {\n        element.setAttribute('rel', 'noopener noreferrer');\n      }\n    }\n    return;\n  }\n\n  // 허용 안 된 태그: 태그만 벗기고 자식은 보존 (unwrap)\n  const parent = element.parentNode;\n  if (parent == null) return;\n  while (element.firstChild) parent.insertBefore(element.firstChild, element);\n  parent.removeChild(element);\n};\n\nexport const sanitizeInlineHtml = (value: string): string => {\n  if (typeof document === 'undefined') return escapeHtml(value);\n  const template = document.createElement('template');\n  template.innerHTML = value;\n  Array.from(template.content.childNodes).forEach(child => sanitizeNode(child));\n  return template.innerHTML;\n};\n","'use client';\n\nimport {\n  forwardRef,\n  useCallback,\n  useImperativeHandle,\n  useRef,\n  useState,\n  type ReactNode,\n  type CSSProperties,\n  type HTMLAttributes,\n} from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { type SColor } from '../../lib/color';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { sanitizeInlineHtml } from '../../lib/sanitize-inline-html';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SGhostButton } from '../SGhostButton';\n\nexport type STooltipType = 'default' | 'danger' | 'warning' | 'accent';\nexport type STooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type STooltipTrigger = 'hover' | 'click' | 'none';\n\nexport interface STooltipProps {\n  /** 툴팁 본문 (ReactNode). message 보다 우선 */\n  content?: ReactNode;\n  /** 툴팁 본문 줄 목록 (각 항목이 한 줄, HTML 문자열 허용 — innerHTML 렌더링) */\n  message?: string[];\n  /** 열림 상태 (제어). 지정하면 controlled — hover·click·`ref.show()/hide()` 가 이 값을 덮지 않는다 */\n  open?: boolean;\n  /** 열림 상태 변경 요청. 트리거·자동 닫힘·X 버튼·ref 모든 경로에서 호출된다 (controlled 여부와 무관) */\n  onOpenChange?: (open: boolean) => void;\n  /** 트리거 방식. `'none'` = 트리거 없음 — `open` 으로만 제어되는 상시 표시 툴팁 */\n  trigger?: STooltipTrigger;\n  /** 표시 방향 */\n  placement?: STooltipPlacement;\n  /** 앵커와의 간격(px) */\n  sideOffset?: number;\n  /** 배경/텍스트 색상 타입 */\n  tooltipType?: STooltipType;\n  /** 우측 상단 닫기 버튼. 켜면 자동 닫힘이 비활성화되고 X(또는 hide())로만 닫힘 (hover·click 공통, `trigger='none'` 에서는 무시) */\n  useClose?: boolean;\n  /** 비활성 — 트리거만 렌더하고 툴팁을 열지 않음 */\n  disabled?: boolean;\n  /** 커스텀 트리거. 없으면 아이콘 트리거를 렌더 */\n  children?: ReactNode;\n  /** 기본(아이콘) 트리거 설정 */\n  icon?: SIconName;\n  iconSize?: number;\n  /** 트리거 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */\n  color?: SColor;\n  /** 접근성 레이블 */\n  ariaLabel?: string;\n  className?: string;\n  triggerClassName?: string;\n  style?: CSSProperties;\n  /** 툴팁 본문 요소에 그대로 전달 (`role`, `aria-*` 등). Radix 기본 `role=\"dialog\"` 를 덮어쓸 수 있다 */\n  contentProps?: HTMLAttributes<HTMLDivElement>;\n}\n\n/** ref로 노출되는 UX 메서드 (sd-tooltip @Method show/hide 대응) */\nexport interface STooltipHandle {\n  /** 툴팁을 표시합니다. */\n  show: () => void;\n  /** 툴팁을 숨깁니다. */\n  hide: () => void;\n}\n\n/** mouseleave 후 닫힘까지의 유예 (sd-tooltip startHideTimer 100ms) */\nconst HIDE_DELAY_MS = 100;\n\nfunction useBody(content?: ReactNode, message: string[] = []): ReactNode {\n  if (content != null) return content;\n  if (message.length === 0) return null;\n  // 원본 sd-tooltip: 각 줄을 <div>로 쌓기만 하고 별도 간격 없이 line-height(20px)로 줄 간격을 잡는다.\n  // 단, 단일 줄일 때는 line-height 24 로 표시한다.\n  // 각 줄은 HTML 문자열을 허용하되, sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어).\n  const singleLine = message.length === 1;\n  return (\n    <>\n      {message.map((line, i) => (\n        <div\n          key={i}\n          className={singleLine ? 'leading-[24px]' : undefined}\n          dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(line) }}\n        />\n      ))}\n    </>\n  );\n}\n\n/**\n * STooltip — sd-tooltip 포팅.\n * hover·click 모두 Radix SPopover 기반으로, sd-tooltip 인터랙션을 재현한다:\n * 즉시 열림(hover 지연 없음) · mouseleave 100ms 유예 + 본문 hover 브릿지 ·\n * useClose 시 자동 닫힘 비활성(X/hide 로만) · 4색 타입은 --cmp-tooltip-* 토큰.\n *\n * `trigger='none'` + `open` 으로 트리거 없는 상시 표시 툴팁(인라인 검증 안내)도 만든다.\n */\nconst STooltipImpl = forwardRef<STooltipHandle, STooltipProps>(function STooltip(\n  {\n    content,\n    message = [],\n    open: openProp,\n    onOpenChange,\n    trigger = 'hover',\n    placement = 'top',\n    sideOffset = 8,\n    tooltipType = 'default',\n    useClose = false,\n    disabled = false,\n    children,\n    icon = 'helpOutline',\n    iconSize = 12,\n    color = '#01BB4B',\n    ariaLabel,\n    className,\n    triggerClassName,\n    style,\n    contentProps,\n  },\n  ref,\n) {\n  const portalContainer = usePortalContainer();\n  // open 미지정이면 내부 state 로 동작(기존 hover·click 그대로), 지정하면 controlled\n  const [internalOpen, setInternalOpen] = useState(false);\n  const isControlled = openProp !== undefined;\n  const open = isControlled ? openProp : internalOpen;\n  const hideTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n  const cancelHide = useCallback(() => {\n    if (hideTimer.current) {\n      clearTimeout(hideTimer.current);\n      hideTimer.current = undefined;\n    }\n  }, []);\n  // 열림/닫힘 요청의 단일 경로 — 트리거·자동 닫힘·X 버튼·ref 가 모두 여기를 지난다.\n  // controlled 면 내부 state 를 건드리지 않고 onOpenChange 만 알린다.\n  const setOpenState = useCallback(\n    (next: boolean) => {\n      if (!isControlled) setInternalOpen(next);\n      onOpenChange?.(next);\n    },\n    [isControlled, onOpenChange],\n  );\n\n  const openNow = () => {\n    cancelHide();\n    setOpenState(true);\n  };\n  // useClose 면 자동 닫힘 없음(수동만). 아니면 100ms 유예 후 닫힘 (본문 hover 시 취소됨)\n  const startHide = () => {\n    if (useClose) return;\n    cancelHide();\n    hideTimer.current = setTimeout(() => setOpenState(false), HIDE_DELAY_MS);\n  };\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      show: () => {\n        cancelHide();\n        setOpenState(true);\n      },\n      hide: () => {\n        cancelHide();\n        setOpenState(false);\n      },\n    }),\n    [cancelHide, setOpenState],\n  );\n\n  const isHover = trigger === 'hover';\n  // 트리거 없음 — 앵커만 두고 열림은 open 이 전담. 자동 닫힘·X 버튼 모두 없다.\n  const isNone = trigger === 'none';\n\n  if (isNone && children == null && typeof console !== 'undefined') {\n    console.warn(\n      '[STooltip] trigger=\"none\" 은 위치 기준이 될 children 이 필요합니다. 아이콘 트리거로 폴백합니다.',\n    );\n  }\n\n  const body = useBody(content, message);\n  const bg = `var(--cmp-tooltip-${tooltipType}-bg)`;\n  const fg = `var(--cmp-tooltip-${tooltipType}-content)`;\n\n  const triggerNode = children ?? (\n    <span className={cn('inline-flex cursor-pointer', triggerClassName)} aria-label={ariaLabel}>\n      <SIcon name={icon} size={iconSize} color={color} />\n    </span>\n  );\n\n  // 트리거만 렌더 (비활성/본문 없음)\n  if (disabled || body == null) return <>{triggerNode}</>;\n\n  // className·style 은 전용 prop 과 병합하고, 나머지(role·aria-* 등)만 본문에 스프레드한다\n  const {\n    className: contentPropsClassName,\n    style: contentPropsStyle,\n    ...restContentProps\n  } = contentProps ?? {};\n\n  // 원본 sd-floating-menu 와 동일하게 fit-content + 자동 줄바꿈 없음(각 줄은 message 배열로만 분리)\n  const contentClass = cn(\n    'z-50 w-fit whitespace-nowrap rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px] shadow-normal-sm',\n    FLOATING_SLIDE_ANIM,\n    className,\n    contentPropsClassName,\n  );\n  // default 500, danger/warning/accent 700 (원본 타이포 기준)\n  const contentStyle: CSSProperties = {\n    background: bg,\n    color: fg,\n    fontWeight: tooltipType === 'default' ? 500 : 700,\n    ...style,\n    ...contentPropsStyle,\n  };\n\n  return (\n    <RPopover.Root open={open} onOpenChange={setOpenState}>\n      {isNone ? (\n        // 트리거 없음: children 을 래퍼 없이 그대로 앵커로 쓴다 (소비자 레이아웃 보존).\n        // mouse/focus 핸들러가 없으므로 useClose 없이도 자동 닫힘이 발생하지 않는다.\n        <RPopover.Anchor asChild>{triggerNode}</RPopover.Anchor>\n      ) : isHover ? (\n        // hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용\n        <RPopover.Anchor asChild>\n          <span\n            className=\"inline-flex\"\n            onMouseEnter={openNow}\n            onMouseLeave={startHide}\n            onFocus={openNow}\n            onBlur={startHide}\n          >\n            {triggerNode}\n          </span>\n        </RPopover.Anchor>\n      ) : (\n        <RPopover.Trigger asChild>{triggerNode}</RPopover.Trigger>\n      )}\n      <RPopover.Portal container={portalContainer}>\n        <RPopover.Content\n          side={placement}\n          sideOffset={sideOffset}\n          className={contentClass}\n          style={contentStyle}\n          // 포커스 가로채지 않음 (sd-tooltip 은 포커스 이동 없음)\n          onOpenAutoFocus={e => e.preventDefault()}\n          // useClose / trigger='none': 바깥 클릭·ESC 로 닫히지 않음\n          // (none 은 open 이 전담하므로 불필요한 onOpenChange(false) 도 막는다)\n          onInteractOutside={e => {\n            if (useClose || isNone) e.preventDefault();\n          }}\n          onEscapeKeyDown={e => {\n            if (useClose || isNone) e.preventDefault();\n          }}\n          // hover 브릿지: 본문 위에 올리면 닫힘 취소, 벗어나면 유예 후 닫힘\n          onMouseEnter={isHover ? cancelHide : undefined}\n          onMouseLeave={isHover ? startHide : undefined}\n          {...restContentProps}\n        >\n          <div className=\"flex items-start gap-[12px]\">\n            <div className=\"min-w-0 flex-1\">{body}</div>\n            {/* 상시 표시 안내(trigger='none')에 \"닫기\" 는 의미가 없다 → useClose 와 분리 */}\n            {useClose && !isNone && (\n              <SGhostButton\n                icon=\"close\"\n                size=\"xs\"\n                intent={tooltipType === 'default' ? 'inverse' : 'default'}\n                ariaLabel=\"닫기\"\n                className=\"shrink-0\"\n                onClick={() => {\n                  cancelHide();\n                  setOpenState(false);\n                }}\n              />\n            )}\n          </div>\n          <RPopover.Arrow width={16} height={12} style={{ fill: bg }} />\n        </RPopover.Content>\n      </RPopover.Portal>\n    </RPopover.Root>\n  );\n});\n\nexport const STooltip = withDisplayName(STooltipImpl, 'STooltip');\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SBadge } from '../SBadge';\nimport { SIcon } from '../SIcon';\nimport { STooltip } from '../STooltip';\n\nexport type SSectionHeaderCardBodyChildren = ReactNode;\nexport type SSectionHeaderCardChildren = ReactNode;\nexport type SSectionHeaderCardThickness = false | 'default' | 'accent';\nexport type SSectionHeaderCardTitleSize = 'xs' | 'sm';\nexport type SSectionHeaderCardBodyPadding = 'default' | 'wide' | 'none';\n\n/** 섹션·패널 안쪽 여백은 토큰이 정한다 — 숫자를 직접 주지 않는다. */\nconst BODY_PADDING_CLASS: Record<SSectionHeaderCardBodyPadding, string> = {\n  default: 'p-(--sys-space-panel-padding-default)',\n  wide: 'p-(--sys-space-panel-padding-wide)',\n  none: '',\n};\n\nconst topBorderColorClass: Record<Exclude<SSectionHeaderCardThickness, false>, string> = {\n  default: 'bg-(--cmp-sectionHeaderCard-topBorder-color-default)',\n  accent: 'bg-(--cmp-sectionHeaderCard-topBorder-color-accent)',\n};\n\nconst titleSizeClass: Record<SSectionHeaderCardTitleSize, string> = {\n  xs: 'typo-heading-xs',\n  sm: 'typo-heading-sm',\n};\n\nexport interface SSectionHeaderCardHeaderProps extends Omit<\n  HTMLAttributes<HTMLDivElement>,\n  'slot' | 'title'\n> {\n  /** 헤더 제목 */\n  title: ReactNode;\n  /** 제목 크기 */\n  titleSize?: SSectionHeaderCardTitleSize;\n  /** 제목 앞 점 표시 여부 */\n  marker?: boolean;\n  /** 제목 뒤 필수 별 표시 여부 */\n  required?: boolean;\n  /** 도움말 툴팁 메시지 */\n  helpText?: string[];\n  /** 부제 */\n  subtitle?: ReactNode;\n  /** 헤더 우측 슬롯 */\n  slot?: ReactNode;\n  /** 상단 border 색상 타입. false면 표시하지 않습니다. */\n  thickness?: SSectionHeaderCardThickness;\n}\n\nexport interface SSectionHeaderCardBodyProps extends Omit<\n  HTMLAttributes<HTMLDivElement>,\n  'children'\n> {\n  /** 바디 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. */\n  children?: SSectionHeaderCardBodyChildren;\n  /**\n   * 안쪽 여백. 기본은 `default`.\n   * 성격이 다른 요소가 세 종류 이상 섞인 영역에만 `wide`, 표를 가장자리까지 채울 때만 `none`.\n   */\n  padding?: SSectionHeaderCardBodyPadding;\n}\n\nexport interface SSectionHeaderCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n  /** SSectionHeaderCard 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. */\n  children?: SSectionHeaderCardChildren;\n}\n\nconst SSectionHeaderCardBodyImpl = forwardRef<HTMLDivElement, SSectionHeaderCardBodyProps>(\n  function SSectionHeaderCardBody({ padding = 'default', className, children, ...rest }, ref) {\n    return (\n      <div ref={ref} className={cn(BODY_PADDING_CLASS[padding], className)} {...rest}>\n        {children}\n      </div>\n    );\n  },\n);\n\nconst SSectionHeaderCardHeaderImpl = forwardRef<HTMLDivElement, SSectionHeaderCardHeaderProps>(\n  function SSectionHeaderCardHeader(\n    {\n      title,\n      titleSize = 'xs',\n      marker = false,\n      required = false,\n      helpText,\n      subtitle,\n      slot,\n      thickness = false,\n      className,\n      ...rest\n    },\n    ref,\n  ) {\n    const hasHelp = helpText != null && helpText.length > 0;\n\n    return (\n      <>\n        {thickness && (\n          <div\n            className={cn(\n              'h-(--cmp-sectionHeaderCard-topBorder-thickness) w-full shrink-0',\n              topBorderColorClass[thickness],\n            )}\n          />\n        )}\n        <div\n          ref={ref}\n          className={cn(\n            'box-border flex min-h-(--cmp-sectionHeaderCard-header-minHeight) w-full shrink-0 items-center gap-(--cmp-sectionHeaderCard-header-gap) overflow-hidden border-b border-(--cmp-sectionHeaderCard-header-border) bg-(--cmp-sectionHeaderCard-header-bg) px-(--cmp-sectionHeaderCard-header-paddingX) py-(--cmp-sectionHeaderCard-header-paddingY)',\n            className,\n          )}\n          {...rest}\n        >\n          {marker && <SBadge color=\"darkblue\" className=\"shrink-0\" />}\n          <div className=\"flex min-w-0 shrink-0 items-center gap-[8px]\">\n            <span\n              className={cn(\n                'min-w-0 truncate text-(--sys-color-fg-brand)',\n                titleSizeClass[titleSize],\n              )}\n            >\n              {title}\n            </span>\n            {required && (\n              <SIcon\n                name=\"asterisk\"\n                size={16}\n                color=\"var(--sys-color-fg-accent)\"\n                className=\"shrink-0\"\n              />\n            )}\n            {hasHelp && (\n              <STooltip\n                trigger=\"hover\"\n                icon=\"helpOutline\"\n                iconSize={16}\n                color=\"var(--sys-color-fg-success)\"\n                message={helpText}\n                triggerClassName=\"shrink-0 rounded-[4px]\"\n              />\n            )}\n          </div>\n          {subtitle && (\n            <span className=\"min-w-0 truncate text-[12px] font-normal leading-[20px] text-(--sys-color-fg-secondary)\">\n              {subtitle}\n            </span>\n          )}\n          <div className=\"ml-auto flex min-h-sd-6 min-w-0 flex-1 items-center justify-end\">\n            {slot}\n          </div>\n        </div>\n      </>\n    );\n  },\n);\n\nconst SSectionHeaderCardRootImpl = forwardRef<HTMLDivElement, SSectionHeaderCardProps>(\n  function SSectionHeaderCard({ className, children, ...rest }, ref) {\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          'box-border flex w-full flex-col items-stretch overflow-hidden rounded-[8px] border border-(--sys-color-border-default) bg-(--sys-color-bg-frame)',\n          className,\n        )}\n        {...rest}\n      >\n        {children}\n      </div>\n    );\n  },\n);\n\nconst SSectionHeaderCardRoot = withDisplayName(SSectionHeaderCardRootImpl, 'SSectionHeaderCard');\nconst SSectionHeaderCardHeader = withDisplayName(\n  SSectionHeaderCardHeaderImpl,\n  'SSectionHeaderCard.Header',\n);\nconst SSectionHeaderCardBody = withDisplayName(\n  SSectionHeaderCardBodyImpl,\n  'SSectionHeaderCard.Body',\n);\n\n// Object.assign 은 첫 인자를 변형하므로 번들러가 지우지 못한다. 여기서는 대상이\n// 이 모듈에서 방금 만든 값뿐이라 안전하게 pure 로 표시할 수 있다.\nexport const SSectionHeaderCard = /* @__PURE__ */ Object.assign(SSectionHeaderCardRoot, {\n  Header: SSectionHeaderCardHeader,\n  Body: SSectionHeaderCardBody,\n});\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SDividerProps extends HTMLAttributes<HTMLHRElement> {\n  /** true면 수직 분할선, false면 수평 분할선 */\n  vertical?: boolean;\n}\n\n/** SDivider — sd-divider 포팅. 색상은 `--sys-color-divider-default`. */\nexport const SDivider = forwardRef<HTMLHRElement, SDividerProps>(function SDivider(\n  { vertical = false, className, style, ...rest },\n  ref,\n) {\n  return (\n    <hr\n      ref={ref}\n      aria-orientation={vertical ? 'vertical' : 'horizontal'}\n      className={cn(\n        'shrink-0 border-0',\n        vertical ? 'inline-block h-auto w-px self-stretch' : 'block h-px w-full',\n        className,\n      )}\n      style={{ backgroundColor: 'var(--sys-color-divider-default, #E1E1E1)', ...style }}\n      {...rest}\n    />\n  );\n});\n","/**\n * 공용 커스텀 스크롤바 클래스.\n * Stencil의 styles/scrollbar.scss mixin과 짝을 이루는 단일 기준이며,\n * 스크롤 영역을 가진 컴포넌트는 DOM을 감싸지 않고 이 클래스를 직접 붙여 쓴다.\n *\n * SVG 스펙: 트랙 12px / 썸 8px(grey-45, 2px 인셋, radius 4).\n * 인셋은 투명 테두리 + padding-box 클립으로 만들어, 트랙을 칠하든 안 칠하든 썸이 8px로 보인다.\n */\n\n// Chrome 121+/WebKit는 scrollbar-width·scrollbar-color의 계산값이 초기값(auto)이 아니면\n// ::-webkit-scrollbar-* 를 통째로 무시한다(CSSWG 결정). 표준 속성을 무조건 켜면 아래 트랙/썸이\n// 전부 죽으므로, webkit 유사요소가 없는 브라우저(Firefox)에서만 적용한다.\nconst FIREFOX_SCROLLBAR_CLASS =\n  'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] ' +\n  'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]';\n\n/** 스크롤 영역 기본 스크롤바. overflow 클래스는 각 컴포넌트가 따로 지정한다. */\nexport const SCROLLBAR_CLASS =\n  `${FIREFOX_SCROLLBAR_CLASS} ` +\n  '[&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent ' +\n  '[&::-webkit-scrollbar-track]:bg-transparent ' +\n  '[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding';\n\n/**\n * hidden: 스크롤은 그대로 되지만 스크롤바만 보이지 않게 한다.\n * SCROLLBAR_CLASS 대신 쓴다(같이 쓰면 어느 한쪽이 무의미하다).\n *\n * 표준 속성과 webkit 유사요소를 둘 다 무조건 건다 — 숨기기만 하므로\n * SCROLLBAR_CLASS 와 달리 둘이 충돌하지 않는다. Chrome 121+ 는 scrollbar-width:none 으로,\n * scrollbar-width 를 모르는 구형 WebKit(Safari)은 ::-webkit-scrollbar 의 display:none 으로 숨는다.\n * theme.css 의 전역 base 스크롤바 규칙은 이 유틸(utilities 레이어)이 덮는다.\n */\nexport const SCROLLBAR_HIDDEN_CLASS = '[scrollbar-width:none] [&::-webkit-scrollbar]:hidden';\n\n/**\n * background: 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다.\n * Stencil 의 scrollbar-track-bg($color) mixin 과 짝이며, 이쪽은 기본값 grey-10 에 해당한다.\n * Tailwind 는 소스에 문자열로 박힌 클래스만 수집하므로 색을 인자로 받는 함수로 만들 수 없다.\n * 색이 필요하면 아래 WHITE 처럼 리터럴 상수를 하나 더 만든다.\n *\n * SCROLLBAR_CLASS 뒤에 와야 Firefox 폴백(scrollbar-color)을 덮어쓸 수 있다.\n */\nexport const SCROLLBAR_TRACK_BG_CLASS =\n  'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] ' +\n  '[&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)] ' +\n  '[&::-webkit-scrollbar-corner]:bg-[var(--color-grey-10)]';\n\n/**\n * background(white): 트랙을 흰색으로 채운다.\n * 페이지 표면이 grey-10(#F6F6F6)과 같은 색이라 기본 트랙 배경이 묻히는 자리에 쓴다 — SPage 의 neutral 이 그 경우다.\n */\nexport const SCROLLBAR_TRACK_BG_WHITE_CLASS =\n  'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-white)] ' +\n  '[&::-webkit-scrollbar]:bg-[var(--color-white)] [&::-webkit-scrollbar-track]:bg-[var(--color-white)] ' +\n  '[&::-webkit-scrollbar-corner]:bg-[var(--color-white)]';\n\n/**\n * bordered: 스크롤바와 콘텐츠 사이 1px 구분선.\n * 단축 속성으로 한 변만 지정한다 — border-solid는 네 변에 걸려 트랙에 기본 3px 테두리를 만든다.\n * 썸과 트랙은 형제 박스라 트랙의 구분선이 썸을 밀어주지 않는다. 구분선이 인셋 2px 중 1px을\n * 차지해 좌우 여백이 1px/2px로 어긋나므로, 썸 인셋을 같은 만큼 키워 2px/2px로 되돌린다(썸 8px → 7px).\n * Firefox는 thin 스크롤바를 이 수준으로 커스터마이즈할 수 없어 적용되지 않는다.\n */\nexport const SCROLLBAR_TRACK_BORDER_CLASS =\n  '[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] ' +\n  '[&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] ' +\n  // 세로·가로 스크롤바가 동시에 있으면 우측 하단에 스크롤바 코너가 생긴다. 코너에도 위/왼쪽\n  // 구분선을 줘 세로 트랙의 border-left, 가로 트랙의 border-top이 코너에서 끊기지 않고 이어지게 한다.\n  '[&::-webkit-scrollbar-corner]:[border-top:1px_solid_var(--sys-color-border-default)] ' +\n  '[&::-webkit-scrollbar-corner]:[border-left:1px_solid_var(--sys-color-border-default)] ' +\n  '[&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] ' +\n  '[&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]';\n","'use client';\n\nimport { forwardRef, type CSSProperties, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n  SCROLLBAR_CLASS,\n  SCROLLBAR_TRACK_BG_CLASS,\n  SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport type { SScrollAreaAxis } from './scrollArea.config';\n\nconst AXIS_CLASS: Record<SScrollAreaAxis, string> = {\n  vertical: 'overflow-x-hidden overflow-y-auto',\n  horizontal: 'overflow-x-auto overflow-y-hidden',\n  both: 'overflow-auto',\n};\n\nexport interface SScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n  /** 스크롤 방향. vertical=세로만, horizontal=가로만, both=양방향 */\n  axis?: SScrollAreaAxis;\n  /** true면 스크롤바 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다. */\n  background?: boolean;\n  /** true면 스크롤바와 콘텐츠 사이에 1px 구분선을 그린다. 컨테이너 테두리가 아니다. */\n  bordered?: boolean;\n  /** viewport 최대 높이 (예: '400px'). 비우면 부모 크기를 따른다. */\n  maxHeight?: string;\n  /** viewport 최대 너비 (예: '480px'). 비우면 부모 크기를 따른다. */\n  maxWidth?: string;\n}\n\n/**\n * SScrollArea — sd-scroll-area 포팅.\n * 오버플로우 콘텐츠를 커스텀 네이티브 스크롤바로 감싸는 영역.\n * background·bordered는 컨테이너가 아니라 스크롤바에만 적용된다.\n * 크기는 소비자가 className/style 로 지정한다(호스트 오버라이드 가능).\n */\nexport const SScrollArea = forwardRef<HTMLDivElement, SScrollAreaProps>(function SScrollArea(\n  {\n    axis = 'both',\n    background = false,\n    bordered = false,\n    maxHeight,\n    maxWidth,\n    className,\n    style,\n    children,\n    ...rest\n  },\n  ref,\n) {\n  const mergedStyle: CSSProperties = { ...style };\n  if (maxHeight) mergedStyle.maxHeight = maxHeight;\n  if (maxWidth) mergedStyle.maxWidth = maxWidth;\n\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        AXIS_CLASS[axis],\n        SCROLLBAR_CLASS,\n        background && SCROLLBAR_TRACK_BG_CLASS,\n        bordered && SCROLLBAR_TRACK_BORDER_CLASS,\n        className,\n      )}\n      style={mergedStyle}\n      {...rest}\n    >\n      {children}\n    </div>\n  );\n});\n","export const SCROLL_AREA_AXES = ['vertical', 'horizontal', 'both'] as const;\nexport type SScrollAreaAxis = (typeof SCROLL_AREA_AXES)[number];\n","export const SSPLITTER_UNITS = ['%', 'px'] as const;\n/** 모델·limits 를 읽는 단위. Quasar QSplitter 의 `unit` 과 같다. */\nexport type SSplitterUnit = (typeof SSPLITTER_UNITS)[number];\n\n/** limits 를 주지 않았을 때의 기본 범위. Quasar 와 같은 값이다. */\nexport const SSPLITTER_DEFAULT_LIMITS: Record<SSplitterUnit, readonly [number, number]> = {\n  '%': [10, 90],\n  'px': [50, Infinity],\n};\n\n/** value·defaultValue 를 주지 않았을 때의 시작값. */\nexport const SSPLITTER_DEFAULT_VALUE: Record<SSplitterUnit, number> = {\n  '%': 50,\n  'px': 240,\n};\n\n/**\n * 방향키 한 번에 움직이는 양. 단위가 다르면 체감도 달라야 하므로 단위별로 둔다.\n * 두께·색과 달리 대응 토큰이 없어 상수다(SLAYOUT_MIN_WIDTH 와 같은 이유).\n */\nexport const SSPLITTER_KEY_STEP: Record<SSplitterUnit, { normal: number; large: number }> = {\n  '%': { normal: 1, large: 10 },\n  'px': { normal: 10, large: 50 },\n};\n","'use client';\n\nimport {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n  type HTMLAttributes,\n  type KeyboardEvent as ReactKeyboardEvent,\n  type MouseEvent as ReactMouseEvent,\n  type MutableRefObject,\n  type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport { withDisplayName } from '../../lib/display-name';\nimport {\n  SSPLITTER_DEFAULT_LIMITS,\n  SSPLITTER_DEFAULT_VALUE,\n  SSPLITTER_KEY_STEP,\n  type SSplitterUnit,\n} from './splitter.config';\n\n/** 구분선 두께 · 선 주변 패딩 — 토큰이 소유한다. */\nconst LINE = 'var(--cmp-splitter-border-width)';\nconst PAD = 'var(--cmp-splitter-border-padding)';\n/** 히트 영역은 구분선 좌우로 패딩만큼 넓힌 것이다. absolute 라 레이아웃을 밀지 않는다. */\nconst HIT = `calc(${LINE} + ${PAD} * 2)`;\nconst HIT_END = `calc(0px - ${PAD})`;\n\ninterface SSplitterContextValue {\n  /** true면 패널을 위아래로 쌓는다 (구분선은 가로) */\n  vertical: boolean;\n  /** 첫 패널이 받을 CSS 크기 ('30%' · '240px') */\n  sizeCss: string;\n  /** 두 패널 사이에 놓이는 구분선. SSplitter.Before 가 자기 뒤에 렌더한다 */\n  divider: ReactNode;\n}\n\nconst SSplitterContext = createContext<SSplitterContextValue | null>(null);\n\nfunction useSSplitterContext(who: string): SSplitterContextValue {\n  const ctx = useContext(SSplitterContext);\n  if (!ctx) throw new Error(`${who} 은 <SSplitter> 안에서만 사용할 수 있습니다.`);\n  return ctx;\n}\n\n/** 패널은 순수 슬롯이다 — 크기·제약은 전부 루트가 소유한다. */\nexport type SSplitterPaneProps = HTMLAttributes<HTMLDivElement>;\n\nexport interface SSplitterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue'> {\n  /** 첫 패널 크기. unit 단위. 주면 controlled */\n  value?: number;\n  /** 첫 패널 초기 크기. uncontrolled. 기본은 '%' 면 50, 'px' 면 240 */\n  defaultValue?: number;\n  /** 크기가 확정될 때. emitImmediately 가 아니면 드래그를 놓는 순간 한 번만 온다 */\n  onValueChange?: (value: number) => void;\n  /** 모델·limits 를 읽는 단위 */\n  unit?: SSplitterUnit;\n  /** [최소, 최대]. 생략하면 '%' 는 [10, 90], 'px' 는 [50, Infinity] */\n  limits?: readonly [number, number];\n  /** 드래그하는 동안에도 onValueChange 를 계속 보낸다 */\n  emitImmediately?: boolean;\n  /** true면 패널을 위아래로 쌓는다 (Quasar q-splitter 의 horizontal 에 해당) */\n  vertical?: boolean;\n  /** true면 크기를 바꿀 수 없다. 커서도 구분선도 나오지 않는다 */\n  disabled?: boolean;\n  /** 구분선에 얹을 클래스 */\n  dividerClassName?: string;\n  /** 구분선에 얹을 인라인 스타일 */\n  dividerStyle?: CSSProperties;\n  /** SSplitter.Before 와 SSplitter.After 둘 */\n  children?: ReactNode;\n}\n\n/**\n * SSplitter — Quasar `q-splitter` 포팅. 두 패널의 경계를 끌어 크기를 바꾼다.\n *\n * 구분선은 평소 자리만 잡고(두께 `--cmp-splitter-border-width`) 칠해지지 않다가,\n * hover·포커스·드래그일 때 `--cmp-splitter-border-color` 로 드러난다 — 조절할 수 있는 자리라는 신호다.\n *\n * 자식은 `SSplitter.Before` 와 `SSplitter.After` 다. 둘 다 루트의 직접 자식이어야 한다.\n * 각 패널은 넘치는 만큼 스스로 스크롤한다(Quasar 와 같음).\n *\n * `emitImmediately` 가 아니면 드래그 중에는 내부에서만 움직이고, 놓는 순간 한 번 통지한다.\n *\n * 키보드: 경계에 포커스를 준 뒤 ←→(상/하는 ↑↓), Shift 조합이면 크게, Home·End 로 최소·최대.\n *\n * @example\n * <SSplitter defaultValue={30} limits={[20, 60]}>\n *   <SSplitter.Before>내비게이션</SSplitter.Before>\n *   <SSplitter.After>본문</SSplitter.After>\n * </SSplitter>\n */\nconst SSplitterRoot = forwardRef<HTMLDivElement, SSplitterProps>(function SSplitter(\n  {\n    value,\n    defaultValue,\n    onValueChange,\n    unit = '%',\n    limits,\n    emitImmediately = false,\n    vertical = false,\n    disabled = false,\n    dividerClassName,\n    dividerStyle,\n    className,\n    style,\n    children,\n    ...rest\n  },\n  ref,\n) {\n  const rootRef = useRef<HTMLDivElement | null>(null);\n  const setRootRef = useCallback(\n    (node: HTMLDivElement | null) => {\n      rootRef.current = node;\n      if (typeof ref === 'function') ref(node);\n      else if (ref) (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n    },\n    [ref],\n  );\n\n  const [uncontrolledValue, setUncontrolledValue] = useState(\n    () => defaultValue ?? SSPLITTER_DEFAULT_VALUE[unit],\n  );\n  const isControlled = value !== undefined;\n  const committedValue = isControlled ? value : uncontrolledValue;\n  /**\n   * 드래그 중 미리보기. emitImmediately 가 아니면 놓기 전까지 밖에 알리지 않으므로,\n   * 화면에 보일 값을 여기에 따로 들고 있어야 한다.\n   */\n  const [dragValue, setDragValue] = useState<number | null>(null);\n  const currentValue = dragValue ?? committedValue;\n\n  const [dragging, setDragging] = useState(false);\n\n  const [minLimit, maxLimit] = limits ?? SSPLITTER_DEFAULT_LIMITS[unit];\n\n  // 드래그 중 리스너가 리렌더 사이에도 최신 값을 동기적으로 읽어야 한다.\n  const stateRef = useRef({ committedValue, unit, vertical, minLimit, maxLimit });\n  stateRef.current = { committedValue, unit, vertical, minLimit, maxLimit };\n  const emitRef = useRef({ onValueChange, emitImmediately, isControlled });\n  emitRef.current = { onValueChange, emitImmediately, isControlled };\n\n  /** 컨테이너 크기를 알아야 상한이 정해진다(px 단위는 컨테이너를 넘을 수 없다). */\n  const measure = useCallback(() => {\n    const el = rootRef.current;\n    if (!el) return 0;\n    return stateRef.current.vertical ? el.clientHeight : el.clientWidth;\n  }, []);\n\n  /** Quasar 와 같은 순서로 자른다 — 단위 상한 → limits 상한 → limits 하한. */\n  const clamp = useCallback((next: number, containerSize: number) => {\n    const { unit: u, minLimit: lo, maxLimit: hi } = stateRef.current;\n    const unitMax = u === '%' ? 100 : containerSize;\n    return Math.min(unitMax, hi, Math.max(lo, next));\n  }, []);\n\n  const commit = useCallback((next: number) => {\n    if (next === stateRef.current.committedValue) return;\n    // 다음 렌더 전까지의 기준. 한 프레임에 mousemove 가 여러 번 들어와도 같은 값을 두 번 알리지 않는다.\n    stateRef.current.committedValue = next;\n    if (!emitRef.current.isControlled) setUncontrolledValue(next);\n    emitRef.current.onValueChange?.(next);\n  }, []);\n\n  // 드래그 도중 언마운트되면 document 리스너와 body 스타일이 남는다.\n  const endDragRef = useRef<(() => void) | null>(null);\n  useEffect(() => () => endDragRef.current?.(), []);\n\n  const startResize = useCallback(\n    (event: ReactMouseEvent<HTMLDivElement>) => {\n      if (disabled || typeof document === 'undefined') return;\n      // preventDefault 로 텍스트 선택을 막으면 포커스도 따라오지 않는다.\n      // 드래그를 놓은 자리에서 바로 방향키로 이어갈 수 있도록 직접 옮겨 준다.\n      event.preventDefault();\n      event.currentTarget.focus();\n\n      const isVertical = stateRef.current.vertical;\n      const containerSize = measure();\n      const startPos = isVertical ? event.clientY : event.clientX;\n      const startValue = clamp(stateRef.current.committedValue, containerSize);\n      // px 는 이동 거리가 곧 값이고, % 는 컨테이너 대비 비율로 환산한다.\n      const multiplier =\n        stateRef.current.unit === '%' ? (containerSize === 0 ? 0 : 100 / containerSize) : 1;\n      let latest = startValue;\n\n      const { body } = document;\n      const prevUserSelect = body.style.userSelect;\n      const prevCursor = body.style.cursor;\n      // 패널 텍스트가 드래그로 선택되지 않게, 커서가 패널 위에서 바뀌지 않게 잠근다.\n      body.style.userSelect = 'none';\n      body.style.cursor = isVertical ? 'row-resize' : 'col-resize';\n\n      const onMove = (moveEvent: MouseEvent) => {\n        const delta = (isVertical ? moveEvent.clientY : moveEvent.clientX) - startPos;\n        latest = clamp(startValue + multiplier * delta, containerSize);\n        setDragValue(latest);\n        if (emitRef.current.emitImmediately) commit(latest);\n      };\n      const endDrag = () => {\n        document.removeEventListener('mousemove', onMove);\n        document.removeEventListener('mouseup', endDrag);\n        body.style.userSelect = prevUserSelect;\n        body.style.cursor = prevCursor;\n        endDragRef.current = null;\n        setDragging(false);\n        setDragValue(null);\n        commit(latest);\n      };\n\n      document.addEventListener('mousemove', onMove);\n      document.addEventListener('mouseup', endDrag);\n      endDragRef.current = endDrag;\n      setDragging(true);\n    },\n    [disabled, measure, clamp, commit],\n  );\n\n  const handleKeyDown = useCallback(\n    (event: ReactKeyboardEvent<HTMLDivElement>) => {\n      if (disabled) return;\n      const { unit: u, vertical: isVertical, minLimit: lo } = stateRef.current;\n      const step = SSPLITTER_KEY_STEP[u][event.shiftKey ? 'large' : 'normal'];\n      const decrease = isVertical ? 'ArrowUp' : 'ArrowLeft';\n      const increase = isVertical ? 'ArrowDown' : 'ArrowRight';\n\n      let next: number | null = null;\n      if (event.key === decrease) next = stateRef.current.committedValue - step;\n      else if (event.key === increase) next = stateRef.current.committedValue + step;\n      else if (event.key === 'Home') next = lo;\n      // 상한은 clamp 가 안다 — 단위·컨테이너·limits 중 가장 작은 값이다.\n      else if (event.key === 'End') next = Number.MAX_SAFE_INTEGER;\n      if (next === null) return;\n\n      event.preventDefault();\n      commit(clamp(next, measure()));\n    },\n    [disabled, measure, clamp, commit],\n  );\n\n  const sizeCss = unit === '%' ? `${currentValue}%` : `${Math.round(currentValue)}px`;\n\n  const divider = (\n    <div className=\"relative z-[1] shrink-0\" style={{ flexBasis: LINE }}>\n      {/* 포커스 가능한 separator = ARIA window splitter 로, 값을 가지는 위젯이다.\n          jsx-a11y 는 separator 를 항상 비대화형으로 보므로 여기서만 끈다. */}\n      {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n      <div\n        role=\"separator\"\n        aria-orientation={vertical ? 'horizontal' : 'vertical'}\n        aria-valuenow={Math.round(currentValue)}\n        aria-valuemin={Math.round(minLimit)}\n        aria-valuemax={Number.isFinite(maxLimit) ? Math.round(maxLimit) : undefined}\n        aria-valuetext={sizeCss}\n        aria-disabled={disabled || undefined}\n        tabIndex={disabled ? -1 : 0}\n        onMouseDown={startResize}\n        onKeyDown={handleKeyDown}\n        className={cn(\n          'group absolute flex outline-none',\n          vertical ? 'inset-x-0 flex-col justify-center' : 'inset-y-0 justify-center',\n          disabled ? 'cursor-default' : vertical ? 'cursor-row-resize' : 'cursor-col-resize',\n          dividerClassName,\n        )}\n        style={{\n          ...(vertical ? { bottom: HIT_END, height: HIT } : { right: HIT_END, width: HIT }),\n          ...dividerStyle,\n        }}\n      >\n        <span\n          aria-hidden\n          className={cn(\n            // 평상시엔 자리만 잡고 칠하지 않는다 — 색이 붙는 것 자체가 조절 가능하다는 신호다.\n            'transition-colors',\n            vertical ? 'h-(--cmp-splitter-border-width)' : 'w-(--cmp-splitter-border-width)',\n            !disabled &&\n              'group-hover:bg-(--cmp-splitter-border-color) group-focus-visible:bg-(--cmp-splitter-border-color)',\n            !disabled && dragging && 'bg-(--cmp-splitter-border-color)',\n          )}\n        />\n      </div>\n    </div>\n  );\n\n  /**\n   * 일부러 memo 하지 않는다 — 패널은 소비자가 만든 element 라 루트가 리렌더돼도 그대로다.\n   * context 가 매번 새 객체여야 드래그 중 크기와 구분선이 패널 쪽에 전달된다.\n   */\n  const ctx: SSplitterContextValue = { vertical, sizeCss, divider };\n\n  return (\n    <SSplitterContext.Provider value={ctx}>\n      <div\n        ref={setRootRef}\n        className={cn('flex size-full', vertical ? 'flex-col' : 'flex-row', className)}\n        style={style}\n        {...rest}\n      >\n        {children}\n      </div>\n    </SSplitterContext.Provider>\n  );\n});\n\n/** 첫 패널이 크기를 받고, 둘째 패널은 남는 자리를 모두 가져간다. */\nfunction usePane(pane: 'before' | 'after', className?: string, style?: CSSProperties) {\n  const ctx = useSSplitterContext(`SSplitter.${pane === 'before' ? 'Before' : 'After'}`);\n  const isSized = pane === 'before';\n  return {\n    divider: ctx.divider,\n    className: cn(\n      'min-h-0 min-w-0 overflow-auto',\n      isSized ? 'shrink-0' : 'flex-1 basis-0',\n      className,\n    ),\n    style: isSized ? { [ctx.vertical ? 'height' : 'width']: ctx.sizeCss, ...style } : style,\n  };\n}\n\nconst SSplitterBeforeImpl = forwardRef<HTMLDivElement, SSplitterPaneProps>(function SSplitterBefore(\n  { className, style, children, ...rest },\n  ref,\n) {\n  const pane = usePane('before', className, style);\n  return (\n    <>\n      <div ref={ref} className={pane.className} style={pane.style} {...rest}>\n        {children}\n      </div>\n      {pane.divider}\n    </>\n  );\n});\n\nconst SSplitterAfterImpl = forwardRef<HTMLDivElement, SSplitterPaneProps>(function SSplitterAfter(\n  { className, style, children, ...rest },\n  ref,\n) {\n  const pane = usePane('after', className, style);\n  return (\n    <div ref={ref} className={pane.className} style={pane.style} {...rest}>\n      {children}\n    </div>\n  );\n});\n\nconst SSplitterBefore = withDisplayName(SSplitterBeforeImpl, 'SSplitter.Before');\nconst SSplitterAfter = withDisplayName(SSplitterAfterImpl, 'SSplitter.After');\n\n// Object.assign 은 첫 인자를 변형하므로 번들러가 지우지 못한다. 여기서는 대상이\n// 이 모듈에서 방금 만든 값뿐이라 안전하게 pure 로 표시할 수 있다.\nexport const SSplitter = /* @__PURE__ */ Object.assign(SSplitterRoot, {\n  Before: SSplitterBefore,\n  After: SSplitterAfter,\n});\n","/**\n * SButton 색상/사이즈 설정 — sd-button(component.button 토큰) 충실 포팅.\n * Stencil `name`(예: primary_sm)의 preset을 color + outline(boolean) + size 로 분리.\n *  - primary / danger : solid·outline 모두 지원\n *  - secondary        : solid 전용 (outline 스타일 없음 → outline 무시)\n *  - neutral          : 흰 배경 고정, outline 은 회색 테두리만 추가(solid = 테두리 없는 흰 버튼)\n * 색상은 theme.css의 `--cmp-button-*` CSS 변수를 참조한다.\n */\nexport const BUTTON_COLORS = ['primary', 'secondary', 'neutral', 'danger'] as const;\nexport const BUTTON_SIZES = ['xs', 'sm', 'md', 'lg'] as const;\n\nexport type SButtonColor = (typeof BUTTON_COLORS)[number];\nexport type SButtonSize = (typeof BUTTON_SIZES)[number];\n\ninterface PresetColors {\n  bg: string;\n  bgHover: string;\n  text: string;\n  icon: string;\n  border: string;\n}\n\nconst V = (path: string) => `var(--cmp-button-${path})`;\n\n/**\n * (color, outline) → 색상 프리셋.\n * secondary 는 outline 을 지원하지 않으므로 outline 인자를 무시하고 항상 solid 를 돌려준다.\n */\nexport function buttonPreset(color: SButtonColor, outline: boolean): PresetColors {\n  switch (color) {\n    case 'primary':\n      return outline\n        ? {\n            bg: V('brand-outline-bg-default'),\n            bgHover: V('brand-outline-bg-hover'),\n            text: V('brand-outline-content'),\n            icon: V('brand-outline-content'),\n            border: V('brand-outline-border'),\n          }\n        : {\n            bg: V('brand-strong-bg-default'),\n            bgHover: V('brand-strong-bg-hover'),\n            text: V('brand-strong-content'),\n            icon: V('brand-strong-content'),\n            border: 'transparent',\n          };\n    case 'secondary':\n      return {\n        bg: V('brand-subtle-bg-default'),\n        bgHover: V('brand-subtle-bg-hover'),\n        text: V('brand-subtle-content'),\n        icon: V('brand-subtle-content'),\n        border: 'transparent',\n      };\n    case 'neutral':\n      // solid·outline 모두 흰 배경 + 동일 텍스트, 테두리 유무만 차이\n      return {\n        bg: V('neutral-outline-bg-default'),\n        bgHover: V('neutral-outline-bg-hover'),\n        text: V('neutral-outline-text'),\n        icon: V('neutral-outline-icon'),\n        border: outline ? V('neutral-outline-border') : 'transparent',\n      };\n    case 'danger':\n      return outline\n        ? {\n            bg: V('danger-outline-bg-default'),\n            bgHover: V('danger-outline-bg-hover'),\n            text: V('danger-outline-content'),\n            icon: V('danger-outline-content'),\n            border: V('danger-outline-border'),\n          }\n        : {\n            bg: V('danger-strong-bg-default'),\n            bgHover: V('danger-strong-bg-hover'),\n            text: V('danger-strong-content'),\n            icon: V('danger-strong-content'),\n            border: 'transparent',\n          };\n  }\n}\n\nexport const BUTTON_SIZE_CONFIG: Record<\n  SButtonSize,\n  {\n    height: string;\n    paddingX: string;\n    gap: string;\n    iconSize: number;\n    fontSize: number;\n    fontWeight: number;\n    radius: string;\n    minWidth: number;\n  }\n> = {\n  xs: {\n    height: 'var(--cmp-button-xs-height)',\n    paddingX: 'var(--cmp-button-xs-paddingX)',\n    gap: 'var(--cmp-button-xs-gap)',\n    iconSize: 12,\n    fontSize: 12,\n    fontWeight: 500,\n    radius: 'var(--cmp-button-radius-sm)',\n    minWidth: 36,\n  },\n  sm: {\n    height: 'var(--cmp-button-sm-height)',\n    paddingX: 'var(--cmp-button-sm-paddingX)',\n    gap: 'var(--cmp-button-sm-gap)',\n    iconSize: 16,\n    fontSize: 12,\n    fontWeight: 500,\n    radius: 'var(--cmp-button-radius-sm)',\n    minWidth: 70,\n  },\n  md: {\n    height: 'var(--cmp-button-md-height)',\n    paddingX: 'var(--cmp-button-md-paddingX)',\n    gap: 'var(--cmp-button-md-gap)',\n    iconSize: 20,\n    fontSize: 16,\n    fontWeight: 500,\n    radius: 'var(--cmp-button-radius-md)',\n    minWidth: 100,\n  },\n  lg: {\n    height: 'var(--cmp-button-lg-height)',\n    paddingX: 'var(--cmp-button-lg-paddingX)',\n    gap: 'var(--cmp-button-lg-gap)',\n    iconSize: 24,\n    fontSize: 18,\n    fontWeight: 500,\n    radius: 'var(--cmp-button-radius-md)',\n    minWidth: 120,\n  },\n};\n\nexport const BUTTON_FOCUS_RING = 'var(--sys-color-border-accent)';\nexport const BUTTON_DISABLED_BG = 'var(--cmp-button-bg-disabled, #E1E1E1)';\nexport const BUTTON_DISABLED_BORDER = 'var(--cmp-button-border-disabled, #CCCCCC)';\nexport const BUTTON_DISABLED_TEXT = 'var(--cmp-button-text-disabled, #888888)';\nexport const BUTTON_DISABLED_ICON = 'var(--cmp-button-icon-disabled, #BBBBBB)';\n","'use client';\n\nimport { forwardRef, type ButtonHTMLAttributes, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon, type SIconName } from '../SIcon';\nimport {\n  buttonPreset,\n  BUTTON_SIZE_CONFIG,\n  BUTTON_FOCUS_RING,\n  BUTTON_DISABLED_BG,\n  BUTTON_DISABLED_BORDER,\n  BUTTON_DISABLED_TEXT,\n  BUTTON_DISABLED_ICON,\n  type SButtonColor,\n  type SButtonSize,\n} from './button.config';\n\nexport interface SButtonProps extends Omit<\n  ButtonHTMLAttributes<HTMLButtonElement>,\n  'color' | 'children'\n> {\n  /** 색상 — sd-button preset의 색 계열 */\n  color?: SButtonColor;\n  /** 아웃라인(테두리) 스타일. primary·neutral·danger 만 지원 (secondary 는 무시) */\n  outline?: boolean;\n  /** 크기 */\n  size?: SButtonSize;\n  /** 레이블 왼쪽 아이콘 */\n  icon?: SIconName;\n  /** 레이블 오른쪽 아이콘 */\n  rightIcon?: SIconName;\n  /** 버튼 텍스트 (문자열만 — 아이콘은 icon/rightIcon 사용) */\n  label?: string;\n}\n\n/**\n * SButton — sd-button 포팅.\n * color(4) × outline × 4개 사이즈, 아이콘(icon/rightIcon), 컴포넌트 토큰(--cmp-button-*) 기반.\n * 텍스트는 label(문자열)로만 받는다. 이벤트: sdClick → 네이티브 onClick.\n */\nexport const SButton = forwardRef<HTMLButtonElement, SButtonProps>(function SButton(\n  {\n    color = 'primary',\n    outline = false,\n    size = 'sm',\n    icon,\n    rightIcon,\n    label,\n    className,\n    style,\n    type = 'button',\n    disabled = false,\n    'aria-label': ariaLabel,\n    ...props\n  },\n  ref,\n) {\n  const preset = buttonPreset(color, outline);\n  const s = BUTTON_SIZE_CONFIG[size];\n  const hasLabel = label != null && label !== '';\n  const iconOnly = !hasLabel && Boolean(icon) !== Boolean(rightIcon);\n\n  if (color === 'secondary' && outline && typeof console !== 'undefined') {\n    console.warn(\n      '[SButton] color=\"secondary\" 는 outline 을 지원하지 않습니다. solid 로 렌더됩니다.',\n    );\n  }\n  if (iconOnly && !ariaLabel && typeof console !== 'undefined') {\n    console.warn(`[SButton] 아이콘 전용 버튼은 aria-label 이 필요합니다. (color=\"${color}\")`);\n  }\n\n  const iconColor = disabled ? BUTTON_DISABLED_ICON : preset.icon;\n  const iconNode = icon ? <SIcon name={icon} size={s.iconSize} color={iconColor} /> : null;\n  const rightIconNode = rightIcon ? (\n    <SIcon name={rightIcon} size={s.iconSize} color={iconColor} />\n  ) : null;\n\n  const cssVars = {\n    '--btn-bg': disabled ? BUTTON_DISABLED_BG : preset.bg,\n    '--btn-bg-hover': preset.bgHover,\n    '--btn-border': disabled ? BUTTON_DISABLED_BORDER : preset.border,\n    '--btn-ring': BUTTON_FOCUS_RING,\n    'minHeight': s.height,\n    'minWidth': iconOnly ? s.height : hasLabel ? s.minWidth : undefined,\n    'padding': iconOnly ? 0 : `0 ${s.paddingX}`,\n    'borderRadius': s.radius,\n    'gap': s.gap,\n    'fontSize': s.fontSize,\n    'fontWeight': s.fontWeight,\n    'color': disabled ? BUTTON_DISABLED_TEXT : preset.text,\n    ...style,\n  } as CSSProperties;\n\n  return (\n    <button\n      ref={ref}\n      type={type}\n      disabled={disabled}\n      aria-label={ariaLabel}\n      className={cn(\n        'inline-flex items-center justify-center whitespace-nowrap border border-solid leading-none transition-colors',\n        'border-[color:var(--btn-border)] bg-[var(--btn-bg)]',\n        'outline-none focus-visible:shadow-[0_0_0_2px_var(--btn-ring)]',\n        disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-[var(--btn-bg-hover)]',\n        className,\n      )}\n      style={cssVars}\n      {...props}\n    >\n      {iconNode}\n      {hasLabel && <span className=\"inline-flex items-center justify-center\">{label}</span>}\n      {rightIconNode}\n    </button>\n  );\n});\n","import { forwardRef, type CSSProperties, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { sanitizeInlineHtml } from '../../lib/sanitize-inline-html';\nimport { SIcon } from '../SIcon';\n\nexport type SCalloutType = 'default' | 'danger';\n\n/** 중첩 메시지: 문자열 또는 (한 단계 더 들어간) 문자열 배열 */\nexport type SCalloutMessage = string | SCalloutMessage[];\n\nexport interface SCalloutProps {\n  /** 콜아웃 타입 (색상·아이콘·타이틀 결정) */\n  type?: SCalloutType;\n  /**\n   * 표시할 메시지 목록 (배열 중첩으로 depth 표현).\n   * 각 문자열은 인라인 HTML(`<b>`, `<a>` 등)을 허용하며 sanitizeInlineHtml 로 살균 후 렌더된다.\n   */\n  message?: SCalloutMessage[];\n  /** message 대신 직접 본문을 넣을 때 */\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst DANGER_TITLE_LABEL = '주의사항';\n\nfunction renderItems(message: SCalloutMessage[], depth = 1): ReactNode[] {\n  const out: ReactNode[] = [];\n  message.forEach((m, i) => {\n    if (Array.isArray(m)) {\n      out.push(...renderItems(m, depth + 1));\n      return;\n    }\n    const isDepth2 = depth >= 2;\n    out.push(\n      <li\n        key={`${depth}-${i}-${out.length}`}\n        className={cn('flex items-start', isDepth2 && 'pl-[32px]')}\n      >\n        <span className=\"w-[24px] shrink-0 text-center\" aria-hidden>\n          {isDepth2 ? '•' : '-'}\n        </span>\n        {/* 메시지는 HTML 문자열을 허용하되, sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어) */}\n        <p\n          className=\"m-0 min-w-0 flex-1 break-words\"\n          dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(m) }}\n        />\n      </li>,\n    );\n  });\n  return out;\n}\n\n/**\n * SCallout — sd-callout 포팅.\n * default/danger 타입, 중첩 리스트(불릿은 span으로 렌더), danger는 좌측 타이틀 표시.\n * 색상은 `--cmp-callout-*` 토큰 참조.\n * message 각 항목은 sanitizeInlineHtml 로 살균한 뒤 innerHTML 로 렌더한다 (원본 sd-callout 과 동일).\n */\nexport const SCallout = forwardRef<HTMLDivElement, SCalloutProps>(function SCallout(\n  { type = 'default', message = [], children, className, style },\n  ref,\n) {\n  const isDanger = type === 'danger';\n  const vars = {\n    '--co-bg': `var(--cmp-callout-${type}-bg)`,\n    '--co-border': `var(--cmp-callout-${type}-border)`,\n    '--co-content': `var(--cmp-callout-${type}-content)`,\n  } as CSSProperties;\n\n  return (\n    <div\n      ref={ref}\n      role=\"note\"\n      className={cn(\n        'inline-flex w-full items-stretch overflow-hidden rounded-[var(--cmp-callout-radius)] border-[length:var(--cmp-callout-border-width)] border-solid',\n        'border-[color:var(--co-border)] bg-[var(--co-bg)] text-[color:var(--co-content)]',\n        className,\n      )}\n      style={{ ...vars, ...style }}\n    >\n      {isDanger && (\n        <div\n          className=\"flex shrink-0 flex-col items-center justify-center gap-[var(--cmp-callout-danger-title-gap)] px-[var(--cmp-callout-danger-title-paddingX)] py-[8px] text-[16px] font-bold leading-[26px]\"\n          style={{\n            background: 'var(--cmp-callout-danger-title-bg)',\n            color: 'var(--cmp-callout-danger-title-color)',\n          }}\n        >\n          <SIcon name=\"warningFill\" size={24} color=\"var(--cmp-callout-danger-title-color)\" />\n          <span className=\"whitespace-nowrap\">{DANGER_TITLE_LABEL}</span>\n        </div>\n      )}\n      <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-[var(--cmp-callout-body-gap)] px-[var(--cmp-callout-body-paddingX)] py-[var(--cmp-callout-body-paddingY)] text-[12px] font-normal leading-[20px]\">\n        {children ?? (\n          <ul className=\"m-0 flex list-none flex-col justify-center gap-[var(--cmp-callout-body-gap)] p-0\">\n            {renderItems(message)}\n          </ul>\n        )}\n      </div>\n    </div>\n  );\n});\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type SLinearProgressType = 'primary' | 'error' | 'complete';\n\nconst FILL_COLOR: Record<SLinearProgressType, string> = {\n  primary: 'var(--cmp-progress-active-color)',\n  error: 'var(--cmp-progress-error-color)',\n  complete: 'var(--cmp-progress-success-color)',\n};\n\nexport interface SLinearProgressProps {\n  /** 진행률 (0–100) */\n  value?: number;\n  /** 색상 타입 */\n  type?: SLinearProgressType;\n  /** 진행률 없이 무한 애니메이션 */\n  indeterminate?: boolean;\n  /** 하단 레이블 */\n  label?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst clamp = (v: number) => (Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0);\n\n/** SLinearProgress — sd-linear-progress 포팅. */\nexport const SLinearProgress = forwardRef<HTMLDivElement, SLinearProgressProps>(\n  function SLinearProgress(\n    { value = 0, type = 'primary', indeterminate = false, label, className, style },\n    ref,\n  ) {\n    const v = clamp(value);\n    const fill = FILL_COLOR[type];\n    const valueColor = v === 0 ? 'var(--sys-color-fg-tertiary, #888888)' : fill;\n    const valueText = `${Math.round(v)}%`;\n\n    return (\n      <div\n        ref={ref}\n        className={cn('inline-flex w-full flex-col gap-[12px]', className)}\n        style={style}\n      >\n        <div className=\"relative h-[20px] w-full overflow-hidden rounded-full bg-[var(--cmp-progress-color-track)]\">\n          <div\n            className={cn(\n              'absolute inset-y-0 left-0 h-full rounded-[inherit]',\n              indeterminate\n                ? 'w-full origin-left animate-linear-indeterminate'\n                : 'transition-[width] duration-[400ms] ease-linear',\n            )}\n            style={{ background: fill, width: indeterminate ? undefined : `${v}%` }}\n          />\n          {!indeterminate && (\n            <>\n              <span\n                className=\"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 select-none text-center text-[12px] font-bold leading-[20px]\"\n                style={{ color: valueColor }}\n              >\n                {valueText}\n              </span>\n              <span\n                className=\"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 select-none text-center text-[12px] font-bold leading-[20px] text-[color:var(--cmp-progress-bar-text)]\"\n                style={{ clipPath: `inset(0 ${100 - v}% 0 0)` }}\n              >\n                {valueText}\n              </span>\n            </>\n          )}\n        </div>\n        {label && (\n          <span className=\"text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]\">\n            {label}\n          </span>\n        )}\n      </div>\n    );\n  },\n);\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type SCircleProgressType = 'primary' | 'inverse' | 'error' | 'complete';\n\nconst VIEWBOX = 80;\nconst RADIUS = 34;\nconst STROKE = 12;\nconst CIRCUMFERENCE = 2 * Math.PI * RADIUS;\n\nconst COLOR_MAP: Record<SCircleProgressType, { arc: string; track: string }> = {\n  primary: { arc: 'var(--cmp-progress-active-color)', track: 'var(--cmp-progress-color-track)' },\n  // inverse: 어두운 배경용 — arc 흰색, track 은 흰색 40%(회색 링)\n  inverse: { arc: 'var(--color-white)', track: 'rgba(255,255,255,0.4)' },\n  error: { arc: 'var(--color-red-75)', track: 'var(--cmp-progress-color-track)' },\n  complete: { arc: '#01BB4B', track: 'var(--cmp-progress-color-track)' },\n};\n\nexport interface SCircleProgressProps {\n  /** 진행률 (0–100) */\n  value?: number;\n  /** 색상 테마 */\n  type?: SCircleProgressType;\n  /** 불확정(스피너) 모드 — value 무시 */\n  indeterminate?: boolean;\n  /** 하단 레이블 */\n  label?: string;\n  /** true면 퍼센트를 원 아래가 아닌 원 가운데에 표시 */\n  innerValue?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst clamp = (v: number) => (Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0);\n\n/** SCircleProgress — sd-circle-progress 포팅. determinate=진행률 arc, indeterminate=스피너. */\nexport const SCircleProgress = forwardRef<HTMLDivElement, SCircleProgressProps>(\n  function SCircleProgress(\n    {\n      value = 0,\n      type = 'primary',\n      indeterminate = false,\n      label,\n      innerValue = false,\n      className,\n      style,\n    },\n    ref,\n  ) {\n    const v = clamp(value);\n    const colors = COLOR_MAP[type];\n    const c = VIEWBOX / 2;\n    const percentColor = v === 0 ? 'var(--sys-color-fg-tertiary, #888888)' : colors.arc;\n    const filled = (v / 100) * CIRCUMFERENCE;\n    const showPercent = !indeterminate;\n    const percentNode = (\n      <span\n        className={cn(\n          'text-center text-[16px] font-bold',\n          innerValue\n            ? // leading-[normal]: 26px leading 은 폰트 content(19px) 위아래로 홀수(7px)만큼 남아\n              // 3px/4px 로 쪼개지고 글자가 링 중심보다 위로 뜬다. (leading-normal 은 1.5 라 동일 문제)\n              'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 leading-[normal]'\n            : 'leading-[26px]',\n        )}\n        style={{ color: percentColor }}\n      >\n        {Math.round(v)}%\n      </span>\n    );\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          'inline-flex flex-col items-center gap-[var(--cmp-progress-circular-gap)]',\n          className,\n        )}\n        style={style}\n      >\n        <div className={cn(innerValue && 'relative')}>\n          <svg\n            viewBox={`0 0 ${VIEWBOX} ${VIEWBOX}`}\n            xmlns=\"http://www.w3.org/2000/svg\"\n            className={cn(\n              'h-[80px] w-[80px]',\n              indeterminate && 'origin-center animate-circle-spin',\n            )}\n          >\n            <circle\n              cx={c}\n              cy={c}\n              r={RADIUS}\n              fill=\"none\"\n              strokeWidth={STROKE}\n              style={{ stroke: colors.track }}\n            />\n            <circle\n              cx={c}\n              cy={c}\n              r={RADIUS}\n              fill=\"none\"\n              strokeWidth={STROKE}\n              strokeLinecap=\"round\"\n              className={cn(\n                'origin-center',\n                indeterminate\n                  ? 'animate-circle-arc'\n                  : '-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear',\n              )}\n              style={{\n                stroke: colors.arc,\n                ...(indeterminate\n                  ? {}\n                  : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }),\n              }}\n            />\n          </svg>\n          {/* innerValue: 원 가운데에 퍼센트 오버레이 */}\n          {showPercent && innerValue && percentNode}\n        </div>\n        {/* 기본: 퍼센트를 원(ring) 아래에 표시 */}\n        {showPercent && !innerValue && percentNode}\n        {label && (\n          <span className=\"text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]\">\n            {label}\n          </span>\n        )}\n      </div>\n    );\n  },\n);\n","/**\n * 모달 위에 뜨는 전역 레이어(토스트·로딩)의 표식.\n *\n * 이 레이어들은 모달보다 위(Z_INDEX.toast/loading > Z_INDEX.modalHost)에 뜨지만 DOM 상으로는\n * body 직속이라, Radix Dialog 입장에서는 '모달 바깥'이다. 표식이 없으면 토스트 닫기 버튼을\n * 누르는 것만으로 바깥 클릭으로 처리돼 persistent 모달은 흔들리고 일반 모달은 닫혀버린다.\n */\nexport const GLOBAL_OVERLAY_ATTR = 'data-s-global-overlay';\n\n/** 전역 레이어 루트에 펼쳐 넣는다. */\nexport const globalOverlayProps = { [GLOBAL_OVERLAY_ATTR]: '' };\n\n/**\n * Radix 의 outside 이벤트(pointerDownOutside/focusOutside/interactOutside)가\n * 전역 레이어에서 비롯됐는지 판별한다. Radix 는 원본 이벤트를 `detail.originalEvent` 에 담는다.\n */\nexport function isFromGlobalOverlay(event: Event): boolean {\n  const detail = (event as CustomEvent<{ originalEvent?: Event }>).detail;\n  const target = detail?.originalEvent?.target ?? event.target;\n  const element =\n    target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n  return !!element?.closest(`[${GLOBAL_OVERLAY_ATTR}]`);\n}\n","'use client';\n\nimport { forwardRef, useCallback, useEffect, useRef, useState, type CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../lib/cn';\nimport { globalOverlayProps } from '../../lib/global-overlay';\nimport { Z_INDEX } from '../../lib/z-index';\nimport { SCircleProgress } from '../SCircleProgress';\n\nexport interface SLoadingContainerProps {\n  /** 오버레이 표시 여부 (Stencil의 show()/hide() 명령형 API → 제어 prop으로 대체) */\n  open?: boolean;\n  /** 스피너 하단 메시지 */\n  message?: string;\n  /** z-index. 기본값(1200)은 토스트(1100)·모달 호스트(1000) 위 — 전체 화면을 막는 최상단 블로킹 오버레이 */\n  zIndex?: number;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SLoadingContainer — sd-loading-container 포팅.\n * 전체 화면 딤 오버레이 + inverse 스피너. React에서는 `open` 제어 prop 사용.\n * body 로 portal 해 조상의 스태킹 컨텍스트에 갇히지 않고 항상 최상단에 뜨게 한다.\n */\nexport const SLoadingContainer = forwardRef<HTMLDivElement, SLoadingContainerProps>(\n  function SLoadingContainer(\n    { open = false, message, zIndex = Z_INDEX.loading, className, style },\n    ref,\n  ) {\n    // portal 은 클라이언트에서만 (SSR 시 document 없음) — 마운트 후 body 로 렌더\n    const [mounted, setMounted] = useState(false);\n    useEffect(() => setMounted(true), []);\n\n    // 오버레이 표시 중 배경 스크롤 차단\n    useEffect(() => {\n      if (!open) return;\n      const prev = document.body.style.overflow;\n      document.body.style.overflow = 'hidden';\n      return () => {\n        document.body.style.overflow = prev;\n      };\n    }, [open]);\n\n    // body 로 portal 된 블로킹 오버레이라, 클릭이 document 까지 전파되면 Radix Dialog 의\n    // \"바깥 클릭\" 감지에 걸려 열려있는 모달이 닫힌다. 오버레이 요소에 네이티브 pointerdown\n    // 리스너를 직접 붙여(요소 자신에서 가장 먼저 발화) 전파를 끊어 document 리스너를 차단한다.\n    const innerRef = useRef<HTMLDivElement | null>(null);\n    const setRef = useCallback(\n      (node: HTMLDivElement | null) => {\n        innerRef.current = node;\n        if (typeof ref === 'function') ref(node);\n        else if (ref) ref.current = node;\n      },\n      [ref],\n    );\n    useEffect(() => {\n      const el = innerRef.current;\n      if (!el) return;\n      const stop = (e: Event) => e.stopPropagation();\n      el.addEventListener('pointerdown', stop);\n      el.addEventListener('mousedown', stop);\n      return () => {\n        el.removeEventListener('pointerdown', stop);\n        el.removeEventListener('mousedown', stop);\n      };\n    }, [mounted]);\n\n    const overlay = (\n      <div\n        ref={setRef}\n        {...globalOverlayProps}\n        aria-hidden={!open}\n        className={cn(\n          'fixed inset-0 flex items-center justify-center transition-opacity duration-200',\n          open\n            ? 'pointer-events-auto visible opacity-100'\n            : 'pointer-events-none invisible opacity-0',\n          className,\n        )}\n        style={{ zIndex, ...style }}\n      >\n        <div className=\"absolute inset-0 bg-black/40\" />\n        <div className=\"relative flex flex-col items-center gap-[16px]\">\n          <SCircleProgress indeterminate type=\"inverse\" />\n          {message && (\n            <p className=\"m-0 max-w-[400px] break-keep text-center text-[14px] font-medium leading-[22px] text-[color:var(--color-white)]\">\n              {message}\n            </p>\n          )}\n        </div>\n      </div>\n    );\n\n    if (!mounted) return null;\n    return createPortal(overlay, document.body);\n  },\n);\n","'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { SLoadingContainer } from './SLoadingContainer';\n\n/**\n * 전역 로딩 오버레이 싱글톤 — sd-loading-container 의 `sdLoading.show()/hide()` 포팅.\n * 앱 어디서든 `loading.show({ message })` / `loading.hide()` 로 호출한다.\n * 최초 show 시 document.body 에 오버레이 루트를 자동 마운트한다.\n */\ninterface LoadingState {\n  open: boolean;\n  message?: string;\n}\n\nlet state: LoadingState = { open: false, message: undefined };\nconst listeners = new Set<() => void>();\n\nconst emit = () => listeners.forEach(l => l());\nconst setState = (patch: Partial<LoadingState>) => {\n  state = { ...state, ...patch };\n  emit();\n};\nconst subscribe = (cb: () => void) => {\n  listeners.add(cb);\n  return () => listeners.delete(cb);\n};\nconst getSnapshot = () => state;\n\n/** 오버레이 뷰포트 — 스토어를 구독해 SLoadingContainer 를 렌더한다. 직접 배치도 가능. */\nexport function SLoadingViewport() {\n  const s = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n  return <SLoadingContainer open={s.open} message={s.message} />;\n}\n\nlet mounted = false;\nfunction ensureMounted() {\n  if (mounted || typeof document === 'undefined') return;\n  mounted = true;\n  const host = document.createElement('div');\n  host.setAttribute('data-sd-loading-root', '');\n  document.body.appendChild(host);\n  createRoot(host).render(<SLoadingViewport />);\n}\n\nexport const loading = {\n  /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */\n  show(options: { message?: string } = {}) {\n    ensureMounted();\n    setState({ open: true, message: options.message });\n  },\n  /** 로딩 오버레이 숨김 */\n  hide() {\n    setState({ open: false });\n  },\n};\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport * as RTooltip from '@radix-ui/react-tooltip';\nimport { cn } from '../../lib/cn';\nimport { type SColor } from '../../lib/color';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { STag } from '../STag';\n\nexport type STextLinkSize = 'sm' | 'md' | 'lg';\nexport type STextLinkArrow = 'none' | 'chevron' | 'caret';\n\nconst SIZE_CONFIG: Record<\n  STextLinkSize,\n  { gap: number; iconSize: number; typo: string; underlineTypo: string }\n> = {\n  sm: {\n    gap: 4,\n    iconSize: 16,\n    typo: 'typo-control-xs-medium',\n    underlineTypo: 'typo-control-xs-underline',\n  },\n  md: {\n    gap: 8,\n    iconSize: 16,\n    typo: 'typo-control-sm-default',\n    underlineTypo: 'typo-control-sm-underline',\n  },\n  lg: {\n    gap: 8,\n    iconSize: 20,\n    typo: 'typo-control-md-default',\n    underlineTypo: 'typo-control-md-underline',\n  },\n};\n\nexport interface STextLinkProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'onClick'> {\n  /** 레이블 */\n  label?: string;\n  /** 좌측 아이콘 */\n  icon?: SIconName;\n  /** 좌측 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */\n  iconColor?: SColor;\n  /** 레이블 span에 추가할 클래스 */\n  labelClass?: string;\n  /** 우측 화살표 */\n  rightArrow?: STextLinkArrow;\n  /** 밑줄 여부 */\n  underline?: boolean;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 크기 */\n  size?: STextLinkSize;\n  /** 호버 시 표시할 툴팁 텍스트 (회색 STag 스타일) */\n  tooltipText?: string;\n  onClick?: () => void;\n}\n\n/** STextLink — sd-text-link 포팅. 아이콘·화살표·밑줄·크기 지원. */\nexport const STextLink = forwardRef<HTMLSpanElement, STextLinkProps>(function STextLink(\n  {\n    label = '',\n    icon,\n    iconColor,\n    labelClass,\n    rightArrow = 'none',\n    underline = false,\n    disabled = false,\n    size = 'sm',\n    tooltipText,\n    className,\n    onClick,\n    children,\n    style,\n    ...rest\n  },\n  ref,\n) {\n  const s = SIZE_CONFIG[size];\n  const contentColor = disabled\n    ? 'var(--cmp-textLink-content-disabled)'\n    : 'var(--cmp-textLink-content-default)';\n  const resolvedIconColor = disabled\n    ? 'var(--cmp-textLink-icon-disabled)'\n    : iconColor || 'var(--cmp-textLink-icon-default)';\n\n  const handle = () => {\n    if (!disabled) onClick?.();\n  };\n\n  const portalContainer = usePortalContainer();\n\n  const link = (\n    <span\n      ref={ref}\n      role=\"button\"\n      tabIndex={disabled ? -1 : 0}\n      onClick={handle}\n      onKeyDown={e => {\n        if (e.key === 'Enter' || e.key === ' ') {\n          e.preventDefault();\n          handle();\n        }\n      }}\n      className={cn(\n        'inline-flex cursor-pointer items-center',\n        underline ? s.underlineTypo : s.typo,\n        !disabled && 'hover:underline',\n        disabled && 'cursor-not-allowed',\n        className,\n      )}\n      style={{ gap: s.gap, color: contentColor, ...style }}\n      {...rest}\n    >\n      {icon && <SIcon name={icon} size={s.iconSize} color={resolvedIconColor} />}\n      {/* disabled일 때는 labelClass와 무관하게 disabled 색으로 덮어씀 (인라인 style이 className을 이김) */}\n      <span\n        className={cn(labelClass)}\n        style={disabled ? { color: 'var(--cmp-textLink-content-disabled)' } : undefined}\n      >\n        {label || children}\n      </span>\n      {rightArrow !== 'none' && (\n        <span className=\"inline-flex h-[16px] w-[16px] items-center justify-center\">\n          <SIcon\n            name={rightArrow === 'chevron' ? 'chevronRight' : 'caretRight'}\n            size={12}\n            color={disabled ? 'var(--cmp-textLink-icon-disabled)' : 'var(--color-grey-65)'}\n          />\n        </span>\n      )}\n    </span>\n  );\n\n  const text = (tooltipText ?? '').trim();\n  if (text === '') return link;\n\n  return (\n    <RTooltip.Provider delayDuration={200}>\n      <RTooltip.Root>\n        <RTooltip.Trigger asChild>{link}</RTooltip.Trigger>\n        <RTooltip.Portal container={portalContainer}>\n          <RTooltip.Content side=\"top\" sideOffset={4} className={cn('z-50', FLOATING_SLIDE_ANIM)}>\n            <STag shape=\"square\" size=\"xs\" color=\"grey\" label={text} />\n          </RTooltip.Content>\n        </RTooltip.Portal>\n      </RTooltip.Root>\n    </RTooltip.Provider>\n  );\n});\n","'use client';\n\nimport {\n  forwardRef,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n  type CSSProperties,\n} from 'react';\nimport * as RDropdown from '@radix-ui/react-dropdown-menu';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { useInsideModal, usePortalContainer } from '../../lib/portal-container';\nimport { sanitizeInlineHtml } from '../../lib/sanitize-inline-html';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { buttonPreset, type SButtonColor } from '../SButton/button.config';\n\nexport type SDropdownButtonSize = 'xs' | 'sm' | 'md';\n\nexport interface SDropdownButtonItem {\n  value: string | number;\n  label: string;\n  icon?: SIconName;\n  disabled?: boolean;\n}\n\nexport interface SDropdownButtonHandle {\n  /** 드롭다운 열기 (sdOpen) */\n  open: () => void;\n  /** 드롭다운 닫기 (sdClose) */\n  close: () => void;\n}\n\nexport interface SDropdownButtonProps {\n  /** 버튼 색상 */\n  color?: SButtonColor;\n  /** 아웃라인(테두리) 스타일 */\n  outline?: boolean;\n  /** 크기 (lg 미지원) */\n  size?: SDropdownButtonSize;\n  /** 버튼 레이블 */\n  label?: string;\n  /** 메뉴 아이템 목록 */\n  items?: SDropdownButtonItem[];\n  /** split 모드 — 레이블 버튼과 토글 분리 */\n  split?: boolean;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 메뉴 아이템 선택 (sdClick) */\n  onItemClick?: (value: string | number) => void;\n  /** split 레이블 버튼 클릭 (sdButtonClick) */\n  onLabelClick?: () => void;\n  /** 열림/닫힘 변경 (sdDropDownShow) */\n  onOpenChange?: (open: boolean) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n// 드롭다운 전용 치수 (sd-dropdown-button.config: DROPDOWN_BUTTON_MIN_WIDTH / size 토큰)\nconst SIZE: Record<\n  SDropdownButtonSize,\n  {\n    height: number;\n    paddingX: number;\n    gap: number;\n    arrow: number;\n    fontSize: number;\n    minWidth: number;\n    splitMinWidth: number;\n  }\n> = {\n  xs: { height: 24, paddingX: 8, gap: 6, arrow: 12, fontSize: 12, minWidth: 64, splitMinWidth: 72 },\n  sm: {\n    height: 28,\n    paddingX: 12,\n    gap: 8,\n    arrow: 12,\n    fontSize: 12,\n    minWidth: 72,\n    splitMinWidth: 88,\n  },\n  md: {\n    height: 36,\n    paddingX: 20,\n    gap: 16,\n    arrow: 16,\n    fontSize: 16,\n    minWidth: 100,\n    splitMinWidth: 106,\n  },\n};\n\n/** split 모드 구분선 색 — (color, outline) 조합별 */\nfunction splitDivider(color: SButtonColor, outline: boolean): string {\n  const solid: Record<SButtonColor, string> = {\n    primary: 'var(--cmp-button-dropdown-brand-strong-split)',\n    secondary: 'var(--cmp-button-dropdown-brand-subtle-split)',\n    neutral: 'var(--cmp-button-neutral-outline-border)',\n    danger: 'var(--cmp-button-dropdown-danger-strong-split)',\n  };\n  const outlined: Record<SButtonColor, string> = {\n    primary: 'var(--cmp-button-brand-outline-border)',\n    secondary: 'var(--cmp-button-dropdown-brand-subtle-split)',\n    neutral: 'var(--cmp-button-neutral-outline-border)',\n    danger: 'var(--cmp-button-danger-outline-border)',\n  };\n  return (outline ? outlined : solid)[color];\n}\n\n// 원본(sd-dropdown-button.config) 메뉴 토큰 소스에 맞춤:\n// default=fg.secondary / active bg=bg.accent.default / active 글자=fg.inverse / disabled=button.text.disabled\nconst itemClass = cn(\n  'flex min-h-[28px] cursor-pointer select-none items-center gap-[8px] rounded-[2px] px-[12px] py-[4px] text-[12px] leading-[20px] outline-none',\n  'text-[color:var(--sys-color-fg-secondary)]',\n  'data-[disabled]:cursor-not-allowed data-[disabled]:text-[color:var(--cmp-button-text-disabled)]',\n  'data-[highlighted]:bg-[var(--sys-color-bg-accent)] data-[highlighted]:text-[color:var(--sys-color-fg-inverse)]',\n);\n\n/**\n * SDropdownButton — sd-dropdown-button 포팅 (Radix DropdownMenu).\n * 원본처럼 자체 트리거를 렌더(sd-button 재사용 X): 드롭다운 전용 min-width + space-between 배치.\n */\nconst SDropdownButtonImpl = forwardRef<SDropdownButtonHandle, SDropdownButtonProps>(\n  function SDropdownButton(\n    {\n      color = 'primary',\n      outline = false,\n      size = 'sm',\n      label = '',\n      items = [],\n      split = false,\n      disabled = false,\n      onItemClick,\n      onLabelClick,\n      onOpenChange,\n      className,\n      style,\n    }: SDropdownButtonProps,\n    ref,\n  ) {\n    const portalContainer = usePortalContainer();\n    const insideModal = useInsideModal();\n    const [open, setOpen] = useState(false);\n    // split 모드: RDropdown.Trigger가 우측 토글 버튼에만 걸려있어 align=\"start\" 기준점 ·\n    // --radix-dropdown-menu-trigger-width 모두 토글 버튼 기준이 된다. 드롭다운을 전체\n    // 버튼(레이블+토글) 좌측·너비에 맞추기 위해 레이블 버튼 폭만큼 음수 alignOffset을 주고\n    // Content 너비를 wrapper 전체 너비로 직접 지정한다 (Radix DropdownMenu는 Popover와 달리\n    // 별도 Anchor를 지원하지 않아 이렇게 우회).\n    const splitWrapRef = useRef<HTMLDivElement>(null);\n    const splitToggleRef = useRef<HTMLButtonElement>(null);\n    const [splitAlignOffset, setSplitAlignOffset] = useState(0);\n    const [splitWidth, setSplitWidth] = useState(0);\n    useEffect(() => {\n      if (!split) return;\n      const update = () => {\n        if (splitWrapRef.current && splitToggleRef.current) {\n          setSplitAlignOffset(\n            -(splitWrapRef.current.offsetWidth - splitToggleRef.current.offsetWidth),\n          );\n          setSplitWidth(splitWrapRef.current.offsetWidth);\n        }\n      };\n      update();\n      const ro = new ResizeObserver(update);\n      ro.observe(splitWrapRef.current!);\n      return () => ro.disconnect();\n    }, [split, label]);\n    useImperativeHandle(\n      ref,\n      () => ({\n        open: () => setOpen(true),\n        close: () => setOpen(false),\n      }),\n      [],\n    );\n    const s = SIZE[size];\n    const p = buttonPreset(color, outline);\n\n    // 색상 CSS 변수 (hover 클래스가 정상 적용되도록)\n    const colorVars = {\n      '--dd-bg': disabled ? 'var(--cmp-button-bg-disabled)' : p.bg,\n      '--dd-bg-hover': p.bgHover,\n      '--dd-border': disabled ? 'var(--cmp-button-border-disabled)' : p.border,\n      '--dd-text': disabled ? 'var(--cmp-button-text-disabled)' : p.text,\n      '--dd-icon': disabled ? 'var(--cmp-button-icon-disabled)' : p.icon,\n    } as CSSProperties;\n\n    // non-split: caretDown (열림 시 회전) / split: etc 아이콘 고정 (회전 X)\n    const caret = (\n      <SIcon\n        name=\"caretDown\"\n        size={s.arrow}\n        color=\"var(--dd-icon)\"\n        className={cn('transition-transform', open && 'rotate-180')}\n      />\n    );\n    const splitIcon = <SIcon name=\"etc\" size={s.arrow} color=\"var(--dd-icon)\" />;\n\n    const triggerBase = cn(\n      'box-border inline-flex items-center whitespace-nowrap border border-solid outline-none transition-colors',\n      'border-[color:var(--dd-border)] bg-[var(--dd-bg)] text-[color:var(--dd-text)]',\n      disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-[var(--dd-bg-hover)]',\n    );\n\n    const menu = (\n      <RDropdown.Portal container={portalContainer}>\n        <RDropdown.Content\n          sideOffset={4}\n          align=\"start\"\n          alignOffset={split ? splitAlignOffset : 0}\n          className={cn(\n            'z-50 overflow-hidden rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] shadow-normal-sm',\n            !split && 'min-w-[var(--radix-dropdown-menu-trigger-width)]',\n            FLOATING_SLIDE_ANIM,\n          )}\n          style={split ? { minWidth: splitWidth } : undefined}\n        >\n          {items.map(it => (\n            <RDropdown.Item\n              key={it.value}\n              disabled={it.disabled}\n              onSelect={() => onItemClick?.(it.value)}\n              className={itemClass}\n            >\n              {it.icon && <SIcon name={it.icon} size={12} />}\n              {/* 원본 sd-dropdown-button: label 을 살균 후 innerHTML 로 렌더 */}\n              <span\n                className=\"min-w-0 whitespace-nowrap\"\n                dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(it.label) }}\n              />\n            </RDropdown.Item>\n          ))}\n        </RDropdown.Content>\n      </RDropdown.Portal>\n    );\n\n    return (\n      <RDropdown.Root\n        // Radix DropdownMenu 는 기본이 modal 이라 열려 있는 동안 body 와 (모달 안이라면)\n        // Dialog Content 까지 pointer-events:none 이 된다. 그러면 모달 안의 다른 컨트롤을\n        // 누를 때 히트테스트가 그 아래 백드롭으로 내려가, 메뉴만 닫히는 게 아니라 백드롭\n        // 클릭으로 처리돼 persistent 모달이 흔들리고 누른 컨트롤은 열리지도 않는다.\n        // 모달 안에서는 모달이 이미 모달리티를 갖고 있으므로 메뉴는 non-modal 로 둔다.\n        modal={!insideModal}\n        open={open}\n        onOpenChange={o => {\n          setOpen(o);\n          onOpenChange?.(o);\n        }}\n      >\n        {split ? (\n          <div\n            ref={splitWrapRef}\n            className={cn('inline-flex items-stretch', className)}\n            style={{ minWidth: s.splitMinWidth, ...style }}\n          >\n            {/* 레이블 파트 (flex-1 로 컨테이너 min-width 채움) */}\n            <button\n              type=\"button\"\n              disabled={disabled}\n              onClick={onLabelClick}\n              className={cn(triggerBase, 'flex-1 justify-center rounded-l-[4px] border-r-0')}\n              style={{\n                minHeight: s.height,\n                padding: `0 ${s.paddingX}px`,\n                fontSize: s.fontSize,\n                ...colorVars,\n              }}\n            >\n              {label}\n            </button>\n            {/* 토글(화살표) 파트 — 좌측 보더 하나만 divider (label은 우측 보더 제거) */}\n            <RDropdown.Trigger asChild>\n              <button\n                ref={splitToggleRef}\n                type=\"button\"\n                disabled={disabled}\n                aria-label=\"메뉴 열기\"\n                className={cn(triggerBase, 'justify-center rounded-r-[4px] border-l')}\n                style={{\n                  minHeight: s.height,\n                  minWidth: s.height,\n                  borderLeftColor: disabled\n                    ? 'var(--cmp-button-border-disabled)'\n                    : splitDivider(color, outline),\n                  ...colorVars,\n                }}\n              >\n                {splitIcon}\n              </button>\n            </RDropdown.Trigger>\n          </div>\n        ) : (\n          <RDropdown.Trigger asChild>\n            <button\n              type=\"button\"\n              disabled={disabled}\n              className={cn(triggerBase, 'justify-between rounded-[4px]', className)}\n              // 라벨은 남은 폭을 채워 가운데 정렬 / 화살표는 우측 고정 + 드롭다운 전용 min-width\n              style={{\n                minWidth: s.minWidth,\n                minHeight: s.height,\n                padding: `0 ${s.paddingX}px`,\n                gap: s.gap,\n                fontSize: s.fontSize,\n                ...colorVars,\n                ...style,\n              }}\n            >\n              <span className=\"flex-1 truncate text-center\">{label}</span>\n              {caret}\n            </button>\n          </RDropdown.Trigger>\n        )}\n        {menu}\n      </RDropdown.Root>\n    );\n  },\n);\n\nexport const SDropdownButton = withDisplayName(SDropdownButtonImpl, 'SDropdownButton');\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport * as RSwitch from '@radix-ui/react-switch';\nimport { cn } from '../../lib/cn';\n\nexport interface SSwitchProps {\n  /** on/off 상태 */\n  value?: boolean;\n  /** 스위치 좌측 라벨 */\n  leftLabel?: string;\n  /** 스위치 우측 라벨 */\n  rightLabel?: string;\n  /** @deprecated `rightLabel` 사용. 우측 라벨(하위호환) */\n  label?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 변경 (sdUpdate) */\n  onValueChange?: (value: boolean) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SSwitch — sd-switch 포팅 (Radix SSwitch). 32×20 트랙, 16 노브. 좌/우 라벨 지원. */\nexport function SSwitch({\n  value = false,\n  leftLabel,\n  rightLabel,\n  label,\n  disabled = false,\n  onValueChange,\n  className,\n  style,\n}: SSwitchProps) {\n  // label(deprecated)은 rightLabel 로 흡수\n  const right = rightLabel ?? label;\n  // 원본 sd-switch: 라벨에 색 토큰 없음 → 색은 상속(별도 지정 안 함)\n  const renderLabel = (text?: string) =>\n    text ? <span className=\"text-[12px] font-medium leading-[20px]\">{text}</span> : null;\n  const trackBg = disabled\n    ? value\n      ? 'var(--cmp-switch-bg-disabled-on)'\n      : 'var(--cmp-switch-bg-disabled-off)'\n    : value\n      ? 'var(--cmp-switch-bg-on)'\n      : 'var(--cmp-switch-bg-off)';\n\n  return (\n    <label\n      className={cn(\n        'inline-flex items-center gap-[6px]',\n        disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        className,\n      )}\n      style={style}\n    >\n      {renderLabel(leftLabel)}\n      <RSwitch.Root\n        checked={value}\n        disabled={disabled}\n        onCheckedChange={v => onValueChange?.(v)}\n        className={cn(\n          'relative h-[20px] w-[32px] flex-shrink-0 rounded-full p-[2px] outline-none transition-colors duration-200',\n          disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        )}\n        style={{ background: trackBg }}\n      >\n        <RSwitch.Thumb\n          className=\"block h-[16px] w-[16px] rounded-full shadow-[0_2px_4px_rgba(0,0,0,0.16)] transition-transform duration-200 data-[state=checked]:translate-x-[12px]\"\n          style={{\n            background: disabled\n              ? 'var(--cmp-switch-knob-disabled)'\n              : 'var(--cmp-switch-knob-default)',\n          }}\n        />\n      </RSwitch.Root>\n      {renderLabel(right)}\n    </label>\n  );\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SToggleProps {\n  /** 선택(on/off) 상태 */\n  value?: boolean;\n  /** 라벨 */\n  label?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 변경 (sdUpdate) */\n  onValueChange?: (value: boolean) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SToggle — sd-toggle 포팅. 알약형 토글 버튼.\n * default(흰 배경/회색), hover(파란 채움), select(흰 배경/파란 테두리·글자), disabled.\n */\nexport function SToggle({\n  value = false,\n  label = '',\n  disabled = false,\n  onValueChange,\n  className,\n  style,\n}: SToggleProps) {\n  const border = disabled\n    ? 'var(--cmp-toggle-border-disabled)'\n    : value\n      ? 'var(--cmp-toggle-border-select)'\n      : 'var(--cmp-toggle-border-default)';\n  const bg = disabled\n    ? 'var(--cmp-toggle-bg-disabled)'\n    : value\n      ? 'var(--cmp-toggle-bg-select)'\n      : 'var(--cmp-toggle-bg-default)';\n  const content = disabled\n    ? 'var(--cmp-toggle-content-disabled)'\n    : value\n      ? 'var(--cmp-toggle-content-select)'\n      : 'var(--cmp-toggle-content-default)';\n\n  return (\n    <button\n      type=\"button\"\n      disabled={disabled}\n      aria-pressed={value}\n      onClick={() => !disabled && onValueChange?.(!value)}\n      className={cn(\n        'box-border inline-flex h-[28px] items-center justify-center whitespace-nowrap rounded-full border border-solid px-[12px] text-[14px] font-medium leading-[24px] transition-colors',\n        disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        // 미선택(off) hover 시 파란 채움 + 흰 글자\n        !disabled &&\n          !value &&\n          'hover:!bg-[var(--cmp-toggle-bg-hover)] hover:!text-[color:var(--cmp-toggle-content-hover)] hover:!border-[color:var(--cmp-toggle-bg-hover)]',\n        className,\n      )}\n      style={{ background: bg, borderColor: border, color: content, ...style } as CSSProperties}\n    >\n      {label}\n    </button>\n  );\n}\n","'use client';\n\nimport { useState, type ReactNode, type CSSProperties } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { type SColor } from '../../lib/color';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SGhostButton } from '../SGhostButton';\nimport { SButton, type SButtonColor } from '../SButton';\nimport { STextLink } from '../STextLink';\n\nexport type SPopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\n/** 색상 타입 — default: 다크 배경 / danger·warning·accent: 라이트 배경 (component.popover 토큰) */\nexport type SPopoverType = 'default' | 'danger' | 'warning' | 'accent';\n\n// 하단 우측 버튼 스타일은 type 별 고정 (default/accent=primary solid, danger=danger outline, warning=neutral outline)\nconst BUTTON_PRESET: Record<SPopoverType, { color: SButtonColor; outline: boolean }> = {\n  default: { color: 'primary', outline: false },\n  accent: { color: 'primary', outline: false },\n  danger: { color: 'danger', outline: true },\n  warning: { color: 'neutral', outline: true },\n};\n\nexport interface SPopoverProps {\n  /** 표시 여부 (제어). onOpenChange 와 함께 사용 */\n  open?: boolean;\n  /** 기본 표시 여부 (비제어) */\n  defaultOpen?: boolean;\n  /** 표시 상태 변경 (sdShowChange) */\n  onOpenChange?: (open: boolean) => void;\n  /** 표시 방향 */\n  placement?: SPopoverPlacement;\n  /** 색상 타입 (default: 다크 / danger·warning·accent: 라이트 배경) */\n  type?: SPopoverType;\n  /** 메뉴 제목 (필수) */\n  menuTitle: string;\n  /** 제목 좌측 아이콘 (선택) */\n  titleIcon?: SIconName;\n  /** 본문 내용 */\n  children?: ReactNode;\n  /** 커스텀 트리거. 없으면 아이콘 트리거 렌더 */\n  trigger?: ReactNode;\n  /** 기본(아이콘) 트리거 설정 */\n  icon?: SIconName;\n  iconSize?: number;\n  /** 트리거 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */\n  color?: SColor;\n  /** 하단 좌측 링크 레이블 (선택). 스타일은 chevron 링크로 고정 */\n  leftLinkLabel?: string;\n  /** 하단 좌측 링크 클릭 */\n  onLeftLinkClick?: () => void;\n  /** 하단 우측 버튼 레이블 (필수). 색상/스타일은 type 별로 고정 */\n  buttonLabel: string;\n  /** 하단 우측 버튼 클릭 */\n  onButtonClick?: () => void;\n  ariaLabel?: string;\n  menuClassName?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SPopover — sd-popover 포팅 (Radix SPopover 기반).\n * 아이콘/커스텀 트리거, menuTitle, 본문, 하단 leftLink(STextLink)+button(SButton) 푸터.\n * 색상은 `--cmp-popover-default-*` 토큰(다크 배경).\n */\nexport function SPopover({\n  open,\n  defaultOpen,\n  onOpenChange,\n  placement = 'bottom',\n  type = 'default',\n  menuTitle,\n  titleIcon,\n  children,\n  trigger,\n  icon = 'helpOutline',\n  iconSize = 12,\n  color = '#01BB4B',\n  leftLinkLabel,\n  onLeftLinkClick,\n  buttonLabel,\n  onButtonClick,\n  ariaLabel,\n  menuClassName,\n  style,\n}: SPopoverProps) {\n  const portalContainer = usePortalContainer();\n  // controlled(open)/uncontrolled(defaultOpen) 하이브리드 — close 버튼에서 setOpen 호출용\n  const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n  const isControlled = open !== undefined;\n  const actualOpen = isControlled ? open : internalOpen;\n  const setOpen = (next: boolean) => {\n    if (!isControlled) setInternalOpen(next);\n    onOpenChange?.(next);\n  };\n  // 하단 우측 버튼은 필수 → 푸터 항상 렌더. 좌측 링크는 선택.\n  const btnPreset = BUTTON_PRESET[type];\n  const bg = `var(--cmp-popover-${type}-bg)`;\n  const titleColor = `var(--cmp-popover-${type}-title)`;\n  // danger·warning·accent 는 라이트 배경 → light 토큰의 description(어두운 글자) 사용\n  const descColor =\n    type === 'default'\n      ? 'var(--cmp-popover-default-description)'\n      : 'var(--cmp-popover-light-description)';\n  // 좌측 링크 텍스트 색: default=subAction(#D8D8D8, 다크배경용) / 그 외=light subAction(#888888)\n  const leftLinkLabelClass =\n    type === 'default'\n      ? 'text-[color:var(--cmp-popover-default-subAction)]'\n      : 'text-[color:var(--cmp-popover-light-subAction)]';\n\n  const triggerNode = trigger ?? (\n    <span className=\"inline-flex cursor-pointer\" aria-label={ariaLabel}>\n      <SIcon name={icon} size={iconSize} color={color} />\n    </span>\n  );\n\n  return (\n    <RPopover.Root open={actualOpen} onOpenChange={setOpen}>\n      <RPopover.Trigger asChild>{triggerNode}</RPopover.Trigger>\n      <RPopover.Portal container={portalContainer}>\n        <RPopover.Content\n          side={placement}\n          sideOffset={8}\n          className={cn(\n            // 닫기 버튼이 항상 있으므로 우측은 close clearance(36px) 로 고정\n            'relative z-50 flex min-w-[160px] flex-col gap-[var(--cmp-popover-gap)] rounded-[var(--cmp-popover-radius)] py-[var(--cmp-popover-paddingY)] px-[var(--cmp-popover-paddingX)] text-[12px] leading-[20px] shadow-normal-sm',\n            FLOATING_SLIDE_ANIM,\n            menuClassName,\n          )}\n          style={{ background: bg, color: descColor, ...style }}\n        >\n          {/* 닫기 — SGhostButton (다크 배경 default=inverse 흰색 / 라이트 배경=default 회색) */}\n          <SGhostButton\n            icon=\"close\"\n            size=\"xs\"\n            ariaLabel=\"닫기\"\n            onClick={() => setOpen(false)}\n            className=\"absolute right-[12px] top-[12px]\"\n          />\n          {(menuTitle || children) && (\n            <div className=\"flex min-w-0 flex-col gap-[var(--cmp-popover-contents-gap)]\">\n              {menuTitle && (\n                <div\n                  className=\"flex items-center gap-[var(--cmp-popover-title-gap)] text-[14px] font-bold leading-[24px]\"\n                  style={{ color: titleColor }}\n                >\n                  {titleIcon && <SIcon name={titleIcon} size={16} color={titleColor} />}\n                  <span className=\"min-w-0\">{menuTitle}</span>\n                </div>\n              )}\n              {children && <div className=\"min-w-0\">{children}</div>}\n            </div>\n          )}\n          <div\n            className={cn('flex items-center', leftLinkLabel ? 'justify-between' : 'justify-end')}\n          >\n            {/* 좌측 링크: 레이블만 받고 스타일은 chevron 링크로 고정 */}\n            {leftLinkLabel && (\n              <STextLink\n                label={leftLinkLabel}\n                labelClass={leftLinkLabelClass}\n                onClick={onLeftLinkClick}\n              />\n            )}\n            {/* 우측 버튼: 레이블만 받고 color/outline 은 type 별 고정 */}\n            <SButton\n              color={btnPreset.color}\n              outline={btnPreset.outline}\n              size=\"xs\"\n              onClick={onButtonClick}\n              label={buttonLabel}\n            />\n          </div>\n          <RPopover.Arrow width={16} height={12} style={{ fill: bg }} />\n        </RPopover.Content>\n      </RPopover.Portal>\n    </RPopover.Root>\n  );\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode, type RefObject } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\n\nexport type SPortalPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type SPortalAlign = 'start' | 'center' | 'end';\n\n/** Radix Anchor 가 위치 계산에 쓰는 최소 인터페이스 (HTMLElement 가 충족한다). */\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\nexport interface SPortalProps {\n  /** 표시 여부 (제어). onClose 와 함께 사용한다. */\n  open: boolean;\n  /** 외부 클릭 · ESC 등으로 닫힘이 요청될 때 (sd-portal `sdClose` 대응). */\n  onClose?: () => void;\n  /** 열림/닫힘 변경 전체 콜백 (선택). */\n  onOpenChange?: (open: boolean) => void;\n  /**\n   * 위치 기준이 되는 앵커 엘리먼트 ref (sd-portal `parentRef` 대응).\n   * 트리거 버튼 등에 그대로 걸면 그 엘리먼트에 붙어서 뜬다.\n   */\n  anchorRef: RefObject<HTMLElement | null>;\n  /** 표시 방향 (공간이 부족하면 자동으로 반대 방향으로 전환). */\n  placement?: SPortalPlacement;\n  /** 교차축 정렬 (start·center·end). */\n  align?: SPortalAlign;\n  /** 앵커로부터의 간격 px (sd-portal offset[1]). */\n  offset?: number;\n  /** 정렬축 오프셋 px (sd-portal offset[0]). */\n  alignOffset?: number;\n  /** 앵커 너비에 맞춰 최소 너비를 잡는다. */\n  fit?: boolean;\n  /** 콘텐츠 최대 높이 px. 넘치면 세로 스크롤. */\n  maxHeight?: number;\n  /** 콘텐츠 내부를 클릭하면 자동으로 닫는다. */\n  autoClose?: boolean;\n  /** 외부 클릭 · ESC 로 닫히지 않게 한다. */\n  persistent?: boolean;\n  /** 뷰포트 경계 여백 px (충돌 회피 패딩). */\n  viewportPadding?: number;\n  /** 열릴 때 포커스 이동 처리 (기본은 Radix가 콘텐츠로 포커스를 옮김). e.preventDefault()로 막을 수 있다. */\n  onOpenAutoFocus?: (event: Event) => void;\n  /** 닫힐 때 포커스 복귀 처리 (기본은 Radix가 앵커로 포커스를 되돌림). e.preventDefault()로 막을 수 있다. */\n  onCloseAutoFocus?: (event: Event) => void;\n  /** 바깥 영역 pointerdown 으로 닫힘이 시작될 때 (앵커 위 클릭·persistent 는 제외). */\n  onPointerDownOutside?: (event: Event) => void;\n  /** 본문 내용 (콘텐츠 자유). */\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n  ariaLabel?: string;\n}\n\n/**\n * SPortal — sd-portal/sd-floating-portal 의 사용성을 Radix Popover 로 옮긴 범용 앵커드 플로팅 컨테이너.\n *\n * 트리거를 감싸지 않고 `anchorRef` 로 임의의 엘리먼트에 붙는다(=sd-portal `parentRef`).\n * open/onClose 로 외부에서 제어하며, flip·collision·스크롤 재배치·외부클릭·ESC·모달 포털은\n * Radix 가 처리한다. 콘텐츠는 children 으로 완전히 자유롭다.\n */\nexport function SPortal({\n  open,\n  onClose,\n  onOpenChange,\n  anchorRef,\n  placement = 'bottom',\n  align = 'start',\n  offset = 4,\n  alignOffset = 0,\n  fit = false,\n  maxHeight,\n  autoClose = false,\n  persistent = false,\n  viewportPadding = 0,\n  onOpenAutoFocus,\n  onCloseAutoFocus,\n  onPointerDownOutside,\n  children,\n  className,\n  style,\n  ariaLabel,\n}: SPortalProps) {\n  const portalContainer = usePortalContainer();\n\n  return (\n    <RPopover.Root\n      open={open}\n      onOpenChange={next => {\n        onOpenChange?.(next);\n        if (!next) onClose?.();\n      }}\n    >\n      <RPopover.Anchor virtualRef={anchorRef as RefObject<Measurable>} />\n      <RPopover.Portal container={portalContainer}>\n        <RPopover.Content\n          side={placement}\n          align={align}\n          sideOffset={offset}\n          alignOffset={alignOffset}\n          collisionPadding={viewportPadding}\n          aria-label={ariaLabel}\n          // persistent: 외부 클릭·ESC 로 닫히지 않음\n          // 아니면: 앵커(트리거) 위 클릭은 소비자가 토글하므로 여기서 닫지 않는다(중복 토글 방지)\n          onPointerDownOutside={e => {\n            if (persistent || anchorRef.current?.contains(e.target as Node)) {\n              e.preventDefault();\n              return;\n            }\n            onPointerDownOutside?.(e);\n          }}\n          // 앵커(예: input)에 이미 포커스가 있는 상태로 열리는 경우(클릭 즉시 오픈), Radix는 포커스가\n          // 레이어 밖에 있다고 판단해 열리자마자 닫아버린다 — 앵커 내부 포커스는 outside로 취급하지 않는다.\n          onFocusOutside={e => {\n            if (persistent || anchorRef.current?.contains(e.target as Node)) {\n              e.preventDefault();\n            }\n          }}\n          onEscapeKeyDown={persistent ? e => e.preventDefault() : undefined}\n          onOpenAutoFocus={onOpenAutoFocus}\n          onCloseAutoFocus={onCloseAutoFocus}\n          onClick={autoClose ? () => onClose?.() : undefined}\n          className={cn(\n            'z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm',\n            maxHeight != null && 'overflow-y-auto',\n            fit && 'min-w-(--radix-popover-trigger-width)',\n            FLOATING_SLIDE_ANIM,\n            className,\n          )}\n          style={{ maxHeight, ...style }}\n        >\n          {children}\n        </RPopover.Content>\n      </RPopover.Portal>\n    </RPopover.Root>\n  );\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SButton, type SButtonColor, type SButtonSize } from '../SButton';\n\nexport type SFooterBg = 'white' | 'grey';\n\nexport interface SFooterButton {\n  label?: string;\n  color?: SButtonColor;\n  outline?: boolean;\n  size?: SButtonSize;\n  disabled?: boolean;\n  onClick?: () => void;\n}\n\n/**\n * @internal\n * 모달·드로어·팝업 하단 영역 공통 props.\n */\nexport interface SFooterProps {\n  /** 배경색 */\n  bg?: SFooterBg;\n  /** footer 좌측 slot */\n  left?: ReactNode;\n  /** footer 좌측 slot. left와 함께 쓰면 left 뒤에 렌더된다 */\n  children?: ReactNode;\n  /** 우측 기본 액션 버튼 */\n  button?: SFooterButton;\n  className?: string;\n  leftClassName?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SFooter — overlay 계열 내부 전용 footer.\n *\n * @internal\n * SActionModal/SConfirmModal/SDrawer/SPopup 의 하단 액션 영역만 공통화한다.\n * 패키지 public export 에 추가하지 말 것.\n */\nexport function SFooter({\n  bg = 'white',\n  left,\n  button,\n  children,\n  className,\n  leftClassName,\n  style,\n}: SFooterProps) {\n  const isGrey = bg === 'grey';\n  const hasSlot = left != null || children != null;\n  const hasButton = button != null;\n\n  return (\n    <footer\n      className={cn(\n        'relative flex w-full flex-shrink-0 items-center justify-end gap-[var(--cmp-overlay-footer-gap)] overflow-hidden px-[var(--cmp-overlay-footer-paddingX)] py-[var(--cmp-overlay-footer-paddingY)]',\n        isGrey\n          ? 'bg-[var(--cmp-overlay-footer-bg-neutral)] border-t border-solid border-[color:var(--sys-color-border-default)]'\n          : 'bg-[var(--cmp-overlay-footer-bg-default)] shadow-[var(--shadow-spread-md)]',\n        className,\n      )}\n      style={style}\n    >\n      {hasSlot && (\n        <div\n          className={cn('flex min-w-px flex-[1_0_0] items-center justify-between', leftClassName)}\n        >\n          {left}\n          {children}\n        </div>\n      )}\n      {hasButton && (\n        <SButton\n          color={button.color ?? 'primary'}\n          outline={button.outline}\n          size={button.size ?? 'md'}\n          disabled={button.disabled}\n          onClick={() => button.onClick?.()}\n          label={button.label ?? '확인'}\n        />\n      )}\n    </footer>\n  );\n}\n","import { forwardRef, type ReactNode, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n  SCROLLBAR_CLASS,\n  SCROLLBAR_TRACK_BG_CLASS,\n  SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport { type SButtonColor, type SButtonSize } from '../SButton';\nimport { SFooter } from '../SFooter';\n\nexport type SPopupType = 'default' | 'light';\n\nexport interface SPopupSubmitButton {\n  label?: string;\n  color?: SButtonColor;\n  outline?: boolean;\n  size?: SButtonSize;\n}\n\nexport interface SPopupProps {\n  /** 헤더 제목 */\n  popupTitle?: string;\n  /** 타입 (헤더 색상) */\n  type?: SPopupType;\n  /** 하단 footer 표시 여부 */\n  useFooter?: boolean;\n  /** 확인 버튼 설정 */\n  submitButton?: SPopupSubmitButton;\n  /** 확인 버튼 클릭 (sdSubmit) */\n  onSubmit?: () => void;\n  /** footer 좌측 영역 */\n  footerLeft?: ReactNode;\n  /** 본문 기본 패딩을 없앱니다. 표를 가장자리까지 채우는 등 본문이 직접 여백을 다룰 때만 사용합니다. */\n  noPadding?: boolean;\n  /** 본문 */\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SPopup — sd-popup 포팅. 헤더(제목)+본문(children)+푸터(확인 버튼) 패널.\n * 헤더 색상은 type(default/inverse), 색은 `--sys-color-*` 토큰.\n */\nexport const SPopup = forwardRef<HTMLDivElement, SPopupProps>(function SPopup(\n  {\n    popupTitle = '',\n    type = 'default',\n    useFooter = false,\n    submitButton,\n    onSubmit,\n    footerLeft,\n    noPadding = false,\n    children,\n    className,\n    style,\n  },\n  ref,\n) {\n  const isLight = type === 'light';\n  const headerBg = isLight\n    ? 'var(--cmp-popup-header-bg-inverse)'\n    : 'var(--cmp-popup-header-bg-default)';\n  const headerColor = isLight\n    ? 'var(--cmp-popup-header-title-inverse)'\n    : 'var(--cmp-popup-header-title-default)';\n\n  return (\n    <div\n      ref={ref}\n      className={cn('flex h-full w-full flex-col overflow-hidden', className)}\n      style={{ background: 'var(--cmp-popup-bg)', ...style }}\n    >\n      <header\n        className=\"flex h-[50px] w-full flex-shrink-0 items-center justify-center px-(--cmp-popup-header-paddingX) py-(--cmp-popup-header-paddingY)\"\n        style={{ background: headerBg }}\n      >\n        <h2\n          className=\"typo-heading-lg m-0 overflow-hidden text-ellipsis whitespace-nowrap text-center\"\n          style={{ color: headerColor }}\n        >\n          {popupTitle}\n        </h2>\n      </header>\n\n      {/* 본문: 스크롤 영역. 안쪽 여백은 토큰이 정한다 — noPadding 이면 콘텐츠가 직접 담당한다 */}\n      <main\n        className={cn(\n          'box-border min-h-0 flex-1 overflow-auto',\n          !noPadding && 'p-(--sys-space-panel-padding-default)',\n          SCROLLBAR_CLASS,\n          SCROLLBAR_TRACK_BG_CLASS,\n          SCROLLBAR_TRACK_BORDER_CLASS,\n        )}\n      >\n        {children}\n      </main>\n\n      {useFooter && <SFooter left={footerLeft} button={{ ...submitButton, onClick: onSubmit }} />}\n    </div>\n  );\n});\n","'use client';\n\nimport { useState, type CSSProperties } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { SIcon } from '../SIcon';\nimport { SGhostButton } from '../SGhostButton';\nimport { sanitizeInlineHtml } from '../../lib/sanitize-inline-html';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\n\nexport type SGuideType = 'tip' | 'notion';\n\n/** 중첩 배열로 depth 표현 (원본 renderListItem 대응). 예: ['상위', ['하위1', '하위2']] */\nexport type SGuideMessage = string | SGuideMessage[];\n\nconst DEFAULT_LABEL: Record<SGuideType, string> = { tip: '활용 TIP', notion: '사용법 안내' };\nconst ICON: Record<SGuideType, 'helpOutline' | 'notion'> = { tip: 'helpOutline', notion: 'notion' };\n\n/** 중첩 메시지를 depth가 매겨진 평면 목록으로 변환 (원본 renderListItem: 배열이면 depth+1) */\nfunction flattenMessages(message: SGuideMessage, depth = 0): { text: string; depth: number }[] {\n  if (Array.isArray(message)) return message.flatMap(m => flattenMessages(m, depth + 1));\n  return message !== '' ? [{ text: message, depth }] : [];\n}\n\nexport interface SGuideProps {\n  /** 가이드 타입 (tip: 팝업, notion: 외부 링크) */\n  type?: SGuideType;\n  /** 버튼 레이블 (없으면 type 기본값) */\n  label?: string;\n  /** 팝업 메시지 (배열이면 리스트, 중첩 배열이면 depth 표현) */\n  message?: SGuideMessage;\n  /** notion 타입 클릭 시 이동 URL */\n  url?: string;\n  /** 팝업 제목 (없으면 type 기본값) */\n  popupTitle?: string;\n  /** 팝업 너비 (px, 기본 426) */\n  popupWidth?: number;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SGuide — sd-guide 포팅. tip=팝업 안내, notion=외부 링크. */\nexport function SGuide({\n  type = 'tip',\n  label = '',\n  message = '',\n  url = '',\n  popupTitle = '',\n  popupWidth,\n  className,\n  style,\n}: SGuideProps) {\n  const [open, setOpen] = useState(false);\n  const portalContainer = usePortalContainer();\n  const isNotion = type === 'notion';\n  const defaultLabel = DEFAULT_LABEL[type];\n  const iconName = ICON[type];\n  const messages = flattenMessages(message);\n\n  // 원본 커스텀 pill 버튼 (표준 SButton 아님): active(팝업 열림) 시 tip=초록/notion=파랑 배경\n  const active = open;\n  const activeBg =\n    type === 'tip' ? 'var(--cmp-guide-button-bg-tip)' : 'var(--cmp-guide-button-bg-notion)';\n  const iconColor = active\n    ? 'var(--cmp-guide-button-icon-active)'\n    : type === 'tip'\n      ? 'var(--cmp-guide-button-icon-default)'\n      : 'var(--sys-color-fg-primary)';\n\n  const trigger = (\n    <button\n      type=\"button\"\n      onClick={() => {\n        if (isNotion) {\n          if (url !== '') window.open(url, '_blank', 'noopener,noreferrer');\n          return;\n        }\n        setOpen(o => !o);\n      }}\n      className=\"inline-flex h-[var(--cmp-guide-button-height)] cursor-pointer items-center gap-[var(--cmp-guide-button-gap)] whitespace-nowrap rounded-[var(--cmp-guide-button-radius)] border-[length:var(--cmp-guide-button-border-width)] border-solid px-[var(--cmp-guide-button-paddingX)] text-[12px] font-medium leading-[20px] transition-colors\"\n      style={{\n        borderColor: active ? activeBg : 'var(--cmp-guide-button-border-default)',\n        background: active ? activeBg : 'var(--cmp-guide-button-bg-default)',\n        color: active\n          ? 'var(--cmp-guide-button-text-active)'\n          : 'var(--cmp-guide-button-text-default)',\n      }}\n    >\n      <SIcon name={iconName} size={16} color={iconColor} />\n      {label || defaultLabel}\n    </button>\n  );\n\n  // notion 타입은 팝업 없이 링크만\n  if (isNotion)\n    return (\n      <span className={className} style={style}>\n        {trigger}\n      </span>\n    );\n\n  return (\n    <RPopover.Root open={open} onOpenChange={setOpen}>\n      <RPopover.Trigger asChild>{trigger}</RPopover.Trigger>\n      <RPopover.Portal container={portalContainer}>\n        <RPopover.Content\n          side=\"bottom\"\n          align=\"start\"\n          sideOffset={4}\n          className={cn(\n            'relative z-50 rounded-[var(--cmp-guide-contents-radius)] bg-[var(--color-white)]',\n            FLOATING_SLIDE_ANIM,\n          )}\n          style={{\n            width: popupWidth != null ? popupWidth : 426,\n            padding: 'var(--cmp-guide-contents-paddingY) var(--cmp-guide-contents-paddingX)',\n            boxShadow: '4px 4px 24px 4px rgba(0,0,0,0.1)',\n          }}\n        >\n          <div className=\"absolute right-[12px] top-[12px]\">\n            <SGhostButton icon=\"close\" size=\"sm\" ariaLabel=\"close\" onClick={() => setOpen(false)} />\n          </div>\n          <div className=\"flex items-center gap-[var(--cmp-guide-contents-title-gap)]\">\n            <SIcon\n              name={iconName}\n              size={24}\n              color={isNotion ? 'var(--sys-color-fg-primary)' : 'var(--cmp-guide-contents-icon)'}\n            />\n            <h3 className=\"m-0 text-[16px] font-bold leading-[26px] text-[color:var(--cmp-guide-contents-typography-color)]\">\n              {popupTitle || defaultLabel}\n            </h3>\n          </div>\n          {/* 원본 sd-guide: '-' 커스텀 불릿(::before) + <p> innerHTML. depth-2 는 '•' + 들여쓰기 */}\n          <ul className=\"m-0 mt-[var(--cmp-guide-contents-gap)] flex w-full list-none flex-col gap-[var(--cmp-guide-contents-body-gap)] p-0 text-[12px] leading-[20px] text-[color:var(--cmp-guide-contents-typography-color)]\">\n            {messages.map((m, i) => (\n              <li\n                key={i}\n                className={cn(\n                  'flex w-full items-start before:ml-[10px] before:mr-[12px] before:block before:w-[6px] before:flex-shrink-0',\n                  m.depth >= 2\n                    ? \"pl-(--cmp-guide-contents-depth-paddingLeft) before:content-['•']\"\n                    : \"before:content-['-']\",\n                )}\n              >\n                <p\n                  className=\"m-0 w-full min-w-0 break-words\"\n                  dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(m.text) }}\n                />\n              </li>\n            ))}\n          </ul>\n        </RPopover.Content>\n      </RPopover.Portal>\n    </RPopover.Root>\n  );\n}\n","import { Z_INDEX } from './z-index';\n\n/** 모달 전체가 공유하는 전역 stacking context. Toast/Loading은 이 Host보다 위에 둔다. */\nexport const MODAL_HOST_Z_INDEX = Z_INDEX.modalHost;\nconst MODAL_HOST_ATTRIBUTE = 'data-s-modal-host';\n\ntype ModalStackEntry = {\n  id: number;\n  layerIndex: number;\n};\n\nlet nextId = 0;\nlet nextLayerIndex = 0;\nconst entries: ModalStackEntry[] = [];\n\n/**\n * 모든 모달 Portal이 공유하는 DOM Host를 반환한다.\n * Host 자체만 전역 z-index를 가지며, 모달 깊이는 Host 내부에서만 관리한다.\n */\nexport function getModalHost(): HTMLElement | undefined {\n  if (typeof document === 'undefined' || !document.body) return undefined;\n\n  const existing = document.body.querySelector<HTMLElement>(`[${MODAL_HOST_ATTRIBUTE}]`);\n  if (existing) return existing;\n\n  const host = document.createElement('div');\n  host.setAttribute(MODAL_HOST_ATTRIBUTE, '');\n  Object.assign(host.style, {\n    position: 'fixed',\n    inset: '0',\n    zIndex: String(MODAL_HOST_Z_INDEX),\n    pointerEvents: 'none',\n  });\n  document.body.appendChild(host);\n  return host;\n}\n\nexport function registerModalStackEntry(): {\n  layerIndex: number;\n  isTop: () => boolean;\n  unregister: () => void;\n} {\n  const entry: ModalStackEntry = {\n    id: ++nextId,\n    layerIndex: nextLayerIndex++,\n  };\n  entries.push(entry);\n\n  let registered = true;\n  return {\n    layerIndex: entry.layerIndex,\n    isTop: () => entries[entries.length - 1] === entry,\n    unregister: () => {\n      if (!registered) return;\n      registered = false;\n      const index = entries.indexOf(entry);\n      if (index !== -1) entries.splice(index, 1);\n    },\n  };\n}\n","'use client';\n\nimport {\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  type ReactNode,\n  type CSSProperties,\n} from 'react';\nimport * as RDialog from '@radix-ui/react-dialog';\nimport { cn } from '../../lib/cn';\nimport { isFromGlobalOverlay } from '../../lib/global-overlay';\nimport { getModalHost, registerModalStackEntry } from '../../lib/modal-stack';\nimport { InsideModalProvider, PortalContainerProvider } from '../../lib/portal-container';\nimport { SGhostButton } from '../SGhostButton';\n\n/**\n * @internal\n * 내부 전용 타입. 소비자에게 노출되지 않으며(패키지 barrel export 제외),\n * SConfirmModal/SActionModal/SLoadingModal 내부에서만 사용한다.\n */\nexport interface SModalContainerProps {\n  /** 표시 여부 (제어) */\n  open?: boolean;\n  /** 표시 상태 변경 */\n  onOpenChange?: (open: boolean) => void;\n  /** 접근성 제목 (스크린리더용). 시각 제목은 children이 담당 */\n  ariaTitle?: string;\n  /** 우측 상단 닫기 버튼 */\n  showClose?: boolean;\n  /** 닫기(X) 버튼 클릭 시 발생 (sd-modal-container 닫기 버튼 대응) */\n  onClose?: () => void;\n  /**\n   * 백드롭 클릭·ESC로 닫히지 않고 흔들림(shake) 애니메이션 (sd-modal-container persistent).\n   * **기본값 true** — 모달은 작성 중인 내용을 잃지 않도록 임의 닫힘을 막는 것이 기본이다.\n   * 닫기 경로는 X 버튼과 모달 안의 버튼뿐이다. false로 주면 백드롭·ESC 닫기가 열린다.\n   */\n  persistent?: boolean;\n  /** 너비/높이 */\n  width?: number | string;\n  height?: number | string;\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst len = (v?: number | string) =>\n  v === undefined ? undefined : typeof v === 'number' ? `${v}px` : v;\n\n// overlay-out(0.3s)이 끝난 뒤 Portal을 제거한다.\nconst CLOSE_ANIMATION_DURATION = 300;\n\n/**\n * SModalContainer — sd-modal-container 포팅 (Radix Dialog 기반).\n * 모든 모달(Confirm/Action/Loading)의 공통 컨테이너. 딤 오버레이 + 중앙 흰 카드.\n * persistent(기본 true)면 백드롭/ESC 닫기를 막고 흔들림 애니메이션을 준다.\n *\n * @internal\n * 내부 전용 컴포넌트다. 패키지 public export(src/index.ts)에서 의도적으로 제외돼 있어\n * 소비자는 직접 import 할 수 없고, SConfirmModal/SActionModal/SLoadingModal 세 모달의\n * 공통 컨테이너로만 조합해 쓴다. barrel(src/index.ts)에 다시 추가하지 말 것.\n */\nexport function SModalContainer({\n  open,\n  onOpenChange,\n  ariaTitle = '모달',\n  showClose = false,\n  onClose,\n  persistent = true,\n  width,\n  height,\n  children,\n  className,\n  style,\n}: SModalContainerProps) {\n  const [shaking, setShaking] = useState(false);\n  // Radix Portal이 open=false 즉시 자식을 제거하지 않도록 닫힘 중에도 유지한다.\n  const [rendered, setRendered] = useState(() => Boolean(open));\n  const contentRef = useRef<HTMLDivElement>(null);\n  const stackRegistrationRef = useRef<ReturnType<typeof registerModalStackEntry> | null>(null);\n  // ModalHost 안에서 열린 순서에 따라 local layer를 배정한다.\n  // 닫힘 애니메이션 동안에는 기존 layerIndex를 유지하고, 새로 열릴 때만 새 레이어를 받는다.\n  const [layerIndex, setLayerIndex] = useState<number | null>(null);\n\n  useEffect(() => {\n    if (open) {\n      setRendered(true);\n      return;\n    }\n\n    if (!rendered) return;\n    const timer = window.setTimeout(() => setRendered(false), CLOSE_ANIMATION_DURATION);\n    return () => window.clearTimeout(timer);\n  }, [open, rendered]);\n\n  useEffect(() => {\n    if (!open) return;\n\n    const registration = registerModalStackEntry();\n    stackRegistrationRef.current = registration;\n    setLayerIndex(registration.layerIndex);\n    return () => {\n      registration.unregister();\n      if (stackRegistrationRef.current === registration) {\n        stackRegistrationRef.current = null;\n      }\n    };\n  }, [open]);\n\n  const modalHost = getModalHost();\n  // 모달 안에서 열린 floating(SSelect/SPopover/SDatePicker 등)이 같은 모달의 backdrop 위로\n  // 뜨도록 Content 자손에 전용 portal target을 둔다. 전역 z-index는 ModalHost 하나만 가진다.\n  const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n\n  // 클래스 재적용만으로는 애니메이션이 재시작되지 않으므로 off→on으로 강제 재시작한다.\n  const triggerShake = useCallback(() => {\n    setShaking(false);\n    requestAnimationFrame(() => setShaking(true));\n  }, []);\n\n  const guardClose = persistent\n    ? (e: Event) => {\n        e.preventDefault();\n        // 여러 Radix Dialog가 같은 ESC/outside 이벤트를 받을 수 있으므로\n        // 이벤트는 모두 막되 shake는 현재 최상단 모달만 실행한다.\n        if (stackRegistrationRef.current?.isTop()) triggerShake();\n      }\n    : undefined;\n\n  // 토스트·로딩은 모달보다 위에 뜨지만 DOM 상으로는 body 직속이라 Radix 는 '모달 바깥'으로 본다.\n  // 그대로 두면 토스트 닫기 버튼을 누른 것만으로 모달이 닫히거나(일반) 흔들린다(persistent).\n  const guardInteractOutside = (e: Event) => {\n    if (isFromGlobalOverlay(e)) {\n      e.preventDefault();\n      return;\n    }\n    guardClose?.(e);\n  };\n\n  return (\n    <RDialog.Root open={open} onOpenChange={onOpenChange}>\n      <RDialog.Portal container={modalHost} forceMount={rendered ? true : undefined}>\n        <div className=\"pointer-events-none absolute inset-0\" style={{ zIndex: layerIndex ?? 0 }}>\n          <RDialog.Overlay\n            forceMount={rendered ? true : undefined}\n            className=\"pointer-events-auto absolute inset-0 bg-black/40 data-[state=open]:animate-overlay-in data-[state=closed]:animate-overlay-out\"\n            style={{ zIndex: 0, animationFillMode: 'forwards' }}\n          />\n          {/*\n            Overlay와 Content를 하나의 모달 레이어 안에 둔다. 모달 간 전역 z-index를 올리지\n            않고 Host 내부의 layerIndex만 비교하므로 Toast/Loading과 충돌하지 않는다.\n            중앙정렬은 이 래퍼가 담당하고, Content는 scale 애니메이션만 수행한다.\n          */}\n          <div\n            className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\n            style={{ zIndex: 1 }}\n          >\n            <RDialog.Content\n              forceMount={rendered ? true : undefined}\n              ref={contentRef}\n              className=\"pointer-events-auto outline-none data-[state=open]:animate-modal-in data-[state=closed]:animate-modal-out\"\n              style={{ animationFillMode: 'forwards' }}\n              // Radix 기본 동작은 열릴 때 첫 tabbable(= 닫기 X 버튼)로 포커스를 옮긴다. 직전 조작이\n              // 키보드였던 환경에서는 이 프로그래매틱 포커스에도 :focus-visible 이 매칭돼 X 에 링이 그려진다.\n              // 대신 Content(자체 tabIndex=-1, outline-none)로 포커스를 보내 포커스 트랩·ESC·스크린리더\n              // 안내는 그대로 두고 링만 없앤다.\n              onOpenAutoFocus={e => {\n                e.preventDefault();\n                contentRef.current?.focus({ preventScroll: true });\n              }}\n              onEscapeKeyDown={guardClose}\n              onPointerDownOutside={guardInteractOutside}\n              onInteractOutside={guardInteractOutside}\n            >\n              <RDialog.Title className=\"sr-only\">{ariaTitle}</RDialog.Title>\n              {/*\n                카드 높이/너비는 뷰포트(dvh/dvw)에서 상하좌우 여백 24px 씩을 뺀 값으로 클램핑한다.\n                height/width prop 이나 콘텐츠가 화면보다 커도 카드가 화면 밖으로 넘쳐 잘리지 않는다\n                (max-height/max-width 가 height/width 보다 우선). flex 컬럼으로 두어, 세로가 클램핑됐을 때\n                각 모달의 본문 영역(min-h-0 + overflow-auto)이 줄어들며 스크롤을 갖게 한다. 가로는 텍스트가\n                래핑되며 줄어드는 것으로 충분해 별도 overflow-x 처리는 두지 않는다.\n                카드 자체는 radius 유지와 닫기(X) 고정을 위해 overflow-hidden 을 유지.\n                consumer 가 className 으로 max-h-*, max-w-* 를 주면 tailwind-merge 로 덮어쓸 수 있다.\n              */}\n              <div\n                className={cn(\n                  'relative flex max-h-[calc(100dvh-48px)] max-w-[calc(100dvw-48px)] flex-col overflow-hidden rounded-[var(--cmp-modal-radius)] bg-[var(--cmp-modal-bg)] shadow-normal-md',\n                  shaking && 'animate-modal-shake',\n                  className,\n                )}\n                style={{ width: len(width), height: len(height), ...style }}\n                onAnimationEnd={e => {\n                  if (e.animationName === 'modal-shake') setShaking(false);\n                }}\n              >\n                {showClose && (\n                  // 원본 모달의 닫기 버튼은 sd-ghost-button(icon=\"close\") — SGhostButton 재사용\n                  <SGhostButton\n                    icon=\"close\"\n                    ariaLabel=\"닫기\"\n                    onClick={() => {\n                      onClose?.();\n                      onOpenChange?.(false);\n                    }}\n                    className=\"absolute right-[16px] top-[16px] z-10\"\n                  />\n                )}\n                <InsideModalProvider value={true}>\n                  <PortalContainerProvider value={portalContainer}>\n                    {children}\n                  </PortalContainerProvider>\n                </InsideModalProvider>\n              </div>\n              {/*\n                반드시 Content의 자손이어야 한다. Radix Dialog의 hideOthers/focus trap 범위를\n                유지하면서 모달 내부 floating을 같은 layer의 Content 위로 표시한다.\n              */}\n              <div\n                ref={setPortalContainer}\n                className=\"pointer-events-auto fixed left-0 top-0\"\n                style={{ zIndex: 2 }}\n              />\n            </RDialog.Content>\n          </div>\n        </div>\n      </RDialog.Portal>\n    </RDialog.Root>\n  );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport { SModalContainer } from '../SModalContainer';\nimport { SButton, type SButtonColor } from '../SButton';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { STag, type STagColor, type STagShape, type STagSize } from '../STag';\nimport { cn } from '../../lib/cn';\nimport { sanitizeInlineHtml } from '../../lib/sanitize-inline-html';\n\nexport type SConfirmModalType = 'positive' | 'negative' | 'default';\n\n/** 확인 버튼 프리셋 (sd-confirm-modal ConfirmModalMainButton) */\nexport type ConfirmModalMainButton =\n  'primary_md' | 'primary_outline_md' | 'danger_md' | 'danger_outline_md' | 'neutral_outline_md';\n\nconst TYPE_ICON: Record<SConfirmModalType, SIconName | null> = {\n  positive: 'notificationOutline',\n  negative: 'warningOutline',\n  default: null,\n};\nconst TYPE_ICON_COLOR: Record<SConfirmModalType, string> = {\n  positive: 'var(--cmp-modal-confirm-positive-icon)',\n  negative: 'var(--cmp-modal-confirm-negative-icon)',\n  default: '',\n};\n/** 확인 버튼 프리셋 → SButton color/outline (모두 md 사이즈) */\nconst MAIN_BUTTON_STYLE: Record<\n  ConfirmModalMainButton,\n  { color: SButtonColor; outline?: boolean }\n> = {\n  primary_md: { color: 'primary' },\n  primary_outline_md: { color: 'primary', outline: true },\n  danger_md: { color: 'danger' },\n  danger_outline_md: { color: 'danger', outline: true },\n  neutral_outline_md: { color: 'neutral', outline: true },\n};\n/** type별 기본 확인 버튼 프리셋 (sd-confirm-modal CONFIRM_MODAL_DEFAULT_BUTTON) */\nconst DEFAULT_MAIN_BUTTON: Record<SConfirmModalType, ConfirmModalMainButton> = {\n  positive: 'primary_md',\n  negative: 'danger_md',\n  default: 'neutral_outline_md',\n};\n\nexport interface SConfirmModalProps {\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  /** 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 false** — 확인 모달은 잃을 입력이 없어 백드롭·ESC로 닫힌다 */\n  persistent?: boolean;\n  /** 타입 (아이콘·메인버튼 색 결정) */\n  type?: SConfirmModalType;\n  modalTitle?: string;\n  /** 제목 엘리먼트에 추가할 클래스 (sd-confirm-modal titleClass) */\n  titleClass?: string;\n  /** 콘텐츠 박스 상단 메시지 목록 (각 항목이 한 줄, HTML 문자열 허용 — innerHTML 렌더링) */\n  topMessage?: string[];\n  /** 콘텐츠 박스 하단 메시지 목록 (각 항목이 한 줄, HTML 문자열 허용 — innerHTML 렌더링) */\n  bottomMessage?: string[];\n  /** tag 슬롯 기본 태그 레이블 (tagSlot 미지정 시) */\n  tagLabel?: string;\n  /** 태그 프리셋 (shape/size/color) — sd-confirm-modal tagPreset 대응 */\n  tagShape?: STagShape;\n  tagSize?: STagSize;\n  tagColor?: STagColor;\n  /** 콘텐츠 박스에서 태그 오른쪽에 오는 텍스트 (optionSlot 미지정 시) */\n  slotLabel?: string;\n  /** 콘텐츠 박스 tag 위치 커스텀 콘텐츠 (미지정 시 tagLabel 기반 STag) */\n  tagSlot?: ReactNode;\n  /** 콘텐츠 박스에서 태그 오른쪽 커스텀 콘텐츠 (미지정 시 slotLabel 텍스트) */\n  optionSlot?: ReactNode;\n  /** 콘텐츠 박스 바로 아래에 통으로 들어가는 커스텀 콘텐츠 (전체 폭) */\n  contentSlot?: ReactNode;\n  /** 메인 버튼 */\n  mainButtonLabel?: string;\n  /** 확인 버튼 프리셋 (없으면 type에 따라 자동 결정) */\n  mainButtonName?: ConfirmModalMainButton;\n  /** 서브(취소) 버튼 */\n  subButtonLabel?: string;\n  /** 확인 버튼 클릭 (sdOk) */\n  onOk?: () => void;\n  onCancel?: () => void;\n  /** 닫기(X) 버튼 클릭 (sdClose) */\n  onClose?: () => void;\n}\n\n/** SConfirmModal — sd-confirm-modal 포팅. 아이콘+제목+메시지+태그+확인/취소 버튼. */\nexport function SConfirmModal({\n  open,\n  onOpenChange,\n  persistent = false,\n  type = 'positive',\n  modalTitle = '',\n  titleClass,\n  topMessage = [],\n  bottomMessage = [],\n  tagLabel,\n  tagShape = 'square',\n  tagSize = 'sm',\n  tagColor = 'grey',\n  slotLabel,\n  tagSlot,\n  optionSlot,\n  contentSlot,\n  mainButtonLabel = '확인',\n  mainButtonName,\n  subButtonLabel,\n  onOk,\n  onCancel,\n  onClose,\n}: SConfirmModalProps) {\n  const iconName = TYPE_ICON[type];\n  const mainStyle = MAIN_BUTTON_STYLE[mainButtonName ?? DEFAULT_MAIN_BUTTON[type]];\n\n  // 콘텐츠 박스 안에서 tag(왼쪽) / option(오른쪽) — 각각 커스텀 슬롯(우선) 또는 기본 fallback\n  const tagNode =\n    tagSlot ??\n    (tagLabel ? <STag shape={tagShape} size={tagSize} color={tagColor} label={tagLabel} /> : null);\n  const optionNode = optionSlot ?? (slotLabel ? <span>{slotLabel}</span> : null);\n  const hasContentBox = tagNode != null || optionNode != null;\n  const hasBody =\n    topMessage.length > 0 || bottomMessage.length > 0 || hasContentBox || contentSlot != null;\n\n  return (\n    <SModalContainer\n      open={open}\n      onOpenChange={onOpenChange}\n      persistent={persistent}\n      ariaTitle={modalTitle}\n      showClose\n      onClose={onClose}\n      // min-w는 화면이 그보다 좁을 땐 양보해야 한다 — min-width가 max-width를 이기므로\n      // min()으로 컨테이너의 화면 폭 클램프와 같은 값까지만 내려가게 한다\n      className=\"w-fit min-w-[min(520px,calc(100dvw-48px))]\"\n    >\n      {/* 카드가 화면 높이에 걸려 줄어들면 본문(아이콘·제목·메시지)만 스크롤되고 버튼 행은 남는다 */}\n      <div className=\"flex min-h-0 flex-auto flex-col items-center gap-[40px] px-[32px] py-[40px]\">\n        <div className=\"flex w-full min-h-0 flex-col items-center gap-[20px] overflow-y-auto\">\n          {/* 아이콘 → 제목 간격 12 (title-gap) */}\n          <div className=\"flex flex-col items-center gap-[12px]\">\n            {iconName && <SIcon name={iconName} size={32} color={TYPE_ICON_COLOR[type]} />}\n            <h2\n              className={cn(\n                'text-center text-[18px] font-bold leading-[30px] text-[color:var(--cmp-modal-confirm-title-color)]',\n                titleClass,\n              )}\n            >\n              {modalTitle}\n            </h2>\n          </div>\n\n          {hasBody && (\n            <div className=\"flex flex-col items-center gap-[20px] text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-modal-confirm-message-color)] w-full\">\n              {/* 각 줄은 HTML 문자열을 허용하되, sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어) */}\n              {topMessage.length > 0 && (\n                <div className=\"flex flex-col gap-[2px]\">\n                  {topMessage.map((m, i) => (\n                    <p\n                      key={i}\n                      className=\"m-0\"\n                      dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(m) }}\n                    />\n                  ))}\n                </div>\n              )}\n              {hasContentBox && (\n                // content-box: 흰 박스 + 1px 테두리 + 패딩 + 14/700 (원본 sd-confirm-modal__content-box)\n                // tag 왼쪽, slotLabel/optionSlot 이 그 오른쪽에 gap 8 로 나란히 놓인다\n                <div className=\"flex items-center justify-center gap-[8px] rounded-[8px] border border-solid border-[color:var(--color-grey-30)] bg-white px-[16px] py-[12px] text-[14px] font-bold leading-[22px] w-full\">\n                  {tagNode}\n                  {optionNode}\n                </div>\n              )}\n              {/* content-box 바로 아래 통 슬롯 — 박스 스타일 없이 전체 폭으로 소비자 콘텐츠를 그대로 렌더 */}\n              {contentSlot != null && <div className=\"w-full\">{contentSlot}</div>}\n              {bottomMessage.length > 0 && (\n                <div className=\"flex flex-col gap-[2px]\">\n                  {bottomMessage.map((m, i) => (\n                    <p\n                      key={i}\n                      className=\"m-0\"\n                      dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(m) }}\n                    />\n                  ))}\n                </div>\n              )}\n            </div>\n          )}\n        </div>\n\n        <div className=\"flex flex-shrink-0 gap-[var(--cmp-modal-confirm-button-gap)]\">\n          {subButtonLabel && (\n            <SButton\n              color=\"neutral\"\n              outline\n              size=\"md\"\n              onClick={() => {\n                onCancel?.();\n                onOpenChange?.(false);\n              }}\n              label={subButtonLabel}\n            />\n          )}\n          <SButton\n            {...mainStyle}\n            size=\"md\"\n            onClick={() => {\n              onOk?.();\n              onOpenChange?.(false);\n            }}\n            label={mainButtonLabel}\n          />\n        </div>\n      </div>\n    </SModalContainer>\n  );\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SGhostButton } from '../SGhostButton';\n\n/**\n * @internal\n * 모달·드로어 상단 제목 영역 공통 props.\n */\nexport interface SOverlayHeaderProps {\n  /** 시각 제목 */\n  title?: ReactNode;\n  /** 제목 오른쪽 보조 설명 */\n  description?: ReactNode;\n  /** 닫기 버튼 표시 */\n  showClose?: boolean;\n  /** 닫기 버튼 클릭 */\n  onClose?: () => void;\n  /** 외부 absolute 닫기 버튼 공간 확보 */\n  reserveCloseSpace?: boolean;\n  className?: string;\n  titleClassName?: string;\n  descriptionClassName?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SOverlayHeader — overlay 계열 내부 전용 헤더.\n *\n * @internal\n * SActionModal/SDrawer 의 제목 영역만 공통화한다. 패키지 public export 에 추가하지 말 것.\n */\nexport function SOverlayHeader({\n  title,\n  description,\n  showClose = false,\n  onClose,\n  reserveCloseSpace = false,\n  className,\n  titleClassName,\n  descriptionClassName,\n  style,\n}: SOverlayHeaderProps) {\n  const hasDescription = description != null && description !== '';\n\n  return (\n    <header\n      className={cn(\n        'relative flex w-full flex-shrink-0 items-center',\n        'gap-[var(--cmp-overlay-header-gap)] bg-[var(--cmp-overlay-header-bg)] py-[var(--cmp-overlay-header-paddingY)] pl-[var(--cmp-overlay-header-paddingX)]',\n        showClose || reserveCloseSpace\n          ? 'pr-[calc(var(--cmp-overlay-header-paddingX)+20px)]'\n          : 'pr-[var(--cmp-overlay-header-paddingX)]',\n        className,\n      )}\n      style={style}\n    >\n      <h2\n        className={cn(\n          'm-0 overflow-hidden text-ellipsis whitespace-nowrap',\n          'text-[16px] font-bold leading-[26px]',\n          titleClassName,\n        )}\n        style={{ color: 'var(--cmp-overlay-header-title-color)' }}\n      >\n        {title}\n      </h2>\n      {hasDescription && (\n        <div\n          className={cn(\n            'flex min-w-0 flex-1 items-center gap-sd-2 text-[12px] font-normal leading-[20px] text-[color:var(--color-grey-65)]',\n            descriptionClassName,\n          )}\n        >\n          {description}\n        </div>\n      )}\n      {showClose && (\n        <SGhostButton\n          icon=\"close\"\n          ariaLabel=\"닫기\"\n          onClick={() => onClose?.()}\n          className=\"absolute right-[12px] top-[12px]\"\n        />\n      )}\n    </header>\n  );\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport { SModalContainer } from '../SModalContainer';\nimport { SFooter, type SFooterButton } from '../SFooter';\nimport { SOverlayHeader } from '../SOverlayHeader';\n\nexport interface SActionModalProps {\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  /** 닫기(X) 버튼 클릭 (sdClose) */\n  onClose?: () => void;\n  /** 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** */\n  persistent?: boolean;\n  modalTitle?: string;\n  /**\n   * 제목 오른쪽에 붙는 보조 설명 (sd-action-modal 의 header-sub-title 슬롯).\n   * 문자열이면 서브텍스트 스타일로 렌더하고, 노드를 넘기면 그대로 배치한다.\n   */\n  description?: ReactNode;\n  /**\n   * 하단 액션 버튼 (주 액션 1개).\n   * 의도적으로 단수다 — 보조 버튼(취소·삭제 등)은 `footerLeft` 슬롯에 직접 배치한다.\n   */\n  button?: SFooterButton;\n  /**\n   * footer 좌측 영역 (sd-action-modal 의 bottom-sub-content 슬롯).\n   * 보조 버튼이나 안내 문구를 넣는다. 버튼을 하나 더 쓰고 싶을 때 여기에 SButton 을 넣는다.\n   */\n  footerLeft?: ReactNode;\n  width?: number | string;\n  height?: number | string;\n  children?: ReactNode;\n}\n\n/**\n * SActionModal — sd-action-modal 포팅. 헤더(제목·닫기) + 본문 + 하단 액션 버튼.\n *\n * 액션 버튼은 `button.onClick` 만 호출하고 모달을 닫지 않는다. 본문에서 API 를 호출하는 경우가\n * 많아 성공 여부에 따라 닫힘 시점이 달라지므로, 닫는 책임은 사용하는 쪽에 둔다.\n *\n * `button` 은 의도적으로 단수다. 주 액션은 오른쪽에 하나만 두고, 보조 버튼은 `footerLeft` 슬롯에\n * 소비자가 직접 배치한다. (buttons 배열 API 를 추가하지 말 것)\n */\nexport function SActionModal({\n  open,\n  onOpenChange,\n  onClose,\n  persistent,\n  modalTitle = '',\n  description,\n  button,\n  footerLeft,\n  width,\n  height,\n  children,\n}: SActionModalProps) {\n  return (\n    <SModalContainer\n      open={open}\n      onOpenChange={onOpenChange}\n      onClose={onClose}\n      persistent={persistent}\n      ariaTitle={modalTitle}\n      showClose\n      width={width}\n      height={height}\n      // min-w/min-h는 화면이 그보다 좁거나 짧을 땐 양보해야 한다 — min-width/min-height가\n      // max-width/max-height를 이기므로 min()으로 컨테이너의 화면 클램프와 같은 값까지만 내려가게 한다\n      className=\"w-fit min-w-[min(480px,calc(100dvw-48px))] min-h-[min(320px,calc(100dvh-48px))]\"\n    >\n      {/* min-h는 height가 걸리는 카드 쪽에 둔다(height<320일 때 클램핑). 내부 flex 컬럼은\n          flex-auto로 카드를 채워 body(flex-1)가 남는 공간을 먹고 footer가 항상 바닥에 붙게 하며,\n          카드가 화면 높이에 걸려 줄어들면 min-h-0 덕에 함께 줄어 body가 스크롤된다 */}\n      <div className=\"flex min-h-0 flex-auto flex-col\">\n        <SOverlayHeader title={modalTitle} description={description} reserveCloseSpace />\n\n        <div className=\"min-h-0 flex-1 overflow-auto px-[var(--cmp-modal-action-body-paddingX)] pb-[var(--cmp-modal-action-body-paddingBottom)]\">\n          {children}\n        </div>\n\n        {(button || footerLeft) && <SFooter bg=\"grey\" left={footerLeft} button={button} />}\n      </div>\n    </SModalContainer>\n  );\n}\n","'use client';\n\nimport { SModalContainer } from '../SModalContainer';\nimport { SCircleProgress } from '../SCircleProgress';\nimport { SIcon } from '../SIcon';\nimport { SButton } from '../SButton';\n\nexport type LoadingModalState = 'loading' | 'error';\n\nconst DEFAULT_MESSAGE: Record<LoadingModalState, string> = {\n  loading: '작업 진행중...',\n  error: '작업에 실패하였습니다. 다시 시도해 주세요.',\n};\nconst DEFAULT_BUTTON_LABEL: Record<LoadingModalState, string> = {\n  loading: '확인',\n  error: '다시 시도',\n};\n\nexport interface SLoadingModalProps {\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  /** 닫기(X) 버튼 클릭 (sdClose) — error 상태에서만 노출 */\n  onClose?: () => void;\n  /** 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** */\n  persistent?: boolean;\n  /** 상태 (loading: 스피너, error: 경고 아이콘) */\n  state?: LoadingModalState;\n  /** 진행률 (0–100) — 지정 시 determinate 스피너 */\n  progress?: number;\n  /** 메시지 (없으면 state 기본값) */\n  message?: string | string[];\n  /** 하단 버튼 표시 */\n  useButton?: boolean;\n  /** 버튼 레이블 (없으면 state 기본값) */\n  buttonLabel?: string;\n  /** 버튼 클릭 (sdClick) */\n  onButtonClick?: () => void;\n  width?: number | string;\n  height?: number | string;\n}\n\n/** SLoadingModal — sd-loading-modal 포팅. state(loading/error) + progress + 옵션 버튼. */\nexport function SLoadingModal({\n  open,\n  onOpenChange,\n  onClose,\n  persistent,\n  state = 'loading',\n  progress,\n  message,\n  useButton = false,\n  buttonLabel,\n  onButtonClick,\n  width = 520,\n  height = 320,\n}: SLoadingModalProps) {\n  const resolvedMessage = message ?? DEFAULT_MESSAGE[state];\n  const lines = Array.isArray(resolvedMessage)\n    ? resolvedMessage\n    : resolvedMessage\n      ? [resolvedMessage]\n      : [];\n  // error 상태에서는 버튼이 필수로 표시됩니다.\n  const showButton = useButton || state === 'error';\n\n  return (\n    <SModalContainer\n      open={open}\n      onOpenChange={onOpenChange}\n      onClose={onClose}\n      showClose={state === 'error'}\n      persistent={persistent}\n      ariaTitle={lines[0] || '로딩 중'}\n      width={width}\n      height={height}\n    >\n      {/* 카드가 화면 높이에 걸려 height(320)보다 작아지면 본문이 스크롤된다. justify-center 대신\n          m-auto로 중앙정렬해야 넘칠 때 위쪽이 잘려 스크롤로도 못 보는 문제가 생기지 않는다 */}\n      <div className=\"flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]\">\n        <div className=\"m-auto flex flex-col items-center gap-[20px]\">\n          {state === 'loading' ? (\n            progress !== undefined ? (\n              <SCircleProgress value={progress} />\n            ) : (\n              <SCircleProgress indeterminate />\n            )\n          ) : (\n            <SIcon name=\"warningOutline\" size={80} color=\"var(--cmp-modal-confirm-negative-icon)\" />\n          )}\n\n          {lines.length > 0 && (\n            <div className=\"flex flex-col gap-[2px]\">\n              {lines.map((m, i) => (\n                <p\n                  key={i}\n                  className=\"m-0 max-w-[400px] break-keep text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-modal-loading-message-color)]\"\n                >\n                  {m}\n                </p>\n              ))}\n            </div>\n          )}\n\n          {showButton && (\n            <SButton\n              color=\"neutral\"\n              outline\n              size=\"sm\"\n              onClick={() => {\n                onButtonClick?.();\n                onOpenChange?.(false);\n              }}\n              label={buttonLabel ?? DEFAULT_BUTTON_LABEL[state]}\n            />\n          )}\n        </div>\n      </div>\n    </SModalContainer>\n  );\n}\n","'use client';\n\nimport {\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n  type KeyboardEvent as ReactKeyboardEvent,\n  type MouseEvent as ReactMouseEvent,\n  type ReactNode,\n} from 'react';\nimport * as RDialog from '@radix-ui/react-dialog';\nimport { cn } from '../../lib/cn';\nimport { isFromGlobalOverlay } from '../../lib/global-overlay';\nimport { getModalHost, registerModalStackEntry } from '../../lib/modal-stack';\nimport { InsideModalProvider, PortalContainerProvider } from '../../lib/portal-container';\nimport { SFooter, type SFooterButton } from '../SFooter';\nimport { SOverlayHeader } from '../SOverlayHeader';\n\nconst CLOSE_ANIMATION_DURATION = 300;\n\n/**\n * 너비 조절에서 방향키 한 번에 움직이는 양(px). Shift 를 함께 누르면 large.\n * SGnb·SSplitter 의 px 단계와 같은 값이라 세 컴포넌트의 체감이 같다.\n */\nconst RESIZE_KEY_STEP = { normal: 10, large: 50 };\n\n/**\n * 조절선 히트 영역 폭. 겉보기 선(--cmp-splitter-border-width) 양옆에 잡기 여유를 둔다.\n * 패널이 overflow:hidden 이라 밖으로 넘길 수 없어 안쪽으로만 넓힌다 — SGnb 와 같다.\n */\nconst RESIZE_HIT_WIDTH =\n  'calc(var(--cmp-splitter-border-width) + var(--cmp-splitter-border-padding) * 2)';\n\nfunction toPx(value: number | string | undefined, percentBase: number): number | undefined {\n  if (typeof value === 'number') return value;\n  if (typeof value !== 'string') return undefined;\n  const normalized = value.trim();\n  if (normalized.endsWith('px')) {\n    const numeric = Number(normalized.slice(0, -2));\n    return Number.isFinite(numeric) ? numeric : undefined;\n  }\n  if (normalized.endsWith('%')) {\n    const numeric = Number(normalized.slice(0, -1));\n    return Number.isFinite(numeric) ? (percentBase * numeric) / 100 : undefined;\n  }\n  if (normalized.endsWith('vw')) {\n    const numeric = Number(normalized.slice(0, -2));\n    return Number.isFinite(numeric) ? (window.innerWidth * numeric) / 100 : undefined;\n  }\n  if (normalized.endsWith('vh')) {\n    const numeric = Number(normalized.slice(0, -2));\n    return Number.isFinite(numeric) ? (window.innerHeight * numeric) / 100 : undefined;\n  }\n  return undefined;\n}\n\nfunction clamp(value: number, min?: number, max?: number) {\n  const minValue = min ?? Number.NEGATIVE_INFINITY;\n  const maxValue = max ?? Number.POSITIVE_INFINITY;\n  return Math.min(Math.max(value, minValue), maxValue);\n}\n\nexport type SDrawerButton = SFooterButton;\n\nexport interface SDrawerProps {\n  /** 표시 여부 */\n  open?: boolean;\n  /** 표시 상태 변경 */\n  onOpenChange?: (open: boolean) => void;\n  /** 닫기(X) 버튼 클릭 */\n  onClose?: () => void;\n  /**\n   * backdrop·ESC로 닫히지 않고 흔들림 효과를 준다.\n   * **기본값 true** — Drawer는 내용을 작성·구성하는 곳이라 임의 닫힘을 막는 것이 기본이다.\n   * 닫기 경로는 X 버튼과 footer 버튼뿐이다. false로 주면 backdrop·ESC 닫기가 열린다.\n   */\n  persistent?: boolean;\n  /** 접근성 제목 및 헤더 제목 */\n  title?: string;\n  /**\n   * Drawer 너비. 기본값은 Figma drawer 기준 572px이다.\n   * 창이 이보다 좁으면 창 폭까지만 넓어진다 — 드로어가 화면 밖으로 나가지 않는다.\n   * `resizable` 로 조절한 폭은 이 값이 바뀔 때 되돌아간다 — 앱이 폭을 저장해 두었다가\n   * 다시 열 때 넘겨주면 그 폭으로 열린다.\n   */\n  width?: number | string;\n  /**\n   * 왼쪽 테두리를 끌어 너비를 조절할 수 있게 한다. 조절선은 패널 왼쪽 경계 전체이며\n   * 평소엔 보이지 않다가 hover·포커스·조절 중에만 드러난다(SSplitter·SGnb 와 같은 선).\n   * 포커스를 받아 방향키(Shift 는 크게)·Home·End 로도 조절된다.\n   */\n  resizable?: boolean;\n  /** 리사이즈 가능한 최소 너비(px, %, vw, vh). % 는 viewport 기준이며, 창 폭보다 클 수 없다 */\n  minWidth?: number | string;\n  /** 리사이즈 가능한 최대 너비(px, %, vw, vh). % 는 viewport 기준이며, 주지 않으면 창 폭이 상한이다 */\n  maxWidth?: number | string;\n  /** 너비가 확정될 때(드래그를 놓거나 방향키 조작). 드래그하는 동안에는 오지 않는다 */\n  onWidthChange?: (width: number) => void;\n  /** footer 좌측 슬롯 */\n  footerLeft?: ReactNode;\n  /** 우측 기본 액션 버튼 */\n  button?: SDrawerButton;\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SDrawer — Figma drawer 포팅.\n *\n * 모달과 동일한 전역 modal host와 stack을 공유한다. 따라서 Drawer가 열린 상태에서\n * 모달을 추가로 열면 새 모달이 Drawer 위에 쌓이고, Drawer 내부 floating은 전용 portal\n * container를 통해 Drawer의 backdrop 위에 표시된다.\n */\nexport function SDrawer({\n  open,\n  onOpenChange,\n  onClose,\n  persistent = true,\n  title = '',\n  width = 572,\n  resizable = false,\n  minWidth,\n  maxWidth,\n  onWidthChange,\n  footerLeft,\n  button,\n  children,\n  className,\n  style,\n}: SDrawerProps) {\n  const [shaking, setShaking] = useState(false);\n  const [rendered, setRendered] = useState(() => Boolean(open));\n  const [entered, setEntered] = useState(false);\n  const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n  const backdropPointerDownRef = useRef(false);\n  const contentRef = useRef<HTMLDivElement>(null);\n  const panelRef = useRef<HTMLDivElement>(null);\n  const stackRegistrationRef = useRef<ReturnType<typeof registerModalStackEntry> | null>(null);\n  const resizeCleanupRef = useRef<(() => void) | null>(null);\n  const [layerIndex, setLayerIndex] = useState<number | null>(null);\n  const [currentWidth, setCurrentWidth] = useState<CSSProperties['width']>(width);\n  const [resizing, setResizing] = useState(false);\n  // 조절선이 알리는 현재 값. width 가 '50%' 같은 문자열일 수 있어 실제 폭을 재서 쓴다.\n  const [measuredWidth, setMeasuredWidth] = useState<number | null>(null);\n  // 드로어 폭의 절대 상한. 서버에서는 알 수 없어 undefined 다.\n  const [viewportWidth, setViewportWidth] = useState<number | undefined>(() =>\n    typeof window === 'undefined' ? undefined : window.innerWidth,\n  );\n\n  useEffect(() => {\n    setCurrentWidth(width);\n  }, [width]);\n\n  useEffect(() => {\n    if (open) {\n      setRendered(true);\n      return;\n    }\n    if (!rendered) return;\n    const timer = window.setTimeout(() => setRendered(false), CLOSE_ANIMATION_DURATION);\n    return () => window.clearTimeout(timer);\n  }, [open, rendered]);\n\n  // 드래그 도중 언마운트되면 document 리스너와 body 스타일이 남는다.\n  useEffect(() => {\n    return () => resizeCleanupRef.current?.();\n  }, []);\n\n  // 창이 줄면 드로어도 따라 줄어야 한다 — 폭·한계를 창 폭에서 자르려면 그 값을 계속 알아야 한다.\n  useEffect(() => {\n    if (!rendered) return;\n    const sync = () => setViewportWidth(window.innerWidth);\n    sync();\n    window.addEventListener('resize', sync);\n    return () => window.removeEventListener('resize', sync);\n  }, [rendered]);\n\n  // 조절선의 aria-valuenow 는 실제 폭이어야 한다 — 드래그뿐 아니라 %·vw 폭이 창 크기를 따라\n  // 움직일 때도 맞아야 하므로 패널을 관찰한다. 조절선이 없으면 잴 이유도 없다.\n  useEffect(() => {\n    const panel = panelRef.current;\n    if (!resizable || !rendered || !panel || typeof ResizeObserver === 'undefined') return;\n    const observer = new ResizeObserver(() =>\n      setMeasuredWidth(Math.round(panel.getBoundingClientRect().width)),\n    );\n    observer.observe(panel);\n    return () => observer.disconnect();\n  }, [resizable, rendered]);\n\n  // 처음 open=true 로 마운트될 때도 닫힌 위치에서 시작해 오른쪽에서 슬라이드 인한다.\n  useEffect(() => {\n    if (!open) {\n      setEntered(false);\n      return;\n    }\n\n    setEntered(false);\n    const frame = requestAnimationFrame(() => setEntered(true));\n    return () => cancelAnimationFrame(frame);\n  }, [open]);\n\n  useEffect(() => {\n    if (!open) return;\n    const registration = registerModalStackEntry();\n    stackRegistrationRef.current = registration;\n    setLayerIndex(registration.layerIndex);\n    return () => {\n      registration.unregister();\n      if (stackRegistrationRef.current === registration) stackRegistrationRef.current = null;\n    };\n  }, [open]);\n\n  const triggerShake = useCallback(() => {\n    setShaking(false);\n    requestAnimationFrame(() => setShaking(true));\n  }, []);\n\n  const guardClose = persistent\n    ? (event: Event) => {\n        event.preventDefault();\n        if (stackRegistrationRef.current?.isTop()) triggerShake();\n      }\n    : undefined;\n\n  // 토스트·로딩은 드로어보다 위에 뜨지만 DOM 상으로는 body 직속이라 Radix 는 '드로어 바깥'으로\n  // 본다. 그대로 두면 토스트 닫기 버튼을 누른 것만으로 드로어가 닫히거나 흔들린다.\n  const guardInteractOutside = (e: Event) => {\n    if (isFromGlobalOverlay(e)) {\n      e.preventDefault();\n      return;\n    }\n    guardClose?.(e);\n  };\n\n  const handleBackdropInteraction = () => {\n    if (persistent) {\n      if (stackRegistrationRef.current?.isTop()) triggerShake();\n      return;\n    }\n    onOpenChange?.(false);\n  };\n\n  // ── 너비 조절 ──\n  // 창이 드로어보다 좁으면 창 폭에서 멈춘다. 상한이 없으면 창 폭이 곧 상한이고, 하한도 창 폭을\n  // 넘지 못한다 — CSS 는 min-width 가 max-width 를 이기므로 하한을 두면 화면 밖으로 삐져나간다.\n  // %·vw 로 준 한계는 창 크기를 알아야 px 이 되므로, 창 폭이 바뀔 때마다 다시 푼다.\n  const resizeBounds = () => {\n    const limit = viewportWidth;\n    // 서버에서는 창을 알 수 없다 — 잴 화면도 없으므로 자르지 않고 넘긴다.\n    if (limit === undefined) return { min: undefined, max: undefined };\n    const min = toPx(minWidth, limit);\n    const max = toPx(maxWidth, limit);\n    return {\n      min: min === undefined ? undefined : Math.min(min, limit),\n      max: max === undefined ? limit : Math.min(max, limit),\n    };\n  };\n\n  /** 조절된 폭을 화면에 반영하고, 시작값과 달라졌을 때만 한 번 알린다. */\n  const commitWidth = (next: number, startWidth: number) => {\n    const { min, max } = resizeBounds();\n    const clamped = Math.round(clamp(next, min, max));\n    setCurrentWidth(clamped);\n    if (clamped !== Math.round(startWidth)) onWidthChange?.(clamped);\n  };\n\n  const handleResizeStart = (event: ReactMouseEvent<HTMLDivElement>) => {\n    if (typeof document === 'undefined') return;\n    const panel = panelRef.current;\n    if (!panel) return;\n\n    // preventDefault 로 텍스트 선택을 막으면 포커스도 따라오지 않는다.\n    // 드래그를 놓은 자리에서 바로 방향키로 이어갈 수 있도록 직접 옮겨 준다.\n    event.preventDefault();\n    event.stopPropagation();\n    event.currentTarget.focus();\n\n    const startX = event.clientX;\n    const startWidth = panel.getBoundingClientRect().width;\n    const { min, max } = resizeBounds();\n    let latest = startWidth;\n\n    const { body } = document;\n    const previousCursor = body.style.cursor;\n    const previousUserSelect = body.style.userSelect;\n\n    const onMove = (moveEvent: MouseEvent) => {\n      // 드로어는 오른쪽에 붙어 있다 — 손을 왼쪽으로 끌수록 넓어진다.\n      latest = Math.round(clamp(startWidth + (startX - moveEvent.clientX), min, max));\n      setCurrentWidth(latest);\n    };\n\n    const cleanupResize = () => {\n      body.style.cursor = previousCursor;\n      body.style.userSelect = previousUserSelect;\n      document.removeEventListener('mousemove', onMove);\n      document.removeEventListener('mouseup', cleanupResize);\n      resizeCleanupRef.current = null;\n      setResizing(false);\n      // 드래그 중에는 알리지 않는다 — 앱이 폭을 저장한다면 프레임마다 저장하게 된다.\n      commitWidth(latest, startWidth);\n    };\n\n    resizeCleanupRef.current?.();\n    resizeCleanupRef.current = cleanupResize;\n    // 본문 텍스트가 드래그로 선택되지 않게, 커서가 페이지 위에서 바뀌지 않게 잠근다.\n    body.style.cursor = 'col-resize';\n    body.style.userSelect = 'none';\n    document.addEventListener('mousemove', onMove);\n    document.addEventListener('mouseup', cleanupResize);\n    setResizing(true);\n  };\n\n  const handleResizeKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n    const panel = panelRef.current;\n    if (!panel) return;\n    const startWidth = panel.getBoundingClientRect().width;\n    const { min, max } = resizeBounds();\n    const step = RESIZE_KEY_STEP[event.shiftKey ? 'large' : 'normal'];\n\n    let next: number | null = null;\n    // 조절선이 실제로 움직이는 방향을 따른다 — 왼쪽으로 밀면 드로어가 넓어진다.\n    if (event.key === 'ArrowLeft') next = startWidth + step;\n    else if (event.key === 'ArrowRight') next = startWidth - step;\n    // 한계를 주지 않았으면 끝으로 보낼 자리가 없다.\n    else if (event.key === 'Home' && min !== undefined) next = min;\n    else if (event.key === 'End' && max !== undefined) next = max;\n    if (next === null) return;\n\n    event.preventDefault();\n    commitWidth(next, startWidth);\n  };\n\n  const modalHost = getModalHost();\n\n  // 조절선이 알리는 값. 잰 폭이 없으면(관찰 전 첫 렌더·ResizeObserver 없음) 숫자로 준 폭을 쓰고,\n  // 그마저 문자열이면 알릴 수 있는 값이 없다.\n  const resizeValueNow =\n    measuredWidth ?? (typeof currentWidth === 'number' ? Math.round(currentWidth) : undefined);\n  const { min: resizeMinPx, max: resizeMaxPx } = resizeBounds();\n  const resizeValueMin = resizeMinPx === undefined ? undefined : Math.round(resizeMinPx);\n  const resizeValueMax = resizeMaxPx === undefined ? undefined : Math.round(resizeMaxPx);\n\n  // 창보다 넓은 폭·하한은 그대로 두면 드로어가 화면 밖으로 나간다 — CSS 는 min-width 가\n  // max-width 를 이기므로 max-w-full 만으로는 막히지 않는다. 창 폭에서 자른 값을 직접 넣는다.\n  const appliedWidth =\n    typeof currentWidth === 'number' && viewportWidth !== undefined\n      ? Math.min(currentWidth, viewportWidth)\n      : currentWidth;\n  const appliedMinWidth = resizeMinPx ?? minWidth;\n  const appliedMaxWidth = resizeMaxPx ?? maxWidth;\n\n  return (\n    <RDialog.Root open={open} onOpenChange={onOpenChange}>\n      <RDialog.Portal container={modalHost} forceMount={rendered ? true : undefined}>\n        <div className=\"pointer-events-none absolute inset-0\" style={{ zIndex: layerIndex ?? 0 }}>\n          <RDialog.Overlay\n            forceMount={rendered ? true : undefined}\n            className=\"pointer-events-auto absolute inset-0 bg-black/40 data-[state=open]:animate-overlay-in data-[state=closed]:animate-overlay-out\"\n            style={{ zIndex: 0, animationFillMode: 'forwards' }}\n            onPointerDown={event => {\n              event.preventDefault();\n              event.stopPropagation();\n              backdropPointerDownRef.current = true;\n              handleBackdropInteraction();\n            }}\n            onClick={event => {\n              event.stopPropagation();\n              if (backdropPointerDownRef.current) {\n                backdropPointerDownRef.current = false;\n                return;\n              }\n              handleBackdropInteraction();\n            }}\n          />\n          <RDialog.Content\n            forceMount={rendered ? true : undefined}\n            ref={contentRef}\n            className=\"pointer-events-none absolute inset-y-0 right-0 flex w-fit max-w-full justify-end outline-none\"\n            onOpenAutoFocus={event => {\n              event.preventDefault();\n              contentRef.current?.focus({ preventScroll: true });\n            }}\n            onEscapeKeyDown={guardClose}\n            onPointerDownOutside={guardInteractOutside}\n            onInteractOutside={guardInteractOutside}\n          >\n            <RDialog.Title className=\"sr-only\">{title || 'Drawer'}</RDialog.Title>\n            <div\n              ref={panelRef}\n              className={cn(\n                'pointer-events-auto relative flex h-full max-w-full translate-x-full flex-col overflow-hidden bg-[var(--cmp-drawer-bg)] shadow-[var(--shadow-overlay)] transition-transform duration-300 ease-out data-[state=open]:translate-x-0 data-[state=closed]:translate-x-full',\n                shaking && 'animate-drawer-shake',\n                className,\n              )}\n              data-s-drawer-panel\n              data-state={open && entered ? 'open' : 'closed'}\n              style={{\n                width: appliedWidth,\n                minWidth: appliedMinWidth,\n                maxWidth: appliedMaxWidth,\n                ...style,\n              }}\n              onAnimationEnd={event => {\n                if (event.animationName === 'drawer-shake') setShaking(false);\n              }}\n            >\n              {resizable && (\n                <>\n                  {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex --\n                      포커스 가능한 separator = ARIA window splitter 로, 값을 가지는 위젯이다.\n                      jsx-a11y 는 separator 를 항상 비대화형으로 보므로 여기서만 끈다. */}\n                  <div\n                    role=\"separator\"\n                    aria-orientation=\"vertical\"\n                    aria-label=\"Drawer 너비 조절\"\n                    aria-valuenow={resizeValueNow}\n                    aria-valuemin={resizeValueMin}\n                    aria-valuemax={resizeValueMax}\n                    aria-valuetext={\n                      resizeValueNow === undefined ? undefined : `${resizeValueNow}px`\n                    }\n                    tabIndex={0}\n                    onMouseDown={handleResizeStart}\n                    onKeyDown={handleResizeKeyDown}\n                    className=\"group absolute inset-y-0 left-0 z-[1] flex cursor-col-resize touch-none justify-start outline-none\"\n                    style={{ width: RESIZE_HIT_WIDTH }}\n                  >\n                    <span\n                      aria-hidden\n                      className={cn(\n                        // 평상시엔 자리만 잡고 칠하지 않는다 — 색이 붙는 것 자체가 조절 가능하다는 신호다.\n                        'w-(--cmp-splitter-border-width) transition-colors',\n                        'group-hover:bg-(--cmp-splitter-border-color) group-focus-visible:bg-(--cmp-splitter-border-color)',\n                        resizing && 'bg-(--cmp-splitter-border-color)',\n                      )}\n                    />\n                  </div>\n                  {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n                </>\n              )}\n              <SOverlayHeader\n                title={title}\n                showClose\n                onClose={() => {\n                  onClose?.();\n                  onOpenChange?.(false);\n                }}\n              />\n\n              <div className=\"min-h-0 flex-1 overflow-auto border-t border-solid border-[color:var(--cmp-drawer-body-border)]\">\n                <InsideModalProvider value={true}>\n                  <PortalContainerProvider value={portalContainer}>\n                    {children}\n                  </PortalContainerProvider>\n                </InsideModalProvider>\n              </div>\n\n              {(button || footerLeft) && (\n                <SFooter left={footerLeft} leftClassName=\"justify-between\" button={button} />\n              )}\n            </div>\n            <div\n              ref={setPortalContainer}\n              className=\"pointer-events-auto fixed left-0 top-0\"\n              style={{ zIndex: 2 }}\n            />\n          </RDialog.Content>\n        </div>\n      </RDialog.Portal>\n    </RDialog.Root>\n  );\n}\n","// @types/node 없이도 타입 검사가 통과하도록 필요한 부분만 선언한다.\n// 번들러가 치환하지 않는 환경도 있으므로 typeof 로 방어한다.\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\n/** 개발 모드 여부 — 진단 로그를 프로덕션 번들에서 조용히 만든다 */\nexport function isDev(): boolean {\n  return typeof process === 'undefined' || process?.env?.NODE_ENV !== 'production';\n}\n","import type { ReactNode } from 'react';\n\n/**\n * SModal.confirm/loading/create 가 띄운 모달의 전역 목록.\n *\n * 왜 필요한가: 명령형 API 는 React 밖(버튼 핸들러·async 흐름)에서 호출되므로 렌더 트리에\n * 노드를 끼워 넣을 방법이 없다. 그래서 원래는 호출할 때마다 `createRoot` 로 새 React 루트를\n * 만들었는데, Context 는 DOM 이 아니라 렌더 트리를 타므로 그 루트에는 앱의 Provider\n * (QueryClient·Router·Theme 등)가 하나도 닿지 않았다.\n *\n * 이 스토어가 그 사이를 잇는다 — 명령형 호출은 여기에 push 만 하고, 앱 트리 안에 한 번\n * 렌더된 `SModalOutlet` 이 구독해 `createPortal` 로 그린다. DOM 위치는 예전과 같은 body\n * 직속 host 지만 렌더 트리는 앱의 자식이 되어 Provider 가 전부 상속된다.\n *\n * outlet 이 없는 앱(구버전 부트스트랩)에서는 SModal 이 예전 `createRoot` 경로로 폴백한다.\n */\nexport interface SModalEntry {\n  /** 스토어 내 식별자 — 제거 대상 지정에 쓴다 */\n  id: number;\n  /** body 직속 host. 모달 자신은 다시 Portal 로 modal host 에 나가므로 보통 비어 있다 */\n  host: HTMLElement;\n  /** 마운트 래퍼 엘리먼트 */\n  node: ReactNode;\n  /** outlet 이 사라져 더 그릴 수 없게 됐을 때 — 콜백 마무리·정리를 엔트리 주인에게 맡긴다 */\n  onOrphan: () => void;\n}\n\nconst EMPTY: readonly SModalEntry[] = [];\n\nlet entries: readonly SModalEntry[] = EMPTY;\nconst listeners = new Set<() => void>();\n/** 렌더 단계에서 확정되는 outlet 존재 여부 — 마운트 방식을 고르는 기준 */\nlet outletRendered = false;\n/** 커밋된 outlet 수 — 중복 경고와 고아 엔트리 정리에만 쓴다 */\nlet outletCount = 0;\nlet nextId = 0;\n\nfunction emit(): void {\n  for (const listener of listeners) listener();\n}\n\n/** @internal useSyncExternalStore 구독 */\nexport function subscribeModalEntries(listener: () => void): () => void {\n  listeners.add(listener);\n  return () => {\n    listeners.delete(listener);\n  };\n}\n\n/** @internal 현재 스냅샷 — 변경이 없으면 같은 참조를 유지해야 한다 */\nexport function getModalEntries(): readonly SModalEntry[] {\n  return entries;\n}\n\n/** @internal SSR 스냅샷 — 서버에서는 명령형 모달이 열려 있을 수 없다 */\nexport function getServerModalEntries(): readonly SModalEntry[] {\n  return EMPTY;\n}\n\n/**\n * @internal outlet 존재 표시 — **렌더 단계에서** 호출한다.\n *\n * 커밋 후 effect 로 등록하면 늦다. effect 는 자식→부모 순으로 돌기 때문에, 페이지가 최초\n * 마운트 effect 에서 모달을 열면 트리 뒤쪽에 있는 outlet 의 effect 가 아직 돌지 않아\n * \"outlet 없음\"으로 판정되고 폴백 경로를 탄다 — 이 구조가 없애려던 Context 단절이 그대로\n * 재현된다. 렌더는 어떤 effect 보다도 앞서므로 여기서 표시한다. (플래그 세팅뿐이라 멱등)\n */\nexport function markModalOutletRendered(): void {\n  outletRendered = true;\n}\n\n/**\n * @internal outlet 마운트 등록. 반환값을 effect cleanup 으로 호출한다.\n * (StrictMode 의 mount→unmount→mount 를 카운터로 견딘다)\n */\nexport function registerModalOutlet(): () => void {\n  outletCount += 1;\n  outletRendered = true;\n  return () => {\n    outletCount -= 1;\n    // StrictMode 재마운트처럼 곧바로 되살아나는 경우가 있어 판정은 다음 마이크로태스크로 미룬다\n    if (outletCount === 0) queueMicrotask(sweepOrphans);\n  };\n}\n\n/**\n * outlet 이 모두 사라졌을 때 — 남은 엔트리는 그려 줄 주체가 없다. 그대로 두면 onDismissed 가\n * 영영 발화하지 않고, 나중에 outlet 이 다시 마운트되면 그 유령 모달이 되살아난다.\n */\nfunction sweepOrphans(): void {\n  if (outletCount > 0) return; // 되살아났다 — 없던 일로\n  outletRendered = false; // 다음 모달은 다시 폴백 경로로\n  if (entries === EMPTY) return;\n  const orphans = entries;\n  entries = EMPTY;\n  emit();\n  for (const entry of orphans) entry.onOrphan();\n}\n\n/** @internal outlet 이 앱 트리에 있는가 — SModal 이 마운트 방식을 고르는 기준 */\nexport function hasModalOutlet(): boolean {\n  return outletRendered;\n}\n\n/** @internal outlet 이 이미 커밋돼 있는가 — 중복 outlet 개발 경고용 */\nexport function isModalOutletMounted(): boolean {\n  return outletCount > 0;\n}\n\n/** @internal 모달 추가 → outlet 이 그린다. 반환한 id 로 나중에 제거한다 */\nexport function addModalEntry(host: HTMLElement, node: ReactNode, onOrphan: () => void): number {\n  const id = ++nextId;\n  entries = [...entries, { id, host, node, onOrphan }];\n  emit();\n  return id;\n}\n\n/** @internal 모달 제거 → outlet 이 언마운트하고 host 도 함께 정리한다 */\nexport function removeModalEntry(id: number): void {\n  const next = entries.filter(entry => entry.id !== id);\n  if (next.length === entries.length) return;\n  entries = next;\n  emit();\n}\n","'use client';\n\nimport {\n  Component,\n  useEffect,\n  useRef,\n  useState,\n  type ComponentType,\n  type ReactElement,\n  type ReactNode,\n} from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { isDev } from '../../lib/is-dev';\nimport { addModalEntry, hasModalOutlet, removeModalEntry } from '../../lib/modal-outlet';\nimport { SConfirmModal, type SConfirmModalProps } from '../SConfirmModal';\nimport { SLoadingModal, type SLoadingModalProps } from '../SLoadingModal';\n\n/**\n * 명령형 모달 서비스 — 원본 디자인 시스템의 `sdModal.confirm/loading/create` 파리티.\n * 선언형 <SConfirmModal open> / <SLoadingModal open> 을 대체하는 게 아니라, 버튼 핸들러에서\n * 바로 모달을 띄우는 흐름을 위해 추가로 제공한다.\n *\n * 구현: 호출 시마다 document.body 에 host div 를 만들고 그 안에 모달을 렌더한다.\n * 렌더 경로는 둘 중 하나다.\n *\n * 1. 앱 트리에 `SModalOutlet` 이 있으면 — 전역 스토어에 push 만 하고 outlet 이 host 로\n *    portal 한다. 렌더 트리가 앱의 자식이라 QueryClient·Router·Theme 등 Context 를 전부\n *    상속한다. **권장 경로다.**\n * 2. outlet 이 없으면 — 예전처럼 host 에 `createRoot` 로 별도 루트를 만든다. Context 는\n *    DOM 이 아니라 렌더 트리를 타므로 앱의 Provider 가 하나도 닿지 않는다. 하위 호환용\n *    폴백이며 개발 모드에서 1회 경고한다.\n *\n * 어느 경로든 닫힘 애니메이션이 끝나면 자동으로 언마운트·정리하고, 표시 중 옵션은 마운트\n * 컴포넌트가 state 로 들고 있어 update() 로 갱신할 수 있다.\n */\n\n// 닫힘 정리 지연 — overlay-out(0.3s)/modal-out(0.2s) 중 긴 쪽 + 버퍼\nconst EXIT_DURATION = 300;\nconst EXIT_BUFFER = 100;\n\n/** SModal.confirm 옵션 — 제어 흐름을 서비스가 담당하므로 관련 props 는 제외 */\nexport type SConfirmOptions = Omit<\n  SConfirmModalProps,\n  'open' | 'onOpenChange' | 'onOk' | 'onCancel' | 'onClose'\n>;\n\n/** SModal.loading 옵션 — 제어 흐름을 서비스가 담당하므로 관련 props 는 제외 */\nexport type SLoadingOptions = Omit<\n  SLoadingModalProps,\n  'open' | 'onOpenChange' | 'onClose' | 'onButtonClick'\n>;\n\n/**\n * create() 가 컴포넌트에 주입하는 prop.\n *\n * 컴포넌트는 `open`/`onOpenChange`/`onClose` 를 루트의 SActionModal 에 **그대로 전달**해야 한다.\n * 전달하지 않으면 모달이 열리지도, 닫히지도 않는다.\n *\n * (컴포넌트 문서 생성기 docs:gen 은 `*Props` interface 를 \"컴포넌트\"로 취급하므로,\n *  서비스인 SModal 이 컴포넌트로 잘못 문서화되지 않도록 type 별칭으로 둔다. README 는 수작성.)\n */\nexport type SModalCreateComponentProps = {\n  /** 표시 여부 — SActionModal 의 open 에 그대로 전달 */\n  open: boolean;\n  /** 표시 상태 변경 — SActionModal 의 onOpenChange 에 그대로 전달 */\n  onOpenChange: (open: boolean) => void;\n  /** 닫기(X) 클릭 — SActionModal 의 onClose 에 그대로 전달 */\n  onClose: () => void;\n  /** 모달 제어 핸들. 컴포넌트에서 ok()/cancel()/close()/submit()/onSubmit() 호출 */\n  modalRef: SModalRef;\n};\n\n/**\n * SModal.create 옵션 — SActionModal 을 루트로 렌더하는 컴포넌트를 띄운다.\n *\n * 디자인 시스템이 띄우는 모달은 SActionModal / SConfirmModal / SLoadingModal 세 가지뿐이고,\n * 서비스 메서드가 1:1 로 대응한다 — create → SActionModal, confirm → SConfirmModal,\n * loading → SLoadingModal. create 는 컨테이너를 덧씌우지 않고 component 를 그대로 렌더하며,\n * 표시 제어(open/onOpenChange/onClose/modalRef)만 주입하고 닫힘 후 정리를 담당한다.\n */\nexport interface SCreateOptions<P extends object = Record<string, never>> {\n  /**\n   * 띄울 컴포넌트. **루트에 SActionModal 을 렌더**하고 주입받은 open/onOpenChange/onClose 를\n   * 그대로 전달해야 한다. 모달 껍데기 없이 본문만 렌더하면 딤·카드 없이 콘텐츠가 그대로\n   * 화면에 붙는다 — 개발 모드에서는 이를 감지해 경고한다.\n   */\n  component: ComponentType<P & SModalCreateComponentProps>;\n  /** component 에 전달할 추가 props (주입 prop 과 이름이 겹치면 주입 쪽이 이긴다) */\n  componentProps?: P;\n}\n\n/**\n * SModal.confirm / loading / create 반환 핸들 — 체이닝 콜백 등록 + 트리거/update/close.\n * 원본 sdModal 의 ModalDialogRef 와 동일하게 단일 타입이며, 모달 종류에 따라 관련 있는\n * 메서드만 실제 발화한다(예: onOk/onCancel 은 confirm, onClick 은 loading, onSubmit 은 create).\n */\nexport interface SModalRef {\n  /** 확인 버튼 클릭 (confirm) 또는 ok() 트리거 */\n  onOk(fn: () => void): SModalRef;\n  /** 취소(서브) 버튼 클릭 (confirm) 또는 cancel() 트리거 */\n  onCancel(fn: () => void): SModalRef;\n  /** 닫기(X) 버튼 클릭 또는 close() 트리거 */\n  onClose(fn: () => void): SModalRef;\n  /**\n   * 단일 버튼 모달(loading error 등)의 버튼 클릭. 자동 닫힘이 없으므로\n   * consumer 가 update()/close() 로 후속 동작을 결정한다. (원본 sdModal onClick)\n   */\n  onClick(fn: () => void): SModalRef;\n  /**\n   * create 커스텀 모달의 제출(submit). 자동 닫힘 없이 fn 만 호출하므로 API 응답을\n   * 받은 뒤 ok()/close()/update() 로 후속 동작을 결정한다. (원본 sdModal onSubmit)\n   */\n  onSubmit(fn: () => void): SModalRef;\n  /** 사유와 무관하게 모달이 완전히 닫혀 언마운트된 뒤 (백드롭·ESC 닫힘 포함) */\n  onDismissed(fn: () => void): SModalRef;\n  /** 표시 중 옵션 갱신 (loading→error, progress, 메시지 등). create 는 미지원. */\n  update(patch: Partial<SConfirmOptions & SLoadingOptions>): SModalRef;\n  /** onOk 트리거 + 닫기 (저장/처리 성공 시맨틱) */\n  ok(): SModalRef;\n  /** onCancel 트리거 + 닫기 (작업 취소 시맨틱) */\n  cancel(): SModalRef;\n  /** onClose 트리거 + 닫기 (중립적 닫기, persistent 여부와 무관) */\n  close(): SModalRef;\n  /** onSubmit 트리거 (닫힘 없음) — create 커스텀 컴포넌트가 제출 버튼에서 호출 */\n  submit(): SModalRef;\n}\n\ntype OptionsPatch = Partial<SConfirmOptions & SLoadingOptions>;\n\nclass SModalRefImpl implements SModalRef {\n  private okFn?: () => void;\n  private cancelFn?: () => void;\n  private closeFn?: () => void;\n  private clickFn?: () => void;\n  private submitFn?: () => void;\n  private dismissedFn?: () => void;\n  private closeBinding?: () => void;\n  private updateBinding?: (patch: OptionsPatch) => void;\n  private pendingClose = false;\n  private pendingPatches: OptionsPatch[] = [];\n  private dismissRequested = false;\n  private torndown = false;\n  private root?: Root;\n  private host?: HTMLElement;\n  private entryId?: number;\n\n  onOk(fn: () => void): this {\n    this.okFn = fn;\n    return this;\n  }\n  onCancel(fn: () => void): this {\n    this.cancelFn = fn;\n    return this;\n  }\n  onClose(fn: () => void): this {\n    this.closeFn = fn;\n    return this;\n  }\n  onClick(fn: () => void): this {\n    this.clickFn = fn;\n    return this;\n  }\n  onSubmit(fn: () => void): this {\n    this.submitFn = fn;\n    return this;\n  }\n  onDismissed(fn: () => void): this {\n    this.dismissedFn = fn;\n    return this;\n  }\n  update(patch: OptionsPatch): this {\n    if (this.updateBinding) this.updateBinding(patch);\n    else this.pendingPatches.push(patch);\n    return this;\n  }\n\n  // 닫힘 트리거 — 이미 닫힘이 시작됐으면 무시(중복 콜백 방지)\n  private settle(emit: () => void): void {\n    if (this.dismissRequested) return;\n    this.dismissRequested = true;\n    emit();\n    if (this.closeBinding) this.closeBinding();\n    else this.pendingClose = true;\n  }\n  ok(): this {\n    this.settle(() => this.okFn?.());\n    return this;\n  }\n  cancel(): this {\n    this.settle(() => this.cancelFn?.());\n    return this;\n  }\n  close(): this {\n    this.settle(() => this.closeFn?.());\n    return this;\n  }\n  submit(): this {\n    this.submitFn?.();\n    return this;\n  }\n\n  /** @internal 마운트 컴포넌트가 닫기 함수를 등록 (등록 전 close() 호출은 지연 반영) */\n  _bindClose(fn: () => void): void {\n    this.closeBinding = fn;\n    if (this.pendingClose) fn();\n  }\n  /** @internal 마운트 컴포넌트가 옵션 갱신 함수를 등록 (등록 전 update() 호출은 지연 반영) */\n  _bindUpdate(fn: (patch: OptionsPatch) => void): void {\n    this.updateBinding = fn;\n    if (this.pendingPatches.length) {\n      this.pendingPatches.forEach(fn);\n      this.pendingPatches = [];\n    }\n  }\n  /** @internal host 주입 — 렌더 전에 호출해야 마운트 검사(_getHost)가 성립한다 */\n  _setHost(host: HTMLElement): void {\n    this.host = host;\n  }\n  /** @internal outlet 경로 정리 대상(스토어 엔트리) 주입 */\n  _setEntry(id: number): void {\n    this.entryId = id;\n  }\n  /** @internal 폴백(createRoot) 경로 정리 대상 주입 */\n  _setRoot(root: Root): void {\n    this.root = root;\n  }\n  /** @internal create 의 마운트 검사용 host 조회 */\n  _getHost(): HTMLElement | undefined {\n    return this.host;\n  }\n  /** @internal 닫힘 시작 표시 — 컴포넌트 버튼·백드롭·ESC 닫힘 경로가 호출(중복 트리거 방지) */\n  _markDismissed(): void {\n    this.dismissRequested = true;\n  }\n  /** @internal confirm 버튼 경로에서 onOk 발화 */ _emitOk(): void {\n    this.okFn?.();\n  }\n  /** @internal confirm 버튼 경로에서 onCancel 발화 */ _emitCancel(): void {\n    this.cancelFn?.();\n  }\n  /** @internal 닫기(X) 경로에서 onClose 발화 */ _emitClose(): void {\n    this.closeFn?.();\n  }\n  /** @internal loading 버튼 경로에서 onClick 발화 */ _emitClick(): void {\n    this.clickFn?.();\n  }\n  /** @internal */ _emitDismissed(): void {\n    this.dismissedFn?.();\n  }\n  /** @internal 닫힘 애니메이션 종료 후 언마운트 */\n  _teardown(): void {\n    if (this.torndown) return;\n    this.torndown = true;\n    if (this.entryId !== undefined) {\n      // outlet 경로 — host 는 엔트리를 그리던 portal 이 언마운트되며 함께 제거한다\n      removeModalEntry(this.entryId);\n      return;\n    }\n    this.root?.unmount();\n    this.host?.remove();\n  }\n  /** @internal 렌더 실패·outlet 소멸로 모달이 사라졌을 때 — 콜백을 마무리하고 정리한다 */\n  _fail(): void {\n    this.dismissRequested = true;\n    this._emitDismissed();\n    this._teardown();\n  }\n}\n\n/** @internal open=false 전환 시 닫힘 애니메이션 후 onDismissed + 언마운트 (1회만) */\nfunction useExitTeardown(open: boolean, refImpl: SModalRefImpl): void {\n  const dismissedRef = useRef(false);\n  useEffect(() => {\n    if (open || dismissedRef.current) return;\n    dismissedRef.current = true;\n    const t = setTimeout(() => {\n      refImpl._emitDismissed();\n      refImpl._teardown();\n    }, EXIT_DURATION + EXIT_BUFFER);\n    return () => clearTimeout(t);\n  }, [open, refImpl]);\n}\n\n/** @internal SConfirmModal 을 createRoot 로 띄우기 위한 마운트 래퍼 */\nfunction ConfirmMount({ options, refImpl }: { options: SConfirmOptions; refImpl: SModalRefImpl }) {\n  // 마운트 즉시 open=true → Radix modal-in 애니메이션 재생\n  const [open, setOpen] = useState(true);\n  const [opts, setOpts] = useState(options);\n\n  useEffect(() => {\n    refImpl._bindClose(() => setOpen(false));\n    refImpl._bindUpdate(patch => setOpts(prev => ({ ...prev, ...patch })));\n  }, [refImpl]);\n\n  useExitTeardown(open, refImpl);\n\n  // ok/cancel/close 시 SConfirmModal 이 핸들러 호출 후 onOpenChange(false) 로 닫는다.\n  return (\n    <SConfirmModal\n      {...opts}\n      open={open}\n      onOpenChange={o => {\n        if (!o) refImpl._markDismissed();\n        setOpen(o);\n      }}\n      onOk={() => refImpl._emitOk()}\n      onCancel={() => refImpl._emitCancel()}\n      onClose={() => refImpl._emitClose()}\n    />\n  );\n}\n\n/** @internal SLoadingModal 을 createRoot 로 띄우기 위한 마운트 래퍼 */\nfunction LoadingMount({ options, refImpl }: { options: SLoadingOptions; refImpl: SModalRefImpl }) {\n  const [open, setOpen] = useState(true);\n  const [opts, setOpts] = useState(options);\n  // 버튼 클릭에 이어 오는 onOpenChange(false) 를 자동 닫힘에서 제외하기 위한 플래그\n  const buttonClicked = useRef(false);\n\n  useEffect(() => {\n    refImpl._bindClose(() => setOpen(false));\n    refImpl._bindUpdate(patch => setOpts(prev => ({ ...prev, ...patch })));\n  }, [refImpl]);\n\n  useExitTeardown(open, refImpl);\n\n  return (\n    <SLoadingModal\n      {...opts}\n      open={open}\n      onOpenChange={o => {\n        // 버튼 클릭 후속 onOpenChange(false) 는 무시 — consumer 가 update()/close() 로 결정\n        if (!o && buttonClicked.current) {\n          buttonClicked.current = false;\n          return;\n        }\n        if (!o) refImpl._markDismissed();\n        setOpen(o);\n      }}\n      onClose={() => refImpl._emitClose()}\n      onButtonClick={() => {\n        buttonClicked.current = true;\n        refImpl._emitClick();\n      }}\n    />\n  );\n}\n\ntype AnyCreateOptions = SCreateOptions<Record<string, unknown>>;\n\n/** outlet 부재 경고는 앱 전체에서 1회만 — 모달을 열 때마다 콘솔을 채우지 않는다 */\nlet outletWarned = false;\n\nconst NO_OUTLET_CAUSE =\n  'SModalOutlet 이 앱 트리에 없어 이 모달은 별도 React 루트(createRoot)로 마운트됩니다. ' +\n  'React Context 는 DOM 이 아니라 렌더 트리를 타므로 앱의 Provider(QueryClient·Router·Theme 등)가 ' +\n  '닿지 않습니다. 앱 부트스트랩에서 Provider 안쪽에 <SModalOutlet /> 을 한 번 렌더하세요.';\n\n/** @internal 폴백 경로로 마운트할 때의 개발 모드 안내 */\nfunction warnMissingOutlet(): void {\n  if (!isDev() || outletWarned) return;\n  outletWarned = true;\n  console.warn(`[SModal] ${NO_OUTLET_CAUSE}`);\n}\n\n/**\n * @internal 마운트 직후 component 가 실제로 모달을 띄웠는지 확인하고, 아니면 개발 모드에서 경고.\n *\n * component 는 임의의 컴포넌트라 정적으로는 판별할 수 없다(TypeScript 도 못 잡는다). 대신 렌더\n * 결과로 판별한다 — 디자인 시스템 모달은 셋 다 Radix Portal 로 body 에 렌더되므로 create 가 만든\n * host 는 비어 있어야 한다. host 에 엘리먼트가 남아 있으면 모달 껍데기 없이 본문만 인라인으로\n * 붙은 것이다.\n */\nfunction warnIfNotModal(host: HTMLElement | undefined, component: unknown): void {\n  if (!isDev()) return;\n  if (!host || host.childElementCount === 0) return;\n  const name = (component as { name?: string })?.name || 'component';\n  console.warn(\n    `[SModal.create] ${name} 이(가) 모달을 띄우지 않았습니다. create 는 컨테이너를 덧씌우지 ` +\n      '않으므로 component 는 루트에 SActionModal 을 렌더하고, 주입받은 open/onOpenChange/onClose 를 ' +\n      '그대로 전달해야 합니다. 확인/취소는 SModal.confirm, 로딩은 SModal.loading 을 사용하세요.',\n  );\n}\n\n/**\n * @internal 모달 컴포넌트를 createRoot 로 띄우기 위한 마운트 래퍼.\n * 컨테이너를 덧씌우지 않고, 표시 제어(open/onOpenChange/onClose)만 주입한다.\n */\nfunction CreateMount({ options, refImpl }: { options: AnyCreateOptions; refImpl: SModalRefImpl }) {\n  const { component: Component, componentProps } = options;\n  const [open, setOpen] = useState(true);\n\n  useEffect(() => {\n    refImpl._bindClose(() => setOpen(false));\n    // create: 모달 컴포넌트가 자체 props 로 표시를 결정하므로 update 미지원(no-op)\n    refImpl._bindUpdate(() => {});\n    // DOM 커밋 후에 검사해야 Portal 이 body 로 빠져나간 결과를 볼 수 있다\n    warnIfNotModal(refImpl._getHost(), Component);\n  }, [refImpl, Component]);\n\n  useExitTeardown(open, refImpl);\n\n  // componentProps 를 먼저 펼쳐 제어 props(open/onOpenChange/onClose)가 항상 이기게 한다.\n  // modalRef 는 children 으로 넘긴 커스텀 본문이 자기 모달을 제어할 수 있도록 함께 주입한다.\n  const componentAllProps = {\n    ...componentProps,\n    open,\n    onOpenChange: (o: boolean) => {\n      if (!o) refImpl._markDismissed();\n      setOpen(o);\n    },\n    onClose: () => refImpl._emitClose(),\n    modalRef: refImpl,\n  } as Record<string, unknown> & SModalCreateComponentProps;\n\n  return <Component {...componentAllProps} />;\n}\n\n/**\n * @internal 모달 렌더 실패를 모달 안에 가둔다.\n *\n * outlet 경로에서는 모달이 앱 트리의 자식이므로, 경계가 없으면 모달 본문에서 던진 예외가\n * 앱의 상위 boundary 까지 올라가 화면 전체를 무너뜨린다. 폴백 경로에서는 실패 원인이 대개\n * \"Provider 가 닿지 않아서\"(No QueryClient set 등)이므로 그 사실을 함께 찍어 준다.\n *\n * 클래스 컴포넌트인 이유: 에러 경계는 React 에서 클래스로만 만들 수 있다.\n */\nclass ModalErrorBoundary extends Component<\n  { standalone: boolean; onError: () => void; children: ReactNode },\n  { failed: boolean }\n> {\n  state = { failed: false };\n\n  static getDerivedStateFromError() {\n    return { failed: true };\n  }\n\n  componentDidCatch(error: unknown): void {\n    console.error(\n      this.props.standalone\n        ? `[SModal] 모달 렌더에 실패했습니다. ${NO_OUTLET_CAUSE}`\n        : '[SModal] 모달 렌더에 실패해 모달을 닫습니다.',\n      error,\n    );\n    // 커밋 중이므로 스토어 갱신·언마운트는 다음 태스크로 미룬다\n    setTimeout(() => this.props.onError(), 0);\n  }\n\n  render(): ReactNode {\n    return this.state.failed ? null : this.props.children;\n  }\n}\n\n/**\n * host div 를 만들고 outlet(있으면) 또는 별도 루트(폴백)에 마운트한 뒤 ref 를 반환하는\n * 공통 부트스트랩. 어느 경로든 DOM 상 위치는 body 직속 host 로 동일하다.\n */\nfunction mount(render: (refImpl: SModalRefImpl) => ReactElement): SModalRef {\n  const host = document.createElement('div');\n  document.body.appendChild(host);\n\n  const refImpl = new SModalRefImpl();\n  refImpl._setHost(host);\n\n  const useOutlet = hasModalOutlet();\n  const node = (\n    <ModalErrorBoundary standalone={!useOutlet} onError={() => refImpl._fail()}>\n      {render(refImpl)}\n    </ModalErrorBoundary>\n  );\n\n  if (useOutlet) {\n    // outlet 이 통째로 사라지면(앱 언마운트·Provider 교체) 이 모달을 그려 줄 주체가 없다 —\n    // 그때는 렌더 실패와 같이 취급해 onDismissed 를 마무리하고 정리한다\n    refImpl._setEntry(addModalEntry(host, node, () => refImpl._fail()));\n    return refImpl;\n  }\n\n  warnMissingOutlet();\n  const root = createRoot(host);\n  refImpl._setRoot(root);\n  root.render(node);\n\n  return refImpl;\n}\n\n/**\n * SModal — 명령형 모달 서비스.\n *\n * @example\n * // 확인/취소\n * SModal.confirm({ type: 'negative', modalTitle: '삭제하시겠습니까?', mainButtonLabel: '삭제', subButtonLabel: '취소' })\n *   .onOk(() => deleteItem())\n *   .onCancel(() => {});\n *\n * @example\n * // 로딩 → 완료 or 에러\n * const ref = SModal.loading({ message: '업로드 중...' });\n * try { await upload(); ref.close(); }\n * catch { ref.update({ state: 'error', message: '업로드 실패' }).onClick(() => retry()); }\n *\n * @example\n * // SActionModal 을 루트로 렌더하는 컴포넌트를 만들어 넘긴다 — 주입 prop 은 그대로 전달\n * function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderModalProps) {\n *   return (\n *     <SActionModal open={open} onOpenChange={onOpenChange} onClose={onClose}\n *       modalTitle=\"주문 처리\" button={{ label: '처리', onClick: () => modalRef.ok() }}>\n *       <OrderBody orderId={orderId} />\n *     </SActionModal>\n *   );\n * }\n * SModal.create({ component: OrderModal, componentProps: { orderId } }).onOk(() => refetch());\n */\nexport const SModal = {\n  /** 확인/취소 모달을 즉시 띄운다. 반환 핸들에 onOk/onCancel/onClose/onDismissed 체이닝. */\n  confirm(options: SConfirmOptions): SModalRef {\n    return mount(refImpl => <ConfirmMount options={options} refImpl={refImpl} />);\n  },\n\n  /**\n   * 로딩(스피너/에러) 모달을 즉시 띄운다. 로딩 중 임의 닫힘 방지를 위해 persistent 기본 true.\n   * 버튼 클릭은 자동 닫힘 없이 onClick 만 발화 — update()/close() 로 후속 동작을 결정한다.\n   */\n  loading(options: SLoadingOptions = {}): SModalRef {\n    return mount(refImpl => (\n      <LoadingMount options={{ persistent: true, ...options }} refImpl={refImpl} />\n    ));\n  },\n\n  /**\n   * SActionModal 을 루트로 렌더하는 컴포넌트를 띄운다. 컨테이너를 덧씌우지 않고 표시 제어\n   * (open/onOpenChange/onClose)와 modalRef 만 주입하며, 닫힘 애니메이션 종료 후 자동으로\n   * 언마운트한다. 컴포넌트가 모달을 띄우지 않으면 개발 모드에서 경고한다.\n   */\n  create<P extends object = Record<string, never>>(options: SCreateOptions<P>): SModalRef {\n    return mount(refImpl => (\n      <CreateMount options={options as unknown as AnyCreateOptions} refImpl={refImpl} />\n    ));\n  },\n};\n","'use client';\n\nimport { useEffect, useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport { isDev } from '../../lib/is-dev';\nimport {\n  getModalEntries,\n  getServerModalEntries,\n  isModalOutletMounted,\n  markModalOutletRendered,\n  registerModalOutlet,\n  subscribeModalEntries,\n  type SModalEntry,\n} from '../../lib/modal-outlet';\nimport { InsideModalProvider, PortalContainerProvider } from '../../lib/portal-container';\n\n/** @internal 엔트리 하나를 자기 host 로 portal 하고, 사라질 때 host 도 정리한다 */\nfunction SModalEntryPortal({ entry }: { entry: SModalEntry }) {\n  useEffect(() => {\n    // StrictMode 의 mount→unmount→mount 로 cleanup 이 먼저 돌아 host 가 떨어져 나갈 수 있다\n    if (!entry.host.isConnected) document.body.appendChild(entry.host);\n    return () => entry.host.remove();\n  }, [entry]);\n\n  return createPortal(entry.node, entry.host);\n}\n\n/**\n * SModalOutlet — 명령형 모달(`SModal.confirm` / `loading` / `create`)이 그려지는 자리.\n *\n * **앱 부트스트랩에서 Provider 안쪽에 한 번만 렌더한다.** 이 outlet 이 있으면 명령형 모달이\n * 앱 렌더 트리의 자식으로 그려져 QueryClient·Router·Theme 등 앱의 Context 를 그대로 상속한다.\n * DOM 상으로는 예전과 같이 `body` 직속으로 portal 되므로 위치·쌓임 순서는 달라지지 않는다.\n *\n * outlet 을 렌더하지 않아도 모달은 뜨지만, 예전처럼 별도 React 루트로 마운트되어 앱의\n * Context 가 닿지 않는다(개발 모드에서 1회 경고).\n *\n * @example\n * // 앱 부트스트랩 — 한 번만. Provider 안쪽이어야 모달이 상속받는다.\n * <QueryClientProvider client={queryClient}>\n *   <RouterProvider router={router} />\n *   <SModalOutlet />\n * </QueryClientProvider>\n */\nexport function SModalOutlet() {\n  // 존재 표시는 렌더 단계에서 한다 — effect 는 자식이 먼저 돌아서, 페이지가 최초 마운트\n  // effect 에서 연 모달이 outlet 을 못 보고 폴백해 버린다 (markModalOutletRendered 주석 참고)\n  markModalOutletRendered();\n\n  const entries = useSyncExternalStore(\n    subscribeModalEntries,\n    getModalEntries,\n    getServerModalEntries,\n  );\n\n  useEffect(() => {\n    // outlet 이 둘이면 같은 엔트리를 둘 다 그려 모달이 겹쳐 뜬다 — 앱 전체에 하나만 둔다\n    if (isDev() && isModalOutletMounted()) {\n      console.warn(\n        '[SModalOutlet] 이미 렌더된 SModalOutlet 이 있습니다. 앱 전체에 하나만 두세요 — ' +\n          '둘 이상이면 같은 모달이 중복으로 그려집니다.',\n      );\n    }\n    return registerModalOutlet();\n  }, []);\n\n  // 명령형 모달은 항상 최상위 모달이다. outlet 이 어쩌다 다른 모달 안에 놓이더라도\n  // 그 모달의 portal 컨테이너를 물려받지 않도록 기본값으로 되돌린다.\n  return (\n    <PortalContainerProvider value={null}>\n      <InsideModalProvider value={false}>\n        {entries.map(entry => (\n          <SModalEntryPortal key={entry.id} entry={entry} />\n        ))}\n      </InsideModalProvider>\n    </PortalContainerProvider>\n  );\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\n/**\n * 페인트 **전에** 부모로 상태를 올려야 할 때 쓴다.\n * useEffect 로 올리면 등록 전 값(예: 폭 0)으로 한 프레임이 먼저 그려져 레이아웃이 번쩍인다.\n *\n * 서버에는 레이아웃 단계가 없어 useLayoutEffect 가 경고를 내므로 SSR 에서는 useEffect 로 내린다.\n */\nexport const useIsomorphicLayoutEffect =\n  typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","'use client';\n\nimport {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useMemo,\n  useState,\n  type CSSProperties,\n  type HTMLAttributes,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport type { SGnbHeader, SGnbType } from '../SGnb/gnb.config';\n\n/** 메뉴 스타일: box(라운드) / belt(풀폭 행) — 자식 SGnb 의 메뉴 모양 */\nexport type SLayoutType = SGnbType;\n/** 레이아웃 구조: fix(좌측 GNB + 페이지 가로 분할) / full(풀폭 상단바 + 아래에 메뉴|페이지) */\nexport type SLayoutHeader = SGnbHeader;\n\n/**\n * 자식 GNB 가 SLayout 에 올리는 자기 치수·요구사항.\n *\n * SLayout 은 GNB 의 내부 상수(레일·메뉴 폭, 상단바 높이, 전환 길이)도 items·activeRail 도 모른다 —\n * 치수를 아는 쪽이 올리고 프레임은 받아 쓰기만 한다. GNB 내부 치수가 바뀌어도 프레임은 따라온다.\n */\nexport interface SLayoutNavState {\n  /**\n   * 펼친 GNB 컬럼 폭(px). 레일·메뉴 유무를 반영한 합이다.\n   * 접힘은 SLayout 이 folded 로 따로 접으므로 여기엔 펼친 폭만 담는다.\n   */\n  columnWidth: number;\n  /** 상단바 높이(CSS 길이) — header=\"full\" 그리드의 1행 높이가 된다. */\n  topHeight: string;\n  /** 접힘 전환 길이(ms) — 페이지 열이 메뉴와 같은 길이로 미끄러지도록 맞춘다. */\n  foldMs: number;\n  /**\n   * 상단바가 레이아웃 전폭이어야 하는지.\n   * 레일에 리프 아이템이 있으면 메뉴 폭이 출렁여 fix 상단바가 함께 흔들리므로 GNB 가 true 로 올린다.\n   * true 면 header prop 과 무관하게 full 로 선다.\n   */\n  requireFullHeader: boolean;\n  /**\n   * GNB 폭을 지금 드래그로 조절하는 중인지.\n   * 참이면 메뉴 열의 폭 전환을 끈다 — 접힘용 전환(foldMs)이 그대로 걸려 있으면\n   * 열이 손보다 그 길이만큼 늦게 따라와 끌리는 느낌이 사라진다.\n   */\n  resizing?: boolean;\n}\n\nconst isSameNav = (a: SLayoutNavState | null, b: SLayoutNavState | null): boolean =>\n  a === b ||\n  (!!a &&\n    !!b &&\n    a.columnWidth === b.columnWidth &&\n    a.topHeight === b.topHeight &&\n    a.foldMs === b.foldMs &&\n    a.requireFullHeader === b.requireFullHeader &&\n    a.resizing === b.resizing);\n\nexport interface SLayoutContextValue {\n  /** 메뉴 스타일 — 자식 SGnb 가 스타일을 맞추는 기준 */\n  type: SLayoutType;\n  /**\n   * 상단바 구조 — 자식 SGnb·SPage 가 배치를 맞추는 기준(유효 header).\n   * 등록된 GNB 가 requireFullHeader 를 올리면 여기에도 full 로 반영된다.\n   */\n  header: SLayoutHeader;\n  /** GNB 좌측 레일 사용 여부 — 자식 SGnb 가 따른다 */\n  useRail: boolean;\n  /** GNB 접힘 상태 */\n  folded: boolean;\n  /** 접힘 상태 변경 */\n  setFolded: (folded: boolean) => void;\n  /**\n   * 자식 GNB 가 자기 치수·요구사항을 등록한다. 언마운트하거나 SLayout 밖으로 나가면 null 로 해제한다.\n   * 페인트 전에 반영돼야 하므로 GNB 쪽에서 layout effect 로 호출한다.\n   */\n  registerNav: (nav: SLayoutNavState | null) => void;\n}\n\nexport const SLayoutContext = createContext<SLayoutContextValue | null>(null);\n\n/**\n * 레이아웃이 보장하는 최소 가로 폭(px). GNB 를 포함한 전체 기준이다.\n * 전용 토큰이 없어 상수로 둔다(GNB_MENU_WIDTH 와 같은 이유).\n *\n * 창이 이보다 좁아져도 프레임 자체는 창을 넘지 않는다 — 모자란 몫은 SPage 가 가로 스크롤로 삼킨다.\n * 그래서 GNB·상단바는 제자리에 남고 문서(창)에는 스크롤이 생기지 않는다.\n */\nexport const SLAYOUT_MIN_WIDTH = 1366;\n\n/**\n * SPage 가 자기 콘텐츠의 최소 폭을 계산할 때 읽는 변수. SLayout 이 프레임에 심는다.\n * SLayout 밖의 SPage 는 이 변수가 없어(폴백 0) 최소 폭 규칙이 걸리지 않는다.\n */\nexport const SLAYOUT_MIN_WIDTH_VAR = '--s-layout-min-width';\n\n/**\n * SLayout 의 상태를 읽고 제어한다. `<SLayout>` 밖에서 호출하면 throw.\n * 외부 버튼으로 GNB 를 접거나, 현재 구조(header)·메뉴 스타일(type)에 따라 분기할 때 사용한다.\n */\nexport function useSLayout(): SLayoutContextValue {\n  const ctx = useContext(SLayoutContext);\n  if (!ctx) throw new Error('useSLayout 은 <SLayout> 안에서만 사용할 수 있습니다.');\n  return ctx;\n}\n\nexport interface SLayoutProps extends HTMLAttributes<HTMLDivElement> {\n  /** 메뉴 스타일: box(라운드) / belt(풀폭 행). 자식 SGnb 가 이 값을 따른다. */\n  type?: SLayoutType;\n  /** 레이아웃 구조: fix(가로 분할) / full(풀폭 상단바). 자식 SGnb·SPage 가 이 값을 따른다. */\n  header?: SLayoutHeader;\n  /**\n   * GNB 좌측 레일 사용 여부. 자식 SGnb 가 이 값을 따르고, 그만큼 넓어진 컬럼 폭을 되올린다.\n   * 레일에 children 없는 아이템이 있으면 SGnb 가 full 상단바를 요구하고, 이 레이아웃도 그에 맞춰 full 그리드로 선다.\n   */\n  useRail?: boolean;\n  /** GNB 접힘 상태 (controlled) */\n  folded?: boolean;\n  /** GNB 초기 접힘 상태 (uncontrolled) */\n  defaultFolded?: boolean;\n  /** 접힘 상태 변경 */\n  onFoldedChange?: (folded: boolean) => void;\n}\n\n/**\n * SLayout — 앱 셸 프레임 겸 context provider.\n * header 가 배치를 결정하고 overflow:hidden 으로 스크롤 경계를 만든다.\n * 자식 SGnb·SPage 는 context 에서 type·header·folded 를 읽으므로 앱은 이 값들을 여기 한 곳에만 쓴다.\n * 높이는 기본 100%(부모를 채움) — 앱 루트로 쓸 땐 부모를 뷰포트 높이로 잡는다.\n *\n * 가로는 SLAYOUT_MIN_WIDTH 를 최소 폭으로 보장한다. 창이 그보다 좁아도 프레임은 창 폭을 그대로 받고,\n * 모자란 몫은 SPage 가 가로 스크롤로 삼킨다 — GNB·상단바는 제자리에 남고 문서엔 스크롤이 생기지 않는다.\n *\n * 치수는 자식이 소유한다: GNB 가 registerNav 로 컬럼 폭·상단바 높이·전환 길이를 올리고\n * 이 프레임은 그 값으로 그리드를 깐다(SLayout 은 GNB 내부 상수를 import 하지 않는다).\n *\n * - header=\"fix\": [GNB(자기 폭 소유) | 페이지] 가로 flex. 프레임이 폭에 관여하지 않는다.\n * - header=\"full\": 이름 있는 영역으로 깐 그리드다.\n *     \"header header\"  ← 전폭 상단바 (1행, 높이 = 등록된 topHeight)\n *     \"nav    page\"    ← 메뉴 열(등록된 columnWidth) | 페이지\n *   접으면 nav 열을 0 으로 접어 페이지가 전폭을 쓴다.\n */\nexport const SLayout = forwardRef<HTMLDivElement, SLayoutProps>(function SLayout(\n  {\n    type = 'box',\n    header = 'fix',\n    useRail = false,\n    folded,\n    defaultFolded = false,\n    onFoldedChange,\n    className,\n    style,\n    children,\n    ...rest\n  },\n  ref,\n) {\n  const [uncontrolledFolded, setUncontrolledFolded] = useState(defaultFolded);\n  const isControlled = folded !== undefined;\n  const currentFolded = isControlled ? folded : uncontrolledFolded;\n\n  const setFolded = useCallback(\n    (next: boolean) => {\n      if (!isControlled) setUncontrolledFolded(next);\n      onFoldedChange?.(next);\n    },\n    [isControlled, onFoldedChange],\n  );\n\n  // 자식 GNB 가 올린 치수. 값이 같으면 같은 참조를 유지해 불필요한 리렌더를 막는다.\n  const [nav, setNav] = useState<SLayoutNavState | null>(null);\n  const registerNav = useCallback(\n    (next: SLayoutNavState | null) => setNav(prev => (isSameNav(prev, next) ? prev : next)),\n    [],\n  );\n\n  // 레일에 리프 아이템이 있으면 GNB 가 전폭 상단바를 요구한다 → 프레임(그리드)도 그에 맞춘다.\n  const effectiveHeader: SLayoutHeader =\n    header === 'full' || nav?.requireFullHeader ? 'full' : 'fix';\n\n  const ctx = useMemo<SLayoutContextValue>(\n    () => ({\n      type,\n      header: effectiveHeader,\n      useRail,\n      folded: currentFolded,\n      setFolded,\n      registerNav,\n    }),\n    [type, effectiveHeader, useRail, currentFolded, setFolded, registerNav],\n  );\n\n  const isFullHeader = effectiveHeader === 'full';\n  /**\n   * 최소 폭 규칙. 프레임은 창을 넘지 않고(폭을 그대로 받고) SPage 가 모자란 몫을 가로 스크롤로 삼킨다.\n   * SPage 가 프레임 폭을 100cqw 로 읽어야 하므로 여기서 컨테이너를 연다 —\n   * 그래야 GNB 폭·접힘·header 구성이 어떻든 SPage 쪽 계산이 저절로 맞는다(프레임이 폭을 알려줄 필요가 없다).\n   */\n  const minWidthStyle: CSSProperties = {\n    containerType: 'inline-size',\n    [SLAYOUT_MIN_WIDTH_VAR]: `${SLAYOUT_MIN_WIDTH}px`,\n  } as CSSProperties;\n  // GNB 가 아직 등록 전이거나 아예 없으면 nav 열·상단바 행을 0 으로 둬 페이지가 전체를 쓴다.\n  const frameStyle: CSSProperties | undefined = isFullHeader\n    ? {\n        // 자식이 좌표가 아니라 이름으로 자리를 잡게 한다 — 열·행이 늘어도 자식을 고칠 일이 없다.\n        gridTemplateAreas: '\"header header\" \"nav page\"',\n        gridTemplateColumns: `${currentFolded ? 0 : (nav?.columnWidth ?? 0)}px 1fr`,\n        gridTemplateRows: `${nav?.topHeight ?? '0px'} 1fr`,\n        // 메뉴가 미끄러지는 동안 페이지 열도 같은 길이로 따라와야 한 덩어리로 읽힌다.\n        // (fix 는 SGnb 가 제 폭을 직접 전환하므로 프레임이 손댈 게 없다)\n        // 단 폭을 끄는 중에는 전환을 끈다 — 그러지 않으면 열이 손보다 늦게 따라온다.\n        transition: nav?.resizing ? 'none' : `grid-template-columns ${nav?.foldMs ?? 0}ms ease-out`,\n      }\n    : undefined;\n\n  return (\n    <SLayoutContext.Provider value={ctx}>\n      <div\n        ref={ref}\n        data-type={type}\n        data-header={effectiveHeader}\n        className={cn(\n          'box-border h-full overflow-hidden',\n          isFullHeader ? 'grid' : 'flex flex-row',\n          className,\n        )}\n        style={{ ...minWidthStyle, ...frameStyle, ...style }}\n        {...rest}\n      >\n        {children}\n      </div>\n    </SLayoutContext.Provider>\n  );\n});\n","import type { SColor } from '../../lib/color';\nimport type { SIconName } from '../SIcon';\nimport type { STagColor } from '../STag';\n\n/** 메뉴 스타일: box = 라운드/좁은 들여쓰기, belt = 풀폭 행/넓은 들여쓰기 */\nexport type SGnbType = 'box' | 'belt';\n/** 상단바 구조: fix = GNB 폭에 고정, full = 레이아웃 전폭 */\nexport type SGnbHeader = 'fix' | 'full';\n/** 색상(테마): light / dark */\nexport type SGnbColor = 'light' | 'dark';\n\n/** GNB 메뉴 아이템 (재귀 트리). depth1 → depth2 → depth3. */\nexport interface SGnbMenuItem {\n  /** 표시 텍스트 */\n  label: string;\n  /** 고유 식별값 (선택 상태 비교 기준) */\n  value: string;\n  /** depth1 전용 아이콘명 */\n  icon?: SIconName;\n  /** 우측 Tag 뱃지 텍스트 */\n  tag?: string;\n  /** 뱃지 색. 미지정 시 blue. */\n  tagColor?: STagColor;\n  /** 비활성 여부 */\n  disabled?: boolean;\n  /** 하위 아이템 (있으면 펼침/접힘 대상) */\n  children?: SGnbMenuItem[];\n}\n\n// theme.css 의 컴포넌트 토큰 참조 (디자인팀 소유, 직접 수정 금지)\n// 토큰은 gnb 한 벌로 통합됐다:\n//   공통(상단바/로고/폴드/바디/아이템) → --cmp-gnb-*\n//   메뉴 변형(type 축)  box → --cmp-gnb-box-*,   belt → --cmp-gnb-belt-*\n//   접힘 레일           → --cmp-gnb-rail-*\n//   색(color 축)        light → --cmp-gnb-light-*, dark → --cmp-gnb-dark-*\nconst gnb = (p: string) => `var(--cmp-gnb-${p})`;\nconst box = (p: string) => `var(--cmp-gnb-box-${p})`;\nconst belt = (p: string) => `var(--cmp-gnb-belt-${p})`;\nconst light = (p: string) => `var(--cmp-gnb-light-${p})`;\nconst dark = (p: string) => `var(--cmp-gnb-dark-${p})`;\n\n/**\n * 상단바(header 축). 상단바 치수 토큰은 gnb 로 통합돼(--cmp-gnb-top-*) fix·full 이 공유한다.\n * 배치는 여전히 이 축이 정한다 — fix 는 GNB 컬럼 안, full 은 레이아웃 전폭(SGnb 에서 분기).\n */\nconst HEADER_TOP = {\n  topHeight: gnb('top-height'),\n  topPaddingX: gnb('top-paddingX'),\n  topGap: gnb('top-gap'),\n  logoHeight: gnb('logo-height'),\n};\n\nexport const GNB_HEADER: Record<\n  SGnbHeader,\n  {\n    topHeight: string;\n    topPaddingX: string;\n    topGap: string;\n    logoHeight: string;\n  }\n> = {\n  fix: HEADER_TOP,\n  full: HEADER_TOP,\n};\n\n/** 메뉴(type 축). box → --cmp-gnb-box-*, belt → --cmp-gnb-belt-* (공통 치수는 --cmp-gnb-*) */\nexport const GNB_MENU: Record<\n  SGnbType,\n  {\n    bodyPaddingY: string;\n    itemMarginX: string;\n    itemPaddingY: string;\n    itemPaddingRight: string;\n    itemGap: string;\n    itemRadius: string;\n    itemArrow: string;\n    depth1PaddingLeft: string;\n    depth2PaddingLeft: string;\n    depth3PaddingLeft: string;\n    depth1Icon: string;\n    // 타이포 (theme.css 에 gnb 타이포 변수 없음 → 토큰 값 직접 명시)\n    depth1FontSize: number;\n    depth1LineHeight: number;\n    depth1FontWeight: number;\n    itemFontSize: number;\n    itemLineHeight: number;\n  }\n> = {\n  box: {\n    // 바디 패딩·세로 패딩·chevron 은 gnb 로 통합된 공통 토큰\n    bodyPaddingY: gnb('body-padding'),\n    itemMarginX: gnb('body-padding'), // 전방향 토큰 → 아이템 좌우 여백에도 사용\n    itemPaddingY: gnb('item-paddingY'),\n    itemPaddingRight: box('item-paddingRight'),\n    itemGap: box('item-gap'),\n    itemRadius: box('item-radius'),\n    itemArrow: gnb('item-chevron-size'),\n    depth1PaddingLeft: box('item-depth1-paddingLeft'),\n    depth2PaddingLeft: box('item-depth2-paddingLeft'),\n    depth3PaddingLeft: box('item-depth3-paddingLeft'),\n    depth1Icon: box('item-depth1-icon'),\n    depth1FontSize: 14, // token: gnb.box.item.typography.selected.fontSize\n    depth1LineHeight: 24, // token: gnb.box.item.typography.selected.lineHeight\n    depth1FontWeight: 700,\n    itemFontSize: 14, // token: gnb.box.item.typography.default.fontSize\n    itemLineHeight: 24, // token: gnb.box.item.typography.default.lineHeight\n  },\n  belt: {\n    bodyPaddingY: gnb('body-padding'),\n    itemMarginX: '0px', // belt 토큰에 가로 여백 없음 → 풀폭 행 (들여쓰기는 depth*-paddingLeft 전담)\n    itemPaddingY: gnb('item-paddingY'),\n    itemPaddingRight: belt('item-paddingRight'),\n    itemGap: belt('item-gap'),\n    itemRadius: '0px', // belt 토큰에 radius 없음 → 풀폭 행\n    itemArrow: gnb('item-chevron-size'),\n    depth1PaddingLeft: belt('item-depth1-paddingLeft'),\n    depth2PaddingLeft: belt('item-depth2-paddingLeft'),\n    depth3PaddingLeft: belt('item-depth3-paddingLeft'),\n    depth1Icon: belt('item-depth1-icon'), // belt 전용 depth1 아이콘 토큰(16)\n    depth1FontSize: 13, // token: gnb.belt.item.depth1.typography.fontSize\n    depth1LineHeight: 22, // token: gnb.belt.item.depth1.typography.lineHeight\n    depth1FontWeight: 700,\n    itemFontSize: 12, // token: gnb.belt.item.typography.default.fontSize\n    itemLineHeight: 20, // token: gnb.belt.item.typography.default.lineHeight\n  },\n};\n\n/**\n * 색상(color 축). light → --cmp-gnb-light-* 색, dark → --cmp-gnb-dark-* 색\n * 상단바 아이콘 색(--cmp-gnb-*-top-icon)은 SGhostButton 이 자체 intent 토큰으로 칠한다:\n * light → --cmp-ghostButton-default-content, dark → --cmp-ghostButton-inverse-content (값 동일).\n */\nexport const GNB_COLORS: Record<\n  SGnbColor,\n  {\n    panelBg: string;\n    topBorder: string;\n    itemBgDefault: string;\n    itemBgHover: string;\n    itemBgSelected: string;\n    itemColorDefault: string;\n    itemColorHover: string;\n    itemColorActive: string;\n    itemChevron: string;\n    /** depth1 아이콘 색. 대응 --cmp-gnb-*-item-icon 토큰이 없어 팔레트 키로 직접 지정한다. */\n    itemIcon: SColor;\n    /**\n     * 레일 아이템 기본 색. 버튼에 얹어 아이콘·라벨이 같은 색으로 물든다.\n     * 선택 시엔 itemColorActive 를 쓴다.\n     */\n    railFgDefault: string;\n  }\n> = {\n  light: {\n    panelBg: light('bg'),\n    topBorder: light('divider'),\n    itemBgDefault: light('item-bg-default'),\n    itemBgHover: light('item-bg-hover'),\n    itemBgSelected: light('item-bg-selected'),\n    itemColorDefault: light('item-fg-default'),\n    itemColorHover: light('item-fg-hover'),\n    itemColorActive: light('item-fg-selected'),\n    itemChevron: light('item-chevron'),\n    itemIcon: 'grey_65',\n    railFgDefault: light('rail-fg-default'),\n  },\n  dark: {\n    panelBg: dark('bg'),\n    topBorder: dark('divider'),\n    itemBgDefault: dark('item-bg-default'),\n    itemBgHover: dark('item-bg-hover'),\n    itemBgSelected: dark('item-bg-selected'),\n    itemColorDefault: dark('item-fg-default'),\n    itemColorHover: dark('item-fg-hover'),\n    itemColorActive: dark('item-fg-selected'),\n    itemChevron: dark('item-chevron'),\n    itemIcon: 'grey_55',\n    // dark 는 어두운 배경에서 레일이 흐려 보여 아이콘·라벨을 함께 white 로 띄운다.\n    // --cmp-gnb-dark-rail-fg-default(#AAAAAA)를 의도적으로 덮는 값이라 토큰 대신 팔레트를 직접 쓴다.\n    railFgDefault: 'var(--color-white)',\n  },\n};\n\n/** 축과 무관한 공통 레이아웃. */\nexport const GNB_COMMON = {\n  /** 접힘 레일 폭. header=\"full\" 은 접으면 메뉴만 사라져 레일이 없으므로 fix 전용. */\n  foldWidth: gnb('fold-width'),\n};\n\n/**\n * 좌측 레일(useRail) — items 의 첫 depth 를 아이콘+라벨 버튼으로 세우는 1차 내비게이션.\n * 선택 색은 레일 전용 토큰이 없어 메뉴 아이템의 선택 색(item-bg-selected / item-fg-selected)을 함께 쓴다.\n */\nexport const GNB_RAIL = {\n  padding: gnb('rail-padding'),\n  gap: gnb('rail-gap'),\n  itemWidth: gnb('rail-item-width'),\n  itemPaddingTop: gnb('rail-item-paddingTop'),\n  itemPaddingBottom: gnb('rail-item-paddingBottom'),\n  itemRadius: gnb('rail-item-radius'),\n  itemIcon: gnb('rail-item-icon'),\n  // 타이포 (theme.css 에 gnb 타이포 변수 없음 → 토큰 값 직접 명시)\n  itemFontSize: 11, // token: gnb.rail.item.typography.default.fontSize\n  itemLineHeight: 18, // token: gnb.rail.item.typography.default.lineHeight\n  itemFontWeight: 500, // token: gnb.rail.item.typography.default.fontWeight\n  itemFontWeightSelected: 700, // token: gnb.rail.item.typography.selected.fontWeight\n};\n\n/**\n * 레일 컬럼 폭 = rail-item-width(44) + rail-padding(12)*2.\n * 토큰이 CSS 변수라 JS 에서 더할 수 없어 합을 상수로 둔다 (GNB_MENU_WIDTH 와 같은 이유).\n */\nexport const GNB_RAIL_WIDTH = 68;\n\n/**\n * 접힘/펼침 전환 시간(ms). GNB 폭·메뉴 슬라이드·상단바 페이드와 SLayout 의 메뉴 열 폭이\n * 이 값을 공유해야 한 덩어리로 미끄러진다.\n */\nexport const GNB_FOLD_MS = 200;\n\n/**\n * 하위 메뉴 펼침/접힘 전환 시간(ms). 아이템을 눌러 children 이 열리고 닫힐 때\n * 높이(grid-template-rows 0fr↔1fr)가 이 길이만큼 부드럽게 늘고 줄어든다.\n * 폴드와 같은 값을 써서 두 모션이 한 언어로 읽히게 한다.\n */\nexport const GNB_EXPAND_MS = 200;\n\n/**\n * 메뉴 고정 폭. 두 header 모두 메뉴는 이 폭으로 좌측에 붙는다(토큰 없음 → 상수).\n * header=\"full\" 에서 SLayout 이 \"메뉴 오른쪽 = 페이지\" 영역을 잡을 때도 이 값을 쓴다.\n */\nexport const GNB_MENU_WIDTH = 240;\n\n/**\n * resizable 일 때 메뉴 폭이 움직일 수 있는 범위(px). 레일 폭은 고정이고 메뉴 컬럼만 늘고 준다.\n * 디자인이 아직 확정한 값이 아니라 임시다 — 확정되면 토큰으로 내려온다.\n */\nexport const GNB_MENU_MIN_WIDTH = 200;\nexport const GNB_MENU_MAX_WIDTH = 300;\n\n/** 메뉴 폭 조절에서 방향키 한 번에 움직이는 양(px). Shift 를 함께 누르면 large. */\nexport const GNB_MENU_RESIZE_KEY_STEP = { normal: 10, large: 50 };\n\n/** 메뉴 폭을 허용 범위 안으로 자른다. */\nexport const clampGnbMenuWidth = (width: number): number =>\n  Math.min(GNB_MENU_MAX_WIDTH, Math.max(GNB_MENU_MIN_WIDTH, Math.round(width)));\n\n/**\n * header=\"full\" 상단바의 로고 슬롯 고정 폭(토큰 없음 → 상수).\n * 전폭 상단바에서는 로고 오른쪽에 topContent 슬롯이 이어지므로, 로고 내용이 바뀌어도\n * 그 시작점이 흔들리지 않도록 자리를 못 박는다. fix 는 상단바가 GNB 컬럼 안이라 내용 폭을 따른다.\n * 런처를 쓰지 않으면 그 자리를 로고가 이어받는다 → GNB_FULL_LOGO_WIDTH_NO_LAUNCHER.\n */\nexport const GNB_FULL_LOGO_WIDTH = 140;\n\n/**\n * 상단바에서 아이콘 버튼끼리 붙는 간격(px, 디자인 스펙 — 전용 토큰 없음).\n * header=\"full\" 의 런처↔폴드가 여기 해당한다. 슬롯(로고·topContent)과의 간격은\n * 이보다 넓은 --cmp-gnb-top-gap 을 쓴다.\n */\nexport const GNB_TOP_ICON_GAP = 8;\n\n/**\n * 상단바 아이콘 버튼(xs 고스트) 폭 = --cmp-ghostButton-xs-size.\n * 토큰이 CSS 변수라 JS 에서 더할 수 없어 값을 상수로 둔다(GNB_RAIL_WIDTH 와 같은 이유).\n */\nexport const GNB_TOP_ICON_SIZE = 24;\n\n/**\n * 런처를 쓰지 않는 header=\"full\" 의 로고 슬롯 폭 = 기본 폭 + 런처가 비운 자리(버튼 + 간격).\n * 런처 유무로 topContent 시작점이 32px 씩 밀리지 않도록, 빈 자리를 로고가 흡수한다.\n */\nexport const GNB_FULL_LOGO_WIDTH_NO_LAUNCHER =\n  GNB_FULL_LOGO_WIDTH + GNB_TOP_ICON_SIZE + GNB_TOP_ICON_GAP;\n\n/**\n * useRail 에서 value 를 품은 첫 depth(레일) 아이템의 value.\n * value 자체가 레일 아이템이면 그 값을, 어디에도 없으면 undefined 를 반환한다.\n */\nexport function findGnbRailValue(items: SGnbMenuItem[], value: string): string | undefined {\n  if (items.some(item => item.value === value)) return value;\n  return findGnbAncestors(items, value)[0];\n}\n\n/** value 를 가진 아이템의 형제(같은 부모의 나머지 아이템) value 목록을 반환 → 아코디언 펼침용 */\nexport function findGnbSiblingValues(items: SGnbMenuItem[], value: string): string[] {\n  const walk = (list: SGnbMenuItem[]): string[] | null => {\n    if (list.some(item => item.value === value)) {\n      return list.filter(item => item.value !== value).map(item => item.value);\n    }\n    for (const item of list) {\n      if (item.children) {\n        const found = walk(item.children);\n        if (found) return found;\n      }\n    }\n    return null;\n  };\n  return walk(items) ?? [];\n}\n\n/** value 로 선택된 아이템의 조상 value 목록(자기 자신 제외)을 반환 → 자동 펼침용 */\nexport function findGnbAncestors(items: SGnbMenuItem[], value: string): string[] {\n  const walk = (list: SGnbMenuItem[], trail: string[]): string[] | null => {\n    for (const item of list) {\n      if (item.value === value) return trail;\n      if (item.children) {\n        const found = walk(item.children, [...trail, item.value]);\n        if (found) return found;\n      }\n    }\n    return null;\n  };\n  return walk(items, []) ?? [];\n}\n","'use client';\n\nimport {\n  forwardRef,\n  useContext,\n  useMemo,\n  useEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n  type HTMLAttributes,\n  type KeyboardEvent as ReactKeyboardEvent,\n  type MouseEvent as ReactMouseEvent,\n  type ReactNode,\n} from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { useIsomorphicLayoutEffect } from '../../lib/isomorphic-layout-effect';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { SCROLLBAR_HIDDEN_CLASS } from '../../lib/scrollbar';\nimport { SGhostButton } from '../SGhostButton';\nimport { SIcon } from '../SIcon';\nimport { SLayoutContext } from '../SLayout/SLayout';\nimport { STag } from '../STag';\nimport {\n  GNB_HEADER,\n  GNB_MENU,\n  GNB_COLORS,\n  GNB_COMMON,\n  GNB_FOLD_MS,\n  GNB_EXPAND_MS,\n  GNB_FULL_LOGO_WIDTH,\n  GNB_FULL_LOGO_WIDTH_NO_LAUNCHER,\n  GNB_MENU_MAX_WIDTH,\n  GNB_MENU_MIN_WIDTH,\n  GNB_MENU_RESIZE_KEY_STEP,\n  GNB_MENU_WIDTH,\n  GNB_RAIL,\n  GNB_RAIL_WIDTH,\n  GNB_TOP_ICON_GAP,\n  clampGnbMenuWidth,\n  findGnbAncestors,\n  findGnbRailValue,\n  findGnbSiblingValues,\n  type SGnbType,\n  type SGnbHeader,\n  type SGnbColor,\n  type SGnbMenuItem,\n} from './gnb.config';\n\nexport interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n  /** 메뉴 스타일: box(라운드) / belt(풀폭 행). 미지정 시 SLayout 의 type 을 따른다. */\n  type?: SGnbType;\n  /**\n   * 상단바 구조: fix(GNB 폭 고정) / full(레이아웃 전폭). 미지정 시 SLayout 의 header 를 따른다.\n   * 단, useRail 이고 레일에 children 없는 아이템이 있으면 메뉴 폭이 출렁이므로 full 로 강제된다.\n   */\n  header?: SGnbHeader;\n  /** 색상 테마: light / dark */\n  color?: SGnbColor;\n  /** 메뉴 트리 (depth1 → depth2 → depth3). useRail 이면 첫 depth 가 레일이 되고 그 children 이 depth1 이 된다. */\n  items: SGnbMenuItem[];\n  /**\n   * 좌측 레일 사용 여부. 켜면 items 의 첫 depth 가 아이콘+라벨 버튼의 세로 레일로 서고,\n   * 선택된 레일 아이템의 children 이 오른쪽 메뉴 패널에 깔린다. 미지정 시 SLayout 의 useRail 을 따른다.\n   * children 없는 레일 아이템이 활성이면 메뉴 패널은 렌더되지 않고 레일만 남는다.\n   */\n  useRail?: boolean;\n  /** 현재 선택된 아이템 value */\n  value?: string;\n  /** 선택 변경 (sdUpdate) */\n  onValueChange?: (value: string) => void;\n  /** 레일 선택 변경. 레일 아이템을 눌러 패널이 바뀔 때 알린다(선택 상태는 SGnb 가 자체 관리). */\n  onRailChange?: (value: string) => void;\n  /** 접힘(레일) 상태. 미지정 시 SLayout 의 folded 를 따른다. */\n  folded?: boolean;\n  /** 접힘 토글 (sdFoldChange) */\n  onFoldChange?: (folded: boolean) => void;\n  /** 앱런처(그리드) 버튼 클릭. 미지정 시 런처 버튼을 렌더하지 않는다. 접힘 레일(fix)에는 폴드 버튼만 남으므로 표시되지 않는다. */\n  onLauncherClick?: () => void;\n  /** 상단바 로고 영역 (slot). header=\"full\" 이면 폭이 140px 로 고정된다. */\n  logo?: ReactNode;\n  /**\n   * 상단바 로고 오른쪽 슬롯 (검색·액션 등). 로고와 16px 띄고 남는 폭을 모두 차지하므로\n   * 안에서 자유롭게 정렬한다. 상단바가 전폭인 header=\"full\" 에서만 렌더된다\n   * (fix 는 상단바가 좁은 GNB 컬럼 안이라 놓을 자리가 없다).\n   */\n  topContent?: ReactNode;\n  /**\n   * 레일 상단 고정 슬롯. 레일 아이템이 많아 넘치면 아이템 목록(ul)만 스크롤되고\n   * 이 슬롯은 레일 상단(상단바 바로 아래)에 붙어 고정된다. useRail 일 때만 렌더된다.\n   */\n  railTop?: ReactNode;\n  /**\n   * 레일 하단 고정 슬롯. 레일 아이템이 많아 넘치면 아이템 목록(ul)만 스크롤되고\n   * 이 슬롯은 레일 하단에 붙어 고정된다. useRail 일 때만 렌더된다.\n   */\n  railFooter?: ReactNode;\n  /**\n   * 메뉴 상단 고정 슬롯. 메뉴 아이템이 많아 넘치면 메뉴 목록(ul)만 스크롤되고\n   * 이 슬롯은 메뉴 상단에 붙어 고정된다. 메뉴가 렌더될 때만(showMenu) 나타난다.\n   */\n  menuTop?: ReactNode;\n  /**\n   * 메뉴 하단 고정 슬롯. 메뉴 아이템이 많아 넘치면 메뉴 목록(ul)만 스크롤되고\n   * 이 슬롯은 메뉴 하단에 붙어 고정된다. 메뉴가 렌더될 때만(showMenu) 나타난다.\n   */\n  menuFooter?: ReactNode;\n  /**\n   * 접힘(fix 레일) 상단 고정 슬롯. 접으면 본문이 빠져나가며 rail/menu top 도 사라지므로,\n   * 48px 폴드 레일 상단(상단바 바로 아래)에 붙는 별도 슬롯이다. header=\"fix\" 로 접혔을 때만 나타난다.\n   */\n  foldedTop?: ReactNode;\n  /**\n   * 접힘(fix 레일) 하단 고정 슬롯. 접으면 본문이 빠져나가며 rail/menu footer 도 사라지므로,\n   * 48px 폴드 레일 바닥에 붙는 별도 슬롯이다. header=\"fix\" 로 접혔을 때만 나타난다.\n   */\n  foldedFooter?: ReactNode;\n  /**\n   * 메뉴 폭을 드래그로 조절할 수 있게 한다. 레일 폭은 고정이고 **메뉴 컬럼만** 늘고 준다.\n   * 조절선은 GNB 컬럼의 오른쪽 경계 전체다 — fix 는 상단바 높이까지, full 은 상단바가 전폭이라 본문 높이까지.\n   * 접혀 있거나 깔 메뉴가 없으면(레일 리프가 활성) 조절선이 나오지 않는다.\n   */\n  resizable?: boolean;\n  /** 메뉴 폭(px). 주면 controlled — onMenuWidthChange 로 직접 갱신해야 움직인다 */\n  menuWidth?: number;\n  /** 메뉴 초기 폭(px). uncontrolled */\n  defaultMenuWidth?: number;\n  /** 메뉴 폭이 확정될 때(드래그를 놓거나 방향키 조작). 드래그하는 동안에는 오지 않는다 */\n  onMenuWidthChange?: (width: number) => void;\n  /** 메뉴 landmark(nav) 의 접근성 레이블. 한 화면에 nav 가 여럿일 때 구분한다. */\n  ariaLabel?: string;\n}\n\n/** 잘린 메뉴명 칩이 닫히기까지의 유예. SGhostButton·STooltip 과 같은 값이다. */\nconst LABEL_TIP_HIDE_DELAY_MS = 100;\n\nconst DEPTH_PADDING_LEFT = (M: (typeof GNB_MENU)[SGnbType], depth: number): string =>\n  depth === 1 ? M.depth1PaddingLeft : depth === 2 ? M.depth2PaddingLeft : M.depth3PaddingLeft;\n\n/**\n * SGnb — 글로벌 네비게이션.\n * 세 축이 독립이다: type(box/belt) = 메뉴 스타일, header(fix/full) = 상단바 구조,\n * color(light/dark) = 색. 치수는 --cmp-gnb / --cmp-gnb-box / --cmp-gnb-belt, 색은 --cmp-gnb-light / --cmp-gnb-dark 토큰 합성.\n *\n * header 가 배치와 접힘 형태를 정한다:\n * - fix: 상단바가 GNB 컬럼(메뉴 폭) 안에 있다. 접으면 48px 세로 레일로 좁혀지고 상단바에는 폴드 버튼만 남는다.\n * - full: 상단바가 레이아웃 전폭을 가로지르고 그 아래 [메뉴 | 페이지]. 접으면 메뉴만 사라진다.\n *\n * useRail 이면 items 의 첫 depth 가 좌측 레일(아이콘+라벨 68px)로 서고, 선택된 레일 아이템의\n * children 이 메뉴 패널의 depth1 이 된다 — 트리는 그대로 두고 어디부터 그릴지만 바뀐다.\n * children 없는 레일 아이템은 자기 자신이 선택(리프)이라 메뉴 패널을 렌더하지 않는다. 이런 리프가\n * 하나라도 있으면 활성에 따라 메뉴 폭이 출렁이므로 header 는 full 로 강제해 상단바를 전폭에 고정한다.\n *\n * 접힘/펼침은 GNB_FOLD_MS 동안의 슬라이드다 — 레일·메뉴가 함께 왼쪽으로 빠져나가고 펼치면 오른쪽에서 들어온다.\n * 페이지 쪽 폭은 fix 면 이 컴포넌트의 폭 전환이, full 이면 SLayout 의 메뉴 열 전환이 같은 길이로 맞춘다.\n *\n * SLayout 안에서 쓰면 type·header·folded 를 context 에서 읽어 앱이 중복으로 넘길 필요가 없고,\n * 자기 치수(컬럼 폭·상단바 높이·전환 길이)를 registerNav 로 되올려 프레임이 그 값으로 그리드를 깐다.\n *\n * SLayout 없이 단독으로도 동작한다(prop 또는 기본값 사용). 단 full 을 **페이지와 나란히** 놓으려면\n * SLayout 이 필요하다 — 그 안에서만 루트를 display:contents 로 지워 상단바·본문을 프레임 그리드의\n * header/nav 셀에 앉힌다. 단독일 때는 루트가 전폭 세로 상자로 남아 [상단바 / 본문] 을 스스로 쌓는다.\n */\nexport const SGnb = forwardRef<HTMLDivElement, SGnbProps>(function SGnb(\n  {\n    type: typeProp,\n    header: headerProp,\n    color = 'light',\n    items,\n    useRail: useRailProp,\n    value = '',\n    onValueChange,\n    onRailChange,\n    folded: foldedProp,\n    onFoldChange,\n    onLauncherClick,\n    logo,\n    topContent,\n    railTop,\n    railFooter,\n    menuTop,\n    menuFooter,\n    foldedTop,\n    foldedFooter,\n    resizable = false,\n    menuWidth: menuWidthProp,\n    defaultMenuWidth,\n    onMenuWidthChange,\n    ariaLabel = 'global navigation',\n    className,\n    style,\n    ...rest\n  },\n  ref,\n) {\n  // 우선순위: prop > SLayout context > 기본값\n  const layout = useContext(SLayoutContext);\n  const type = typeProp ?? layout?.type ?? 'box';\n  const folded = foldedProp ?? layout?.folded ?? false;\n  const useRail = useRailProp ?? layout?.useRail ?? false;\n\n  // 레일에 children 없는 아이템이 하나라도 있으면, 그 아이템이 활성일 때 메뉴 패널이 사라져\n  // GNB 폭이 [레일+메뉴]↔[레일]로 출렁인다. fix 상단바는 GNB 폭에 묶여 함께 출렁이므로,\n  // 이 경우 header 를 full 로 강제해 상단바를 레이아웃 전폭에 붙들어 둔다(요청 prop/context 를 덮는다).\n  const railHasLeaf = useRail && items.some(item => !item.children || item.children.length === 0);\n  const header = railHasLeaf ? 'full' : (headerProp ?? layout?.header ?? 'fix');\n\n  const H = GNB_HEADER[header];\n  const M = GNB_MENU[type];\n  const C = GNB_COLORS[color];\n\n  const [expandedKeys, setExpandedKeys] = useState<Set<string>>(\n    () => new Set(findGnbAncestors(items, value)),\n  );\n  const [hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n  // ── 잘린 메뉴명 칩 ──\n  // 폭이 모자라 말줄임된 항목만 hover 시 전체 이름을 칩으로 띄운다(SGhostButton 의 tooltipText 와 같은 형식).\n  // 잘렸는지는 hover 시점에 잰다 — resizable 로 폭이 바뀌어도 늘 맞고, 평소엔 아무 비용이 들지 않는다.\n  // 팝오버는 GNB 당 하나만 두고 virtualRef 로 hover 한 요소를 가리킨다. 아이템마다 하나씩 두면\n  // 메뉴가 큰 화면에서 Root 가 수백 개가 되고, 폭을 끄는 동안 매 프레임 그 비용을 다시 낸다.\n  const [labelTip, setLabelTip] = useState<{ label: string; el: HTMLElement } | null>(null);\n  const labelTipHideRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const portalContainer = usePortalContainer();\n  /**\n   * Radix 의 virtualRef 는 **참조가 바뀔 때만** 위치를 다시 잡고 null 을 받지 않는다.\n   * 그래서 현재 라벨을 대신 재 주는 얇은 객체를 두고, hover 대상이 바뀔 때만 새로 만든다.\n   */\n  const labelTipAnchorRef = useMemo(\n    () => ({\n      current: {\n        getBoundingClientRect: () => labelTip?.el.getBoundingClientRect() ?? new DOMRect(),\n      },\n    }),\n    [labelTip?.el],\n  );\n\n  const cancelLabelTipHide = () => {\n    if (labelTipHideRef.current === null) return;\n    clearTimeout(labelTipHideRef.current);\n    labelTipHideRef.current = null;\n  };\n  /**\n   * hover 는 라벨이 아니라 **행 전체**가 받는다. 라벨에만 걸면 하위 메뉴처럼 왼쪽 들여쓰기와\n   * 하이픈 자리표시자가 넓은 행에서 커서가 라벨에 닿지 않아 칩이 뜨지 않는다.\n   * 잘렸는지는 행 안의 라벨(data-gnb-label)을 찾아 잰다.\n   */\n  const showLabelTipIfTruncated = (row: HTMLElement, label: string) => {\n    cancelLabelTipHide();\n    const el = row.querySelector<HTMLElement>('[data-gnb-label]');\n    // 잘리지 않았으면 띄울 이유가 없다 — 이미 다 보이는 이름을 한 번 더 보여주는 꼴이다.\n    if (!el || el.scrollWidth <= el.clientWidth) {\n      setLabelTip(null);\n      return;\n    }\n    setLabelTip(prev => (prev?.el === el && prev.label === label ? prev : { label, el }));\n  };\n  const startLabelTipHide = () => {\n    cancelLabelTipHide();\n    labelTipHideRef.current = setTimeout(() => setLabelTip(null), LABEL_TIP_HIDE_DELAY_MS);\n  };\n  useEffect(() => cancelLabelTipHide, []);\n\n  /** 행 hover — 선택 하이라이트와 잘린 이름 칩을 함께 다룬다. */\n  const rowHoverProps = (item: SGnbMenuItem) => ({\n    onMouseEnter: (event: ReactMouseEvent<HTMLElement>) => {\n      setHoveredKey(item.value);\n      showLabelTipIfTruncated(event.currentTarget, item.label);\n    },\n    onMouseLeave: () => {\n      setHoveredKey(prev => (prev === item.value ? null : prev));\n      startLabelTipHide();\n    },\n  });\n  // 활성 레일 = 패널에 children 을 깔 첫 depth 아이템. value 가 속한 가지에서 출발하고,\n  // 이후엔 레일 클릭으로 바뀐다(선택 없이 다른 가지를 둘러보는 걸 허용).\n  const [activeRail, setActiveRail] = useState<string | undefined>(\n    () => findGnbRailValue(items, value) ?? items[0]?.value,\n  );\n\n  // 선택값/아이템이 바뀌어도 선택 경로가 보이도록 조상을 펼친다 (기존 펼침 유지).\n  useEffect(() => {\n    const ancestors = findGnbAncestors(items, value);\n    if (ancestors.length === 0) return;\n    setExpandedKeys(prev => {\n      // 이미 다 펼쳐져 있으면 같은 Set 을 반환해 불필요한 리렌더를 막는다.\n      if (ancestors.every(a => prev.has(a))) return prev;\n      const next = new Set(prev);\n      ancestors.forEach(a => next.add(a));\n      return next;\n    });\n  }, [items, value]);\n\n  // 앱이 다른 가지로 이동하면(value 변경) 레일도 그 가지로 따라간다.\n  // 어디에도 안 걸리는 value(빈 값 등)면 지금 보던 레일을 유지한다.\n  useEffect(() => {\n    const owner = findGnbRailValue(items, value);\n    if (owner !== undefined) setActiveRail(owner);\n  }, [items, value]);\n\n  // items 가 통째로 바뀌어 활성 레일이 사라졌으면 첫 아이템으로 되돌린다(패널이 빈 채 남는 걸 막는다).\n  useEffect(() => {\n    setActiveRail(prev =>\n      prev !== undefined && items.some(item => item.value === prev) ? prev : items[0]?.value,\n    );\n  }, [items]);\n\n  // 아코디언: 새로 펼치는 아이템의 형제(같은 부모 아래 나머지)가 열려 있으면 함께 닫는다.\n  // 같은 depth 에 한 번에 하나만 펼쳐지도록 해 메뉴가 무한정 길어지는 걸 막는다.\n  const toggleExpand = (key: string) => {\n    setExpandedKeys(prev => {\n      const next = new Set(prev);\n      if (next.has(key)) {\n        next.delete(key);\n      } else {\n        findGnbSiblingValues(items, key).forEach(sibling => next.delete(sibling));\n        next.add(key);\n      }\n      return next;\n    });\n  };\n\n  const handleItemClick = (item: SGnbMenuItem) => {\n    if (item.disabled) return;\n    if (item.children && item.children.length > 0) {\n      toggleExpand(item.value);\n      return;\n    }\n    onValueChange?.(item.value);\n  };\n\n  // 레일 아이템은 보통 컨테이너라 누르면 패널만 바꾼다.\n  // children 이 없는 레일 아이템은 갈 곳이 패널에 없으므로 그 자체를 선택으로 친다.\n  const handleRailClick = (item: SGnbMenuItem) => {\n    if (item.disabled) return;\n    setActiveRail(item.value);\n    onRailChange?.(item.value);\n    if (!item.children || item.children.length === 0) onValueChange?.(item.value);\n  };\n\n  const handleFoldToggle = () => {\n    const next = !folded;\n    onFoldChange?.(next);\n    // folded 를 prop 으로 직접 제어 중이면 context 는 건드리지 않는다 —\n    // SLayout 프레임만 접히고 SGnb 는 펼쳐진 채 남는 어긋남을 막는다.\n    if (foldedProp === undefined) layout?.setFolded(next);\n  };\n\n  // 레일 아이템 — 아이콘 위, 라벨 아래의 44px 세로 버튼.\n  // 색은 버튼에 얹어 아이콘·라벨이 함께 물들게 한다(SIcon 은 color 가 없으면 currentColor 상속).\n  const renderRailItem = (item: SGnbMenuItem): ReactNode => {\n    const isActive = item.value === activeRail;\n    const isHovered = hoveredKey === item.value && !item.disabled;\n\n    return (\n      <li key={item.value}>\n        <button\n          type=\"button\"\n          disabled={item.disabled}\n          // 레일은 '현재 페이지'가 아니라 활성 섹션이라 page 가 아닌 true 로 표시한다\n          // (선택된 리프 메뉴가 aria-current=\"page\" 를 따로 갖는다).\n          aria-current={isActive ? 'true' : undefined}\n          className=\"box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150\"\n          style={{\n            width: GNB_RAIL.itemWidth,\n            paddingTop: GNB_RAIL.itemPaddingTop,\n            paddingBottom: GNB_RAIL.itemPaddingBottom,\n            borderRadius: GNB_RAIL.itemRadius,\n            backgroundColor: isActive\n              ? C.itemBgSelected\n              : isHovered\n                ? C.itemBgHover\n                : C.itemBgDefault,\n            color: isActive ? C.itemColorActive : C.railFgDefault,\n            // <button> 의 UA 폰트를 끊고 앱 폰트를 잇는다 (메뉴 아이템과 같은 이유)\n            fontFamily: 'inherit',\n            fontSize: GNB_RAIL.itemFontSize,\n            lineHeight: `${GNB_RAIL.itemLineHeight}px`,\n            fontWeight: isActive ? GNB_RAIL.itemFontWeightSelected : GNB_RAIL.itemFontWeight,\n            opacity: item.disabled ? 0.4 : 1,\n            cursor: item.disabled ? 'not-allowed' : 'pointer',\n          }}\n          onClick={() => handleRailClick(item)}\n          {...rowHoverProps(item)}\n        >\n          {item.icon && <SIcon name={item.icon} size={GNB_RAIL.itemIcon} className=\"shrink-0\" />}\n          <span\n            data-gnb-label\n            className=\"w-full overflow-hidden text-ellipsis whitespace-nowrap text-center\"\n          >\n            {item.label}\n          </span>\n        </button>\n      </li>\n    );\n  };\n\n  // branchHasIcon: 이 아이템이 속한 depth1 가지에 아이콘이 있는지.\n  // 아이콘은 depth1 전용이므로 하위 depth 는 자기 아이콘이 아니라 조상 depth1 의 아이콘 유무를 본다.\n  const renderItem = (item: SGnbMenuItem, depth: number, branchHasIcon = false): ReactNode => {\n    const hasChildren = !!(item.children && item.children.length > 0);\n    const isSelected = !hasChildren && item.value === value;\n    const isExpanded = expandedKeys.has(item.value);\n    const isHovered = hoveredKey === item.value && !item.disabled;\n    const iconBranch = depth === 1 ? !!item.icon : branchHasIcon;\n\n    const itemStyle: CSSProperties = {\n      gap: M.itemGap,\n      paddingTop: M.itemPaddingY,\n      paddingBottom: M.itemPaddingY,\n      paddingRight: M.itemPaddingRight,\n      paddingLeft: DEPTH_PADDING_LEFT(M, depth),\n      marginLeft: M.itemMarginX,\n      marginRight: M.itemMarginX,\n      borderRadius: M.itemRadius,\n      backgroundColor: isSelected ? C.itemBgSelected : isHovered ? C.itemBgHover : C.itemBgDefault,\n      color: isSelected ? C.itemColorActive : isHovered ? C.itemColorHover : C.itemColorDefault,\n      // <button> 의 UA 폰트(Arial 13.3px)를 끊고 앱 폰트를 잇는다\n      fontFamily: 'inherit',\n      fontSize: depth === 1 ? M.depth1FontSize : M.itemFontSize,\n      lineHeight: `${depth === 1 ? M.depth1LineHeight : M.itemLineHeight}px`,\n      fontWeight: depth === 1 || isSelected ? M.depth1FontWeight : 400,\n      opacity: item.disabled ? 0.4 : 1,\n      cursor: item.disabled ? 'not-allowed' : 'pointer',\n    };\n\n    return (\n      // li 를 flex-col 로 둬야 버튼이 좌우 마진만큼 안쪽으로 들어가고,\n      // 하위 ul 은 마진 없이 전폭을 써서 depth*-paddingLeft 가 들여쓰기를 단독으로 책임진다.\n      <li key={item.value} className=\"flex flex-col\">\n        <button\n          type=\"button\"\n          disabled={item.disabled}\n          aria-expanded={hasChildren ? isExpanded : undefined}\n          aria-current={isSelected ? 'page' : undefined}\n          className=\"box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150\"\n          style={itemStyle}\n          onClick={() => handleItemClick(item)}\n          {...rowHoverProps(item)}\n        >\n          {depth === 1 && item.icon && (\n            <SIcon\n              name={item.icon}\n              size={M.depth1Icon}\n              // 선택되면 라벨과 함께 활성 색으로 물든다 (기본은 전용 회색 아이콘 색)\n              color={isSelected ? C.itemColorActive : C.itemIcon}\n              className=\"shrink-0\"\n            />\n          )}\n          <span className=\"flex min-w-0 flex-1 items-center\">\n            {/* 아이콘 있는 depth1 아래에서만 하위 메뉴명 앞에 하이픈을 붙인다.\n                자리표시자 높이는 행 높이를 부풀리지 않도록 line-height 에 맞춘다\n                (하드코딩 24 는 belt(line-height 20)에서 행을 36px 로 밀어 올렸다 → box 36 / belt 32). */}\n            {depth > 1 && iconBranch ? (\n              <div\n                className=\"mr-[8px] flex w-[20px] shrink-0 items-center justify-center\"\n                style={{ height: M.itemLineHeight }}\n              >\n                -\n              </div>\n            ) : null}\n            {/* 말줄임은 flex 컨테이너에 걸리지 않는다(text-overflow 는 블록 컨테이너의 인라인 콘텐츠에만\n                적용된다). 하이픈과 나란히 서야 하는 바깥은 flex 로 두고, 텍스트는 자기 블록에 담아\n                거기서 자른다 — 폭이 좁아지거나(resizable) 메뉴명이 길면 여기서 \"...\" 이 된다. */}\n            <span\n              data-gnb-label\n              className=\"min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap\"\n            >\n              {item.label}\n            </span>\n          </span>\n          {item.tag !== undefined && item.tag !== '' && (\n            <STag\n              shape=\"square\"\n              size=\"xs\"\n              color={item.tagColor ?? 'blue'}\n              label={item.tag}\n              className=\"shrink-0\"\n            />\n          )}\n          {hasChildren && (\n            <SIcon\n              name=\"chevronDown\"\n              size={M.itemArrow}\n              color={C.itemChevron}\n              rotate={isExpanded ? 180 : 0}\n              // 회전이 펼침 높이(GNB_EXPAND_MS)와 함께 끝나도록 200ms 로 맞춘다\n              className=\"shrink-0 transition-transform duration-200\"\n            />\n          )}\n        </button>\n        {/* 하위 메뉴는 열려도 닫혀도 마운트를 유지하고, 바깥 grid 의 행 크기를\n            0fr↔1fr 로 전환해 높이가 부드럽게 늘고 줄게 한다(height:auto 는 전환 불가).\n            안쪽 ul 은 overflow:hidden·min-height:0 으로 접히는 동안 잘려나가고,\n            다 접힌 뒤엔 visibility:hidden 으로 포커스·스크린리더에서 빠진다(펼칠 땐 즉시 보임). */}\n        {hasChildren && (\n          <div\n            className=\"grid\"\n            style={{\n              gridTemplateRows: isExpanded ? '1fr' : '0fr',\n              transition: `grid-template-rows ${GNB_EXPAND_MS}ms ease-out`,\n            }}\n          >\n            <ul\n              className=\"m-0 flex min-h-0 list-none flex-col overflow-hidden p-0\"\n              style={{\n                visibility: isExpanded ? 'visible' : 'hidden',\n                transition: `visibility 0s linear ${isExpanded ? '0s' : `${GNB_EXPAND_MS}ms`}`,\n              }}\n            >\n              {item.children!.map(child => renderItem(child, depth + 1, iconBranch))}\n            </ul>\n          </div>\n        )}\n      </li>\n    );\n  };\n\n  // useRail: items 의 첫 depth 는 레일로 빠지고, 패널에는 활성 레일의 children 이 depth1 으로 깔린다.\n  const railItems = useRail ? items : [];\n  const menuItems = useRail\n    ? (items.find(item => item.value === activeRail)?.children ?? [])\n    : items;\n\n  // 활성 레일에 children 이 없으면 깔 메뉴가 없다 → 메뉴 nav 를 렌더하지 않고 레일만 남긴다.\n  const showMenu = !useRail || menuItems.length > 0;\n\n  // ── 메뉴 폭 (resizable) ──\n  // 드래그 중에는 dragMenuWidth 로만 움직이고, 놓는 순간 한 번 밖에 알린다.\n  // 매 이동마다 onMenuWidthChange 를 쏘면 앱이 그 값을 저장하는 순간 저장이 프레임마다 일어난다.\n  const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = useState(\n    () => defaultMenuWidth ?? GNB_MENU_WIDTH,\n  );\n  const [dragMenuWidth, setDragMenuWidth] = useState<number | null>(null);\n  const committedMenuWidth = menuWidthProp ?? uncontrolledMenuWidth;\n  const menuWidth = clampGnbMenuWidth(dragMenuWidth ?? committedMenuWidth);\n  const [resizing, setResizing] = useState(false);\n\n  // 펼친 GNB 컬럼 폭. 레일이 있으면 [레일 | 메뉴] 두 칸, 메뉴가 없으면 레일 한 칸이다.\n  const bodyWidth = (useRail ? GNB_RAIL_WIDTH : 0) + (showMenu ? menuWidth : 0);\n\n  // SLayout 안이면 자기 치수·요구사항을 등록한다 — SLayout 은 GNB 내부 상수도 items·activeRail 도\n  // 모르므로, 이 값으로 full 그리드의 상단바 행·메뉴 열(빈틈 방지)과 접힘 전환을 맞춘다.\n  // 등록 전 폭(0)으로 한 프레임이 그려지지 않도록 layout effect 로 올린다. 단독이면 layout=null 이라 무시된다.\n  const registerNav = layout?.registerNav;\n  useIsomorphicLayoutEffect(() => {\n    if (!registerNav) return;\n    registerNav({\n      columnWidth: bodyWidth,\n      topHeight: H.topHeight,\n      foldMs: GNB_FOLD_MS,\n      requireFullHeader: railHasLeaf,\n      resizing,\n    });\n    return () => registerNav(null);\n  }, [registerNav, bodyWidth, H.topHeight, railHasLeaf, resizing]);\n\n  // ── 메뉴 폭 조절 ──\n  // 접히면 폭이 레일(fix) 또는 0(full)으로 가고, 깔 메뉴가 없으면 늘릴 대상이 없다.\n  const canResize = resizable && showMenu && !folded;\n  // 드래그 리스너가 리렌더 사이에도 최신 폭을 동기적으로 읽어야 한다.\n  const menuWidthRef = useRef(menuWidth);\n  menuWidthRef.current = menuWidth;\n  const commitMenuWidth = (next: number) => {\n    const clamped = clampGnbMenuWidth(next);\n    setDragMenuWidth(null);\n    if (menuWidthProp === undefined) setUncontrolledMenuWidth(clamped);\n    if (clamped !== committedMenuWidth) onMenuWidthChange?.(clamped);\n  };\n\n  // 드래그 도중 언마운트되면 document 리스너와 body 스타일이 남는다.\n  const endResizeRef = useRef<(() => void) | null>(null);\n  useEffect(() => () => endResizeRef.current?.(), []);\n\n  const startMenuResize = (event: ReactMouseEvent<HTMLDivElement>) => {\n    if (!canResize || typeof document === 'undefined') return;\n    // preventDefault 로 텍스트 선택을 막으면 포커스도 따라오지 않는다.\n    // 드래그를 놓은 자리에서 바로 방향키로 이어갈 수 있도록 직접 옮겨 준다.\n    event.preventDefault();\n    event.currentTarget.focus();\n\n    const startX = event.clientX;\n    const startWidth = menuWidthRef.current;\n    let latest = startWidth;\n\n    const { body } = document;\n    const prevUserSelect = body.style.userSelect;\n    const prevCursor = body.style.cursor;\n    // 메뉴 텍스트가 드래그로 선택되지 않게, 커서가 페이지 위에서 바뀌지 않게 잠근다.\n    body.style.userSelect = 'none';\n    body.style.cursor = 'col-resize';\n\n    const onMove = (moveEvent: MouseEvent) => {\n      latest = clampGnbMenuWidth(startWidth + (moveEvent.clientX - startX));\n      setDragMenuWidth(latest);\n    };\n    const endResize = () => {\n      document.removeEventListener('mousemove', onMove);\n      document.removeEventListener('mouseup', endResize);\n      body.style.userSelect = prevUserSelect;\n      body.style.cursor = prevCursor;\n      endResizeRef.current = null;\n      setResizing(false);\n      commitMenuWidth(latest);\n    };\n\n    document.addEventListener('mousemove', onMove);\n    document.addEventListener('mouseup', endResize);\n    endResizeRef.current = endResize;\n    setResizing(true);\n  };\n\n  const handleMenuResizeKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n    if (!canResize) return;\n    const step = GNB_MENU_RESIZE_KEY_STEP[event.shiftKey ? 'large' : 'normal'];\n    let next: number | null = null;\n    if (event.key === 'ArrowLeft') next = menuWidthRef.current - step;\n    else if (event.key === 'ArrowRight') next = menuWidthRef.current + step;\n    // 한계는 clamp 가 안다 — 끝까지 밀어 두고 맡긴다.\n    else if (event.key === 'Home') next = GNB_MENU_MIN_WIDTH;\n    else if (event.key === 'End') next = GNB_MENU_MAX_WIDTH;\n    if (next === null) return;\n\n    event.preventDefault();\n    commitMenuWidth(next);\n  };\n\n  const railFolded = folded && header === 'fix';\n\n  const isFull = header === 'full';\n\n  /**\n   * full 을 **SLayout 안에서** 쓰면 루트를 display:contents 로 지워 상단바와 본문이 프레임\n   * 그리드의 셀이 된다(`\"header header\" / \"nav page\"`). 상단바는 header 영역에서 전폭을 쓰고\n   * 본문은 nav 영역에 서며, 페이지는 남은 page 영역에 들어온다.\n   *\n   * 예전엔 루트가 전 셀에 겹친 뒤 pointer-events 를 껐다 켜는 식이었다 — 상단바와 본문이 한\n   * 엘리먼트에 묶여 사이에 페이지를 끼울 수 없었기 때문이다. 루트를 지우면 그 제약이 없어진다.\n   *\n   * 대신 루트가 없으니 루트가 하던 일을 셀이 나눠 갖는다.\n   * - 배경: fix 는 루트가 칠하지만(접혀 메뉴가 사라져도 레일이 바닥까지 이어진다) full 은 상단바·메뉴가 각자 칠한다.\n   * - 접힘 궤적 클리핑: fix 는 루트 overflow 가, full 은 nav 셀 래퍼가 잘라낸다.\n   * - 폭: fix 는 루트가 곧 GNB 컬럼이라 루트가 전환하고, full 은 프레임의 nav 열이 전환한다.\n   *\n   * **프레임이 없으면(단독 렌더) 루트를 지우지 않는다.** 지우면 셀 이름을 받아줄 그리드가 없어\n   * 본문이 콘텐츠 높이로 쪼그라들거나(평범한 블록 부모) 엉뚱한 칸에 자동 배치된다.\n   * 이때는 루트가 전폭 세로 상자로 남아 [상단바 / 본문] 을 스스로 쌓는다.\n   */\n  const isFullFrame = isFull && !!layout;\n\n  // light 패널은 배경이 페이지와 비슷해 GNB 오른쪽(페이지 경계)에 구분선을 둔다.\n  // dark 는 어두운 배경으로 이미 페이지와 구분돼 선이 불필요하다.\n  // fix 는 루트가 곧 GNB 컬럼이라 루트가 이 선을 그리고(상단바+본문 전체 높이),\n  // full 은 루트가 전폭이라 여기 두면 페이지 맨 오른쪽에 그려지므로 메뉴 nav 가 대신 그린다.\n  const rightBorder = color === 'light' ? `1px solid ${C.topBorder}` : undefined;\n\n  /**\n   * 메뉴 폭 조절선. 미끄러지는 본문 **밖**에 둬야 접힘 궤적을 따라가지 않는다.\n   * 어느 상자에 거는지는 header 가 정한다 — 그 상자의 오른쪽 끝이 곧 GNB 컬럼 경계여야 하기 때문이다.\n   * - fix : 루트가 곧 컬럼이다 → 루트에 걸어 **상단바 높이까지** 끌 수 있다.\n   * - full: 상단바가 전폭이라 컬럼 경계는 본문 높이에만 있다 → 본문 래퍼에 건다.\n   *   프레임 안이면 그 래퍼가 nav 열이라 폭이 딱 맞지만, 단독이면 전폭이라 오른쪽 끝이 컬럼 경계가\n   *   아니다 → 그때만 bodyWidth 지점으로 직접 잡는다.\n   * 히트 영역은 어느 상자든 접힘 궤적을 자르는 overflow:hidden 안이라 밖으로 넘길 수 없어 안쪽으로만\n   * 넓힌다. 겉보기 선은 SSplitter 와 같은 --cmp-splitter-border-* 를 쓴다.\n   */\n  const resizeHitWidth =\n    'calc(var(--cmp-splitter-border-width) + var(--cmp-splitter-border-padding) * 2)';\n  const menuResizeHandle = canResize ? (\n    <>\n      {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex --\n          포커스 가능한 separator = ARIA window splitter 로, 값을 가지는 위젯이다.\n          jsx-a11y 는 separator 를 항상 비대화형으로 보므로 여기서만 끈다. */}\n      <div\n        role=\"separator\"\n        aria-orientation=\"vertical\"\n        aria-label={`${ariaLabel} width`}\n        aria-valuenow={menuWidth}\n        aria-valuemin={GNB_MENU_MIN_WIDTH}\n        aria-valuemax={GNB_MENU_MAX_WIDTH}\n        aria-valuetext={`${menuWidth}px`}\n        tabIndex={0}\n        onMouseDown={startMenuResize}\n        onKeyDown={handleMenuResizeKeyDown}\n        className=\"group absolute inset-y-0 z-[1] flex cursor-col-resize justify-end outline-none\"\n        style={{\n          width: resizeHitWidth,\n          ...(isFull && !isFullFrame\n            ? { left: `calc(${bodyWidth}px - ${resizeHitWidth})` }\n            : { right: 0 }),\n        }}\n      >\n        <span\n          aria-hidden\n          className={cn(\n            // 평상시엔 자리만 잡고 칠하지 않는다 — 색이 붙는 것 자체가 조절 가능하다는 신호다.\n            'w-(--cmp-splitter-border-width) transition-colors',\n            'group-hover:bg-(--cmp-splitter-border-color) group-focus-visible:bg-(--cmp-splitter-border-color)',\n            resizing && 'bg-(--cmp-splitter-border-color)',\n          )}\n        />\n      </div>\n      {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n    </>\n  ) : null;\n\n  const rootStyle: CSSProperties = isFullFrame\n    ? { display: 'contents', ...style }\n    : isFull\n      ? // 단독 full — 상단바가 전폭이어야 하므로 루트도 전폭이고, 배경·선은 상단바·메뉴가 각자 그린다.\n        { width: '100%', ...style }\n      : {\n          // fix 를 닫으면 48px 레일로 좁혀진다.\n          width: folded ? GNB_COMMON.foldWidth : bodyWidth,\n          // 폭을 끄는 중에는 전환을 끈다 — 접힘용 전환이 걸려 있으면 컬럼이 손보다 늦게 따라온다.\n          transition: resizing ? 'none' : `width ${GNB_FOLD_MS}ms ease-out`,\n          backgroundColor: C.panelBg,\n          borderRight: rightBorder,\n          ...style,\n        };\n\n  // 나가는 동안은 보이고 다 나간 뒤엔 포커스·스크린리더에서 빠지도록, visibility 를 접을 때만\n  // 전환 길이만큼 늦춘다(펼칠 땐 0s = 즉시 보임). 언마운트·display:none 으로는 전환이 생기지 않는다.\n  const hideAfterSlide = (hidden: boolean) =>\n    `visibility 0s linear ${hidden ? `${GNB_FOLD_MS}ms` : '0s'}`;\n\n  // 런처·로고 스타일: 접히면(fix 레일) 페이드하며 흐름에서 빠져(absolute)\n  // 폴드 버튼만 흐름에 남는다 → 좌우 대칭 패딩 덕에 48px 레일 가운데에 선다(gap 도 흐름 아이템에만 적용).\n  const sideFoldStyle: CSSProperties = {\n    opacity: railFolded ? 0 : 1,\n    position: railFolded ? 'absolute' : 'static',\n    visibility: railFolded ? 'hidden' : 'visible',\n    transition: `opacity ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(railFolded)}`,\n  };\n\n  // 인라인 상단바의 순서는 header 가 정한다:\n  // - fix : [런처? | 로고 | ...여백 | 폴드] — 상단바가 GNB 컬럼 안이라 로고가 왼쪽에 붙고\n  //         폴드는 ml-auto 로 컬럼 오른쪽 끝에 고정된다(접혀도 48px 레일 폭을 꽉 채워 가운데에 선다:\n  //         레일 패딩 12+12 에 xs 고스트버튼 24 = 48).\n  // - full: [런처? | 폴드 | 로고 | topContent?] — 전폭 상단바라 폴드가 GNB 컬럼(메뉴) 위에 서고\n  //         로고가 그 오른쪽에 이어지며, 남는 폭은 topContent 슬롯이 가져간다.\n  // 간격은 컨테이너 gap 대신 각 요소 margin 으로 준다 — 순서가 header 마다 달라 흐름 위치별로 값이 다르다.\n  // - fix : 런처 →16px→ 로고 →16px(최소, 나머지는 ml-auto 여백)→ 폴드\n  // - full: 런처 →8px(아이콘 버튼끼리 붙는 GNB_TOP_ICON_GAP)→ 폴드 →16px→ 로고 →16px→ topContent\n  // 16px 은 --cmp-gnb-top-gap(H.topGap) 이다.\n  const launcherButton = onLauncherClick ? (\n    <SGhostButton\n      key=\"launcher\"\n      icon=\"launcher\"\n      size=\"xs\"\n      intent={color === 'dark' ? 'inverse' : 'default'}\n      ariaLabel=\"app launcher\"\n      onClick={onLauncherClick}\n      className=\"shrink-0\"\n      style={{ ...sideFoldStyle, marginRight: header === 'fix' ? H.topGap : GNB_TOP_ICON_GAP }}\n    />\n  ) : null;\n\n  const foldButton = (\n    <SGhostButton\n      key=\"fold\"\n      icon=\"sidebar\"\n      size=\"xs\"\n      intent={color === 'dark' ? 'inverse' : 'default'}\n      ariaLabel=\"toggle navigation\"\n      ariaPressed={folded}\n      onClick={handleFoldToggle}\n      className={cn('shrink-0', header === 'fix' && 'ml-auto')}\n    />\n  );\n\n  const logoBox = logo ? (\n    <div\n      key=\"logo\"\n      className=\"flex shrink-0 items-center\"\n      style={{\n        height: H.logoHeight,\n        ...(header === 'full'\n          ? // full 은 전폭이라 로고 자리가 고정이다 — 폭 140px(디자인 스펙, 전용 토큰 없음)로 못 박아\n            // 로고 내용이 바뀌어도 오른쪽 topContent 시작점이 흔들리지 않게 한다.\n            // 런처가 없으면 그 자리(버튼 + 간격)를 로고가 이어받아, 런처 유무로 topContent 가 밀리지 않는다.\n            {\n              width: launcherButton ? GNB_FULL_LOGO_WIDTH : GNB_FULL_LOGO_WIDTH_NO_LAUNCHER,\n              marginLeft: H.topGap,\n            }\n          : // fix 는 폴드가 ml-auto 로 밀려나므로(margin-left 를 못 쓴다) 로고 오른쪽에 최소 간격을 둔다\n            { marginRight: H.topGap }),\n        ...sideFoldStyle,\n      }}\n    >\n      {logo}\n    </div>\n  ) : null;\n\n  // 로고 오른쪽 슬롯 — 로고와 16px 띄고 남는 폭을 모두 먹는다(min-w-0 으로 긴 내용이 상단바를 넓히지 않는다).\n  // 전폭 상단바(full)에만 자리가 있다.\n  const topContentBox =\n    header === 'full' && topContent ? (\n      <div\n        key=\"topContent\"\n        className=\"flex min-w-0 flex-1 items-center\"\n        style={{ marginLeft: H.topGap }}\n      >\n        {topContent}\n      </div>\n    ) : null;\n\n  // fix 의 루트는 곧 GNB 컬럼이다 — 프레임 높이를 꽉 채워(h-full) 메뉴가 페이지 바닥까지 내려오고,\n  // shrink-0 으로 SPage(flex-1, basis 0)가 아니라 GNB 가 축소분을 떠안는 걸 막는다.\n  // full 은 루트가 display:contents 라 상자가 없다 — 이 클래스들도, 앱이 넘긴 className 도 걸리지 않는다.\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        'box-border',\n        // relative: fix 의 조절선이 루트(=GNB 컬럼) 오른쪽 끝을 기준으로 서야 상단바까지 이어진다.\n        !isFullFrame && 'relative flex h-full shrink-0 flex-col overflow-hidden',\n        className,\n      )}\n      style={rootStyle}\n      data-type={type}\n      data-header={header}\n      data-color={color}\n      {...rest}\n    >\n      {/* 상단바 — full 이면 그리드의 header 영역(전폭 1행)에 직접 앉는다.\n          fix 레일이면 폴드 버튼만 남고 가운데로 미끄러진다(높이·구분선은 펼친 상태와 동일).\n          런처·로고는 흐름에서 빼야(absolute) 폭이 48px 로 줄어드는 동안 폴드 버튼을 밀어내지 않는다. */}\n      <div\n        className=\"relative box-border flex shrink-0 items-center overflow-hidden\"\n        style={{\n          ...(isFullFrame ? { gridArea: 'header' } : null),\n          height: H.topHeight,\n          // 간격은 컨테이너 gap 대신 각 요소 margin 으로 준다 — 순서가 header 마다 달라\n          // 이웃 쌍마다 값이 다르기 때문(위 launcherButton/logoBox 주석).\n          // 접히면 런처·로고가 흐름에서 빠져 margin 도 무의미해진다.\n          padding: `0 ${railFolded ? GNB_RAIL.padding : H.topPaddingX}`,\n          borderBottom: `1px solid ${C.topBorder}`,\n          backgroundColor: C.panelBg,\n          transition: `padding ${GNB_FOLD_MS}ms ease-out`,\n          // 아이콘 버튼은 자체 ghostButton 토큰을 쓰므로, 이 색은 logo 슬롯 상속용\n          color: C.itemColorDefault,\n        }}\n      >\n        {/* 런처·폴드·로고·topContent 를 흐름에 나란히 둔다 — 순서는 header 가 정한다(위 주석 참고).\n            없는 슬롯은 null 이라 자리를 비우지 않고 나머지가 그대로 이어 붙는다.\n            접히면 런처·로고가 페이드하며 흐름에서 빠지고(sideFoldStyle), 폴드 버튼만 남아 레일 가운데에 선다. */}\n        {header === 'fix' ? (\n          <>\n            {launcherButton}\n            {logoBox}\n            {foldButton}\n          </>\n        ) : (\n          <>\n            {launcherButton}\n            {foldButton}\n            {logoBox}\n            {topContentBox}\n          </>\n        )}\n      </div>\n\n      {/* 접힘(fix 레일) 상단 슬롯 — 본문이 왼쪽으로 빠져나가면 rail/menu top 도 함께 사라지므로,\n          48px 레일 상단(상단바 바로 아래)에 붙는 별도 슬롯(foldedTop)을 둔다.\n          본문(flex-1)보다 앞이라 흐름 맨 위에 서고, 좁은 폴드 폭에 맞춰 가운데 정렬한다.\n          위 여백은 아래 foldedFooter 와 대칭이다. */}\n      {railFolded && foldedTop && (\n        <div className=\"mt-[24px] flex shrink-0 items-center justify-center\">{foldedTop}</div>\n      )}\n\n      {/* 본문 [레일 | 메뉴] — 접히면 제 폭만큼 왼쪽으로 미끄러져 나가고, 펼치면 반대로 들어온다.\n          레일과 메뉴가 한 상자에 있어 함께 움직인다.\n          바깥 래퍼가 그 궤적을 잘라낸다 — fix 는 루트 안에서 남는 높이를 먹는 칸(flex-1),\n          full 은 그리드의 nav 셀(폭 전환은 프레임이 맡는다).\n          안쪽 본문은 제 폭(bodyWidth)을 쥐고 있어 좁아지는 폴드 레일에 눌려 찌그러지지 않는다. */}\n      <div\n        className={cn('relative overflow-hidden', !isFullFrame && 'min-h-0 flex-1')}\n        style={isFullFrame ? { gridArea: 'nav' } : undefined}\n      >\n        <div\n          className=\"flex h-full flex-row\"\n          style={{\n            width: bodyWidth,\n            transform: folded ? 'translateX(-100%)' : 'none',\n            visibility: folded ? 'hidden' : 'visible',\n            transition: `transform ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(folded)}`,\n          }}\n        >\n          {useRail && (\n            // 레일 컬럼 — 스크롤되는 아이템 목록(nav)을 가운데 두고 위아래에 고정 슬롯(top/footer)을 붙인다.\n            // 두 슬롯은 내비게이션이 아니므로 nav(landmark) 밖에 두고, 컬럼 폭·구분선·배경은 이 래퍼가\n            // 전체 높이에 걸쳐 책임진다(그래야 슬롯 자리까지 배경·오른쪽 선이 이어진다).\n            <div\n              className=\"flex shrink-0 flex-col overflow-hidden\"\n              style={{\n                width: GNB_RAIL_WIDTH,\n                borderRight: `1px solid ${C.topBorder}`,\n                backgroundColor: C.panelBg,\n              }}\n            >\n              {/* top 슬롯은 nav 밖이라 목록 스크롤에 딸려 올라가지 않고, shrink-0 으로 컬럼 상단에 붙는다. */}\n              {railTop && <div className=\"shrink-0\">{railTop}</div>}\n              {/* 레일도 내비게이션 landmark — nav 로 세워야 aria-label(레일)이 스크린리더에 노출된다\n                (role 없는 ul 의 aria-label 은 영역명으로 읽히지 않는다). 메뉴 nav 와는 레이블로 구분된다.\n                padding 은 nav 안쪽에 둔다 — 남는 높이를 flex-1(min-h-0)로 채우고 넘치면 nav 에 스크롤이 생긴다.\n                좁은 레일에서 스크롤바가 아이템을 가리지 않도록 스크롤은 되되 스크롤바는 숨긴다. */}\n              <nav\n                aria-label={`${ariaLabel} rail`}\n                className={cn(\n                  'flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto',\n                  SCROLLBAR_HIDDEN_CLASS,\n                )}\n                style={{ padding: GNB_RAIL.padding }}\n              >\n                <ul className=\"m-0 flex list-none flex-col p-0\" style={{ gap: GNB_RAIL.gap }}>\n                  {railItems.map(renderRailItem)}\n                </ul>\n              </nav>\n              {/* footer 는 nav 밖이라 컬럼 정렬용 좌우·하단 padding 을 직접 갖고, shrink-0 으로 컬럼 하단에 붙는다. */}\n              {railFooter && <div className=\"shrink-0\">{railFooter}</div>}\n            </div>\n          )}\n          {showMenu && (\n            <div\n              className=\"flex shrink-0 flex-col overflow-hidden\"\n              style={{\n                width: menuWidth,\n                backgroundColor: C.panelBg,\n                // full 은 루트가 오른쪽 선을 못 그리므로(전폭이거나 아예 없다) 메뉴 오른쪽(페이지 경계)이 대신 그린다.\n                borderRight: isFull ? rightBorder : undefined,\n              }}\n            >\n              {/* 메뉴 목록만 스크롤한다 — nav 가 스크롤 컨테이너다(min-h-0 flex-1 로 남는 높이를 먹고\n                넘치면 스크롤). 스크롤바 숨김도 실제 스크롤이 걸리는 nav 에 붙인다(레일과 동일) —\n                GNB 는 상시 노출되는 내비게이션이라 스크롤바가 메뉴 폭·정렬을 흐트러뜨리지 않게 한다.\n                top/footer 는 nav 밖이라 흐름에 밀리지 않고 shrink-0 으로 위아래에 붙는다. */}\n              {menuTop && <div className=\"shrink-0\">{menuTop}</div>}\n              <nav\n                aria-label={ariaLabel}\n                className={cn(\n                  'flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto',\n                  SCROLLBAR_HIDDEN_CLASS,\n                )}\n                style={{\n                  paddingTop: M.bodyPaddingY,\n                  paddingBottom: M.bodyPaddingY,\n                }}\n              >\n                <ul className=\"m-0 flex list-none flex-col p-0\">\n                  {menuItems.map(item => renderItem(item, 1))}\n                </ul>\n              </nav>\n              {menuFooter && <div className=\"shrink-0\">{menuFooter}</div>}\n            </div>\n          )}\n        </div>\n\n        {/* full 은 상단바가 전폭이라 컬럼 경계가 본문 높이에만 있다 → 조절선도 이 칸에 선다. */}\n        {header === 'full' && menuResizeHandle}\n      </div>\n\n      {/* 접힘(fix 레일) 하단 슬롯 — 본문이 왼쪽으로 빠져나가면 rail/menu footer 도 함께 사라지므로,\n          48px 레일 바닥에 붙는 별도 슬롯(foldedFooter)을 둔다. 본문(flexGrow:1)이 남는 높이를 먹어 바닥으로 민다.\n          좁은 폴드 폭에 맞춰 가운데 정렬한다. */}\n      {/* fix 는 루트가 곧 GNB 컬럼이다 → 조절선을 여기 걸어 상단바 높이까지 끌 수 있게 한다. */}\n      {header === 'fix' && menuResizeHandle}\n\n      {/* 잘린 메뉴명의 전체 이름. GNB 당 하나이고 virtualRef 로 hover 한 라벨을 가리킨다\n          (Anchor 는 virtualRef 를 주면 DOM 을 만들지 않아 display:contents 루트에도 안전하다).\n          메뉴가 좁은 왼쪽 열이라 오른쪽으로 띄운다 — 위로 띄우면 바로 윗 메뉴를 가린다. */}\n      <RPopover.Root open={labelTip !== null} onOpenChange={open => !open && setLabelTip(null)}>\n        <RPopover.Anchor virtualRef={labelTipAnchorRef} />\n        <RPopover.Portal container={portalContainer}>\n          <RPopover.Content\n            side=\"right\"\n            sideOffset={4}\n            className={cn('z-50', FLOATING_SLIDE_ANIM)}\n            aria-hidden\n            // 포커스를 가로채지 않는다 (라벨 칩은 읽기 전용 표시다)\n            onOpenAutoFocus={event => event.preventDefault()}\n            // 칩 위로 마우스가 넘어와도 닫히지 않게 — 라벨과 칩 사이 4px 를 건너는 동안의 유예다\n            onMouseEnter={cancelLabelTipHide}\n            onMouseLeave={startLabelTipHide}\n          >\n            <STag shape=\"square\" size=\"xs\" color=\"grey\" label={labelTip?.label ?? ''} />\n          </RPopover.Content>\n        </RPopover.Portal>\n      </RPopover.Root>\n\n      {railFolded && foldedFooter && (\n        <div className=\"flex shrink-0 items-center justify-center mb-[24px]\">{foldedFooter}</div>\n      )}\n    </div>\n  );\n});\n","import { forwardRef, useContext, type CSSProperties, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n  SCROLLBAR_CLASS,\n  SCROLLBAR_TRACK_BG_CLASS,\n  SCROLLBAR_TRACK_BG_WHITE_CLASS,\n  SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport { SLAYOUT_MIN_WIDTH_VAR, SLayoutContext } from '../SLayout/SLayout';\nimport type { SPageBackground } from './page.config';\n\n/**\n * 스크롤 콘텐츠의 최소 폭 — SLayout 이 보장하는 레이아웃 최소 폭을 이 영역이 대신 삼킨다.\n *\n * 100cqw 는 SLayout 프레임의 폭, 100% 는 이 영역의 콘텐츠 폭이다.\n * \"프레임이 최소 폭보다 좁은 만큼\" 콘텐츠를 넓히므로, GNB 폭·접힘·header 구성이 어떻든\n * [GNB + 스크롤 끝까지 민 페이지] 합이 정확히 최소 폭이 된다. 패딩을 덮어써도 100% 가 따라온다.\n *\n * SLayout 밖이면 변수가 없어(폴백 0) 값이 음수가 되고, 음수 min-width 는 0 으로 클램프돼 규칙이 꺼진다.\n */\nconst MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;\n\n/**\n * 배경별 표면색 + 스크롤바 처리. 구분선(bordered)과 트랙 배경은 셋 다 깔되, 트랙 색만 갈린다.\n *\n * 기본 트랙 색은 grey-10(#F6F6F6)인데 neutral 표면(bg.neutralLight)이 정확히 같은 색이라\n * 그대로 쓰면 트랙이 페이지에 묻힌다. 그래서 neutral 만 흰 트랙을 써서 홈을 드러낸다.\n * (트랙 배경을 아예 빼면 흰색이 아니라 transparent 라 페이지색이 비친다 — 묻히는 건 마찬가지다)\n */\nconst BACKGROUND_CLASS: Record<SPageBackground, string> = {\n  frame: `bg-[var(--sys-color-bg-frame)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,\n  neutral: `bg-[var(--sys-color-bg-neutralLight)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,\n  screen: `bg-[var(--sys-color-bg-screen)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,\n};\n\n// docs:gen 은 export interface 만 수집하므로(gen-docs.mjs) 타입 별칭 대신 interface 로 둔다.\nexport interface SPageProps extends HTMLAttributes<HTMLElement> {\n  /**\n   * 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕.\n   * 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다.\n   */\n  background?: SPageBackground;\n  /**\n   * 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 \"여기서 끝\"이 안 읽히는 것을 막는다.\n   * 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).\n   */\n  scrollEndSpacing?: boolean;\n}\n\n/**\n * SPage — SLayout 안에서 남은 공간을 채우는 스크롤 콘텐츠 영역.\n * 스크롤은 SLayout(overflow:hidden)이 잡아둔 경계 안에서 이 영역에만 생긴다.\n * 창이 SLayout 의 최소 폭보다 좁을 때 생기는 가로 스크롤도 여기 걸린다(문서는 스크롤되지 않는다).\n * 패딩은 className 으로, 배경은 background 로 정한다(className 으로도 덮어쓸 수 있다).\n *\n * - header=\"fix\": flex 자식으로 남은 가로 공간을 채운다.\n * - header=\"full\": SLayout 이 깐 grid 의 \"page\" 영역 = 상단바 아래·메뉴 오른쪽 자리를 차지한다.\n *   좌표가 아니라 이름으로 잡으므로 프레임의 열·행 구성이 바뀌어도 여기는 그대로다.\n */\nexport const SPage = forwardRef<HTMLElement, SPageProps>(function SPage(\n  { background = 'frame', scrollEndSpacing = true, className, style, children, ...rest },\n  ref,\n) {\n  const layout = useContext(SLayoutContext);\n  const gridStyle: CSSProperties | undefined =\n    layout?.header === 'full' ? { gridArea: 'page' } : undefined;\n\n  return (\n    <main\n      ref={ref}\n      className={cn(\n        'box-border min-h-0 min-w-0 flex-1 overflow-auto p-[var(--cmp-pageBody-padding-default)]',\n        scrollEndSpacing && 'pb-[var(--cmp-pageBody-padding-scrollEnd)]',\n        SCROLLBAR_CLASS,\n        BACKGROUND_CLASS[background],\n        className,\n      )}\n      style={{ ...gridStyle, ...style }}\n      {...rest}\n    >\n      {/* 최소 폭을 삼키는 콘텐츠 상자. 넘치는 만큼 이 영역만 가로로 스크롤된다. */}\n      <div style={{ minWidth: MIN_CONTENT_WIDTH }}>{children}</div>\n    </main>\n  );\n});\n","/**\n * 페이지 배경 — 표면의 역할로 이름을 붙인다(리터럴 색이 아니다).\n * - frame:   콘텐츠를 얹는 흰 표면 (sys.color.bg.frame)\n * - neutral: 한 단계 눌러앉은 회색 표면 (sys.color.bg.neutralLight)\n * - screen:  카드·패널이 떠 있는 앱 바탕 (sys.color.bg.screen)\n */\nexport const PAGE_BACKGROUNDS = ['frame', 'neutral', 'screen'] as const;\nexport type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];\n","export type STabSize = 'md' | 'lg';\n\nexport interface STabOption {\n  label: string;\n  value: string;\n  badge?: string | number;\n}\n\n/** main(분절형) 사이즈별 레이아웃 — size는 높이·패딩만 바꾸고 폰트는 고정 */\nexport const TAB_MAIN_SIZE: Record<STabSize, { height: number; paddingX: number }> = {\n  md: { height: 36, paddingX: 24 },\n  lg: { height: 44, paddingX: 32 },\n};\n\n/** 탭 타이포 (main/sub 공통, token: typography.navigation.sm) */\nexport const TAB_TYPOGRAPHY = { fontSize: 12, lineHeight: 20 };\n\n// 색상은 토큰(--cmp-tab-*) 참조 → token.json 변경이 전역 반영\nexport const TAB_MAIN_COLORS = {\n  selected: {\n    bg: 'var(--cmp-tab-main-selected-bg)',\n    border: 'var(--cmp-tab-main-selected-border)',\n    text: 'var(--cmp-tab-main-selected-text)',\n  },\n  default: {\n    bg: 'var(--cmp-tab-main-default-bg)',\n    border: 'var(--cmp-tab-main-default-border)',\n    text: 'var(--cmp-tab-main-default-text)',\n  },\n};\n\nexport const TAB_SUB_COLORS = {\n  selected: { text: 'var(--cmp-tab-sub-selected-text)', line: 'var(--cmp-tab-sub-selected-line)' },\n  default: { text: 'var(--cmp-tab-sub-default-text)' },\n};\n","import { useRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { STag } from '../STag';\nimport {\n  TAB_MAIN_SIZE,\n  TAB_MAIN_COLORS,\n  TAB_SUB_COLORS,\n  TAB_TYPOGRAPHY,\n  type STabSize,\n  type STabOption,\n} from './tabs.config';\n\nexport interface STabsProps {\n  /** 현재 선택된 탭 value */\n  value: string;\n  /** 탭 옵션 목록 */\n  tabs: STabOption[];\n  /** 탭 변경 (sdUpdate) */\n  onValueChange?: (value: string) => void;\n  /** 탭 크기 (main 전용) */\n  size?: STabSize;\n  /** 서브 탭(밑줄형) 스타일 */\n  isSub?: boolean;\n  /** 세로 배치 (sub 전용 — main 폴더형은 항상 가로) */\n  vertical?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * STabs — sd-tabs 포팅.\n * main = 폴더형(탭 줄에 파란 baseline, 탭은 위쪽만 둥글고 하단 테두리 없음),\n * sub = 밑줄형(선택 시 하단 라인). 뱃지(STag), 세로 배치, value 제어 + onValueChange(sdUpdate).\n */\nexport function STabs({\n  value,\n  tabs,\n  onValueChange,\n  size = 'md',\n  isSub = false,\n  vertical = false,\n  className,\n  style,\n}: STabsProps) {\n  const s = TAB_MAIN_SIZE[size];\n  const blue = TAB_MAIN_COLORS.selected.border; // baseline 색 (토큰)\n  // vertical 은 sub 전용. main 폴더형은 항상 가로.\n  const isVertical = isSub && vertical;\n\n  // roving tabindex + 방향키 내비게이션 (ARIA tabs 패턴, automatic activation).\n  const tabRefs = useRef<(HTMLDivElement | null)[]>([]);\n  const moveTo = (target: number) => {\n    if (target < 0 || target >= tabs.length) return;\n    onValueChange?.(tabs[target].value);\n    tabRefs.current[target]?.focus();\n  };\n\n  // 컨테이너: main 은 하단 baseline(파란선, 100% 너비), sub 는 없음\n  const containerStyle: CSSProperties = { ...style };\n  if (!isSub) containerStyle.borderBottom = `1px solid ${blue}`;\n\n  return (\n    <div\n      role=\"tablist\"\n      aria-orientation={isVertical ? 'vertical' : 'horizontal'}\n      className={cn(\n        // main(가로): baseline(하단 divider)이 100% 너비로 채워지도록 w-full\n        isSub ? 'inline-flex w-fit' : 'flex w-full',\n        isVertical ? 'flex-col items-stretch' : 'flex-row',\n        isSub ? (isVertical ? 'gap-[16px]' : 'gap-[24px]') : 'gap-[4px]',\n        className,\n      )}\n      style={containerStyle}\n    >\n      {tabs.map((tab, i) => {\n        const selected = tab.value === value;\n        const select = () => onValueChange?.(tab.value);\n\n        let tabStyle: CSSProperties;\n        if (isSub) {\n          tabStyle = {\n            height: 20,\n            paddingBottom: 4,\n            fontSize: TAB_TYPOGRAPHY.fontSize,\n            lineHeight: `${TAB_TYPOGRAPHY.lineHeight}px`,\n            color: selected ? TAB_SUB_COLORS.selected.text : TAB_SUB_COLORS.default.text,\n            borderBottom: `1px solid ${selected ? TAB_SUB_COLORS.selected.line : 'transparent'}`,\n          };\n        } else {\n          const border = selected\n            ? TAB_MAIN_COLORS.selected.border\n            : TAB_MAIN_COLORS.default.border;\n          const selectedBg = TAB_MAIN_COLORS.selected.bg; // baseline 을 덮을 흰색\n          tabStyle = {\n            height: s.height,\n            padding: `0 ${s.paddingX}px`,\n            fontSize: TAB_TYPOGRAPHY.fontSize,\n            lineHeight: `${TAB_TYPOGRAPHY.lineHeight}px`,\n            background: selected ? TAB_MAIN_COLORS.selected.bg : TAB_MAIN_COLORS.default.bg,\n            color: selected ? TAB_MAIN_COLORS.selected.text : TAB_MAIN_COLORS.default.text,\n            border: `1px solid ${border}`,\n            // 폴더형: 미선택 탭은 baseline 위에, 선택 탭은 baseline(파란선)을 1px 덮어 연결된 것처럼 보이게\n            borderTopLeftRadius: 6,\n            borderTopRightRadius: 6,\n            borderBottomLeftRadius: 0,\n            borderBottomRightRadius: 0,\n            borderBottom: selected ? `1px solid ${selectedBg}` : 'none',\n            marginBottom: selected ? -1 : 0,\n          };\n        }\n\n        return (\n          <div\n            key={tab.value}\n            ref={el => {\n              tabRefs.current[i] = el;\n            }}\n            role=\"tab\"\n            // roving tabindex: 선택된 탭만 Tab 포커스 대상, 나머지는 방향키로 이동.\n            tabIndex={selected ? 0 : -1}\n            aria-selected={selected}\n            aria-label={tab.label || 'tab'}\n            onClick={select}\n            onKeyDown={e => {\n              if (e.key === 'Enter' || e.key === ' ') {\n                e.preventDefault();\n                select();\n                return;\n              }\n              const nextKey = isVertical ? 'ArrowDown' : 'ArrowRight';\n              const prevKey = isVertical ? 'ArrowUp' : 'ArrowLeft';\n              if (e.key === nextKey) {\n                e.preventDefault();\n                moveTo((i + 1) % tabs.length);\n              } else if (e.key === prevKey) {\n                e.preventDefault();\n                moveTo((i - 1 + tabs.length) % tabs.length);\n              } else if (e.key === 'Home') {\n                e.preventDefault();\n                moveTo(0);\n              } else if (e.key === 'End') {\n                e.preventDefault();\n                moveTo(tabs.length - 1);\n              }\n            }}\n            className=\"relative box-border inline-flex cursor-pointer select-none items-center justify-center gap-[8px] whitespace-nowrap outline-none transition-[color,background-color] duration-200\"\n            style={tabStyle}\n          >\n            {/* 고스트(bold) 텍스트로 너비 고정 → 선택 시 두께 변화로 밀리지 않음 */}\n            <span className=\"grid\">\n              <span aria-hidden className=\"invisible font-bold\" style={{ gridArea: '1 / 1' }}>\n                {tab.label}\n              </span>\n              <span style={{ gridArea: '1 / 1', fontWeight: selected ? 700 : 400 }}>\n                {tab.label}\n              </span>\n            </span>\n            {tab.badge !== undefined && tab.badge !== null && tab.badge !== '' && (\n              <STag\n                shape=\"square\"\n                size=\"xs\"\n                color={selected ? 'blue' : 'grey'}\n                label={String(tab.badge)}\n              />\n            )}\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon, type SIconName } from '../SIcon';\n\nconst PER_PAGE = 10;\nconst BUTTON_WIDTH: Record<number, number> = { 1: 24, 2: 34, 3: 40, 4: 48, 5: 56 };\n\nexport interface SPaginationProps {\n  /** 현재 페이지 */\n  currentPage?: number;\n  /** 마지막 페이지 */\n  lastPage?: number;\n  /** 단순 모드 (현재/마지막만 표시) */\n  simple?: boolean;\n  /** 페이지 변경 (sdPageChange) */\n  onPageChange?: (page: number) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SPagination — sd-pagination 포팅. 10개 단위 그룹 이동 + simple 모드. */\nexport function SPagination({\n  currentPage = 1,\n  lastPage = 1,\n  simple = false,\n  onPageChange,\n  className,\n  style,\n}: SPaginationProps) {\n  const start = Math.floor((currentPage - 1) / PER_PAGE) * PER_PAGE + 1;\n  const end = Math.min(start + PER_PAGE - 1, lastPage);\n  const pageNumbers = Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i);\n  const maxDigits = (pageNumbers.length > 0 ? pageNumbers[pageNumbers.length - 1] : 1).toString()\n    .length;\n  const itemWidth = BUTTON_WIDTH[maxDigits] || BUTTON_WIDTH[1];\n\n  const isFirstGroup = currentPage <= PER_PAGE;\n  const isLastGroup = start + PER_PAGE - 1 >= lastPage;\n\n  const go = (page: number) => {\n    if (page < 1 || page > lastPage || page === currentPage) return;\n    onPageChange?.(page);\n  };\n  const groupMove = (dir: 'forward' | 'backward') => {\n    const delta = dir === 'forward' ? PER_PAGE : -PER_PAGE;\n    go(Math.min(Math.max(currentPage + delta, 1), lastPage));\n  };\n\n  const navBtn = (icon: SIconName, aria: string, onClick: () => void) => (\n    <button\n      type=\"button\"\n      aria-label={aria}\n      onClick={onClick}\n      className=\"flex h-[var(--cmp-pagination-height)] w-[var(--cmp-pagination-height)] cursor-pointer items-center justify-center rounded-[var(--cmp-pagination-radius)] border-none bg-transparent hover:bg-[var(--cmp-pagination-item-bg-hover)]\"\n    >\n      <SIcon name={icon} size={12} color=\"var(--color-grey-65)\" />\n    </button>\n  );\n\n  const prevButtons = simple\n    ? currentPage > 1 && (\n        <>\n          {navBtn('chevronLeftEnd', '첫 페이지', () => go(1))}\n          {navBtn('chevronLeft', '이전 페이지', () => go(currentPage - 1))}\n        </>\n      )\n    : !isFirstGroup && (\n        <>\n          {navBtn('chevronLeftEnd', '첫 페이지', () => go(1))}\n          {navBtn('chevronLeft', '이전 그룹', () => groupMove('backward'))}\n        </>\n      );\n\n  const nextButtons = simple\n    ? currentPage < lastPage && (\n        <>\n          {navBtn('chevronRight', '다음 페이지', () => go(currentPage + 1))}\n          {navBtn('chevronRightEnd', '마지막 페이지', () => go(lastPage))}\n        </>\n      )\n    : !isLastGroup && (\n        <>\n          {navBtn('chevronRight', '다음 그룹', () => groupMove('forward'))}\n          {navBtn('chevronRightEnd', '마지막 페이지', () => go(lastPage))}\n        </>\n      );\n\n  return (\n    <div\n      className={cn('inline-flex items-center gap-[var(--cmp-pagination-gap)]', className)}\n      style={style}\n    >\n      <div className=\"flex min-w-[calc(var(--cmp-pagination-height)*2+var(--cmp-pagination-move-gap))] items-center justify-end gap-[var(--cmp-pagination-move-gap)]\">\n        {prevButtons}\n      </div>\n\n      {simple ? (\n        <div className=\"flex h-[var(--cmp-pagination-height)] items-center gap-[var(--cmp-pagination-simple-gap)] px-[var(--cmp-pagination-paddingX)] text-[12px] font-medium leading-[20px] text-[color:var(--cmp-pagination-item-content-default)]\">\n          <span className=\"font-bold text-[color:var(--cmp-pagination-item-content-selected)]\">\n            {currentPage}\n          </span>\n          <span>/</span>\n          <span>{lastPage}</span>\n        </div>\n      ) : (\n        <div className=\"flex items-center gap-[var(--cmp-pagination-move-gap)]\">\n          {pageNumbers.map(n => {\n            const selected = currentPage === n;\n            return (\n              <button\n                key={n}\n                type=\"button\"\n                aria-current={selected ? 'page' : undefined}\n                onClick={() => go(n)}\n                className={cn(\n                  'box-border flex h-[var(--cmp-pagination-height)] cursor-pointer items-center justify-center rounded-[var(--cmp-pagination-radius)] border-none px-[var(--cmp-pagination-paddingX)] text-[12px] leading-[20px]',\n                  selected\n                    ? 'bg-[var(--cmp-pagination-item-bg-selected)] font-bold text-[color:var(--cmp-pagination-item-content-selected)]'\n                    : 'bg-transparent font-medium text-[color:var(--cmp-pagination-item-content-default)] hover:bg-[var(--cmp-pagination-item-bg-hover)] hover:text-[color:var(--cmp-pagination-item-content-hover)]',\n                )}\n                style={{ width: itemWidth }}\n              >\n                {n}\n              </button>\n            );\n          })}\n        </div>\n      )}\n\n      <div className=\"flex min-w-[calc(var(--cmp-pagination-height)*2+var(--cmp-pagination-move-gap))] items-center justify-start gap-[var(--cmp-pagination-move-gap)]\">\n        {nextButtons}\n      </div>\n    </div>\n  );\n}\n","export const STEPPER_SIZES = ['sm', 'lg'] as const;\nexport type SStepperSize = (typeof STEPPER_SIZES)[number];\n\nexport type SStepperItem = {\n  label: string;\n  value?: string;\n  group?: string;\n  completed?: boolean;\n  error?: boolean;\n};\n\nconst V = (path: string) => `var(--cmp-stepper-${path})`;\nconst VF = (path: string, fallback: string) => `var(--cmp-stepper-${path}, ${fallback})`;\n\nexport const STEPPER_SIZE_CONFIG: Record<\n  SStepperSize,\n  {\n    sequenceSize: string;\n    fontSize: string;\n    lineHeight: string;\n    fontWeightActive: number;\n    fontWeightDefault: number;\n  }\n> = {\n  sm: {\n    sequenceSize: V('sm-sequence-size'),\n    fontSize: '12px',\n    lineHeight: '20px',\n    fontWeightActive: 700,\n    fontWeightDefault: 500,\n  },\n  lg: {\n    sequenceSize: V('lg-sequence-size'),\n    fontSize: '14px',\n    lineHeight: '24px',\n    fontWeightActive: 700,\n    fontWeightDefault: 500,\n  },\n};\n\nexport const STEPPER_LAYOUT = {\n  containerGap: V('horizontal-gap'),\n  itemGap: V('item-gap'),\n  dashWidth: V('horizontal-dash-width'),\n  sequenceRadius: V('sequence-radius'),\n  sequenceBorderWidth: V('sequence-border-width'),\n  sequenceIcon: V('sequence-icon'),\n};\n\nexport const STEPPER_COLORS = {\n  dash: V('horizontal-dash-color'),\n  sequenceBorder: {\n    active: V('sequence-border-active'),\n    default: V('sequence-border-default'),\n    completed: VF('sequence-border-completed', '#93C4FF'),\n  },\n  sequenceBg: {\n    active: V('sequence-bg-active'),\n    default: V('sequence-bg-default'),\n    completed: VF('sequence-bg-completed', '#EFF6FF'),\n  },\n  sequenceText: {\n    active: V('sequence-text-active'),\n    default: V('sequence-text-default'),\n    completed: VF('sequence-text-completed', '#0075FF'),\n  },\n  text: {\n    active: V('text-active'),\n    default: V('text-default'),\n    completed: V('text-completed'),\n  },\n};\n\nexport const STEPPER_HORIZONTAL_COMPLETED_COLORS = {\n  sequenceBorder: STEPPER_COLORS.sequenceBorder.completed,\n  sequenceBg: STEPPER_COLORS.sequenceBg.completed,\n  sequenceIcon: STEPPER_COLORS.sequenceText.completed,\n  text: STEPPER_COLORS.text.completed,\n};\n\nexport const STEPPER_VERTICAL_LAYOUT = {\n  width: VF('vertical-width', '240px'),\n  itemGap: VF('vertical-item-gap', '12px'),\n  itemPaddingX: VF('vertical-item-paddingX', '16px'),\n  itemPaddingY: VF('vertical-item-paddingY', '8px'),\n  titlePaddingTop: VF('vertical-title-paddingTop', '12px'),\n  titlePaddingBottom: VF('vertical-title-paddingBottom', '4px'),\n  titleFontSize: VF('vertical-title-font-size', '11px'),\n  titleLineHeight: VF('vertical-title-line-height', '18px'),\n  accentStripeWidth: VF('vertical-item-accentStripe-width', '2px'),\n  accentStripeColor: VF('vertical-item-accentStripe-color', '#64ABFF'),\n};\n\nexport const STEPPER_VERTICAL_COLORS = {\n  itemBg: {\n    default: VF('vertical-item-bg-default', '#FFFFFF'),\n    hover: VF('vertical-item-bg-hover', '#F6F6F6'),\n    selected: VF('vertical-item-bg-selected', '#EFF6FF'),\n  },\n  titleText: VF('vertical-title-text', '#004290'),\n  textDefault: STEPPER_COLORS.text.default,\n  textCompleted: STEPPER_COLORS.text.completed,\n  sequenceBorderActive: STEPPER_COLORS.sequenceBorder.active,\n  sequenceBgActive: STEPPER_COLORS.sequenceBg.active,\n  sequenceTextActive: STEPPER_COLORS.sequenceText.active,\n  sequenceTextDefault: STEPPER_COLORS.sequenceText.default,\n  sequenceBorderCompleted: VF('vertical-sequence-border-completed', '#93C4FF'),\n  sequenceBgCompleted: VF('vertical-sequence-bg-completed', '#EFF6FF'),\n  sequenceIconCompleted: VF('vertical-sequence-icon-completed', '#0075FF'),\n  errorBadge: '#FB4444',\n};\n","'use client';\n\nimport {\n  forwardRef,\n  useImperativeHandle,\n  useLayoutEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon } from '../SIcon';\nimport { STooltip } from '../STooltip';\nimport {\n  STEPPER_COLORS,\n  STEPPER_HORIZONTAL_COMPLETED_COLORS,\n  STEPPER_LAYOUT,\n  STEPPER_SIZE_CONFIG,\n  STEPPER_VERTICAL_COLORS,\n  STEPPER_VERTICAL_LAYOUT,\n  type SStepperItem,\n  type SStepperSize,\n} from './stepper.config';\n\ntype StepperState = 'completed' | 'active' | 'default';\n\n/** error 아이템 hover 시 노출되는 고정 안내 문구 */\nconst ERROR_TOOLTIP_MESSAGE = '확인이 필요한 항목이 있습니다.';\n\nexport interface SStepperProps {\n  /** 단계 목록 */\n  items: SStepperItem[];\n  /** 현재 활성 단계 value */\n  value?: string;\n  /** 크기 */\n  size?: SStepperSize;\n  /** 세로형 여부 */\n  vertical?: boolean;\n  /** 단계 클릭 가능 여부. 미지정 시 가로형=false, 세로형=true */\n  clickable?: boolean;\n  /** 단계 선택 시 호출 */\n  onValueChange?: (value: string, item: SStepperItem, index: number) => void;\n  /** 접근성 레이블 */\n  ariaLabel?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * ref 로 노출되는 커스텀 툴팁 제어 API. 세로형 전용 — items 중 error 가 true 인 첫 번째\n * 아이템의 텍스트+뱃지 영역에 표시된다.\n *\n * 지금은 대상(첫 번째 error 아이템 하나)·문구·스타일이 hover 툴팁(ERROR_TOOLTIP_MESSAGE, danger)과\n * 동일하게 고정되어 있다 — 열고 닫는 타이밍만 소비자가 제어한다. 대상 아이템을 지정하거나\n * content·type 을 커스터마이즈하는 기능은 필요해지면 추가한다(지금은 만들지 않음).\n */\nexport interface SStepperHandle {\n  /** error 아이템 중 첫 번째에 툴팁을 연다. error 아이템이 없으면 아무 일도 일어나지 않는다. */\n  showItemTooltip: () => void;\n  /** 열려있는 커스텀 툴팁을 닫는다. 활성 단계(value prop)가 바뀌면 별도 호출 없이도 자동으로 닫힌다. */\n  hideItemTooltip: () => void;\n}\n\nfunction getItemValue(item: SStepperItem, index: number) {\n  return item.value ?? String(index + 1);\n}\n\nfunction groupAdjacentItems(items: SStepperItem[]) {\n  return items.reduce<Array<{ group?: string; startIndex: number; items: SStepperItem[] }>>(\n    (groups, item, index) => {\n      const currentGroup = item.group;\n      const previous = groups[groups.length - 1];\n\n      if (currentGroup && previous?.group === currentGroup) {\n        previous.items.push(item);\n        return groups;\n      }\n\n      groups.push({ group: currentGroup, startIndex: index, items: [item] });\n      return groups;\n    },\n    [],\n  );\n}\n\n/** SStepper — sd-stepper 포팅. 단계 진행 상태 표시 전용. */\nexport const SStepper = forwardRef<SStepperHandle, SStepperProps>(function SStepper(\n  {\n    items,\n    value,\n    size = 'sm',\n    vertical = false,\n    clickable,\n    onValueChange,\n    ariaLabel = '진행 단계',\n    className,\n    style,\n  },\n  ref,\n) {\n  const config = STEPPER_SIZE_CONFIG[size];\n  const isClickable = clickable ?? vertical;\n  const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n  const [tooltipHoverValue, setTooltipHoverValue] = useState<string | null>(null);\n  const [customTooltipOpen, setCustomTooltipOpen] = useState(false);\n  const [verticalAccentStripeStyle, setVerticalAccentStripeStyle] = useState<CSSProperties>({\n    height: 0,\n    opacity: 0,\n    transform: 'translateY(0px)',\n  });\n  const verticalItemRefs = useRef<Array<HTMLElement | null>>([]);\n  const activeIndex = Math.max(\n    0,\n    items.findIndex((item, index) => getItemValue(item, index) === value),\n  );\n  const lastCompletedIndex = items.reduce(\n    (lastIndex, item, index) => (item.completed === true ? index : lastIndex),\n    -1,\n  );\n  const resolvedClickableIndex = lastCompletedIndex + 1;\n  const [visitedMaxIndex, setVisitedMaxIndex] = useState(activeIndex);\n  const firstErrorIndex = items.findIndex(item => item.error === true);\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      showItemTooltip: () => setCustomTooltipOpen(true),\n      hideItemTooltip: () => setCustomTooltipOpen(false),\n    }),\n    [],\n  );\n\n  useLayoutEffect(() => {\n    setVisitedMaxIndex(current => Math.max(current, activeIndex));\n  }, [activeIndex]);\n\n  // 활성 단계가 바뀌면 커스텀 툴팁은 별도 호출 없이 자동으로 닫힌다.\n  useLayoutEffect(() => {\n    setCustomTooltipOpen(false);\n  }, [activeIndex]);\n\n  useLayoutEffect(() => {\n    if (!vertical) return;\n\n    const activeItem = verticalItemRefs.current[activeIndex];\n    if (!activeItem) {\n      setVerticalAccentStripeStyle(current => ({ ...current, opacity: 0 }));\n      return;\n    }\n\n    setVerticalAccentStripeStyle({\n      height: activeItem.offsetHeight,\n      opacity: 1,\n      transform: `translateY(${activeItem.offsetTop}px)`,\n    });\n  }, [activeIndex, vertical, items]);\n\n  const getState = (item: SStepperItem, index: number): StepperState => {\n    if (index === activeIndex) return 'active';\n    if (item.completed != null) return item.completed ? 'completed' : 'default';\n    return 'default';\n  };\n\n  const emitValueChange = (item: SStepperItem, index: number) => {\n    onValueChange?.(getItemValue(item, index), item, index);\n  };\n\n  const isWithinClickableIndex = (index: number) => index <= resolvedClickableIndex;\n\n  const renderStepContent = (\n    item: SStepperItem,\n    index: number,\n    options: { isVertical?: boolean; roleListItem?: boolean; hovered?: boolean } = {},\n  ) => {\n    const { isVertical = false, roleListItem = true, hovered = false } = options;\n    const state = getState(item, index);\n    const isHorizontalCompleted = !isVertical && state === 'completed';\n    const isVerticalCompleted = isVertical && state === 'completed';\n    const isVerticalLastActive = isVertical && state === 'default' && index === visitedMaxIndex;\n    const showsCheckIcon = state === 'completed';\n    const itemColor = (() => {\n      if (isHorizontalCompleted) return STEPPER_HORIZONTAL_COMPLETED_COLORS.text;\n      if (!isVertical) return STEPPER_COLORS.text[state];\n      if (state === 'active') return STEPPER_COLORS.text.active;\n      if (isVerticalCompleted) return STEPPER_VERTICAL_COLORS.textCompleted;\n      return STEPPER_VERTICAL_COLORS.textDefault;\n    })();\n    const sequenceBorderColor = (() => {\n      if (isVerticalCompleted) {\n        return STEPPER_VERTICAL_COLORS.sequenceBorderCompleted;\n      }\n      if (isVertical && (state === 'active' || isVerticalLastActive)) {\n        return STEPPER_VERTICAL_COLORS.sequenceBorderActive;\n      }\n      if (isHorizontalCompleted) return STEPPER_HORIZONTAL_COMPLETED_COLORS.sequenceBorder;\n      return STEPPER_COLORS.sequenceBorder[state];\n    })();\n    const sequenceBg = (() => {\n      if (isVerticalCompleted) {\n        return STEPPER_VERTICAL_COLORS.sequenceBgCompleted;\n      }\n      if (isVertical && (state === 'active' || isVerticalLastActive)) {\n        return STEPPER_VERTICAL_COLORS.sequenceBgActive;\n      }\n      if (isHorizontalCompleted) return STEPPER_HORIZONTAL_COMPLETED_COLORS.sequenceBg;\n      return STEPPER_COLORS.sequenceBg[state];\n    })();\n    const sequenceColor = (() => {\n      if (isVerticalCompleted) {\n        return STEPPER_VERTICAL_COLORS.sequenceIconCompleted;\n      }\n      if (isVertical && (state === 'active' || isVerticalLastActive)) {\n        return STEPPER_VERTICAL_COLORS.sequenceTextActive;\n      }\n      if (isVertical) return STEPPER_VERTICAL_COLORS.sequenceTextDefault;\n      if (isHorizontalCompleted) return STEPPER_HORIZONTAL_COMPLETED_COLORS.sequenceIcon;\n      return STEPPER_COLORS.sequenceText[state];\n    })();\n    const itemStyle = {\n      gap: STEPPER_LAYOUT.itemGap,\n      color: itemColor,\n      fontWeight:\n        state === 'active' || (isVertical && hovered)\n          ? config.fontWeightActive\n          : config.fontWeightDefault,\n    } as CSSProperties;\n    const sequenceStyle = {\n      width: config.sequenceSize,\n      height: config.sequenceSize,\n      flexBasis: config.sequenceSize,\n      borderRadius: STEPPER_LAYOUT.sequenceRadius,\n      borderWidth: STEPPER_LAYOUT.sequenceBorderWidth,\n      borderColor: sequenceBorderColor,\n      background: sequenceBg,\n      color: sequenceColor,\n    } as CSSProperties;\n\n    return (\n      <span\n        role={roleListItem ? 'listitem' : undefined}\n        aria-current={roleListItem && state === 'active' ? 'step' : undefined}\n        className=\"inline-flex items-center whitespace-nowrap\"\n        style={itemStyle}\n      >\n        <span\n          aria-hidden\n          className=\"box-border inline-flex shrink-0 items-center justify-center border border-solid font-bold\"\n          style={sequenceStyle}\n        >\n          {showsCheckIcon ? (\n            <SIcon name=\"check\" size={STEPPER_LAYOUT.sequenceIcon} color=\"currentColor\" />\n          ) : (\n            index + 1\n          )}\n        </span>\n        <span>{item.label}</span>\n      </span>\n    );\n  };\n\n  const renderClickableStepContent = (item: SStepperItem, index: number, isVertical = false) => {\n    const isDisabled = !isWithinClickableIndex(index);\n\n    return (\n      <button\n        type=\"button\"\n        disabled={isDisabled}\n        className={cn(\n          'm-0 inline-flex w-full items-center border-0 bg-transparent p-0 text-left',\n          isDisabled ? 'cursor-default' : 'cursor-pointer',\n        )}\n        style={{ font: 'inherit', color: 'inherit' }}\n        onClick={() => {\n          if (!isDisabled) emitValueChange(item, index);\n        }}\n      >\n        {renderStepContent(item, index, { isVertical, roleListItem: false })}\n      </button>\n    );\n  };\n\n  if (vertical) {\n    const groups = groupAdjacentItems(items);\n\n    return (\n      <div\n        role=\"list\"\n        aria-label={ariaLabel}\n        className={cn('relative inline-flex flex-col items-start', className)}\n        style={{\n          width: STEPPER_VERTICAL_LAYOUT.width,\n          fontSize: config.fontSize,\n          lineHeight: config.lineHeight,\n          ...style,\n        }}\n      >\n        <span\n          aria-hidden=\"true\"\n          data-stepper-accent-stripe=\"true\"\n          className=\"pointer-events-none absolute left-0 top-0 z-[1]\"\n          style={{\n            width: STEPPER_VERTICAL_LAYOUT.accentStripeWidth,\n            background: STEPPER_VERTICAL_LAYOUT.accentStripeColor,\n            transition: 'transform 160ms ease, height 160ms ease, opacity 120ms ease',\n            ...verticalAccentStripeStyle,\n          }}\n        />\n        {groups.map(group => {\n          const groupKey = group.group ?? getItemValue(group.items[0], group.startIndex);\n\n          return (\n            <div\n              key={`${groupKey}-${group.startIndex}`}\n              className=\"flex w-full flex-col items-start\"\n            >\n              {group.group && (\n                <div\n                  className=\"flex w-full items-center overflow-hidden\"\n                  style={{\n                    gap: STEPPER_VERTICAL_LAYOUT.itemGap,\n                    paddingLeft: STEPPER_VERTICAL_LAYOUT.itemPaddingX,\n                    paddingRight: STEPPER_VERTICAL_LAYOUT.itemPaddingX,\n                    paddingTop: STEPPER_VERTICAL_LAYOUT.titlePaddingTop,\n                    paddingBottom: STEPPER_VERTICAL_LAYOUT.titlePaddingBottom,\n                    background: STEPPER_VERTICAL_COLORS.itemBg.default,\n                    color: STEPPER_VERTICAL_COLORS.titleText,\n                    fontSize: STEPPER_VERTICAL_LAYOUT.titleFontSize,\n                    lineHeight: STEPPER_VERTICAL_LAYOUT.titleLineHeight,\n                    fontWeight: 700,\n                  }}\n                >\n                  <span className=\"whitespace-nowrap\">{group.group}</span>\n                </div>\n              )}\n              {group.items.map((item, itemIndex) => {\n                const index = group.startIndex + itemIndex;\n                const state = getState(item, index);\n                const itemValue = getItemValue(item, index);\n                const canClickItem = isClickable && isWithinClickableIndex(index);\n                const isDisabled = !canClickItem;\n                const isHovered = hoveredIndex === index && canClickItem && state !== 'active';\n                const itemContainerStyle = {\n                  gap: STEPPER_VERTICAL_LAYOUT.itemGap,\n                  paddingLeft: STEPPER_VERTICAL_LAYOUT.itemPaddingX,\n                  paddingRight: STEPPER_VERTICAL_LAYOUT.itemPaddingX,\n                  paddingTop: STEPPER_VERTICAL_LAYOUT.itemPaddingY,\n                  paddingBottom: STEPPER_VERTICAL_LAYOUT.itemPaddingY,\n                  background:\n                    state === 'active'\n                      ? STEPPER_VERTICAL_COLORS.itemBg.selected\n                      : isHovered\n                        ? STEPPER_VERTICAL_COLORS.itemBg.hover\n                        : STEPPER_VERTICAL_COLORS.itemBg.default,\n                } as CSSProperties;\n                const handleMouseEnter = () => {\n                  if (canClickItem) setHoveredIndex(index);\n                };\n                const handleMouseLeave = () => {\n                  setHoveredIndex(current => (current === index ? null : current));\n                };\n                const stepContent = renderStepContent(item, index, {\n                  isVertical: true,\n                  roleListItem: false,\n                  hovered: isHovered,\n                });\n                const errorBadge = item.error ? (\n                  <span\n                    aria-hidden=\"true\"\n                    data-stepper-error-badge=\"true\"\n                    className=\"inline-flex shrink-0 overflow-hidden rounded-full\"\n                    style={{\n                      width: 6,\n                      height: 6,\n                      background: STEPPER_VERTICAL_COLORS.errorBadge,\n                    }}\n                  />\n                ) : null;\n\n                // hover 툴팁과 커스텀 툴팁(ref API)은 지금은 문구·스타일이 완전히 같은 고정 안내라,\n                // 둘 중 하나라도 열려있으면 그냥 보여준다(둘 다 error 아이템에만 뜬다).\n                // TODO: 커스텀 툴팁에 별도 문구/스타일이 필요해지면 열림 조건을 다시 분리한다.\n                const isTooltipHovered = tooltipHoverValue === itemValue;\n                const isCustomTooltipOpen = customTooltipOpen && index === firstErrorIndex;\n                const showTooltip =\n                  item.error === true && (isTooltipHovered || isCustomTooltipOpen);\n                const handleTooltipMouseEnter = () => setTooltipHoverValue(itemValue);\n                const handleTooltipMouseLeave = () => {\n                  setTooltipHoverValue(current => (current === itemValue ? null : current));\n                };\n\n                const labelBadge = (\n                  <STooltip\n                    trigger=\"none\"\n                    open={showTooltip}\n                    content={ERROR_TOOLTIP_MESSAGE}\n                    tooltipType=\"danger\"\n                    placement=\"right\"\n                  >\n                    {/* onClick 은 겹쳐진 button(z-[2])과 같은 동작의 포인터 캡처용 중복일 뿐이며,\n                        키보드 접근은 그 button 이 이미 제공한다 */}\n                    {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n                    <span\n                      className={cn(\n                        'relative z-[3] inline-flex items-center',\n                        isClickable && (isDisabled ? 'cursor-default' : 'cursor-pointer'),\n                      )}\n                      style={{ gap: STEPPER_VERTICAL_LAYOUT.itemGap }}\n                      onMouseEnter={handleTooltipMouseEnter}\n                      onMouseLeave={handleTooltipMouseLeave}\n                      onClick={\n                        isClickable\n                          ? () => {\n                              if (!isDisabled) emitValueChange(item, index);\n                            }\n                          : undefined\n                      }\n                    >\n                      {stepContent}\n                      {errorBadge}\n                    </span>\n                  </STooltip>\n                );\n\n                if (isClickable) {\n                  return (\n                    <div\n                      key={itemValue}\n                      ref={node => {\n                        verticalItemRefs.current[index] = node;\n                      }}\n                      role=\"listitem\"\n                      aria-current={state === 'active' ? 'step' : undefined}\n                      className={cn(\n                        'relative flex w-full items-center overflow-hidden',\n                        isDisabled ? 'cursor-default' : 'cursor-pointer',\n                      )}\n                      onMouseEnter={handleMouseEnter}\n                      onMouseLeave={handleMouseLeave}\n                      style={itemContainerStyle}\n                    >\n                      <button\n                        type=\"button\"\n                        disabled={isDisabled}\n                        aria-label={item.label}\n                        className={cn(\n                          'absolute inset-0 z-[2] m-0 border-0 bg-transparent p-0 text-left outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent)',\n                          isDisabled ? 'cursor-default' : 'cursor-pointer',\n                        )}\n                        onClick={() => {\n                          if (!isDisabled) emitValueChange(item, index);\n                        }}\n                      />\n                      {labelBadge}\n                    </div>\n                  );\n                }\n\n                return (\n                  <div\n                    key={itemValue}\n                    ref={node => {\n                      verticalItemRefs.current[index] = node;\n                    }}\n                    role=\"listitem\"\n                    aria-current={state === 'active' ? 'step' : undefined}\n                    className={cn(\n                      'relative flex w-full items-center overflow-hidden',\n                      isClickable && (canClickItem ? 'cursor-pointer' : 'cursor-default'),\n                    )}\n                    onMouseEnter={handleMouseEnter}\n                    onMouseLeave={handleMouseLeave}\n                    style={itemContainerStyle}\n                  >\n                    {labelBadge}\n                  </div>\n                );\n              })}\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n\n  return (\n    <div\n      role=\"list\"\n      aria-label={ariaLabel}\n      className={cn('inline-flex items-center', className)}\n      style={{\n        gap: STEPPER_LAYOUT.containerGap,\n        fontSize: config.fontSize,\n        lineHeight: config.lineHeight,\n        ...style,\n      }}\n    >\n      {items.map((item, index) => {\n        const state = getState(item, index);\n        const content = isClickable ? (\n          <span role=\"listitem\" aria-current={state === 'active' ? 'step' : undefined}>\n            {renderClickableStepContent(item, index)}\n          </span>\n        ) : (\n          renderStepContent(item, index)\n        );\n\n        return (\n          <span\n            key={getItemValue(item, index)}\n            className=\"inline-flex items-center\"\n            style={{ gap: STEPPER_LAYOUT.containerGap }}\n          >\n            {content}\n            {index < items.length - 1 && (\n              <span\n                aria-hidden\n                className=\"inline-flex h-px shrink-0 items-center\"\n                style={{ width: STEPPER_LAYOUT.dashWidth, color: STEPPER_COLORS.dash }}\n              >\n                <svg\n                  width=\"20\"\n                  height=\"1\"\n                  viewBox=\"0 0 20 1\"\n                  fill=\"none\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                >\n                  {/* 색은 부모 span 의 color(= --cmp-stepper-horizontal-dash-color)를 물려받는다 */}\n                  <rect width=\"1.6\" height=\"1\" fill=\"currentColor\" />\n                  <rect x=\"5\" width=\"3.3\" height=\"1\" fill=\"currentColor\" />\n                  <rect x=\"11.7\" width=\"3.3\" height=\"1\" fill=\"currentColor\" />\n                  <rect x=\"18.4\" width=\"1.6\" height=\"1\" fill=\"currentColor\" />\n                </svg>\n              </span>\n            )}\n          </span>\n        );\n      })}\n    </div>\n  );\n});\n","import { createContext, useContext, useEffect, useRef } from 'react';\n\n/** 유효성 규칙: 유효하면 true, 아니면 에러 메시지 문자열 반환 (sd types/form Rule 포팅) */\nexport type Rule = (value: unknown) => true | string;\n\n/** rules를 순서대로 실행해 첫 실패 메시지를 반환. 모두 통과하면 \"\" */\nexport function runRules(value: unknown, rules?: Rule[]): string {\n  if (!rules || rules.length === 0) return '';\n  for (const rule of rules) {\n    const result = rule(value ?? '');\n    if (result !== true) return typeof result === 'string' ? result : '유효하지 않은 값입니다.';\n  }\n  return '';\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SForm 연동 — Context 기반 필드 등록 (sd-form 검증 서브시스템 포팅)\n// 각 rule-bearing 컨트롤이 useFormField로 자신을 등록하면, SForm이 submit 시\n// 등록된 모든 필드의 validate()를 실행해 하나라도 실패하면 제출을 막는다.\n// SForm 밖에서 쓰이면 context가 없어 no-op (form-agnostic 사용 유지).\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** SForm에 등록되는 필드 항목 */\nexport interface FormFieldEntry {\n  /** 폼 연동용 name (validationError names·focus 대상 식별) */\n  name: string;\n  /** 현재 값에 rules를 실행하고 에러 상태를 반영한 뒤 valid 여부 반환 */\n  validate: () => boolean;\n  /** 검증 에러 상태만 초기화 (값은 소비자 소유) */\n  resetValidation: () => void;\n}\n\nexport interface FormContextValue {\n  /** 필드를 등록하고 해제 함수를 반환 */\n  register: (entry: FormFieldEntry) => () => void;\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n/** 가장 가까운 SForm의 context (없으면 null) */\nexport function useFormContext(): FormContextValue | null {\n  return useContext(FormContext);\n}\n\n/**\n * 폼 필드 등록 훅. SForm 내부이면 등록되고, 밖이면 no-op.\n * validate/resetValidation은 항상 최신 클로저를 참조하도록 ref로 래핑한다.\n */\nexport function useFormField(field: {\n  name?: string;\n  validate: () => boolean;\n  resetValidation: () => void;\n}): void {\n  const ctx = useFormContext();\n  const cbRef = useRef(field);\n  cbRef.current = field;\n  const name = field.name ?? '';\n\n  useEffect(() => {\n    if (!ctx) return;\n    return ctx.register({\n      name,\n      validate: () => cbRef.current.validate(),\n      resetValidation: () => cbRef.current.resetValidation(),\n    });\n  }, [ctx, name]);\n}\n","import { forwardRef, useImperativeHandle, useRef, type ReactNode, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { STooltip, type STooltipProps } from '../STooltip';\nimport { type SColor } from '../../lib/color';\nimport { type Rule } from '../../lib/form';\n\nexport type SFieldSize = 'sm' | 'md';\nexport type SFieldAddonAlign = 'start' | 'center' | 'end';\nexport type SFieldStatus = 'default' | 'pass' | 'error';\n\n// fieldGap: label↔control 간격 (시스템 --sys-space-field-{size}-gap: 12/16)\n// labelGap: label 내부 아이콘·툴팁 간격 (컴포넌트 --cmp-field-label-{size}-gap: 6/8)\nconst FIELD_SIZE: Record<\n  SFieldSize,\n  {\n    height: number;\n    radius: number;\n    fieldGap: number;\n    labelGap: number;\n    fontSize: number;\n    lineHeight: number;\n    icon: number;\n  }\n> = {\n  sm: { height: 28, radius: 4, fieldGap: 12, labelGap: 6, fontSize: 12, lineHeight: 20, icon: 16 },\n  md: { height: 36, radius: 6, fieldGap: 16, labelGap: 8, fontSize: 14, lineHeight: 24, icon: 16 },\n};\n\nconst ALIGN: Record<SFieldAddonAlign, CSSProperties['justifyContent']> = {\n  start: 'flex-start',\n  center: 'center',\n  end: 'flex-end',\n};\n\n/** ref로 노출되는 UX 메서드 (sd-field @Method sdFocus 대응) */\nexport interface SFieldHandle {\n  /** 내부 컨트롤에 포커스하고 필드를 화면에 스크롤합니다. */\n  focus: () => void;\n}\n\nexport interface SFieldProps {\n  /** 폼 연동용 name 속성 */\n  name?: string;\n  /** 레이블 텍스트 */\n  label?: string;\n  /** 레이블 영역 아이콘명 (크기는 size 토큰 16px 고정) */\n  icon?: SIconName;\n  /** 레이블 영역 아이콘 색상. 미지정 시 currentColor 상속 */\n  iconColor?: SColor;\n  /** 레이블 툴팁 텍스트 */\n  labelTooltip?: string;\n  /** 레이블 툴팁 상세 옵션 (SdTooltipProps 대응) */\n  labelTooltipProps?: Partial<STooltipProps>;\n  /** 레이블/어드온 레이블 너비 (숫자=px). label·addonLabel 폭에 공통 적용 */\n  labelWidth?: number | string;\n  /**\n   * 레이블 박스 높이 (숫자=px). 미지정 시 size별 기본값 사용.\n   * 컨트롤 박스가 기본 필드 높이보다 큰 경우(multiline 등) 첫 행에 세로 중앙 정렬을\n   * 맞추기 위해 컨트롤 박스 높이를 넘겨받는다.\n   */\n  labelHeight?: number | string;\n  /** 필드 크기 */\n  size?: SFieldSize;\n  /** 우측 어드온 레이블 */\n  addonLabel?: string;\n  /** 어드온 정렬 */\n  addonAlign?: SFieldAddonAlign;\n  /** 에러 상태 */\n  error?: boolean;\n  /** 에러 메시지 */\n  errorMessage?: string;\n  /** 필드 상태 — 'error' | 'pass' | 'default'. 'pass'면 초록 테두리 */\n  status?: SFieldStatus;\n  /** 포커스 상태 (제어/반영) */\n  focused?: boolean;\n  /** 호버 상태 (제어/반영) */\n  hovered?: boolean;\n  /** 유효성 규칙 (검증은 컨트롤에서 수행, API 패리티) */\n  rules?: Rule[];\n  /** 하단 힌트 */\n  hint?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 읽기 전용 (회색 배경) */\n  readOnly?: boolean;\n  /**\n   * 컨트롤 너비 (숫자=px). 지정하면 필드가 부모 폭을 다 먹지 않고 (레이블 + width) 만큼만 차지한다.\n   * 다른 요소와 나란히 놓으려면 부모를 flex 로 두면 된다.\n   */\n  width?: number | string;\n  /** 컨트롤 최소 너비 (숫자=px). 하한선만 지정하며 필드는 계속 부모 폭을 채운다 */\n  minWidth?: number | string;\n  /** 멀티라인(textarea) — 컨트롤 높이를 고정하지 않고 min-height만 적용 */\n  multiline?: boolean;\n  /**\n   * 테두리 박스 제거 (inline 컨트롤용) — border/배경/hover·focus 강조만 사라지고\n   * label·hint·errorMessage 등 나머지 필드 구성은 그대로 동작한다.\n   */\n  borderless?: boolean;\n  /** 실제 컨트롤 (input/select 등) — 테두리 없이 렌더, 테두리는 SField가 제공 */\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n  onMouseEnter?: () => void;\n  onMouseLeave?: () => void;\n}\n\nconst cssLen = (v?: number | string) =>\n  v === undefined || v === '' || v === 0 ? undefined : typeof v === 'number' ? `${v}px` : v;\n\n/**\n * SField — sd-field 포팅. 폼 컨트롤 래퍼.\n * ★ SField 가 컨트롤 테두리 박스(border/radius/bg + hover/focus/error/disabled 상태)를 소유하고,\n *   children(input/select 등)은 테두리 없이 그 안을 채운다. (Stencil sd-field 구조)\n */\nexport const SField = forwardRef<SFieldHandle, SFieldProps>(function SField(\n  {\n    name,\n    label = '',\n    icon,\n    iconColor,\n    labelTooltip = '',\n    labelTooltipProps,\n    labelWidth,\n    labelHeight,\n    size = 'sm',\n    addonLabel = '',\n    addonAlign = 'start',\n    error = false,\n    errorMessage = '',\n    status,\n    focused = false,\n    hovered = false,\n    rules: _rules,\n    hint = '',\n    disabled = false,\n    readOnly = false,\n    width,\n    minWidth,\n    multiline = false,\n    borderless = false,\n    children,\n    className,\n    style,\n    onMouseEnter,\n    onMouseLeave,\n  },\n  ref,\n) {\n  const rootRef = useRef<HTMLDivElement>(null);\n  useImperativeHandle(\n    ref,\n    () => ({\n      focus: () => {\n        const root = rootRef.current;\n        if (!root) return;\n        const focusable = root.querySelector<HTMLElement>(\n          'input,textarea,select,button,[tabindex]',\n        );\n        focusable?.focus();\n        root.scrollIntoView({ block: 'nearest' });\n      },\n    }),\n    [],\n  );\n\n  const s = FIELD_SIZE[size];\n  // label 과 addonLabel 은 함께 사용 불가 — 둘 다 지정 시 label 우선, addonLabel 무시\n  if (label !== '' && addonLabel !== '' && typeof console !== 'undefined') {\n    console.warn(\n      '[SField] label 과 addonLabel 은 함께 사용할 수 없습니다. addonLabel 을 무시합니다.',\n    );\n  }\n  const effectiveAddonLabel = label !== '' ? '' : addonLabel;\n  // status가 있으면 error보다 우선 반영 (원본: status !== undefined 시 override)\n  const resolvedError = status === 'error' || (status === undefined && error);\n  const resolvedSuccess = status === 'pass';\n  const showError = resolvedError && errorMessage !== '';\n  // hover/focus 는 error/pass 보다 우선 (원본 sd-field: error/pass 는 :not(:hover), hover/focus 는 focus색 !important).\n  // disabled/readOnly 만 hover/focus 강조에서 제외.\n  const interactive = !disabled && !readOnly;\n  // width 가 지정되면 루트가 부모 폭을 다 먹지 않고 (label + width) 만큼만 hug 한다.\n  // minWidth 는 하한선 용도로 항상 넘어오는 경우가 있어(STimePicker 등) hug 판정에서 제외.\n  const hug = cssLen(width) !== undefined;\n\n  const borderColor = borderless\n    ? 'transparent'\n    : disabled\n      ? 'var(--color-grey-45)'\n      : interactive && focused\n        ? 'var(--sys-color-field-border-focus)' // focus(제어 prop) 가 error/pass 보다 우선\n        : resolvedSuccess\n          ? 'var(--sys-color-field-border-success)'\n          : resolvedError\n            ? 'var(--sys-color-field-border-danger)'\n            : 'var(--sys-color-field-border-default)';\n  const bgColor = borderless\n    ? 'transparent'\n    : disabled\n      ? 'var(--color-grey-30)'\n      : readOnly\n        ? 'var(--sys-color-field-bg-readOnly)'\n        : 'var(--sys-color-field-bg-default)';\n  const textColor = disabled\n    ? 'var(--color-grey-65)'\n    : readOnly\n      ? 'var(--sys-color-field-text-readOnly)'\n      : 'var(--sys-color-field-text-default)';\n\n  return (\n    <div\n      ref={rootRef}\n      data-name={name || undefined}\n      className={cn(\n        'h-fit flex-col',\n        // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로\n        // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.\n        hug ? 'flex w-fit max-w-full' : 'inline-flex w-full',\n        className,\n      )}\n      style={style}\n      onMouseEnter={onMouseEnter}\n      onMouseLeave={onMouseLeave}\n    >\n      <div className=\"flex w-full items-start\">\n        {label !== '' && (\n          <div\n            className=\"flex shrink-0 items-center font-bold text-(--sys-color-field-text-default)\"\n            style={{\n              height: cssLen(labelHeight) ?? s.height,\n              marginRight: s.fieldGap,\n              width: cssLen(labelWidth),\n              fontSize: s.fontSize,\n              lineHeight: `${s.lineHeight}px`,\n            }}\n          >\n            {icon && (\n              <SIcon\n                name={icon}\n                size={s.icon}\n                color={iconColor}\n                style={{ marginRight: s.labelGap }}\n              />\n            )}\n            <span className=\"min-w-0 overflow-hidden text-ellipsis whitespace-nowrap\">{label}</span>\n            {(labelTooltip !== '' || labelTooltipProps) && (\n              <span className=\"shrink-0 flex items-center\" style={{ marginLeft: s.labelGap }}>\n                <STooltip\n                  message={labelTooltip !== '' ? [labelTooltip] : undefined}\n                  iconSize={s.icon}\n                  {...labelTooltipProps}\n                />\n              </span>\n            )}\n          </div>\n        )}\n\n        <div\n          // 폭을 control 이 아니라 이 래퍼에 걸어야 hint/errorMessage 도 같은 폭에서 줄바꿈된다.\n          className={cn('flex min-w-0 flex-col', !hug && 'flex-1')}\n          style={{ width: cssLen(width), minWidth: cssLen(minWidth) }}\n        >\n          {/* 테두리 박스 = 컨트롤 */}\n          <div\n            className={cn(\n              'relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)',\n              interactive &&\n                !borderless &&\n                'hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]',\n              disabled && 'cursor-not-allowed',\n            )}\n            style={{\n              // @ts-expect-error CSS 변수\n              '--field-bc': borderColor,\n              // focused/hovered prop이 명시된 경우 강조를 즉시 반영\n              ...(interactive && !borderless && focused\n                ? { boxShadow: '0px 0px 4px 0px #0071ff66' }\n                : {}),\n              ...(multiline ? { minHeight: s.height } : { height: s.height }),\n              'borderRadius': s.radius,\n              'background': bgColor,\n              'color': textColor,\n            }}\n            data-focused={focused || undefined}\n            data-hovered={hovered || undefined}\n          >\n            {effectiveAddonLabel !== '' && (\n              <div\n                className=\"flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r border-solid px-(--cmp-field-addonLabel-paddingX) text-12 font-medium leading-sd-20\"\n                style={{\n                  // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨\n                  width: cssLen(labelWidth),\n                  justifyContent: ALIGN[addonAlign],\n                  background: 'var(--cmp-field-addonLabel-bg)',\n                  borderRightColor: disabled\n                    ? 'var(--cmp-field-addonLabel-border-disabled)'\n                    : 'var(--cmp-field-addonLabel-border-default)',\n                  borderTopLeftRadius: s.radius - 1,\n                  borderBottomLeftRadius: s.radius - 1,\n                }}\n              >\n                {icon && !label && <SIcon name={icon} size={s.icon} color={iconColor} />}\n                {effectiveAddonLabel}\n              </div>\n            )}\n            <div className=\"flex min-w-0 flex-1\">{children}</div>\n          </div>\n\n          {showError ? (\n            <div className=\"mt-(--cmp-field-contents-gap) px-(--cmp-field-message-paddingX) text-12 font-normal leading-sd-20 text-(--cmp-field-errorMessage-color)\">\n              {errorMessage}\n            </div>\n          ) : hint !== '' ? (\n            <div className=\"mt-(--cmp-field-contents-gap) px-(--cmp-field-message-paddingX) text-12 font-normal leading-sd-20 text-(--cmp-field-hint-color)\">\n              {hint}\n            </div>\n          ) : null}\n        </div>\n      </div>\n    </div>\n  );\n});\n","export interface SSelectOption {\n  value: string | number;\n  label: string;\n  disabled?: boolean;\n  children?: SSelectOption[];\n}\n\nexport type SSelectType = 'default' | 'multi' | 'default_depth' | 'multi_depth';\n\nexport interface FlatOption {\n  value: string; // 내부적으로 문자열로 정규화\n  label: string;\n  disabled: boolean;\n  depth: number;\n  /** children 을 가진 그룹(비선택) 노드 */\n  isGroup: boolean;\n  raw: string | number;\n}\n\n/** 트리 옵션을 depth 정보를 유지한 평탄 리스트로 변환. */\nexport function flattenOptions(options: SSelectOption[], depth = 1): FlatOption[] {\n  const out: FlatOption[] = [];\n  for (const o of options) {\n    const hasChildren = Array.isArray(o.children) && o.children.length > 0;\n    if (hasChildren) {\n      const childFlat = flattenOptions(o.children!, depth + 1);\n      // 그룹(depth2/3 포함): 자기 자신이 disabled 이거나, 하위 항목이 전부 disabled 이면\n      // 어미도 disabled 로 취급한다. (childFlat 은 하위 그룹의 계산 결과를 이미 포함하므로 재귀적으로 성립)\n      const allChildrenDisabled = childFlat.every(c => c.disabled);\n      out.push({\n        value: String(o.value),\n        label: o.label,\n        disabled: !!o.disabled || allChildrenDisabled,\n        depth,\n        isGroup: true,\n        raw: o.value,\n      });\n      out.push(...childFlat);\n    } else {\n      out.push({\n        value: String(o.value),\n        label: o.label,\n        disabled: !!o.disabled,\n        depth,\n        isGroup: false,\n        raw: o.value,\n      });\n    }\n  }\n  return out;\n}\n\n/** 선택 가능한(비그룹) 옵션만 */\nexport const selectableOptions = (flat: FlatOption[]) =>\n  flat.filter(o => !o.isGroup && !o.disabled);\n\n/**\n * flat 배열에서 groupIndex 위치 그룹의 하위(자손) 리프 중 '토글 가능한'(비활성 아님)\n * 것들의 정규화 value 목록. flat 은 DFS 순서라 그룹 뒤로 depth 가 더 깊은 연속 구간이\n * 그 그룹의 자손이며, 중첩 그룹의 리프까지 재귀 없이 모두 포함된다.\n * (multi_depth 부모 체크박스의 상태/카운트/토글 계산에 사용)\n */\nexport function collectGroupLeafValues(flat: FlatOption[], groupIndex: number): string[] {\n  const group = flat[groupIndex];\n  if (group == null || !group.isGroup) return [];\n  const values: string[] = [];\n  for (let i = groupIndex + 1; i < flat.length; i++) {\n    if (flat[i].depth <= group.depth) break;\n    if (!flat[i].isGroup && !flat[i].disabled) values.push(flat[i].value);\n  }\n  return values;\n}\n\n/** 라벨에 HTML 태그가 있는지 (원본 isHtmlLabel) */\nexport const isHtmlLabel = (label: string): boolean => /<[a-z][\\s\\S]*>/i.test(label);\n\n/** HTML 라벨에서 태그를 제거한 텍스트 (검색 매칭용, 원본 extractText) */\nexport const extractText = (html: string): string => html.replace(/<[^>]*>/g, '');\n","'use client';\n\nimport {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n  type KeyboardEvent,\n  type CSSProperties,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n  SCROLLBAR_CLASS,\n  SCROLLBAR_TRACK_BG_CLASS,\n  SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport { useInsideModal, usePortalContainer } from '../../lib/portal-container';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { sanitizeInlineHtml } from '../../lib/sanitize-inline-html';\nimport { SField, type SFieldAddonAlign } from '../SField';\nimport { SGhostButton } from '../SGhostButton';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SPortal } from '../SPortal';\nimport { type SColor } from '../../lib/color';\nimport { withDisplayName } from '../../lib/display-name';\nimport { type STooltipProps } from '../STooltip';\nimport {\n  collectGroupLeafValues,\n  extractText,\n  flattenOptions,\n  isHtmlLabel,\n  selectableOptions,\n  type SSelectOption,\n  type SSelectType,\n} from './select.config';\n\nexport type { SSelectOption, SSelectType } from './select.config';\n\n/** 검색바 노출 임계값 — useSearch=true 이고 옵션(리프)이 이 수 이상일 때만 검색바 표시 (원본 SEARCH_THRESHOLD) */\nconst SEARCH_THRESHOLD = 11;\n\nexport interface SSelectHandle {\n  /** 트리거 버튼에 포커스 (sdFocus) */\n  focus: () => void;\n  /** 드롭다운 열기 (sdOpen) */\n  open: () => void;\n}\n\nexport interface SSelectProps {\n  /** 선택 값. multi 타입이면 배열. emitValue=false(기본) 라운드트립을 위해 SSelectOption 객체도 허용 */\n  value?: (string | number | SSelectOption) | (string | number | SSelectOption)[] | null;\n  /** 값 변경 (sdUpdate). emitValue=false(기본)면 SSelectOption(들), true면 원시값 */\n  onValueChange?: (value: any) => void;\n  /** 열림/닫힘 변경 (sdDropDownShow) */\n  onOpenChange?: (open: boolean) => void;\n  /** true면 SSelectOption 대신 원시값(string|number) 방출 */\n  emitValue?: boolean;\n  /** 폼 연동용 name 속성 */\n  name?: string;\n  /** 옵션 목록 (children으로 계층 표현) */\n  options?: SSelectOption[];\n  /** 타입: default | multi | default_depth | multi_depth */\n  type?: SSelectType;\n  /** 검색 입력 사용 */\n  useSearch?: boolean;\n  /** 전체선택 옵션 사용 (multi 전용) */\n  useSelectAll?: boolean;\n  /** 전체선택 레이블 */\n  allSelectedLabel?: string;\n  /** placeholder */\n  placeholder?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 에러 상태 */\n  error?: boolean;\n  /** 유효성 규칙 — 닫힐 때 자동 검증 */\n  rules?: Rule[];\n  /** 레이블 툴팁 상세 옵션 */\n  labelTooltipProps?: Partial<STooltipProps>;\n  /** 드롭다운 최대 높이 */\n  dropdownHeight?: string;\n  /** 드롭다운 너비 (없으면 트리거 너비) */\n  dropdownWidth?: string;\n  /** 드롭다운 최대 너비 */\n  maxDropdownWidth?: string;\n  // ── SField 래퍼 props ──\n  label?: string;\n  labelWidth?: number | string;\n  /** 레이블 영역 아이콘 */\n  icon?: SIconName;\n  iconColor?: SColor;\n  /** 레이블 툴팁 텍스트 */\n  labelTooltip?: string;\n  /** 우측 어드온 레이블 */\n  addonLabel?: string;\n  /** 어드온 정렬 */\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  errorMessage?: string;\n  width?: number | string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SSelect — sd-select 포팅.\n * 단일/다중 선택, 검색(useSearch), 전체선택(useSelectAll), 계층(depth), SField 통합.\n */\nconst SSelectImpl = forwardRef<SSelectHandle, SSelectProps>(function SSelect(\n  {\n    value,\n    onValueChange,\n    onOpenChange,\n    emitValue = false,\n    name,\n    options = [],\n    type = 'default',\n    useSearch = false,\n    useSelectAll = false,\n    allSelectedLabel = '전체',\n    placeholder = '선택',\n    disabled = false,\n    error = false,\n    rules,\n    labelTooltipProps,\n    dropdownHeight = '260px',\n    dropdownWidth,\n    maxDropdownWidth = '640px',\n    label,\n    labelWidth,\n    icon,\n    iconColor,\n    labelTooltip,\n    addonLabel,\n    addonAlign,\n    hint,\n    errorMessage,\n    width,\n    className,\n    style,\n  }: SSelectProps,\n  ref,\n) {\n  const multi = type === 'multi' || type === 'multi_depth';\n  const portalContainer = usePortalContainer();\n  const insideModal = useInsideModal();\n  const [search, setSearch] = useState('');\n  const [ruleError, setRuleError] = useState('');\n  const [open, setOpen] = useState(false);\n  const [pendingOpen, setPendingOpen] = useState(false);\n  const [focusedIndex, setFocusedIndex] = useState(-1);\n  const triggerRef = useRef<HTMLButtonElement>(null);\n  const searchInputRef = useRef<HTMLInputElement>(null);\n  const searchBarRef = useRef<HTMLDivElement>(null);\n  /**\n   * 리스트는 ref 가 아니라 state 로 잡는다 — 포털 콘텐츠는 open 이 true 가 된 커밋이 아니라\n   * 몇 커밋 뒤에 마운트되므로, ref 로 두면 스크롤 effect 가 도는 시점에 아직 null 이고\n   * 이후 다시 실행될 계기가 없어 진입 스크롤이 통째로 유실된다.\n   * (identity 가 고정된 콜백 ref 여야 리렌더마다 detach/attach 되며 무한 루프가 나지 않는다)\n   */\n  const [listEl, setListEl] = useState<HTMLDivElement | null>(null);\n  const setListRef = useCallback((node: HTMLDivElement | null) => setListEl(node), []);\n  // 바깥 클릭으로 닫힌 경우를 표시 — onCloseAutoFocus 에서 포커스 회수 여부를 가른다.\n  const dismissedByPointerRef = useRef(false);\n  // 열린 직후 1회만 true — 선택 항목을 리스트 맨 위로 끌어올리는 스크롤을 트리거한다.\n  // (이후 키보드 탐색은 기존대로 최소 스크롤만 한다)\n  const alignSelectedTopRef = useRef(false);\n  // 리스트 순서상 첫 선택 항목의 탐색 인덱스. 렌더마다 갱신하되 effect 의존성에는 넣지 않는다\n  // — multi 에서 항목을 토글할 때마다 포커스가 되돌아가는 것을 막기 위함.\n  const selectedAnchorRef = useRef(-1);\n\n  const flat = useMemo(() => flattenOptions(options), [options]);\n  const selectable = useMemo(() => selectableOptions(flat), [flat]);\n  // 선택 가능한 리프가 하나라도 있는데 전부 비활성이면 select 자체를 비활성화한다.\n  // (옵션이 아예 없는 empty 상태와 구분하기 위해 리프 존재 여부를 함께 확인)\n  const hasLeaf = useMemo(() => flat.some(o => !o.isGroup), [flat]);\n  const allOptionsDisabled = hasLeaf && selectable.length === 0;\n  const effectiveDisabled = disabled || allOptionsDisabled;\n  // 원본: useSearch=true 이고 리프 옵션이 SEARCH_THRESHOLD(11) 이상일 때만 검색바 노출\n  const showSearch = useSearch && selectable.length >= SEARCH_THRESHOLD;\n  const labelByValue = useMemo(() => new Map(flat.map(o => [o.value, o.label])), [flat]);\n  const rawByValue = useMemo(() => new Map(flat.map(o => [o.value, o.raw])), [flat]);\n  const optionByValue = useMemo(\n    () => new Map(flat.map(o => [o.value, { value: o.raw, label: o.label } as SSelectOption])),\n    [flat],\n  );\n\n  // 내부는 문자열 배열로 정규화. value가 SSelectOption 객체면 .value를 꺼낸다.\n  // emitValue=false일 때 방출값이 객체여도 다시 넣었을 때 비교가 깨지지 않게 맞춘다.\n  const selected: string[] = useMemo(() => {\n    if (value == null) return [];\n    const arr = Array.isArray(value) ? value : [value];\n    return arr\n      .map(v => (v != null && typeof v === 'object' ? (v as SSelectOption).value : v))\n      .filter(v => v != null && v !== '')\n      .map(String);\n  }, [value]);\n\n  const selectedRef = useRef<string[]>(selected);\n  selectedRef.current = selected;\n\n  const emit = (next: string[]) => {\n    if (!onValueChange) return;\n    // emitValue=true → 원시값 / false → SSelectOption 객체 방출\n    const mapped = next.map(v =>\n      emitValue ? (rawByValue.get(v) ?? v) : (optionByValue.get(v) ?? { value: v, label: v }),\n    );\n    onValueChange(multi ? mapped : (mapped[0] ?? (emitValue ? '' : null)));\n  };\n\n  /**\n   * `valueForRules` — 선택 직후 같은 틱에 닫는 경로(단일 선택)에서 방금 고른 값을 넘긴다.\n   * `selectedRef.current` 는 렌더 중에만 갱신되므로, emit() 직후에는 아직 이전 값이라\n   * 그대로 검증하면 첫 선택에서 required 가 오탐하고 이후로도 한 박자씩 밀린다.\n   */\n  const commitOpen = (next: boolean, valueForRules?: string[]) => {\n    setOpen(next);\n    onOpenChange?.(next);\n\n    if (next) {\n      dismissedByPointerRef.current = false;\n      alignSelectedTopRef.current = true;\n    } else {\n      // 닫힐 때 transient UI 상태(검색/대기열림)를 함께 정리해 다음 오픈이 깨끗하게 시작되게 한다.\n      setPendingOpen(false);\n      setSearch('');\n      if (rules && rules.length > 0) {\n        const current = valueForRules ?? selectedRef.current;\n        setRuleError(runRules(multi ? current : (current[0] ?? ''), rules));\n      }\n    }\n  };\n\n  const requestOpen = (next: boolean) => {\n    if (next && insideModal && portalContainer == null) {\n      // 모달 내부 첫 프레임에는 portal target ref 가 아직 없을 수 있다.\n      // 이 순간 body로 열어버리면 포커스/dismiss 타이밍이 흔들릴 수 있어 준비 후 연다.\n      setPendingOpen(true);\n      return;\n    }\n    commitOpen(next);\n  };\n\n  useEffect(() => {\n    if (!insideModal || portalContainer == null || !pendingOpen) return;\n    setPendingOpen(false);\n    commitOpen(true);\n  }, [insideModal, pendingOpen, portalContainer]);\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      focus: () => triggerRef.current?.focus(),\n      open: () => requestOpen(true),\n    }),\n    [insideModal, portalContainer],\n  );\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(multi ? selected : (selected[0] ?? ''), rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const filtered = useMemo(() => {\n    if (!showSearch || search.trim() === '') return flat;\n    const q = search.trim().toLowerCase();\n    return flat.filter(\n      o =>\n        o.isGroup ||\n        (isHtmlLabel(o.label) ? extractText(o.label) : o.label).toLowerCase().includes(q),\n    );\n  }, [flat, search, showSearch]);\n\n  const allValues = selectable.map(o => o.value);\n  const allSelected = allValues.length > 0 && allValues.every(v => selected.includes(v));\n  // 표시할(그룹 아닌) 항목이 하나도 없으면 empty 상태 (options=[] 또는 검색 결과 없음)\n  const hasItems = filtered.some(o => !o.isGroup);\n  // 그룹(부모) 렌더 인덱스 → 하위(자손) 리프 value 목록. multi_depth 부모 체크박스 계산에 사용.\n  const groupLeafValues = useMemo(() => {\n    const map = new Map<number, string[]>();\n    filtered.forEach((o, i) => {\n      if (o.isGroup) map.set(i, collectGroupLeafValues(filtered, i));\n    });\n    return map;\n  }, [filtered]);\n  const navigableItems = useMemo(() => {\n    const items: Array<{\n      key: string;\n      isSelectAll?: boolean;\n      isGroup?: boolean;\n      value?: string;\n      leafValues?: string[];\n    }> = [];\n    if (multi && useSelectAll && allValues.length > 0) {\n      items.push({ key: '__select_all__', isSelectAll: true });\n    }\n    filtered.forEach((o, i) => {\n      if (o.disabled) return;\n      if (o.isGroup) {\n        // multi 계열만 그룹(부모)을 선택 대상에 포함 (하위 리프 전체 토글). default_depth 그룹은 비선택.\n        if (!multi) return;\n        const leafValues = groupLeafValues.get(i) ?? [];\n        if (leafValues.length === 0) return;\n        items.push({ key: `__group_${i}__`, isGroup: true, leafValues });\n      } else {\n        items.push({ key: o.value, value: o.value });\n      }\n    });\n    return items;\n  }, [allValues.length, filtered, groupLeafValues, multi, useSelectAll]);\n\n  /**\n   * 열 때 기준이 될 선택 항목 — navigableItems 가 화면 순서 그대로라 findIndex 결과가\n   * 곧 \"리스트 순서상 첫 선택 항목\"이다. multi 에서 나중에 고른 값이 앞줄에 있어도\n   * 선택 순서가 아닌 화면 순서를 따른다. 선택 항목이 비활성이라 탐색 대상에서 빠졌거나\n   * 검색으로 걸러진 경우엔 -1 → 기존대로 첫 항목에 포커스한다.\n   */\n  const selectedAnchorIndex = useMemo(() => {\n    if (selected.length === 0) return -1;\n    const selectedSet = new Set(selected);\n    return navigableItems.findIndex(item => item.value != null && selectedSet.has(item.value));\n  }, [navigableItems, selected]);\n  selectedAnchorRef.current = selectedAnchorIndex;\n\n  const triggerText = (() => {\n    if (selected.length === 0) return placeholder;\n    if (multi) {\n      // 원본: 전체 선택 시 allSelectedLabel, 아니면 선택 라벨을 \", \"로 join\n      if (allSelected) return allSelectedLabel;\n      return selected\n        .map(v => labelByValue.get(v) ?? v)\n        .filter(Boolean)\n        .join(', ');\n    }\n    return labelByValue.get(selected[0]) ?? selected[0];\n  })();\n\n  const isPlaceholder = selected.length === 0;\n\n  const handleSelect = (nextValue: string) => {\n    if (multi) {\n      const next = selected.includes(nextValue)\n        ? selected.filter(v => v !== nextValue)\n        : [...selected, nextValue];\n      emit(next);\n      return;\n    }\n\n    emit([nextValue]);\n    // 방금 고른 값으로 검증한다 — emit() 만으로는 selectedRef 가 아직 갱신되지 않는다.\n    commitOpen(false, [nextValue]);\n  };\n\n  const handleSelectAll = () => {\n    emit(allSelected ? [] : allValues);\n  };\n\n  // multi_depth: 그룹(부모) 클릭 → 하위 리프 전체 토글. 전부 선택돼 있으면 해제, 아니면 채운다.\n  const handleToggleGroup = (leafValues: string[]) => {\n    if (leafValues.length === 0) return;\n    const selectedSet = new Set(selected);\n    const allSelectedInGroup = leafValues.every(v => selectedSet.has(v));\n    if (allSelectedInGroup) {\n      const remove = new Set(leafValues);\n      emit(selected.filter(v => !remove.has(v)));\n    } else {\n      emit([...selected, ...leafValues.filter(v => !selectedSet.has(v))]);\n    }\n  };\n\n  // 열림/검색어 변경 시 포커스 위치 초기화.\n  // 열린 직후에는 선택 항목(multi 는 화면 순서상 첫 선택)에, 검색 후에는 첫 항목에 둔다.\n  useEffect(() => {\n    if (!open || navigableItems.length === 0) {\n      setFocusedIndex(-1);\n      return;\n    }\n    const anchor = alignSelectedTopRef.current ? selectedAnchorRef.current : -1;\n    setFocusedIndex(anchor >= 0 ? anchor : 0);\n  }, [open, search, navigableItems.length]);\n\n  // 페인트 전에 스크롤을 잡아야 리스트가 맨 위에서 한 번 그려졌다가 튀는 게 보이지 않는다.\n  useLayoutEffect(() => {\n    if (!open || focusedIndex < 0 || !listEl) return;\n    const focusedEl = listEl.querySelector('[data-select-focused=\"true\"]') as HTMLElement | null;\n    if (!focusedEl) return;\n\n    // scrollIntoView는 상위 스크롤 컨테이너까지 흔들 수 있어 리스트 내부 스크롤만 직접 조정한다.\n    const listRect = listEl.getBoundingClientRect();\n    const itemRect = focusedEl.getBoundingClientRect();\n\n    // 진입 직후 1회: 최소 스크롤이 아니라 선택 항목을 리스트 맨 위로 올린다.\n    // 검색바는 sticky 라 리스트 최상단을 덮으므로 그 높이만큼 내려 가려지지 않게 한다.\n    // (끝에 가까운 항목은 스크롤 한계에 걸려 맨 위까지 못 갈 수 있다 — 브라우저가 알아서 클램프)\n    if (alignSelectedTopRef.current) {\n      alignSelectedTopRef.current = false;\n      const stickyOffset = searchBarRef.current?.offsetHeight ?? 0;\n      listEl.scrollTop += itemRect.top - listRect.top - stickyOffset;\n      return;\n    }\n\n    if (itemRect.top < listRect.top) {\n      listEl.scrollTop += itemRect.top - listRect.top;\n    } else if (itemRect.bottom > listRect.bottom) {\n      listEl.scrollTop += itemRect.bottom - listRect.bottom;\n    }\n  }, [focusedIndex, open, listEl]);\n\n  const moveFocusedIndex = (direction: 'next' | 'prev') => {\n    if (!open || navigableItems.length === 0) return;\n    setFocusedIndex(current => {\n      if (direction === 'next') {\n        return current < 0 ? 0 : (current + 1) % navigableItems.length;\n      }\n      return current <= 0 ? navigableItems.length - 1 : current - 1;\n    });\n  };\n\n  const selectFocusedItem = () => {\n    if (focusedIndex < 0 || focusedIndex >= navigableItems.length) return;\n    const focused = navigableItems[focusedIndex];\n    // 전체 선택도 일반 옵션과 같은 키보드 탐색 순서에 포함해 Enter 동작을 통일한다.\n    if (focused.isSelectAll) {\n      handleSelectAll();\n      return;\n    }\n    // multi_depth 그룹(부모): Enter 로 하위 리프 전체 토글\n    if (focused.isGroup) {\n      handleToggleGroup(focused.leafValues ?? []);\n      return;\n    }\n    handleSelect(focused.value!);\n  };\n\n  const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n    if (!open) {\n      if ((event.key === 'ArrowDown' || event.key === 'ArrowUp') && !effectiveDisabled) {\n        event.preventDefault();\n        requestOpen(true);\n      }\n      return;\n    }\n\n    if (event.key === 'ArrowDown') {\n      event.preventDefault();\n      moveFocusedIndex('next');\n      return;\n    }\n\n    if (event.key === 'ArrowUp') {\n      event.preventDefault();\n      moveFocusedIndex('prev');\n      return;\n    }\n\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      selectFocusedItem();\n      return;\n    }\n\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      commitOpen(false);\n    }\n  };\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      hint={hint}\n      error={error || ruleError !== ''}\n      status={rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined}\n      errorMessage={ruleError !== '' ? ruleError : errorMessage}\n      disabled={effectiveDisabled}\n      width={width}\n      className={className}\n      style={style}\n    >\n      {name && <input type=\"hidden\" name={name} value={selected.join(',')} />}\n\n      <button\n        ref={triggerRef}\n        type=\"button\"\n        disabled={effectiveDisabled}\n        aria-haspopup=\"listbox\"\n        aria-expanded={open}\n        onClick={() => requestOpen(!open)}\n        onKeyDown={handleKeyDown}\n        className=\"flex h-full w-full cursor-pointer items-center justify-between gap-[8px] bg-transparent px-[12px] text-left text-[12px] leading-[20px] outline-none disabled:cursor-not-allowed\"\n        style={{\n          color: effectiveDisabled\n            ? 'var(--cmp-select-text-disabled)'\n            : isPlaceholder\n              ? 'var(--cmp-select-icon-default)'\n              : 'var(--cmp-select-text-default)',\n        }}\n      >\n        {/* HTML 라벨이면 살균 후 렌더 (원본 isHtmlLabel + sanitizeInlineHtml) */}\n        {isHtmlLabel(triggerText) ? (\n          <span\n            className=\"truncate\"\n            dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(triggerText) }}\n          />\n        ) : (\n          <span className=\"truncate\">{triggerText}</span>\n        )}\n        <SIcon\n          name=\"chevronDown\"\n          size={12}\n          color={\n            effectiveDisabled ? 'var(--cmp-select-icon-disabled)' : 'var(--cmp-select-icon-default)'\n          }\n          className={cn('shrink-0 transition-transform duration-200', open && 'rotate-180')}\n        />\n      </button>\n\n      <SPortal\n        open={open}\n        onClose={() => commitOpen(false)}\n        onOpenChange={next => {\n          if (next) requestOpen(true);\n        }}\n        anchorRef={triggerRef}\n        placement=\"bottom\"\n        align=\"start\"\n        offset={4}\n        fit={!dropdownWidth}\n        onOpenAutoFocus={event => {\n          if (!showSearch) {\n            event.preventDefault();\n            return;\n          }\n          // 검색형 셀렉트는 열리자마자 검색 입력으로 포커스를 넘겨 기존 사용감과 맞춘다.\n          event.preventDefault();\n          requestAnimationFrame(() => searchInputRef.current?.focus());\n        }}\n        onPointerDownOutside={() => {\n          dismissedByPointerRef.current = true;\n        }}\n        onCloseAutoFocus={event => {\n          event.preventDefault();\n          // Radix FocusScope 는 unmount 포커스 복귀를 setTimeout(0) 으로 미룬다.\n          // 다른 셀렉트 트리거를 눌러 닫힌 경우 그 사이 새 셀렉트가 이미 열려 있어서,\n          // 여기서 트리거로 포커스를 되돌리면 새로 열린 쪽이 focus-outside 로 보고 즉시 닫힌다.\n          if (dismissedByPointerRef.current) return;\n          triggerRef.current?.focus();\n        }}\n        className=\"rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]\"\n        style={{\n          ...(dropdownWidth ? { width: dropdownWidth } : {}),\n          maxWidth: maxDropdownWidth,\n        }}\n      >\n        <div\n          ref={setListRef}\n          className={cn(\n            'overflow-auto',\n            SCROLLBAR_CLASS,\n            SCROLLBAR_TRACK_BG_CLASS,\n            SCROLLBAR_TRACK_BORDER_CLASS,\n          )}\n          style={{ maxHeight: dropdownHeight }}\n          onMouseLeave={() => setFocusedIndex(-1)}\n        >\n          {showSearch && (\n            <div\n              ref={searchBarRef}\n              className=\"sticky top-0 z-[1] bg-[var(--cmp-listBox-bg)] px-[8px] py-[4px]\"\n            >\n              <div className=\"flex items-center gap-[6px] rounded-[4px] border border-solid border-[color:var(--color-grey-45)] bg-white px-[8px] py-[4px] focus-within:border-[color:var(--sys-color-field-border-focus)]\">\n                <SIcon name=\"search\" size={16} color=\"var(--color-grey-70)\" className=\"shrink-0\" />\n                <input\n                  ref={searchInputRef}\n                  value={search}\n                  onChange={e => setSearch(e.target.value)}\n                  onKeyDown={handleKeyDown}\n                  placeholder=\"검색\"\n                  className=\"min-w-0 flex-1 border-none bg-transparent text-[12px] leading-[20px] text-[color:var(--cmp-select-text-default)] outline-none placeholder:text-[color:var(--color-grey-55)]\"\n                />\n                {search !== '' && (\n                  <SGhostButton\n                    icon=\"close\"\n                    size=\"xxs\"\n                    intent=\"default\"\n                    ariaLabel=\"검색어 지우기\"\n                    onClick={() => setSearch('')}\n                    className=\"shrink-0\"\n                  />\n                )}\n              </div>\n            </div>\n          )}\n\n          {hasItems ? (\n            <ItemList\n              items={filtered}\n              multi={multi}\n              selected={selected}\n              groupLeafValues={groupLeafValues}\n              focusedValue={navigableItems[focusedIndex]?.key}\n              showSelectAll={multi && useSelectAll && allValues.length > 0}\n              selectAllLabel={allSelectedLabel}\n              selectAllSelected={allSelected}\n              onSelectAll={handleSelectAll}\n              onSelect={handleSelect}\n              onToggleGroup={handleToggleGroup}\n              onHoverValue={key => {\n                if (key == null) {\n                  setFocusedIndex(-1);\n                  return;\n                }\n                const index = navigableItems.findIndex(item => item.key === key);\n                if (index >= 0) setFocusedIndex(index);\n              }}\n            />\n          ) : (\n            <div className=\"px-[12px] py-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]\">\n              표시할 항목이 없습니다.\n            </div>\n          )}\n        </div>\n      </SPortal>\n    </SField>\n  );\n});\n\nexport const SSelect = withDisplayName(SSelectImpl, 'SSelect');\n\ninterface ItemListProps {\n  items: ReturnType<typeof flattenOptions>;\n  multi: boolean;\n  selected: string[];\n  /** 그룹 렌더 인덱스 → 하위(자손) 리프 value 목록 (multi_depth 부모 체크박스용) */\n  groupLeafValues: Map<number, string[]>;\n  focusedValue?: string;\n  showSelectAll: boolean;\n  selectAllSelected: boolean;\n  onSelectAll: () => void;\n  onSelect: (value: string) => void;\n  /** 그룹(부모) 클릭 — 하위 리프 전체 토글 */\n  onToggleGroup: (leafValues: string[]) => void;\n  /** null 이면 hover 해제 */\n  onHoverValue: (value: string | null) => void;\n}\n\nfunction ItemList({\n  items,\n  multi,\n  selected,\n  groupLeafValues,\n  focusedValue,\n  showSelectAll,\n  selectAllLabel,\n  selectAllSelected,\n  onSelectAll,\n  onSelect,\n  onToggleGroup,\n  onHoverValue,\n}: ItemListProps & { selectAllLabel: string }) {\n  const selectedSet = useMemo(() => new Set(selected), [selected]);\n  const itemBase = cn(\n    'group/select-item flex w-full cursor-pointer select-none items-center gap-[8px] border-none bg-transparent text-left text-[12px] leading-[20px] outline-none',\n    'text-[color:var(--cmp-listBoxItem-content-default)]',\n    'disabled:cursor-not-allowed disabled:text-[color:var(--cmp-listBoxItem-content-disabled)]',\n  );\n  // hover 는 focusedIndex 상태로도 그려지지만 즉각 피드백을 위해 CSS :hover 도 유지.\n  // 단 포커스 강조는 focus 가 아닌 focus-visible 로 — multi 에서 옵션 클릭 후 버튼이\n  // DOM 포커스를 계속 보유해 파란 배경이 남는(=hover 가 안 풀리는) 문제를 방지한다.\n  const activeClass =\n    'hover:bg-[var(--cmp-listBoxItem-bg-hover)] hover:text-[color:var(--cmp-listBoxItem-content-hover)] focus-visible:bg-[var(--cmp-listBoxItem-bg-hover)] focus-visible:text-[color:var(--cmp-listBoxItem-content-hover)]';\n\n  return (\n    <div role=\"listbox\" aria-multiselectable={multi || undefined}>\n      {showSelectAll && (\n        <button\n          type=\"button\"\n          data-select-focused={focusedValue === '__select_all__' ? 'true' : undefined}\n          data-select-active={focusedValue === '__select_all__' ? 'true' : undefined}\n          className={cn(\n            itemBase,\n            focusedValue === '__select_all__' &&\n              'bg-[var(--cmp-listBoxItem-bg-hover)] text-[color:var(--cmp-listBoxItem-content-hover)]',\n          )}\n          style={{ paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: 12 }}\n          onMouseEnter={() => onHoverValue('__select_all__')}\n          onMouseLeave={() => onHoverValue(null)}\n          onClick={onSelectAll}\n        >\n          <CheckboxBox state={selectAllSelected} focused={focusedValue === '__select_all__'} />\n          <span className=\"flex-1 truncate\">{selectAllLabel}</span>\n        </button>\n      )}\n      {items.map((o, idx) => {\n        const padLeft = o.depth === 1 ? 12 : o.depth === 2 ? 20 : 28;\n        // value 는 데이터 소스에 따라 드물게 중복될 수 있으므로(예: 분류 코드 중복),\n        // React key 는 렌더 순서 인덱스를 조합해 항상 유일하게 만든다.\n        const rowKey = `${o.value}-${idx}`;\n\n        if (o.isGroup) {\n          const isDepth1 = o.depth === 1;\n          // depth1: 상단 구분선 + 파란 배경 + bold, depth2: 회색 배경 + medium (공통)\n          const groupTone = isDepth1\n            ? 'border-t border-solid border-[color:var(--cmp-listBoxItem-depth1-border-color)] bg-[var(--cmp-listBoxItem-depth1-bg-default)] font-bold'\n            : 'bg-[var(--cmp-listBoxItem-depth2-middle-bg)] font-medium';\n\n          // multi 계열: 그룹(부모)도 체크박스 + 하위 리프 전체 토글 (원본 sd-select multi_depth 동작)\n          if (multi) {\n            const leafValues = groupLeafValues.get(idx) ?? [];\n            const total = leafValues.length;\n            const selectedCount = leafValues.reduce((n, v) => (selectedSet.has(v) ? n + 1 : n), 0);\n            // true=전체선택, null=부분선택(indeterminate), false=미선택\n            const groupState: boolean | null =\n              total === 0 || selectedCount === 0 ? false : selectedCount === total ? true : null;\n            const groupDisabled = o.disabled || total === 0;\n            const groupFocused = focusedValue === `__group_${idx}__`;\n\n            return (\n              <button\n                key={rowKey}\n                type=\"button\"\n                role=\"option\"\n                aria-selected={groupState === true}\n                disabled={groupDisabled}\n                data-select-focused={groupFocused ? 'true' : undefined}\n                data-select-active={groupFocused ? 'true' : undefined}\n                className={cn(\n                  'flex w-full select-none items-center gap-[8px] border-none py-[4px] pr-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-default)]',\n                  groupTone,\n                  groupDisabled\n                    ? 'cursor-not-allowed text-[color:var(--cmp-listBoxItem-content-disabled)]'\n                    : 'cursor-pointer',\n                  groupDisabled && isDepth1 && 'bg-[var(--cmp-listBoxItem-depth1-bg-disabled)]',\n                  // 포커스 하이라이트는 depth 배경보다 뒤에 둬 tailwind-merge 로 이기게 한다.\n                  groupFocused &&\n                    !groupDisabled &&\n                    'bg-[var(--cmp-listBoxItem-bg-hover)] text-[color:var(--cmp-listBoxItem-content-hover)]',\n                )}\n                style={{ paddingLeft: padLeft }}\n                onMouseEnter={() => onHoverValue(`__group_${idx}__`)}\n                onMouseLeave={() => onHoverValue(null)}\n                onClick={() => onToggleGroup(leafValues)}\n              >\n                <CheckboxBox state={groupState} disabled={groupDisabled} focused={groupFocused} />\n                {isHtmlLabel(o.label) ? (\n                  <span\n                    className=\"min-w-0 truncate\"\n                    dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(o.label) }}\n                  />\n                ) : (\n                  <span className=\"min-w-0 truncate\">{o.label}</span>\n                )}\n                {total > 0 && (\n                  <span\n                    className={cn(\n                      'shrink-0 font-medium',\n                      groupFocused\n                        ? 'text-white'\n                        : 'text-[color:var(--cmp-listBoxItem-content-disabled)]',\n                    )}\n                  >\n                    ({selectedCount}/{total})\n                  </span>\n                )}\n              </button>\n            );\n          }\n\n          // default_depth: 선택 없는 라벨 전용 그룹 헤더\n          return (\n            <div\n              key={rowKey}\n              className={cn(\n                'select-none py-[4px] pr-[12px] text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-default)]',\n                groupTone,\n                // 하위가 전부 비활성이면(select.config 에서 bubble-up) 어미 그룹도 비활성 처리:\n                // 텍스트는 회색(#888), depth1 그룹은 파란 배경 대신 회색(#EEE)으로 (depth2 는 #F6F6F6 유지)\n                o.disabled &&\n                  'cursor-not-allowed text-[color:var(--cmp-listBoxItem-content-disabled)]',\n                o.disabled && isDepth1 && 'bg-[var(--cmp-listBoxItem-depth1-bg-disabled)]',\n              )}\n              style={{ paddingLeft: padLeft }}\n            >\n              {o.label}\n            </div>\n          );\n        }\n\n        const isSelected = selected.includes(o.value);\n        return (\n          <button\n            key={rowKey}\n            type=\"button\"\n            disabled={o.disabled}\n            role=\"option\"\n            aria-selected={isSelected}\n            data-select-focused={focusedValue === o.value ? 'true' : undefined}\n            data-select-active={focusedValue === o.value ? 'true' : undefined}\n            className={cn(\n              itemBase,\n              isSelected &&\n                !multi &&\n                'font-bold text-[color:var(--cmp-listBoxItem-content-selected)]',\n              focusedValue === o.value &&\n                'bg-[var(--cmp-listBoxItem-bg-hover)] text-[color:var(--cmp-listBoxItem-content-hover)]',\n              // 비활성 항목은 hover/focus 스타일 대상에서 제외한다.\n              // (:hover 는 disabled 버튼에도 매칭되므로 클래스 자체를 붙이지 않아야 한다)\n              !o.disabled && activeClass,\n            )}\n            style={{ paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: padLeft }}\n            onMouseEnter={() => onHoverValue(o.value)}\n            onMouseLeave={() => onHoverValue(null)}\n            onClick={() => onSelect(o.value)}\n          >\n            {multi && (\n              <CheckboxBox\n                state={isSelected}\n                disabled={o.disabled}\n                focused={focusedValue === o.value}\n              />\n            )}\n            {isHtmlLabel(o.label) ? (\n              <span\n                className=\"flex-1 truncate\"\n                dangerouslySetInnerHTML={{ __html: sanitizeInlineHtml(o.label) }}\n              />\n            ) : (\n              <span className=\"flex-1 truncate\">{o.label}</span>\n            )}\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n\n/**\n * 리스트 항목용 체크박스 박스 (전체선택 / 리프 / multi_depth 그룹 공용).\n * state: true=체크, null=부분선택(indeterminate), false=미선택.\n */\nfunction CheckboxBox({\n  state,\n  disabled = false,\n  focused = false,\n}: {\n  state: boolean | null;\n  disabled?: boolean;\n  focused?: boolean;\n}) {\n  // 체크(true)·부분선택(null) 모두 '채워진' 표시(테두리/배경 강조 + 아이콘)\n  const filled = state === true || state === null;\n  return (\n    <span\n      className={cn(\n        'flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-[2px] border border-solid',\n        disabled\n          ? // 비활성: 회색 채움(#E1E1E1) + 회색 테두리(#CCCCCC)\n            'cursor-not-allowed border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]'\n          : filled\n            ? focused\n              ? 'border-[color:var(--cmp-checkbox-checked-border-inverse)] bg-[var(--cmp-checkbox-checked-bg-default)]'\n              : 'border-[color:var(--cmp-checkbox-checked-bg-default)] bg-[var(--cmp-checkbox-checked-bg-default)]'\n            : 'border-[color:var(--cmp-checkbox-unchecked-border-default)] bg-[var(--cmp-checkbox-unchecked-bg-default)]',\n      )}\n    >\n      {filled && (\n        <SIcon\n          name={state === null ? 'checkboxIndeterminate' : 'checkboxCheck'}\n          size={12}\n          color={\n            disabled\n              ? 'var(--cmp-checkbox-checked-icon-disabled)'\n              : 'var(--cmp-checkbox-checked-icon-default)'\n          }\n        />\n      )}\n    </span>\n  );\n}\n","'use client';\n\nimport {\n  Fragment,\n  forwardRef,\n  useCallback,\n  useEffect,\n  useId,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n  type CSSProperties,\n  type MouseEvent as ReactMouseEvent,\n  type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n  SCROLLBAR_CLASS,\n  SCROLLBAR_TRACK_BG_CLASS,\n  SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport { type SColor } from '../../lib/color';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SCheckbox } from '../SCheckbox';\nimport { SCircleProgress } from '../SCircleProgress';\nimport { SPagination } from '../SPagination';\nimport { SSelect, type SSelectOption } from '../SSelect';\n\nexport type SRow = Record<string, any>;\n\nconst DEFAULT_ROW_HEIGHT = 44;\nconst DENSE_ROW_HEIGHT = 32;\n/** 선택 체크박스 컬럼 너비 (sd-table TABLE_SELECTABLE_COLUMN_WIDTH) */\nconst SELECTABLE_COLUMN_WIDTH = 48;\nconst DEFAULT_ROWS_PER_PAGE_OPTION: SSelectOption[] = [\n  { label: '10개씩 보기', value: 10 },\n  { label: '25개씩 보기', value: 25 },\n  { label: '50개씩 보기', value: 50 },\n  { label: '100개씩 보기', value: 100 },\n];\n\n/** `STableColumn.renderCell`에 전달되는 컨텍스트 */\nexport interface STableCellContext {\n  row: SRow;\n  /** `field` + `format`이 적용된 표시 값 */\n  value: any;\n  column: STableColumn;\n  /** 보이는 컬럼 기준 인덱스 */\n  colIndex: number;\n  /** 현재 렌더 중인 행 목록 기준 인덱스 (페이지/가상 스크롤 윈도우 기준) */\n  rowIndex: number;\n  /** 행 선택 여부 */\n  isSelected: boolean;\n  /** STable이 이 셀에 적용하려던 클래스 (구분선·말줄임·sticky 그림자 포함) */\n  className: string;\n  /** STable이 이 셀에 적용하려던 스타일 (패딩·정렬·폭·sticky offset 포함) */\n  style: CSSProperties;\n}\n\nexport interface STableColumn {\n  name: string;\n  label: string;\n  /** 값 접근: 필드명 또는 접근 함수 */\n  field: string | ((row: SRow) => any);\n  align?: 'left' | 'center' | 'right';\n  width?: string;\n  /** 고정폭 없이 자동 너비 (sticky/resize 계산에서 제외) */\n  autoWidth?: boolean;\n  /** 리사이즈 최소/최대 너비 (px) */\n  minWidth?: number;\n  maxWidth?: number;\n  /** 표시 포맷 */\n  format?: (value: any, row: SRow) => string;\n  visible?: boolean;\n  icon?: SIconName;\n  /** 헤더 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */\n  iconColor?: SColor;\n  /** 셀 커스텀 렌더 (React 확장) — `<td>` 안쪽 내용만 교체한다 */\n  render?: (row: SRow, value: any) => ReactNode;\n  /**\n   * 셀(`<td>`) 자체를 커스텀 렌더 (React 확장). 반환한 엘리먼트가 그대로 `<td>`가 되므로\n   * `colSpan` / `rowSpan`을 직접 지정할 수 있다. `render`보다 우선한다.\n   *\n   * - `ctx.className` / `ctx.style`을 그대로 펼쳐야 구분선·정렬·sticky 등 기본 스타일이 유지된다.\n   * - `null`(또는 `false`)을 반환하면 그 자리에는 `<td>`를 만들지 않는다.\n   *   다른 셀의 `colSpan` / `rowSpan`에 덮이는 자리를 이렇게 비운다.\n   * - 병합은 sticky 컬럼(인덱스 기준 offset 계산)과 함께 쓰지 않는 것을 전제로 한다.\n   *   `rowSpan`은 행을 잘라 쓰는 가상 스크롤 / 내부 페이지네이션과 경계에서 어긋날 수 있다.\n   */\n  renderCell?: (ctx: STableCellContext) => ReactNode;\n  /** 헤더 셀 커스텀 렌더 (React 확장) */\n  renderHeader?: (column: STableColumn, index: number) => ReactNode;\n  /** 본문 셀 커스텀 클래스. 함수를 주면 행마다 다른 클래스를 반환할 수 있다 */\n  tdClass?: string | ((row: SRow) => string | undefined);\n  /** 헤더 셀 커스텀 클래스/스타일 (sd-table thClass/thStyle) */\n  thClass?: string;\n  thStyle?: CSSProperties;\n}\n\nexport interface STablePagination {\n  page: number;\n  rowsPerPage: number;\n  lastPage?: number;\n}\n\nexport interface STableStickyColumn {\n  left?: number;\n  right?: number;\n}\n\n/** STable ref 명령형 API (sd-table @Method 대응) */\nexport interface STableHandle {\n  /** 행 선택 여부 */\n  isRowSelected: (row: SRow) => boolean;\n  /** 주어진 행들의 전체 선택 상태 (true/false/null=indeterminate) */\n  getIsAllChecked: (rows: SRow[]) => boolean | null;\n  /** 내부 페이지네이션 정보 (useInternalPagination 아니면 null) */\n  getPaginationInfo: () => {\n    startIndex: number;\n    endIndex: number;\n    currentPage: number;\n    rowsPerPage: number;\n  } | null;\n  /** 컬럼 sticky 스타일 (CSS 변수 + 고정폭) */\n  getStickyStyle: (colIdx: number) => CSSProperties;\n  /** 가상 스크롤 총 행 수 설정 */\n  setRowCount: (count: number) => void;\n  /** 단일 행 선택 토글 (sd-table updateRowSelect) — onSelectedChange 발생 */\n  updateRowSelect: (row: SRow) => void;\n  /** 주어진 행들 전체 선택/해제 (sd-table toggleSelectAll) — onSelectedChange 발생 */\n  toggleSelectAll: (checked: boolean, rows: SRow[]) => void;\n}\n\nexport interface STableProps {\n  columns?: STableColumn[];\n  rows?: SRow[];\n  /** 행 식별 필드 */\n  rowKey?: string;\n  /** 행 선택 체크박스 */\n  selectable?: boolean;\n  selected?: SRow[];\n  onSelectedChange?: (rows: SRow[]) => void;\n  /** 컬럼 너비 조절 */\n  resizable?: boolean;\n  width?: string;\n  height?: string;\n  /** @deprecated 헤더는 항상 세로 스크롤에서 제외되어 고정됩니다 (body만 세로 스크롤) */\n  stickyHeader?: boolean;\n  /** 고정할 좌/우 컬럼 수 */\n  stickyColumn?: STableStickyColumn;\n  /** border-radius 제어 */\n  radius?: 'default' | 'useTop' | 'full';\n  noDataLabel?: string;\n  /**\n   * 데이터가 없을 때 body 영역 전체를 대체하는 슬롯.\n   * 지정하면 `noDataLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다.\n   */\n  noDataSlot?: ReactNode;\n  isLoading?: boolean;\n  dense?: boolean;\n  /** true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 */\n  noHover?: boolean;\n  /** 페이지네이션 (있으면 하단 표시) */\n  pagination?: STablePagination;\n  onPageChange?: (page: number) => void;\n  /** 테이블 내부에서 페이지네이션을 직접 관리 (rows를 내부 슬라이싱) */\n  useInternalPagination?: boolean;\n  /** 페이지당 행 수 셀렉트 표시 */\n  useRowsPerPageSelect?: boolean;\n  rowsPerPageOption?: SSelectOption[];\n  onRowsPerPageChange?: (perPage: number) => void;\n  /** 가상 스크롤 */\n  useVirtualScroll?: boolean;\n  rowHeight?: number;\n  virtualBuffer?: number;\n  virtualEndThreshold?: number;\n  onVirtualUpdate?: (range: { from: number; to: number }) => void;\n  onVirtualReachEnd?: (info: {\n    from: number;\n    to: number;\n    rowCount: number;\n    threshold: number;\n  }) => void;\n  /** 테이블 식별자 (없으면 자동 생성) */\n  tableId?: string;\n  /** 행 클릭 */\n  onRowClick?: (row: SRow) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst cellValue = (col: STableColumn, row: SRow) => {\n  const raw = typeof col.field === 'function' ? col.field(row) : row[col.field];\n  return col.format ? col.format(raw, row) : raw;\n};\n\nconst colWidthFromDef = (c: STableColumn) => (c.autoWidth ? 0 : parseInt(c.width || '120', 10));\n\n/**\n * STable — sd-table 포팅. 컬럼/행 + 선택 + sticky 헤더/컬럼 + 리사이즈 +\n * 내부 페이지네이션 + rows-per-page + 가상 스크롤 + 로딩 + dense.\n */\nexport const STable = forwardRef<STableHandle, STableProps>(function STable(\n  {\n    columns = [],\n    rows = [],\n    rowKey = 'id',\n    selectable = false,\n    selected = [],\n    onSelectedChange,\n    resizable = false,\n    width,\n    height,\n    stickyColumn,\n    radius = 'default',\n    noDataLabel = '데이터가 없습니다.',\n    noDataSlot,\n    isLoading = false,\n    dense = false,\n    noHover = false,\n    pagination,\n    onPageChange,\n    useInternalPagination = false,\n    useRowsPerPageSelect = false,\n    rowsPerPageOption = DEFAULT_ROWS_PER_PAGE_OPTION,\n    onRowsPerPageChange,\n    useVirtualScroll = false,\n    rowHeight,\n    virtualBuffer = 5,\n    virtualEndThreshold = 10,\n    onVirtualUpdate,\n    onVirtualReachEnd,\n    tableId,\n    onRowClick,\n    className,\n    style,\n  }: STableProps,\n  ref,\n) {\n  const autoId = useId();\n  const resolvedTableId = tableId ?? autoId;\n\n  const visibleCols = useMemo(() => columns.filter(c => c.visible !== false), [columns]);\n  const stickyLeft = stickyColumn?.left ?? 0;\n  const stickyRight = stickyColumn?.right ?? 0;\n  const effectiveRowHeight = rowHeight ?? (dense ? DENSE_ROW_HEIGHT : DEFAULT_ROW_HEIGHT);\n\n  // ── 컬럼 너비 (리사이즈로 변경 가능) ──\n  const colSignature = useMemo(\n    () => visibleCols.map(c => `${c.name}:${c.width ?? ''}:${c.autoWidth ? 1 : 0}`).join('|'),\n    [visibleCols],\n  );\n  const [columnWidths, setColumnWidths] = useState<number[]>(() =>\n    visibleCols.map(colWidthFromDef),\n  );\n  // resize 시작폭을 동기적으로 읽기 위한 ref (setState 업데이터 읽기는 비동기라 신뢰 불가)\n  const columnWidthsRef = useRef(columnWidths);\n  columnWidthsRef.current = columnWidths;\n  useEffect(() => {\n    setColumnWidths(visibleCols.map(colWidthFromDef));\n    // colSignature가 실제 재시드 트리거 (visibleCols 참조 변화 무시)\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [colSignature]);\n\n  // ── 선택 상태 (controlled) ──\n  const selectedKeys = useMemo(() => new Set(selected.map(r => r[rowKey])), [selected, rowKey]);\n  const isRowSelected = useCallback(\n    (row: SRow) => selectedKeys.has(row[rowKey]),\n    [selectedKeys, rowKey],\n  );\n  const getIsAllChecked = useCallback(\n    (rws: SRow[]): boolean | null => {\n      const total = rws.length;\n      if (total === 0) return false;\n      const cnt = rws.filter(r => selectedKeys.has(r[rowKey])).length;\n      if (cnt === 0) return false;\n      if (cnt === total) return true;\n      return null;\n    },\n    [selectedKeys, rowKey],\n  );\n\n  // ── 페이지네이션 상태 ──\n  const [currentPage, setCurrentPage] = useState(pagination?.page ?? 1);\n  const [innerRowsPerPage, setInnerRowsPerPage] = useState(pagination?.rowsPerPage ?? 10);\n  useEffect(() => {\n    if (pagination?.page != null) setCurrentPage(pagination.page);\n    if (pagination?.rowsPerPage != null) setInnerRowsPerPage(pagination.rowsPerPage);\n  }, [pagination?.page, pagination?.rowsPerPage]);\n\n  // ── 가상 스크롤 상태 ──\n  const [rowCountOverride, setRowCountOverride] = useState<number | null>(null);\n  const rowCount = rowCountOverride ?? rows.length;\n  const scrollRef = useRef<HTMLDivElement>(null);\n  // 헤더는 세로 스크롤 컨테이너 밖에 두고, 가로 스크롤만 body와 동기화한다\n  const headerScrollRef = useRef<HTMLDivElement>(null);\n  // body 세로 스크롤바 폭. 헤더 우측에 같은 폭의 거터를 둬 두 스크롤포트 너비를 맞춘다\n  const [headerGutter, setHeaderGutter] = useState(0);\n  const [vsRange, setVsRange] = useState<{ start: number; end: number }>({ start: 0, end: 0 });\n  const lastReachEndRef = useRef<number>(-1);\n  const cbRef = useRef({ onVirtualUpdate, onVirtualReachEnd });\n  cbRef.current = { onVirtualUpdate, onVirtualReachEnd };\n\n  const [scrolledLeft, setScrolledLeft] = useState(false);\n  const [scrolledRight, setScrolledRight] = useState(false);\n\n  const setRowCount = useCallback((count: number) => {\n    const safe = Math.max(0, Math.floor(Number.isFinite(count) ? count : 0));\n    lastReachEndRef.current = -1;\n    setRowCountOverride(safe);\n  }, []);\n\n  const calcRange = useCallback(\n    (scrollTop: number, containerHeight: number) => {\n      const h = Math.max(1, effectiveRowHeight);\n      const buf = Math.max(0, Math.floor(virtualBuffer));\n      const first = Math.floor(Math.max(0, scrollTop) / h);\n      const vis = Math.ceil(Math.max(0, containerHeight) / h);\n      return { start: Math.max(0, first - buf), end: Math.min(rowCount, first + vis + buf) };\n    },\n    [effectiveRowHeight, virtualBuffer, rowCount],\n  );\n\n  const handleScroll = useCallback(() => {\n    const el = scrollRef.current;\n    // body가 슬롯으로 대체돼 스크롤포트가 없으면 헤더 거터도 없앤다\n    if (!el) {\n      setHeaderGutter(0);\n      return;\n    }\n    const header = headerScrollRef.current;\n    if (header) header.scrollLeft = el.scrollLeft;\n    setHeaderGutter(el.offsetWidth - el.clientWidth);\n    setScrolledLeft(el.scrollLeft > 0);\n    setScrolledRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n    if (useVirtualScroll) {\n      const { start, end } = calcRange(el.scrollTop, el.clientHeight);\n      setVsRange(prev => (prev.start === start && prev.end === end ? prev : { start, end }));\n    }\n  }, [useVirtualScroll, calcRange]);\n\n  // 초기/의존성 변경 시 범위·스크롤 그림자·헤더 거터 재계산\n  // (isLoading/height는 body 스크롤바 유무를 바꿔 headerGutter에 영향)\n  useEffect(() => {\n    handleScroll();\n  }, [handleScroll, rowCount, columnWidths, isLoading, height]);\n\n  // 가상 스크롤 이벤트 발생\n  useEffect(() => {\n    if (!useVirtualScroll) return;\n    cbRef.current.onVirtualUpdate?.({ from: vsRange.start, to: vsRange.end });\n    const threshold = Math.max(1, virtualEndThreshold);\n    if (vsRange.end >= Math.max(0, rowCount - threshold) && lastReachEndRef.current !== rowCount) {\n      lastReachEndRef.current = rowCount;\n      cbRef.current.onVirtualReachEnd?.({\n        from: vsRange.start,\n        to: vsRange.end,\n        rowCount,\n        threshold,\n      });\n    }\n  }, [vsRange, useVirtualScroll, rowCount, virtualEndThreshold]);\n\n  // ── sticky 스타일 계산 (sd-table getStickyStyleSync 포팅) ──\n  const getStickyStyle = useCallback(\n    (colIdx: number): CSSProperties => {\n      const leftOffset = columnWidths\n        .slice(0, colIdx)\n        .reduce((a, b) => a + b, selectable ? SELECTABLE_COLUMN_WIDTH : 0);\n      const rightOffset = columnWidths\n        .filter((_, i) => i >= visibleCols.length - stickyRight && i > colIdx)\n        .reduce((a, b) => a + b, 0);\n      const col = visibleCols[colIdx];\n      const s: CSSProperties = {};\n      (s as Record<string, string | number>)['--sticky-left-offset'] = `${leftOffset}px`;\n      (s as Record<string, string | number>)['--sticky-right-offset'] = `${rightOffset}px`;\n      if (!col?.autoWidth) {\n        const w = columnWidths[colIdx];\n        s.width = w;\n        s.minWidth = w;\n        s.maxWidth = w;\n      }\n      return s;\n    },\n    [columnWidths, selectable, visibleCols, stickyRight],\n  );\n\n  useImperativeHandle(\n    ref,\n    (): STableHandle => ({\n      isRowSelected,\n      getIsAllChecked,\n      getPaginationInfo: () => {\n        if (!useInternalPagination || !pagination) return null;\n        const startIndex = (currentPage - 1) * innerRowsPerPage;\n        return {\n          startIndex,\n          endIndex: startIndex + innerRowsPerPage,\n          currentPage,\n          rowsPerPage: innerRowsPerPage,\n        };\n      },\n      getStickyStyle,\n      setRowCount,\n      updateRowSelect: row => {\n        if (selectedKeys.has(row[rowKey]))\n          onSelectedChange?.(selected.filter(r => r[rowKey] !== row[rowKey]));\n        else onSelectedChange?.([...selected, row]);\n      },\n      toggleSelectAll: (checked, rws) => {\n        if (checked) {\n          const add = rws.filter(r => !selectedKeys.has(r[rowKey]));\n          onSelectedChange?.([...selected, ...add]);\n        } else {\n          const keys = new Set(rws.map(r => r[rowKey]));\n          onSelectedChange?.(selected.filter(r => !keys.has(r[rowKey])));\n        }\n      },\n    }),\n    [\n      isRowSelected,\n      getIsAllChecked,\n      getStickyStyle,\n      setRowCount,\n      useInternalPagination,\n      pagination,\n      currentPage,\n      innerRowsPerPage,\n      selected,\n      selectedKeys,\n      onSelectedChange,\n      rowKey,\n    ],\n  );\n\n  // ── 컬럼 리사이즈 (sd-table handleResize 포팅) ──\n  const startResize = useCallback(\n    (index: number, event: ReactMouseEvent) => {\n      if (typeof document === 'undefined') return;\n      event.preventDefault();\n      event.stopPropagation();\n      const startX = event.clientX;\n      const startWidth = columnWidthsRef.current[index] ?? 0;\n      const col = visibleCols[index];\n      const minWidth = col?.minWidth || 50;\n      const maxWidth = col?.maxWidth || 9999;\n\n      const onMove = (moveEvent: MouseEvent) => {\n        const delta = moveEvent.clientX - startX;\n        const newWidth = Math.min(Math.max(startWidth + delta, minWidth), maxWidth);\n        setColumnWidths(prev => prev.map((w, i) => (i === index ? newWidth : w)));\n      };\n      const onUp = () => {\n        document.removeEventListener('mousemove', onMove);\n        document.removeEventListener('mouseup', onUp);\n      };\n      document.addEventListener('mousemove', onMove);\n      document.addEventListener('mouseup', onUp);\n    },\n    [visibleCols],\n  );\n\n  // ── 행 윈도잉 (가상 스크롤 / 내부 페이지네이션) ──\n  const pageInfo =\n    useInternalPagination && pagination\n      ? {\n          startIndex: (currentPage - 1) * innerRowsPerPage,\n          endIndex: (currentPage - 1) * innerRowsPerPage + innerRowsPerPage,\n        }\n      : null;\n\n  let bodyRows = rows;\n  let topSpacer = 0;\n  let bottomSpacer = 0;\n  if (useVirtualScroll) {\n    bodyRows = rows.slice(vsRange.start, vsRange.end);\n    topSpacer = vsRange.start * effectiveRowHeight;\n    bottomSpacer = Math.max(0, (rowCount - vsRange.end) * effectiveRowHeight);\n  } else if (pageInfo) {\n    bodyRows = rows.slice(pageInfo.startIndex, pageInfo.endIndex);\n  }\n\n  // 데이터 없음 상태 (로딩 중이면 로딩이 우선)\n  const isNoData = rowCount === 0 && !isLoading;\n  // 슬롯이 주어지면 기본 라벨 오버레이 대신 body 영역 자체를 슬롯으로 대체한다.\n  const showNoDataSlot = isNoData && noDataSlot != null;\n\n  // ── 페이지네이션 표시 (가상 스크롤과 상호 배타) ──\n  const showPagination = !useVirtualScroll && (pagination != null || useInternalPagination);\n  const lastPage = useInternalPagination\n    ? Math.max(1, Math.ceil(rowCount / (innerRowsPerPage || 1)))\n    : (pagination?.lastPage ?? Math.max(1, Math.ceil(rowCount / (pagination?.rowsPerPage ?? 10))));\n  const displayPage = useInternalPagination ? currentPage : (pagination?.page ?? 1);\n\n  const changePage = (p: number) => {\n    if (useInternalPagination) setCurrentPage(p);\n    onPageChange?.(p);\n  };\n  const changeRowsPerPage = (perPage: number) => {\n    if (useInternalPagination) {\n      setInnerRowsPerPage(perPage);\n      const newLast = Math.max(1, Math.ceil(rowCount / (perPage || 1)));\n      setCurrentPage(cp => (cp > newLast ? newLast : cp));\n    }\n    onRowsPerPageChange?.(perPage);\n  };\n\n  // ── 선택 토글 (현재 표시 행 기준) ──\n  const headerCheck = getIsAllChecked(bodyRows);\n  const toggleAll = () => {\n    if (headerCheck === true) {\n      const pageKeys = new Set(bodyRows.map(r => r[rowKey]));\n      onSelectedChange?.(selected.filter(r => !pageKeys.has(r[rowKey])));\n    } else {\n      const add = bodyRows.filter(r => !selectedKeys.has(r[rowKey]));\n      onSelectedChange?.([...selected, ...add]);\n    }\n  };\n  const toggleRow = (row: SRow) => {\n    if (selectedKeys.has(row[rowKey]))\n      onSelectedChange?.(selected.filter(r => r[rowKey] !== row[rowKey]));\n    else onSelectedChange?.([...selected, row]);\n  };\n\n  const radiusClass =\n    radius === 'full'\n      ? 'rounded-none'\n      : radius === 'useTop'\n        ? 'rounded-b-[var(--cmp-table-radius)] rounded-t-none'\n        : 'rounded-[var(--cmp-table-radius)]';\n  const cellPadY = dense\n    ? 'var(--cmp-table-body-paddingY-dense)'\n    : 'var(--cmp-table-body-paddingY-default)';\n  // dense 여부와 무관하게 좌우 패딩은 항상 16px 유지\n  const cellPadX = 'var(--cmp-table-body-paddingX-wide)';\n  const rowH = dense\n    ? 'var(--cmp-table-body-dense-height)'\n    : 'var(--cmp-table-body-default-height)';\n  const totalColSpan = visibleCols.length + (selectable ? 1 : 0);\n\n  // 특정 시각 컬럼 인덱스의 sticky 배치 정보\n  const stickyInfo = (i: number) => {\n    const isLeft = i < stickyLeft;\n    const isRight = i >= visibleCols.length - stickyRight;\n    return { isLeft, isRight, isSticky: isLeft || isRight };\n  };\n  // 모든 컬럼에 columnWidths 기반 고정폭을 적용(리사이즈 반영)하고, sticky 컬럼은 위치까지 부여.\n  // 기존에는 sticky 컬럼에만 폭을 줬기 때문에 resize state가 화면에 반영되지 않았다.\n  const cellStyle = (i: number): CSSProperties => {\n    const { isLeft, isRight, isSticky } = stickyInfo(i);\n    const base = getStickyStyle(i); // 비 autoWidth면 width/min/max + --sticky-*-offset 포함\n    if (!isSticky) return base;\n    return {\n      ...base,\n      position: 'sticky',\n      left: isLeft ? 'var(--sticky-left-offset)' : undefined,\n      right: isRight ? 'var(--sticky-right-offset)' : undefined,\n      zIndex: 6,\n    };\n  };\n  // 원본 sd-table의 sticky-left/right-edge :after처럼 그림자를 셀 \"바깥\"(스크롤 영역) 쪽으로 드리운다.\n  // spread 0 → 셀 높이만큼 꽉 찬 코어라 행마다 얼룩 없이 세로로 균일. 색/농도는 원본과 동일하게\n  // grey_95(#222)·연한 강도(peak≈20)로 맞춤. 좌측 고정 컬럼 → 오른쪽, 우측 고정 컬럼 → 왼쪽으로 그림자.\n  const stickyShadowClass = (i: number) => {\n    const { isLeft, isRight } = stickyInfo(i);\n    const isLeftEdge = isLeft && i === stickyLeft - 1;\n    const isRightEdge = isRight && i === visibleCols.length - stickyRight;\n    return cn(\n      isLeftEdge && scrolledLeft && 'shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]',\n      isRightEdge && scrolledRight && 'shadow-[-5px_0_8px_0_rgba(34,34,34,0.1)]',\n    );\n  };\n\n  // 헤더 하단 구분선은 body 상단 border로 그린다. body 래퍼는 스크롤바를 포함한\n  // 전체 폭을 차지하므로(스크롤바는 border 안쪽) 헤더 거터의 border-right와 미터가\n  // 생기지 않아 색·길이가 균일한 한 줄이 된다.\n  const bodyScrollClass = cn(\n    'min-h-0 flex-1 overflow-auto border-t border-solid border-[color:var(--cmp-table-border-color)]',\n    SCROLLBAR_CLASS,\n    SCROLLBAR_TRACK_BG_CLASS,\n    SCROLLBAR_TRACK_BORDER_CLASS,\n  );\n\n  // 헤더/바디 테이블이 분리돼 있어 colgroup으로 두 테이블의 컬럼 폭을 동일하게 고정한다.\n  // table-fixed는 첫 행 셀로 폭을 정하는데, 바디 첫 행이 가상 스크롤 스페이서(colSpan)일 수 있어 필수.\n  const colgroup = (\n    <colgroup>\n      {selectable && <col style={{ width: SELECTABLE_COLUMN_WIDTH }} />}\n      {visibleCols.map((col, i) => (\n        <col key={col.name} style={col.autoWidth ? undefined : { width: columnWidths[i] }} />\n      ))}\n    </colgroup>\n  );\n\n  return (\n    <div\n      className={cn('flex flex-col', className)}\n      style={{ width, ...style }}\n      data-table-id={resolvedTableId}\n    >\n      <div\n        className={cn(\n          // isolate: no-data/loading 오버레이(z-30·31)를 테이블 안에서 끝낸다. relative + z-auto\n          // 만으로는 스태킹 컨텍스트가 생기지 않아, 모달 안에 들어가면 30·31이 모달 Content\n          // 레벨까지 올라가 같은 컨텍스트의 floating portal 밴드(z-2)를 덮는다.\n          // 자손은 이미 overflow-hidden으로 클리핑되므로 테이블 내부 순서는 달라지지 않는다.\n          'bg-white relative isolate flex flex-col overflow-hidden border border-solid border-[color:var(--cmp-table-border-color)]',\n          // height가 없으면 루트가 받은 높이를 끝까지 채운다. 호스트가 className으로\n          // `flex-1 min-h-0` 등을 줘 루트 높이가 확정된 경우, 행이 적어도 테두리 박스가\n          // 남은 영역을 그대로 차지한다. basis는 auto로 둬 높이가 확정되지 않은\n          // 기본 사용(내용만큼 커지는 케이스)에서는 동작이 바뀌지 않는다.\n          !height && 'min-h-0 grow',\n          radiusClass,\n          // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 인터랙션 차단\n          (isLoading || rowCount === 0) && 'pointer-events-none',\n        )}\n        // 원본: no-data 시 헤더(36px) + 본문 최소(60px) 높이 확보\n        style={{\n          height,\n          minHeight: isNoData ? 'calc(var(--cmp-table-header-height) + 60px)' : undefined,\n        }}\n      >\n        {/* 헤더: 세로 스크롤 밖에 고정, 가로 스크롤은 body와 scrollLeft 동기화.\n            border-right 거터로 body 세로 스크롤바 폭만큼 스크롤포트를 맞춰\n            sticky right 컬럼·최대 스크롤 위치가 body와 어긋나지 않게 한다. */}\n        <div\n          ref={headerScrollRef}\n          className=\"flex-none overflow-hidden\"\n          style={{\n            borderRight: headerGutter\n              ? `${headerGutter}px solid var(--cmp-table-header-bg)`\n              : undefined,\n          }}\n        >\n          <table\n            className=\"w-full table-fixed border-separate border-spacing-0 text-left\"\n            style={{ fontSize: 12 }}\n          >\n            {colgroup}\n            {/* 원본 .sd-table--no-data sd-thead: 데이터 없음 시 헤더 흐리게 */}\n            <thead className={cn(isNoData && 'opacity-40')}>\n              <tr className=\"h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]\">\n                {selectable && (\n                  <th\n                    className={cn(\n                      // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬\n                      // 하단 border는 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.\n                      'sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle',\n                      stickyLeft === 0 && scrolledLeft && 'shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]',\n                    )}\n                    style={{\n                      width: SELECTABLE_COLUMN_WIDTH,\n                      minWidth: SELECTABLE_COLUMN_WIDTH,\n                      maxWidth: SELECTABLE_COLUMN_WIDTH,\n                    }}\n                  >\n                    <div className=\"flex items-center justify-center\">\n                      <SCheckbox value={headerCheck} onValueChange={toggleAll} />\n                    </div>\n                    {/* 원본 th__bar: 체크박스 컬럼 우측 경계 1px 구분선 */}\n                    <span\n                      aria-hidden\n                      className=\"pointer-events-none absolute right-0 top-1/2 h-[16px] w-px -translate-y-1/2 bg-[var(--cmp-table-header-resizingBar-color)]\"\n                    />\n                  </th>\n                )}\n                {visibleCols.map((col, i) => (\n                  <th\n                    key={col.name}\n                    className={cn(\n                      // 하단 border는 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).\n                      'relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[20px] text-[color:var(--sys-color-fg-primary)]',\n                      stickyInfo(i).isSticky && 'z-[6]',\n                      stickyShadowClass(i),\n                      col.thClass,\n                    )}\n                    style={{ textAlign: col.align ?? 'left', ...cellStyle(i), ...col.thStyle }}\n                  >\n                    <span\n                      className={cn(\n                        // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)\n                        'inline-flex w-full min-w-0 items-center gap-[4px]',\n                        col.align === 'center' && 'justify-center',\n                        col.align === 'right' && 'justify-end',\n                      )}\n                    >\n                      {col.renderHeader ? (\n                        col.renderHeader(col, i)\n                      ) : (\n                        <>\n                          {col.icon && <SIcon name={col.icon} size={16} color={col.iconColor} />}\n                          <span className=\"truncate\">{col.label}</span>\n                        </>\n                      )}\n                    </span>\n                    {resizable && !col.autoWidth && i < visibleCols.length - 1 && (\n                      // 원본 th__resizer: 셀 우측 경계 안쪽 4px 그립(좌우 1px #CCCCCC 라인, 세로 16px).\n                      // 셀 밖으로 넘치면 다음 셀에 가려져 클릭이 안 먹으므로 translate 없이 셀 내부에 배치.\n                      // 겉보기 그립은 4px(원본과 동일), 클릭 영역은 9px로 넓혀 사용성 확보.\n                      <span\n                        onMouseDown={e => startResize(i, e)}\n                        className=\"absolute right-0 top-1/2 z-[5] flex h-[16px] w-[9px] -translate-y-1/2 cursor-col-resize items-center justify-end\"\n                        aria-hidden\n                      >\n                        <span className=\"h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]\" />\n                      </span>\n                    )}\n                  </th>\n                ))}\n              </tr>\n            </thead>\n          </table>\n        </div>\n\n        {/* 데이터 없음 + 슬롯: body 테이블 대신 슬롯이 헤더 아래 영역을 그대로 차지한다.\n            상위 박스가 no-data일 때 pointer-events-none이므로 슬롯에서 다시 활성화해\n            버튼 등 인터랙티브 콘텐츠가 동작하게 한다. */}\n        {showNoDataSlot ? (\n          <div className={cn(bodyScrollClass, 'pointer-events-auto bg-white')}>\n            <div className=\"flex h-full min-h-[60px] w-full items-center justify-center\">\n              {noDataSlot}\n            </div>\n          </div>\n        ) : (\n          /* 바디: 세로 스크롤은 이 컨테이너에만 생긴다 (헤더 제외) */\n          <div\n            ref={scrollRef}\n            onScroll={handleScroll}\n            className={cn(\n              bodyScrollClass,\n              // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 스크롤 차단\n              (isLoading || rowCount === 0) && 'overflow-hidden',\n            )}\n          >\n            {/* border-collapse:collapse는 sticky 셀의 border가 스크롤 시 사라져 원본처럼 separate 사용 */}\n            <table\n              className=\"w-full table-fixed border-separate border-spacing-0 text-left\"\n              style={{ fontSize: 12 }}\n            >\n              {colgroup}\n              <tbody>\n                {useVirtualScroll && topSpacer > 0 && (\n                  <tr aria-hidden style={{ height: topSpacer }}>\n                    <td colSpan={totalColSpan} className=\"p-0\" />\n                  </tr>\n                )}\n                {rowCount === 0\n                  ? null\n                  : bodyRows.map((row, ri) => {\n                      const isSel = selectedKeys.has(row[rowKey]);\n                      // 원본 sd-table: 선택 행 배경 강조 없음. sticky 셀은 불투명 흰색만 유지.\n                      const rowBg = 'bg-white';\n                      return (\n                        <tr\n                          key={row[rowKey] ?? ri}\n                          onClick={() => onRowClick?.(row)}\n                          // border-separate에서는 tr border가 렌더되지 않아 행 구분선은 각 셀(td)의 border-b로 그린다.\n                          // 원본 sd-tr: hover 시 grey_05(#F9F9F9)\n                          className={cn(\n                            'group/table-row',\n                            !noHover && 'hover:bg-[var(--color-grey-05)]',\n                            onRowClick && 'cursor-pointer',\n                          )}\n                          style={{ height: useVirtualScroll ? effectiveRowHeight : rowH }}\n                        >\n                          {selectable && (\n                            <td\n                              className={cn(\n                                // 원본 .td--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬\n                                'sticky left-0 z-[2] border-b border-solid border-[color:var(--cmp-table-border-color)] align-middle',\n                                rowBg,\n                                !noHover && 'group-hover/table-row:bg-[var(--color-grey-05)]',\n                                stickyLeft === 0 &&\n                                  scrolledLeft &&\n                                  'shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]',\n                              )}\n                              style={{\n                                width: SELECTABLE_COLUMN_WIDTH,\n                                minWidth: SELECTABLE_COLUMN_WIDTH,\n                                maxWidth: SELECTABLE_COLUMN_WIDTH,\n                              }}\n                              onClick={e => e.stopPropagation()}\n                            >\n                              <div className=\"flex items-center justify-center\">\n                                <SCheckbox value={isSel} onValueChange={() => toggleRow(row)} />\n                              </div>\n                            </td>\n                          )}\n                          {visibleCols.map((col, i) => {\n                            const tdClassName = cn(\n                              // 원본 .td: 컬럼 폭에 맞춰 내용 말줄임(overflow hidden + ellipsis) + 행 구분선(border-b)\n                              // 셀 배경은 흰색으로 채워 뒤 배경이 비치지 않게 하고, hover 시 행 배경(grey_05)을 따른다.\n                              'overflow-hidden text-ellipsis whitespace-nowrap border-b border-solid border-[color:var(--cmp-table-border-color)] text-[12px] leading-[20px] text-[color:var(--sys-color-fg-primary)]',\n                              rowBg,\n                              !noHover && 'group-hover/table-row:bg-[var(--color-grey-05)]',\n                              stickyShadowClass(i),\n                              typeof col.tdClass === 'function' ? col.tdClass(row) : col.tdClass,\n                            );\n                            const tdStyle: CSSProperties = {\n                              paddingLeft: cellPadX,\n                              paddingRight: cellPadX,\n                              paddingTop: cellPadY,\n                              paddingBottom: cellPadY,\n                              textAlign: col.align ?? 'left',\n                              ...cellStyle(i),\n                            };\n                            // td 자체를 호스트가 그리는 경로. colSpan/rowSpan을 직접 줄 수 있고,\n                            // 병합에 덮이는 자리는 null을 반환해 td를 아예 만들지 않는다.\n                            if (col.renderCell) {\n                              const cell = col.renderCell({\n                                row,\n                                value: cellValue(col, row),\n                                column: col,\n                                colIndex: i,\n                                rowIndex: ri,\n                                isSelected: isSel,\n                                className: tdClassName,\n                                style: tdStyle,\n                              });\n                              if (cell == null || cell === false) return null;\n                              // 반환 엘리먼트에는 key가 없으므로 Fragment로 감싸 key를 부여한다\n                              return <Fragment key={col.name}>{cell}</Fragment>;\n                            }\n                            return (\n                              <td key={col.name} className={tdClassName} style={tdStyle}>\n                                {col.render\n                                  ? col.render(row, cellValue(col, row))\n                                  : cellValue(col, row)}\n                              </td>\n                            );\n                          })}\n                        </tr>\n                      );\n                    })}\n                {useVirtualScroll && bottomSpacer > 0 && (\n                  <tr aria-hidden style={{ height: bottomSpacer }}>\n                    <td colSpan={totalColSpan} className=\"p-0\" />\n                  </tr>\n                )}\n              </tbody>\n            </table>\n          </div>\n        )}\n\n        {isNoData && (\n          <>\n            {/* 원본 .sd-table__no-data-header-overlay: 헤더 영역 흰색 60% 오버레이 */}\n            <div\n              aria-hidden\n              className=\"pointer-events-none absolute left-0 right-0 top-0 z-[31] h-[var(--cmp-table-header-height)] bg-white/60\"\n            />\n            {/* 원본 .sd-table__no-data: 헤더 아래 영역에 메시지 정중앙 + 흰색 60% 오버레이.\n                슬롯이 있으면 body가 이미 슬롯으로 대체돼 있어 이 오버레이는 그리지 않는다. */}\n            {!showNoDataSlot && (\n              <div className=\"pointer-events-none absolute bottom-0 left-0 right-0 top-[var(--cmp-table-header-height)] z-[30] flex items-center justify-center bg-white/60 text-[12px] text-[color:var(--color-grey-65)]\">\n                <div className=\"flex min-h-[60px] w-full items-center justify-center\">\n                  {noDataLabel}\n                </div>\n              </div>\n            )}\n          </>\n        )}\n\n        {isLoading && (\n          <div className=\"absolute inset-0 z-30 flex items-center justify-center bg-white/60\">\n            <SCircleProgress indeterminate />\n          </div>\n        )}\n      </div>\n\n      {showPagination && (\n        // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).\n        // SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.\n        // 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가\n        // 눌리지 않도록 shrink-0으로 48px를 보장한다.\n        <div className=\"relative -mt-px flex h-[48px] shrink-0 items-center justify-center rounded-[var(--cmp-table-radius)] border border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--color-grey-05)]\">\n          <SPagination currentPage={displayPage} lastPage={lastPage} onPageChange={changePage} />\n          {useRowsPerPageSelect && (\n            <div className=\"absolute right-[10px] top-1/2 -translate-y-1/2\">\n              <SSelect\n                options={rowsPerPageOption}\n                value={useInternalPagination ? innerRowsPerPage : pagination?.rowsPerPage}\n                emitValue\n                onValueChange={v => changeRowsPerPage(Number(v))}\n                width={128}\n              />\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n});\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SDivider } from '../SDivider';\n\n/** 0(또는 미집계)은 죽은 값이라 어느 쪽이든 count-null. */\nconst COUNT_NULL = 'var(--cmp-table-bar-count-null)';\n\n/** 전체 건수 색 — 1건 이상이면 count-total. */\nconst totalColor = (n: number) => (n > 0 ? 'var(--cmp-table-bar-count-total)' : COUNT_NULL);\n\n/**\n * 선택 건수 색 — 선택이 있으면 brilliantblue_75 로 강조한다.\n * 전체 건수(count-total)보다 밝은 파랑이라 \"지금 선택된 상태\"가 눈에 먼저 들어온다.\n */\nconst selectedColor = (n: number) => (n > 0 ? 'var(--color-brilliantblue-75)' : COUNT_NULL);\n\nexport interface STableBarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n  /** 전체 건수. 지정하면 \"총 N 건\" 을 표시한다 (천단위 구분 자동) */\n  total?: number;\n  /** 선택 건수. 지정하면 \"N건 선택\" 을 표시한다 */\n  selected?: number;\n  /** 구분선 오른쪽 좌측 액션 영역 */\n  actions?: ReactNode;\n  /** 우측 정렬 액션 영역 */\n  rightActions?: ReactNode;\n}\n\n/**\n * STableBar — STable 위에 얹는 툴바.\n * 왼쪽에 건수 요약(총 N 건 / N건 선택), 구분선 뒤에 좌측 액션, 오른쪽 끝에 우측 액션을 둔다.\n * 색·간격은 모두 테이블 컴포넌트 토큰(--cmp-table-bar-*) 기반.\n */\nexport const STableBar = forwardRef<HTMLDivElement, STableBarProps>(function STableBar(\n  { total, selected, actions, rightActions, className, ...rest },\n  ref,\n) {\n  const hasTotal = total != null;\n  const hasSelected = selected != null;\n  const hasCount = hasTotal || hasSelected;\n\n  return (\n    <div\n      ref={ref}\n      // 액션이 하나도 없으면 조작 대상이 없는 요약 텍스트 줄이라 toolbar 롤을 붙이지 않는다.\n      role={actions || rightActions ? 'toolbar' : undefined}\n      className={cn(\n        'flex w-full items-center gap-[var(--cmp-table-bar-section-gap)] px-[var(--sys-space-table-padding-md)]',\n        'h-[var(--cmp-table-bar-height)] shrink-0',\n        'rounded-[var(--cmp-table-radius)] border-[length:var(--cmp-table-border-width)] border-solid border-[var(--cmp-table-border-color)] bg-white',\n        className,\n      )}\n      {...rest}\n    >\n      {/* 건수 요약은 한 섹션이라 내부 간격만 content-gap(8px), 바깥 구분선까지는 section-gap(12px). */}\n      {hasCount && (\n        <div className=\"flex items-center gap-[var(--cmp-table-content-gap)]\">\n          {hasTotal && (\n            <span className=\"typo-table-accent whitespace-nowrap text-[var(--sys-color-fg-primary)]\">\n              총 <b style={{ color: totalColor(total) }}>{total.toLocaleString()}</b> 건\n            </span>\n          )}\n\n          {hasTotal && hasSelected && (\n            <span\n              aria-hidden=\"true\"\n              className=\"typo-table-body text-[var(--sys-color-fg-tertiary)]\"\n            >\n              /\n            </span>\n          )}\n\n          {hasSelected && (\n            <span className=\"typo-table-body whitespace-nowrap text-[var(--sys-color-fg-primary)]\">\n              <b style={{ color: selectedColor(selected) }}>{selected.toLocaleString()}</b> 건 선택\n            </span>\n          )}\n        </div>\n      )}\n\n      {/*\n        actions 가 Fragment 라 truthy 인데 내부 분기로 아무것도 렌더되지 않는 경우가 있다.\n        React 로는 알 수 없으므로 슬롯이 실제로 비었는지(:empty)를 CSS 로 보고\n        구분선까지 통째로 감춘다. 구분선을 이 래퍼 안에 둔 이유도 그것.\n      */}\n      {actions && (\n        <div className=\"flex items-center gap-[var(--cmp-table-bar-section-gap)] has-[>div:empty]:hidden\">\n          {hasCount && (\n            <SDivider\n              vertical\n              className=\"h-[var(--cmp-table-bar-divider-height)] self-center\"\n              // 색은 SDivider 가 인라인 style 로 깔므로 클래스가 아니라 style 로 덮어써야 한다.\n              style={{ backgroundColor: 'var(--cmp-table-border-color)' }}\n            />\n          )}\n          <div className=\"flex items-center gap-[var(--cmp-table-content-gap)]\">{actions}</div>\n        </div>\n      )}\n\n      {rightActions && (\n        <div className=\"ml-auto flex items-center gap-[var(--cmp-table-content-gap)] empty:hidden\">\n          {rightActions}\n        </div>\n      )}\n    </div>\n  );\n});\n","/**\n * 공용 브라우저 자동완성 배경 차단 클래스.\n * Stencil의 styles/reset.scss + sd-input/sd-barcode-input.scss 규칙과 짝을 이루는 단일 기준이며,\n * 네이티브 <input>·<textarea>를 가진 컴포넌트는 그 요소에 이 클래스를 직접 붙여 쓴다.\n *\n * 자동완성이 걸린 필드에 브라우저가 UA 스타일시트로 파란 배경을 칠한다. 이 배경은\n * background-color로 덮을 수 없어(UA 내부에서 !important로 걸린다), 필드 배경색과 같은 색의\n * 거대한 inset box-shadow로 가리는 것이 유일한 방법이다. transition은 배경 재계산이 뒤늦게\n * 걸리는 경우의 보험으로, 원본 규칙에 있던 것을 그대로 옮겼다.\n *\n * Stencil은 전역 reset.scss로 페이지의 모든 input을 덮지만 이 패키지에는 그럴 자리가 없다 —\n * theme.css는 생성 산출물이라 손댈 수 없고, Tailwind 소비자(theme.css만 import)와 컴파일 CSS\n * 소비자(styles.css) 양쪽에 동시에 닿는 곳은 컴포넌트가 붙이는 유틸 클래스뿐이다.\n *\n * 배경색을 토큰 var()로 참조하는 것이 핵심이다. SBarcodeInput은 래퍼에서\n * --sys-color-field-bg-default를 --cmp-textinput-bg-barcode(노랑)로 재바인딩하므로, 같은\n * 클래스가 바코드 필드에서는 저절로 노란 배경으로 해석된다. Stencil이 sd-input(#fff)과\n * sd-barcode-input(#fafaa1)에 규칙을 통째로 복제해 둔 부분이 여기서는 하나로 합쳐진다.\n * 글자색도 같은 이유로 currentColor를 쓴다 — 각 컴포넌트가 input에 지정한 color를 그대로 따른다.\n *\n * :autofill과 :-webkit-autofill을 각각 따로 적는다. 한쪽 셀렉터를 모르는 브라우저는 그 규칙을\n * 통째로 버리므로 콤마로 묶으면 안 되는데, Tailwind는 클래스마다 규칙을 나누므로 variant를\n * 둘로 적는 것으로 충족된다. Tailwind v4의 autofill: 은 &:autofill만 내보내고 접두사 셀렉터는\n * 만들지 않아, -webkit- 쪽은 arbitrary variant로 직접 적는다.\n *\n * Tailwind는 소스에 문자열로 박힌 클래스만 수집한다. 선언을 배열로 두고 조립하면 스캐너가\n * 보지 못하므로 아래처럼 완성형 클래스를 그대로 나열한다(scrollbar.ts와 같은 이유).\n */\nexport const AUTOFILL_RESET_CLASS =\n  'autofill:[-webkit-text-fill-color:currentColor] ' +\n  'autofill:[box-shadow:0_0_0_1000px_var(--sys-color-field-bg-default)_inset] ' +\n  'autofill:[transition:background-color_5000s_ease-in-out_0s] ' +\n  '[&:-webkit-autofill]:[-webkit-text-fill-color:currentColor] ' +\n  '[&:-webkit-autofill]:[box-shadow:0_0_0_1000px_var(--sys-color-field-bg-default)_inset] ' +\n  '[&:-webkit-autofill]:[transition:background-color_5000s_ease-in-out_0s]';\n","'use client';\n\nimport {\n  forwardRef,\n  useState,\n  type InputHTMLAttributes,\n  type CSSProperties,\n  type ReactNode,\n} from 'react';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SGhostButton } from '../SGhostButton';\nimport { type SIconName } from '../SIcon';\nimport { cn } from '../../lib/cn';\nimport { AUTOFILL_RESET_CLASS } from '../../lib/autofill';\nimport { type SColor } from '../../lib/color';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { type STooltipProps } from '../STooltip';\n\nexport interface SInputProps extends Omit<\n  InputHTMLAttributes<HTMLInputElement>,\n  'size' | 'value' | 'onChange' | 'type' | 'prefix' | 'suffix'\n> {\n  /** 값 (제어) */\n  value?: string | number;\n  /** 값 변경 (sdUpdate) — 문자열 전달 */\n  onValueChange?: (value: string) => void;\n  /** 네이티브 onChange (form-agnostic 연동용, RHF 등) */\n  onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];\n  /** 입력 타입 */\n  type?: 'text' | 'password' | 'email' | 'number' | 'tel' | 'search' | 'url';\n  /** 크기 */\n  size?: SFieldSize;\n  /** 좌측 아이콘명 */\n  icon?: SIconName;\n  /** 좌측 아이콘 색상 */\n  iconColor?: SColor;\n  /** 입력 앞(좌측) 커스텀 노드 — 원본 slot=\"prefix\" */\n  prefix?: ReactNode;\n  /** 입력 뒤(우측) 커스텀 노드 — 원본 slot=\"suffix\" */\n  suffix?: ReactNode;\n  /** 지우기 버튼 */\n  clearable?: boolean;\n  /** 유효성 규칙 — blur 시 자동 검증 */\n  rules?: Rule[];\n  /** 필드 상태 ('default' | 'pass' | 'error') */\n  status?: SFieldStatus;\n  /** 포커스 상태 (제어/반영) */\n  focused?: boolean;\n  /** 호버 상태 (제어/반영) */\n  hovered?: boolean;\n  /** 내부 input 요소 className */\n  inputClass?: string;\n  /** 내부 input 요소 style */\n  inputStyle?: CSSProperties;\n  // ── SField 래퍼 ──\n  label?: string;\n  labelWidth?: number | string;\n  /** 레이블 툴팁 텍스트 */\n  labelTooltip?: string;\n  /** 레이블 툴팁 상세 옵션 */\n  labelTooltipProps?: Partial<STooltipProps>;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  addonLabel?: string;\n  /** 어드온 정렬 */\n  addonAlign?: SFieldAddonAlign;\n  width?: number | string;\n  disabled?: boolean;\n  readOnly?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\n// 원본 textinput.{sm,md}.typography: sm 12/20, md 14/24 (fontWeight 400)\nconst FONT: Record<SFieldSize, { fontSize: number; lineHeight: number; paddingX: string }> = {\n  sm: { fontSize: 12, lineHeight: 20, paddingX: 'var(--cmp-textinput-sm-paddingX)' },\n  md: { fontSize: 14, lineHeight: 24, paddingX: 'var(--cmp-textinput-md-paddingX)' },\n};\n\n/** SInput — sd-input 포팅. SField(테두리 박스) + borderless native input + clearable/password/icon. */\nexport const SInput = forwardRef<HTMLInputElement, SInputProps>(function SInput(\n  {\n    value,\n    onValueChange,\n    onChange,\n    type = 'text',\n    size = 'sm',\n    icon,\n    iconColor,\n    prefix,\n    suffix,\n    clearable = false,\n    rules,\n    status,\n    focused,\n    hovered,\n    inputClass,\n    inputStyle,\n    label,\n    labelWidth,\n    labelTooltip,\n    labelTooltipProps,\n    hint,\n    error,\n    errorMessage,\n    addonLabel,\n    addonAlign,\n    width,\n    disabled = false,\n    readOnly = false,\n    placeholder = '입력해 주세요.',\n    onBlur,\n    className,\n    style,\n    ...rest\n  },\n  ref,\n) {\n  const [visible, setVisible] = useState(false);\n  const [ruleError, setRuleError] = useState('');\n  const f = FONT[size];\n  const isPassword = type === 'password';\n  const inputType = isPassword ? (visible ? 'text' : 'password') : type;\n  const hasValue = value !== undefined && value !== null && String(value) !== '';\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name: rest.name,\n    validate: () => {\n      const msg = runRules(value, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  // rules가 있으면 blur 시 검증 → error/errorMessage 자동 결정\n  const resolvedError = error || ruleError !== '';\n  const resolvedErrorMessage = ruleError !== '' ? ruleError : errorMessage;\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      icon={icon}\n      iconColor={iconColor}\n      size={size}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused}\n      hovered={hovered}\n      errorMessage={resolvedErrorMessage}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      width={width}\n      disabled={disabled}\n      readOnly={readOnly}\n      className={className}\n      style={style}\n    >\n      <div\n        className={cn(\n          'flex h-full w-full items-center',\n          size === 'md' ? 'gap-[var(--cmp-textinput-md-gap)]' : 'gap-[var(--cmp-textinput-sm-gap)]',\n        )}\n        // 원본 .sd-input__content 처럼 컨테이너에 폰트 지정 → input·prefix·suffix 모두 상속\n        style={{\n          padding: `0 ${f.paddingX}`,\n          fontSize: f.fontSize,\n          lineHeight: `${f.lineHeight}px`,\n        }}\n      >\n        {/* icon prop은 원본처럼 SField 라벨 영역에 렌더됨. 입력 좌측 노드는 prefix 사용 */}\n        {prefix != null && <span className=\"flex-shrink-0\">{prefix}</span>}\n        <input\n          ref={ref}\n          type={inputType}\n          // onChange 가 항상 부착되므로 value 를 항상 지정해 controlled 로 고정한다\n          // (value 미지정 시 uncontrolled ↔ controlled 전환 경고 방지).\n          value={value ?? ''}\n          disabled={disabled}\n          readOnly={readOnly}\n          placeholder={placeholder}\n          onChange={e => {\n            onChange?.(e);\n            onValueChange?.(e.target.value);\n            if (ruleError !== '') setRuleError(runRules(e.target.value, rules));\n          }}\n          onBlur={e => {\n            onBlur?.(e);\n            if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));\n          }}\n          className={cn(\n            'h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed',\n            AUTOFILL_RESET_CLASS,\n            inputClass,\n          )}\n          style={{\n            // fontSize/lineHeight 는 컨테이너에서 상속 (원본 font-size: inherit)\n            color: disabled\n              ? 'var(--cmp-textinput-text-disabled)'\n              : 'var(--sys-color-field-text-default)',\n            ...inputStyle,\n          }}\n          {...rest}\n        />\n        {suffix != null && <span className=\"flex-shrink-0\">{suffix}</span>}\n        {/* 원본 sd-input: clear/password 는 sd-ghost-button(xxs) */}\n        {clearable && hasValue && !disabled && !readOnly && (\n          <SGhostButton\n            icon=\"close\"\n            size=\"xxs\"\n            ariaLabel=\"지우기\"\n            className=\"flex-shrink-0\"\n            onClick={() => onValueChange?.('')}\n          />\n        )}\n        {isPassword && (\n          <SGhostButton\n            icon={visible ? 'visibilityOn' : 'visibilityOff'}\n            size=\"xxs\"\n            ariaLabel=\"비밀번호 표시\"\n            disabled={disabled || readOnly}\n            className=\"flex-shrink-0\"\n            onClick={() => setVisible(v => !v)}\n          />\n        )}\n      </div>\n    </SField>\n  );\n});\n","'use client';\n\nimport { forwardRef, useState, type TextareaHTMLAttributes, type CSSProperties } from 'react';\nimport { SField, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { type SIconName } from '../SIcon';\nimport { cn } from '../../lib/cn';\nimport { AUTOFILL_RESET_CLASS } from '../../lib/autofill';\nimport { type SColor } from '../../lib/color';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { type STooltipProps } from '../STooltip';\n\nexport interface STextareaProps extends Omit<\n  TextareaHTMLAttributes<HTMLTextAreaElement>,\n  'value' | 'onChange'\n> {\n  /** 값 (제어) */\n  value?: string;\n  /** 값 변경 (sdUpdate) */\n  onValueChange?: (value: string) => void;\n  /** 네이티브 onChange (form-agnostic) */\n  onChange?: TextareaHTMLAttributes<HTMLTextAreaElement>['onChange'];\n  /** 행 수 */\n  rows?: number;\n  /** 유효성 규칙 — blur 시 자동 검증 */\n  rules?: Rule[];\n  /** 필드 상태 ('default' | 'pass' | 'error') */\n  status?: SFieldStatus;\n  /** 포커스 상태 (제어/반영) */\n  focused?: boolean;\n  /** 호버 상태 (제어/반영) */\n  hovered?: boolean;\n  /** 내부 textarea 요소 className */\n  textareaClass?: string;\n  /** 내부 textarea 요소 style */\n  textareaStyle?: CSSProperties;\n  // ── SField 래퍼 ──\n  label?: string;\n  labelWidth?: number | string;\n  /** 레이블 영역 아이콘 */\n  icon?: SIconName;\n  iconColor?: SColor;\n  /** 레이블 툴팁 텍스트 */\n  labelTooltip?: string;\n  /** 레이블 툴팁 상세 옵션 */\n  labelTooltipProps?: Partial<STooltipProps>;\n  /** 우측 어드온 레이블 */\n  addonLabel?: string;\n  /** 어드온 정렬 */\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  width?: number | string;\n  disabled?: boolean;\n  readOnly?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\n// sd-textarea는 단일 사이즈 (원본에 size prop 없음)\nconst PAD = { fontSize: 12, paddingX: 12, paddingY: 4 };\n\n/** STextarea — sd-textarea 포팅. SField(멀티라인 테두리 박스) + borderless native textarea. */\nexport const STextarea = forwardRef<HTMLTextAreaElement, STextareaProps>(function STextarea(\n  {\n    value,\n    onValueChange,\n    onChange,\n    rows = 3,\n    rules,\n    status,\n    focused,\n    hovered,\n    textareaClass,\n    textareaStyle,\n    label,\n    labelWidth,\n    icon,\n    iconColor,\n    labelTooltip,\n    labelTooltipProps,\n    addonLabel,\n    addonAlign,\n    hint,\n    error,\n    errorMessage,\n    width,\n    disabled = false,\n    readOnly = false,\n    placeholder = '입력해 주세요.',\n    onBlur,\n    className,\n    style,\n    ...rest\n  },\n  ref,\n) {\n  const p = PAD;\n  const [ruleError, setRuleError] = useState('');\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name: rest.name,\n    validate: () => {\n      const msg = runRules(value, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedErrorMessage = ruleError !== '' ? ruleError : errorMessage;\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused}\n      hovered={hovered}\n      errorMessage={resolvedErrorMessage}\n      width={width}\n      disabled={disabled}\n      readOnly={readOnly}\n      multiline\n      className={className}\n      style={style}\n    >\n      <textarea\n        ref={ref}\n        // onChange 가 항상 부착되므로 value 를 항상 지정해 controlled 로 고정한다.\n        value={value ?? ''}\n        rows={rows}\n        disabled={disabled}\n        readOnly={readOnly}\n        placeholder={placeholder}\n        onChange={e => {\n          onChange?.(e);\n          onValueChange?.(e.target.value);\n          if (ruleError !== '') setRuleError(runRules(e.target.value, rules));\n        }}\n        onBlur={e => {\n          onBlur?.(e);\n          if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));\n        }}\n        className={cn(\n          'w-full resize-y border-0 bg-transparent outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed',\n          AUTOFILL_RESET_CLASS,\n          textareaClass,\n        )}\n        style={{\n          minHeight: 100,\n          padding: `${p.paddingY}px ${p.paddingX}px`,\n          fontSize: p.fontSize,\n          lineHeight: '20px',\n          color: disabled\n            ? 'var(--cmp-textinput-text-disabled)'\n            : 'var(--sys-color-field-text-default)',\n          ...textareaStyle,\n        }}\n        {...rest}\n      />\n    </SField>\n  );\n});\n","'use client';\n\nimport { forwardRef, useEffect, useRef, useState, type CSSProperties } from 'react';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { type SColor } from '../../lib/color';\nimport { cn } from '../../lib/cn';\nimport { AUTOFILL_RESET_CLASS } from '../../lib/autofill';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { type STooltipProps } from '../STooltip';\n\nexport type SNumberInputSize = SFieldSize;\n\nconst PAD: Record<\n  SNumberInputSize,\n  { fontSize: number; lineHeight: number; stepper: number; icon: number }\n> = {\n  sm: { fontSize: 12, lineHeight: 20, stepper: 20, icon: 12 },\n  md: { fontSize: 14, lineHeight: 24, stepper: 24, icon: 14 },\n};\n\nexport interface SNumberInputProps {\n  /** 입력 값 */\n  value?: string | number | null;\n  /** 값 변경 (sdUpdate) — number|null 전달 */\n  onValueChange?: (value: number | null) => void;\n  /** 크기 */\n  size?: SNumberInputSize;\n  /** 최솟값 */\n  min?: number;\n  /** 최댓값 */\n  max?: number;\n  /** 스텝 단위 */\n  step?: number;\n  /** 증감 버튼 표시 */\n  useButton?: boolean;\n  /** 소수점 입력 허용 */\n  useDecimal?: boolean;\n  /** 소수점 이하 최대 자리수 */\n  maxDecimalLength?: number;\n  /** 입력 앞 접두 텍스트 */\n  inputPrefix?: string;\n  /** 입력 뒤 접미 텍스트 */\n  inputSuffix?: string;\n  /** 네이티브 input className */\n  inputClass?: string;\n  /** 네이티브 input style */\n  inputStyle?: CSSProperties;\n  /** 마운트 시 자동 포커스 */\n  autoFocus?: boolean;\n  /** 포커스 이벤트 (sdFocus) */\n  onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n  /** 블러 이벤트 (sdBlur) */\n  onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n  /** 폼 연동 name */\n  name?: string;\n  placeholder?: string;\n  disabled?: boolean;\n  readOnly?: boolean;\n  /** 유효성 규칙 — blur 시 검증 */\n  rules?: Rule[];\n  status?: SFieldStatus;\n  focused?: boolean;\n  hovered?: boolean;\n  // ── SField 래퍼 ──\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  width?: number | string;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst toNumber = (val: unknown): number | null => {\n  if (val === null || val === undefined || val === '') return null;\n  if (typeof val === 'number') return isNaN(val) ? null : val;\n  const cleaned = String(val).replace(/,/g, '').trim();\n  if (!/^-?(\\d+\\.?\\d*|\\d*\\.\\d+)$/.test(cleaned)) return null;\n  const n = parseFloat(cleaned);\n  return isNaN(n) ? null : n;\n};\n\nconst formatWithCommas = (value: number | null): string => {\n  if (value === null || value === undefined || isNaN(value)) return '';\n  const isNeg = value < 0;\n  const [intPart, decPart] = Math.abs(value).toString().split('.');\n  const formatted = (+intPart).toLocaleString();\n  const result = isNeg ? '-' + formatted : formatted;\n  return decPart !== undefined && decPart !== '' ? result + '.' + decPart : result;\n};\n\nconst addCommas = (value: string): string => value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\nconst formatInputWithCommas = (value: string): string => {\n  const isNeg = value.startsWith('-');\n  const unsigned = isNeg ? value.slice(1) : value;\n  const hasDecimal = unsigned.includes('.');\n  const [intPart = '', decPart = ''] = unsigned.split('.');\n  const formattedInt = addCommas(intPart === '' ? '0' : intPart);\n\n  return `${isNeg ? '-' : ''}${formattedInt}${hasDecimal ? `.${decPart}` : ''}`;\n};\n\nconst getDecimalLimit = (useDecimal: boolean, maxDecimalLength?: number): number | undefined => {\n  if (!useDecimal || maxDecimalLength === undefined || !Number.isFinite(maxDecimalLength)) {\n    return undefined;\n  }\n  return Math.max(0, Math.floor(maxDecimalLength));\n};\n\nconst applyDecimalLimit = (value: number | null, decimalLimit?: number): number | null => {\n  if (value === null || decimalLimit === undefined) return value;\n  return Number(value.toFixed(decimalLimit));\n};\n\nconst getLogicalCaret = (value: string, caret: number | null): number => {\n  return value.slice(0, caret ?? value.length).replace(/,/g, '').length;\n};\n\nconst getDisplayCaret = (value: string, logicalCaret: number): number => {\n  if (logicalCaret <= 0) return 0;\n\n  let seen = 0;\n  for (let i = 0; i < value.length; i += 1) {\n    if (value[i] === ',') continue;\n    seen += 1;\n    if (seen >= logicalCaret) return i + 1;\n  }\n\n  return value.length;\n};\n\n/** SNumberInput — sd-number-input 포팅. 콤마 포맷 + min/max/step + 옵션 스테퍼. */\nexport const SNumberInput = forwardRef<HTMLInputElement, SNumberInputProps>(function SNumberInput(\n  {\n    value,\n    onValueChange,\n    size = 'sm',\n    min = Number.NEGATIVE_INFINITY,\n    max = Number.POSITIVE_INFINITY,\n    step = 1,\n    useButton = false,\n    useDecimal = false,\n    maxDecimalLength,\n    inputPrefix = '',\n    inputSuffix = '',\n    inputClass,\n    inputStyle,\n    autoFocus,\n    onFocus,\n    onBlur,\n    name,\n    placeholder = '입력해 주세요.',\n    disabled = false,\n    readOnly = false,\n    rules,\n    status,\n    focused,\n    hovered,\n    label,\n    labelWidth,\n    icon,\n    iconColor,\n    labelTooltip,\n    labelTooltipProps,\n    addonLabel,\n    addonAlign,\n    hint,\n    error,\n    errorMessage,\n    width,\n    className,\n    style,\n  },\n  ref,\n) {\n  const p = PAD[size];\n  const padX = `var(--cmp-numberInput-${size}-paddingX)`;\n  const decimalLimit = getDecimalLimit(useDecimal, maxDecimalLength);\n  const numValue = applyDecimalLimit(toNumber(value), decimalLimit);\n  const [display, setDisplay] = useState(() => formatWithCommas(numValue));\n  const [ruleError, setRuleError] = useState('');\n  const innerRef = useRef<HTMLInputElement | null>(null);\n  const setRefs = (el: HTMLInputElement | null) => {\n    innerRef.current = el;\n    if (typeof ref === 'function') ref(el);\n    else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = el;\n  };\n\n  // value prop 변경 시 표시값 동기화\n  useEffect(() => {\n    if (document.activeElement === innerRef.current) return;\n    setDisplay(formatWithCommas(applyDecimalLimit(toNumber(value), decimalLimit)));\n  }, [decimalLimit, value]);\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(numValue, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n\n  const restoreCaret = (nextDisplay: string, logicalCaret?: number) => {\n    const input = innerRef.current;\n    if (logicalCaret === undefined || !input || document.activeElement !== input) return;\n\n    const nextCaret = getDisplayCaret(nextDisplay, logicalCaret);\n    requestAnimationFrame(() => {\n      if (document.activeElement !== input) return;\n      input.setSelectionRange(nextCaret, nextCaret);\n    });\n  };\n\n  const setDisplayWithCaret = (nextDisplay: string, logicalCaret?: number) => {\n    setDisplay(nextDisplay);\n    restoreCaret(nextDisplay, logicalCaret);\n  };\n\n  const resetRejectedInput = (target: HTMLInputElement, logicalCaret: number) => {\n    target.value = display;\n    restoreCaret(display, Math.min(logicalCaret, display.replace(/,/g, '').length));\n  };\n\n  const emit = (n: number | null, logicalCaret?: number) => {\n    const next = applyDecimalLimit(n, decimalLimit);\n    const nextDisplay = formatWithCommas(next);\n    setDisplayWithCaret(nextDisplay, logicalCaret);\n    onValueChange?.(next);\n  };\n\n  const incDisabled = disabled || readOnly || (numValue !== null && numValue >= max);\n  const decDisabled = disabled || readOnly || (numValue !== null && numValue <= min);\n\n  const increment = () => {\n    if (incDisabled) return;\n    const cur = numValue ?? (min === Number.NEGATIVE_INFINITY ? 0 : min);\n    const next = applyDecimalLimit(Math.min(cur + step, max), decimalLimit);\n    if (next !== cur) emit(next);\n  };\n  const decrement = () => {\n    if (decDisabled) return;\n    const cur = numValue ?? (min === Number.NEGATIVE_INFINITY ? 0 : min);\n    const next = applyDecimalLimit(Math.max(cur - step, min), decimalLimit);\n    if (next !== cur) emit(next);\n  };\n\n  const handleInput = (event: React.ChangeEvent<HTMLInputElement>) => {\n    const target = event.currentTarget;\n    const raw = target.value;\n    const logicalCaret = getLogicalCaret(raw, target.selectionStart);\n\n    if (raw === '') {\n      setDisplayWithCaret('', 0);\n      onValueChange?.(null);\n      return;\n    }\n    const cleaned = raw.replace(/,/g, '');\n    const decimals = (cleaned.match(/\\./g) || []).length;\n    if (decimals > 1) {\n      resetRejectedInput(target, logicalCaret);\n      return;\n    }\n    if (cleaned === '-' || cleaned === '.' || cleaned === '-.') {\n      setDisplayWithCaret(cleaned, logicalCaret);\n      return;\n    }\n    if (!useDecimal && cleaned.includes('.')) {\n      resetRejectedInput(target, logicalCaret);\n      return;\n    }\n    if (decimalLimit !== undefined && cleaned.includes('.')) {\n      const fraction = cleaned.split('.')[1] ?? '';\n      if (fraction.length > decimalLimit) {\n        resetRejectedInput(target, logicalCaret);\n        return;\n      }\n    }\n    // 입력 도중 '123.' 유지\n    if (cleaned.endsWith('.') && decimals === 1) {\n      const parsed = toNumber(cleaned.slice(0, -1));\n      if (parsed !== null) {\n        setDisplayWithCaret(formatInputWithCommas(cleaned), logicalCaret);\n        return;\n      }\n    }\n    const parsed = toNumber(cleaned);\n    if (parsed === null) {\n      resetRejectedInput(target, logicalCaret);\n      return;\n    }\n    // 타이핑 도중에는 범위 밖 값도 허용한다(예: min=10 에서 '50' 을 향해 '5' 입력).\n    // 최종 클램프는 blur 시점에 수행한다 — 여기서 막으면 유효한 중간 입력이 삼켜진다.\n    setDisplayWithCaret(formatInputWithCommas(cleaned), logicalCaret);\n    onValueChange?.(applyDecimalLimit(parsed, decimalLimit));\n  };\n\n  const stepper = (dir: 'dec' | 'inc') => {\n    const off = dir === 'inc' ? incDisabled : decDisabled;\n    return (\n      <button\n        type=\"button\"\n        tabIndex={-1}\n        disabled={off}\n        aria-label={dir === 'inc' ? '증가' : '감소'}\n        onClick={dir === 'inc' ? increment : decrement}\n        className={cn(\n          'flex flex-shrink-0 items-center justify-center border border-solid border-transparent transition-colors',\n          off\n            ? 'cursor-not-allowed'\n            : 'cursor-pointer hover:border-[var(--color-border-accentLight)]',\n        )}\n        style={{\n          width: `var(--cmp-numberInput-stepper-${size}-size)`,\n          height: `var(--cmp-numberInput-stepper-${size}-size)`,\n          borderRadius: 'var(--cmp-numberInput-stepper-radius)',\n          background: off\n            ? 'var(--cmp-numberInput-stepper-bg-disabled)'\n            : 'var(--cmp-numberInput-stepper-bg-default)',\n        }}\n      >\n        <SIcon\n          name={(dir === 'inc' ? 'add' : 'minus') as SIconName}\n          size={p.icon}\n          color={\n            off\n              ? 'var(--cmp-numberInput-stepper-icon-disabled)'\n              : 'var(--cmp-numberInput-stepper-icon-default)'\n          }\n        />\n      </button>\n    );\n  };\n\n  const affixColor = disabled\n    ? 'var(--cmp-numberInput-text-disabled)'\n    : 'var(--cmp-numberInput-text-placeholder)';\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      size={size}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused}\n      hovered={hovered}\n      errorMessage={ruleError !== '' ? ruleError : errorMessage}\n      width={width}\n      disabled={disabled}\n      readOnly={readOnly}\n      className={className}\n      style={style}\n    >\n      <div\n        className=\"flex h-full w-full items-center\"\n        // 폰트는 컨테이너에 지정해 input·prefix·suffix 가 동일한 메트릭을 상속 (SInput 패턴)\n        style={{\n          // 원본 sd-number-input: content gap = padding-x 토큰 (gap 토큰 아님)\n          gap: `var(--cmp-numberInput-${size}-paddingX)`,\n          padding: `0 ${useButton ? padX : `calc(${padX} * 2)`}`,\n          fontSize: p.fontSize,\n          lineHeight: `${p.lineHeight}px`,\n        }}\n      >\n        {useButton && stepper('dec')}\n        {inputPrefix !== '' && (\n          <span className=\"flex-shrink-0\" style={{ color: affixColor }}>\n            {inputPrefix}\n          </span>\n        )}\n        <input\n          ref={setRefs}\n          name={name}\n          type=\"text\"\n          inputMode={useDecimal ? 'decimal' : 'numeric'}\n          value={display}\n          placeholder={placeholder}\n          disabled={disabled}\n          readOnly={readOnly}\n          autoFocus={autoFocus}\n          onChange={handleInput}\n          onKeyDown={e => {\n            if (e.key === 'ArrowUp') {\n              e.preventDefault();\n              increment();\n            } else if (e.key === 'ArrowDown') {\n              e.preventDefault();\n              decrement();\n            }\n          }}\n          onFocus={e => onFocus?.(e)}\n          onBlur={e => {\n            // blur 시 [min, max] 범위로 클램프. 값이 바뀌면 emit(display+onValueChange 갱신),\n            // 그대로면 표시값만 재포맷한다.\n            const cleaned = display.replace(/,/g, '');\n            const n = toNumber(cleaned);\n            const clamped = n === null ? null : Math.min(Math.max(n, min), max);\n            if (clamped !== n) emit(clamped);\n            else setDisplay(n === null ? '' : formatInputWithCommas(cleaned));\n            if (rules && rules.length > 0) setRuleError(runRules(clamped, rules));\n            onBlur?.(e);\n          }}\n          className={cn(\n            // h-full 대신 라인박스 높이 그대로 두어 prefix/suffix 와 동일하게 flex 로 수직 센터링\n            // (h-full 이면 input 내부 텍스트 센터링을 브라우저가 수행해 1px 어긋날 수 있음)\n            'min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-numberInput-text-placeholder)] disabled:cursor-not-allowed',\n            AUTOFILL_RESET_CLASS,\n            inputClass,\n          )}\n          style={{\n            // fontSize/lineHeight 는 컨테이너에서 상속\n            textAlign: useButton ? 'center' : 'right',\n            color: disabled\n              ? 'var(--cmp-numberInput-text-disabled)'\n              : 'var(--cmp-numberInput-text-default)',\n            ...inputStyle,\n          }}\n        />\n        {inputSuffix !== '' && (\n          <span className=\"flex-shrink-0\" style={{ color: affixColor }}>\n            {inputSuffix}\n          </span>\n        )}\n        {useButton && stepper('inc')}\n      </div>\n    </SField>\n  );\n});\n","'use client';\n\nimport { type CSSProperties, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\n\n/** 라디오 값 타입 (sd-radio SRadioValue) */\nexport type SRadioValue = string | number | boolean;\n\nexport interface SRadioProps {\n  /** 이 라디오의 값 */\n  val: SRadioValue;\n  /** 그룹의 현재 선택 값 */\n  value?: SRadioValue | null;\n  /** 라벨 */\n  label?: string;\n  /** 비활성 */\n  disabled?: boolean;\n  /** native radio name (form-agnostic 그룹핑) */\n  name?: string;\n  /** 선택 변경 (sdUpdate) — 선택된 val 전달 */\n  onValueChange?: (val: SRadioValue) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SRadio — sd-radio 포팅. value===val 이면 선택. 단독 또는 SRadioGroup 안에서 사용. */\nexport function SRadio({\n  val,\n  value,\n  label,\n  disabled = false,\n  name,\n  onValueChange,\n  className,\n  style,\n}: SRadioProps) {\n  // key/name 속성용 문자열 표현\n  const valStr = String(val);\n  const checked = value === val;\n  const select = () => {\n    if (!disabled && !checked) onValueChange?.(val);\n  };\n\n  // name 이 있으면 네이티브 <input type=\"radio\"> 가 실제 상호작용 컨트롤이 된다.\n  // 이때 label 에는 role/tabIndex/키핸들러를 주지 않는다 — 상호작용 요소 중첩\n  // (role=\"radio\" 안에 native radio) 및 radio 역할 중복을 피한다.\n  const native = name != null && name !== '';\n\n  // native 모드가 아니면 label 자체가 커스텀 radio 로 동작한다.\n  const labelInteractiveProps: HTMLAttributes<HTMLLabelElement> = native\n    ? {}\n    : {\n        'role': 'radio',\n        'aria-checked': checked,\n        'tabIndex': disabled ? -1 : 0,\n        'onClick': select,\n        'onKeyDown': e => {\n          if (e.key === ' ' || e.key === 'Enter') {\n            e.preventDefault();\n            select();\n          }\n        },\n      };\n\n  return (\n    <label\n      {...labelInteractiveProps}\n      className={cn(\n        'inline-flex items-center gap-[8px]',\n        disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        className,\n      )}\n      style={style}\n    >\n      {native && (\n        <input\n          type=\"radio\"\n          name={name}\n          value={valStr}\n          checked={checked}\n          disabled={disabled}\n          // 네이티브 라디오가 포커스/키보드/선택을 담당한다. label 이 감싸므로\n          // 라벨 클릭도 이 input 을 토글하며, onChange 는 값이 실제로 바뀔 때만 발생.\n          onChange={() => onValueChange?.(val)}\n          className=\"sr-only\"\n        />\n      )}\n      <span\n        className={cn(\n          'flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-full border border-solid border-[color:var(--rd-border)] bg-[var(--rd-bg)]',\n          !disabled &&\n            !checked &&\n            'hover:border-[color:var(--cmp-radio-border-hover)] hover:bg-[var(--cmp-radio-bg-hover)]',\n        )}\n        style={\n          {\n            '--rd-bg': disabled ? 'var(--cmp-radio-bg-disabled)' : 'var(--cmp-radio-bg-default)',\n            '--rd-border': disabled\n              ? 'var(--cmp-radio-border-disabled)'\n              : checked\n                ? 'var(--cmp-radio-border-active)'\n                : 'var(--cmp-radio-border-default)',\n          } as CSSProperties\n        }\n      >\n        {checked && (\n          <span\n            className=\"h-[10px] w-[10px] rounded-full\"\n            style={{\n              background: disabled\n                ? 'var(--cmp-radio-dot-disabled)'\n                : 'var(--cmp-radio-dot-default)',\n            }}\n          />\n        )}\n      </span>\n      {label && (\n        <span\n          className=\"grid text-[12px] leading-[20px]\"\n          style={{\n            color: disabled ? 'var(--cmp-radio-label-disabled)' : 'var(--cmp-radio-label-default)',\n          }}\n        >\n          <span aria-hidden className=\"invisible font-medium\" style={{ gridArea: '1 / 1' }}>\n            {label}\n          </span>\n          <span style={{ gridArea: '1 / 1', fontWeight: checked ? 500 : 400 }}>{label}</span>\n        </span>\n      )}\n    </label>\n  );\n}\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SRadio, type SRadioValue } from './SRadio';\n\nexport interface SRadioOption {\n  /** 옵션 값 (sd-radio-group SRadioOption.value) */\n  value: SRadioValue;\n  label: string;\n  disabled?: boolean;\n}\n\nexport interface SRadioGroupProps {\n  /** 옵션 목록 */\n  options?: SRadioOption[];\n  /** 현재 선택 값 */\n  value?: SRadioValue | null;\n  /** 배치 방향 */\n  direction?: 'vertical' | 'horizontal';\n  /** 전체 비활성 */\n  disabled?: boolean;\n  /** 라디오 name 속성 (form-agnostic 그룹핑) */\n  groupName?: string;\n  /** 선택 변경 (sdUpdate) */\n  onValueChange?: (val: SRadioValue) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SRadioGroup — sd-radio-group 포팅. options를 SRadio로 렌더. */\nexport function SRadioGroup({\n  options = [],\n  value,\n  direction = 'vertical',\n  disabled = false,\n  groupName,\n  onValueChange,\n  className,\n  style,\n}: SRadioGroupProps) {\n  return (\n    <div\n      role=\"radiogroup\"\n      className={cn(\n        'inline-flex',\n        direction === 'vertical'\n          ? 'flex-col gap-[var(--cmp-radio-group-gap-vertical)]'\n          : 'flex-row gap-[var(--cmp-radio-group-gap-horizontal)]',\n        className,\n      )}\n      style={style}\n    >\n      {options.map(o => (\n        <SRadio\n          key={String(o.value)}\n          val={o.value}\n          value={value}\n          label={o.label}\n          name={groupName}\n          disabled={disabled || o.disabled}\n          onValueChange={onValueChange}\n        />\n      ))}\n    </div>\n  );\n}\n","/** 로컬 기준 오늘 YYYY-MM-DD */\nexport function todayStr(): string {\n  const d = new Date();\n  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\nexport function formatDate(year: number, month: number, day: number): string {\n  return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n}\n\nexport function calcYearMonth(\n  year: number,\n  month: number,\n  dir: 'prev' | 'next',\n): { year: number; month: number } {\n  if (dir === 'prev')\n    return month === 1 ? { year: year - 1, month: 12 } : { year, month: month - 1 };\n  return month === 12 ? { year: year + 1, month: 1 } : { year, month: month + 1 };\n}\n\nexport interface DayCell {\n  date: string;\n  day: number;\n  inCurrentMonth: boolean;\n}\n\n/** year/month(1-12)에 대한 6주 그리드 셀 목록 (앞뒤 달 채움 포함) */\nexport function monthCells(year: number, month: number): DayCell[] {\n  const firstDayIndex = new Date(year, month - 1, 1).getDay();\n  const daysInCurrent = new Date(year, month, 0).getDate();\n  const prev = calcYearMonth(year, month, 'prev');\n  const daysInPrev = new Date(prev.year, prev.month, 0).getDate();\n  const next = calcYearMonth(year, month, 'next');\n\n  const cells: DayCell[] = [];\n  for (let i = firstDayIndex - 1; i >= 0; i--) {\n    const day = daysInPrev - i;\n    cells.push({ date: formatDate(prev.year, prev.month, day), day, inCurrentMonth: false });\n  }\n  for (let day = 1; day <= daysInCurrent; day++) {\n    cells.push({ date: formatDate(year, month, day), day, inCurrentMonth: true });\n  }\n  const remaining = (7 - (cells.length % 7)) % 7;\n  for (let day = 1; day <= remaining; day++) {\n    cells.push({ date: formatDate(next.year, next.month, day), day, inCurrentMonth: false });\n  }\n  return cells;\n}\n\nexport const WEEK_LABELS = ['일', '월', '화', '수', '목', '금', '토'] as const;\n","'use client';\n\nimport { useEffect, useMemo, useState, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { resolveColor, type SColor } from '../../lib/color';\nimport { SDivider } from '../SDivider';\nimport { SGhostButton } from '../SGhostButton';\nimport { todayStr, monthCells, calcYearMonth, WEEK_LABELS } from '../../lib/date';\n\nexport interface SCalendarEventGroup {\n  /** 도트 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */\n  color: SColor;\n  label: string;\n  dates: string[];\n}\n\nexport interface SCalendarProps {\n  /** 선택 날짜 (YYYY-MM-DD) */\n  value?: string | null;\n  /** 선택 변경 (sdUpdate) */\n  onValueChange?: (date: string) => void;\n  /** 선택 가능 범위 [시작, 종료] (빈 문자열이면 제한 없음) */\n  selectable?: [string, string];\n  /** 이벤트 그룹 (날짜별 점) */\n  events?: SCalendarEventGroup[];\n  /** 보이는 연·월 변경 (sdViewChange) */\n  onViewChange?: (v: { year: number; month: number }) => void;\n  /** 카드 그림자 */\n  elevated?: boolean;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SCalendar — sd-calendar 포팅. 월 그리드 + 이벤트 점 + 범례. */\nexport function SCalendar({\n  value,\n  onValueChange,\n  selectable,\n  events,\n  onViewChange,\n  elevated = false,\n  className,\n  style,\n}: SCalendarProps) {\n  const today = todayStr();\n  const base = value || today;\n  const [y, setY] = useState(() => Number(base.split('-')[0]));\n  const [m, setM] = useState(() => Number(base.split('-')[1]));\n\n  useEffect(() => {\n    const b = value || today;\n    setY(Number(b.split('-')[0]));\n    setM(Number(b.split('-')[1]));\n  }, [value]);\n\n  const cells = useMemo(() => monthCells(y, m), [y, m]);\n  const eventMap = useMemo(() => {\n    const map = new Map<string, { color: string; label: string }[]>();\n    (events ?? []).forEach(g =>\n      g.dates.forEach(d => {\n        const arr = map.get(d) ?? [];\n        arr.push({ color: g.color, label: g.label });\n        map.set(d, arr);\n      }),\n    );\n    return map;\n  }, [events]);\n  const legend = useMemo(() => {\n    const seen = new Set<string>();\n    const out: { color: string; label: string }[] = [];\n    (events ?? []).forEach(g => {\n      const k = `${g.color}|${g.label}`;\n      if (!seen.has(k)) {\n        seen.add(k);\n        out.push({ color: g.color, label: g.label });\n      }\n    });\n    return out;\n  }, [events]);\n  const hasEvents = (events?.length ?? 0) > 0;\n\n  const view = (ny: number, nm: number) => {\n    setY(ny);\n    setM(nm);\n    onViewChange?.({ year: ny, month: nm });\n  };\n  const isDisabled = (date: string) => {\n    if (!selectable) return false;\n    const [s, e] = selectable;\n    if (s !== '' && date < s) return true;\n    if (e !== '' && date > e) return true;\n    return false;\n  };\n  const pick = (date: string) => {\n    if (!isDisabled(date)) onValueChange?.(date);\n  };\n\n  return (\n    <div\n      className={cn(\n        'inline-flex w-[328px] min-h-[328px] flex-col gap-[var(--cmp-datepicker-calendar-gap)] rounded-[var(--cmp-datepicker-calendar-radius)] bg-[var(--cmp-datepicker-calendar-bg)] p-[var(--cmp-datepicker-calendar-paddingXY)] select-none text-[color:var(--cmp-datepicker-calendar-day-default-text)]',\n        elevated && 'shadow-[2px_2px_12px_2px_rgba(0,0,0,0.2)]',\n        className,\n      )}\n      style={style}\n    >\n      {/* 헤더: 연도 / 월 네비 */}\n      <div className=\"flex items-center justify-center gap-[var(--cmp-datepicker-calendar-header-gap)]\">\n        <div className=\"flex items-center gap-[var(--cmp-datepicker-calendar-gap)]\">\n          <SGhostButton\n            icon=\"chevronLeft\"\n            size=\"xxs\"\n            ariaLabel=\"prevYear\"\n            onClick={() => view(y - 1, m)}\n          />\n          <span className=\"inline-flex min-w-[40px] items-center justify-center text-center text-[14px] font-medium leading-[24px]\">\n            {y}\n          </span>\n          <SGhostButton\n            icon=\"chevronRight\"\n            size=\"xxs\"\n            ariaLabel=\"nextYear\"\n            onClick={() => view(y + 1, m)}\n          />\n        </div>\n        <SDivider\n          vertical\n          className=\"h-[var(--cmp-datepicker-calendar-header-divider-height)] self-center\"\n        />\n        <div className=\"flex w-full items-center gap-[var(--cmp-datepicker-calendar-gap)]\">\n          <SGhostButton\n            icon=\"chevronLeft\"\n            size=\"xxs\"\n            ariaLabel=\"prevMonth\"\n            onClick={() => {\n              const n = calcYearMonth(y, m, 'prev');\n              view(n.year, n.month);\n            }}\n          />\n          <span className=\"inline-flex w-full min-w-[40px] items-center justify-center text-center text-[14px] font-medium leading-[24px]\">\n            {m}월\n          </span>\n          <SGhostButton\n            icon=\"chevronRight\"\n            size=\"xxs\"\n            ariaLabel=\"nextMonth\"\n            onClick={() => {\n              const n = calcYearMonth(y, m, 'next');\n              view(n.year, n.month);\n            }}\n          />\n        </div>\n      </div>\n\n      {/* 요일 */}\n      <div className=\"grid grid-cols-7\">\n        {WEEK_LABELS.map(label => (\n          <span\n            key={label}\n            className=\"flex h-[20px] items-center justify-center text-[12px] font-normal text-[color:var(--cmp-datepicker-calendar-week-color)]\"\n          >\n            {label}\n          </span>\n        ))}\n      </div>\n\n      {/* 날짜 그리드 */}\n      <div className=\"grid grid-cols-7 gap-y-[var(--cmp-datepicker-calendar-grid-rowGap)]\">\n        {cells.map(cell => {\n          const selected = cell.inCurrentMonth && value === cell.date;\n          const isToday = cell.inCurrentMonth && today === cell.date;\n          const disabled = cell.inCurrentMonth && isDisabled(cell.date);\n          const evs = cell.inCurrentMonth ? eventMap.get(cell.date) : undefined;\n          return (\n            <button\n              key={cell.date}\n              type=\"button\"\n              disabled={!cell.inCurrentMonth || disabled}\n              onClick={() => cell.inCurrentMonth && pick(cell.date)}\n              className={cn(\n                'flex min-h-[var(--cmp-datepicker-calendar-day-circle-size)] w-[var(--cmp-datepicker-calendar-day-width)] flex-col items-center justify-start border-none bg-transparent p-0',\n                !cell.inCurrentMonth\n                  ? 'invisible pointer-events-none'\n                  : disabled\n                    ? 'cursor-not-allowed'\n                    : 'cursor-pointer',\n              )}\n              aria-hidden={!cell.inCurrentMonth ? 'true' : undefined}\n            >\n              <span\n                className={cn(\n                  'flex h-[var(--cmp-datepicker-calendar-day-circle-size)] w-[var(--cmp-datepicker-calendar-day-circle-size)] items-center justify-center rounded-[var(--cmp-datepicker-calendar-day-circle-radius)] border border-solid border-transparent text-[14px] leading-[var(--cmp-datepicker-calendar-day-circle-size)]',\n                  selected\n                    ? 'bg-[var(--cmp-datepicker-calendar-day-select-bg)] text-[color:var(--cmp-datepicker-calendar-day-select-text)]'\n                    : disabled\n                      ? 'text-[color:var(--cmp-datepicker-calendar-day-disabled-text)]'\n                      : 'text-[color:var(--cmp-datepicker-calendar-day-default-text)] hover:border-[color:var(--cmp-datepicker-calendar-day-hover-border)] hover:text-[color:var(--cmp-datepicker-calendar-day-hover-text)]',\n                  isToday && !disabled && 'font-bold',\n                )}\n              >\n                {cell.inCurrentMonth ? cell.day : ''}\n              </span>\n              {hasEvents && (\n                <span\n                  className=\"flex min-h-[14px] w-full flex-wrap items-center justify-center gap-[var(--cmp-datepicker-calendar-day-dot-gap)] py-[var(--cmp-datepicker-calendar-day-dot-paddingY)]\"\n                  aria-hidden\n                >\n                  {evs?.map((ev, i) => (\n                    <span\n                      key={i}\n                      className=\"h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full\"\n                      style={{ backgroundColor: resolveColor(ev.color) }}\n                    />\n                  ))}\n                </span>\n              )}\n            </button>\n          );\n        })}\n      </div>\n\n      {/* 범례 */}\n      {legend.length > 0 && (\n        <>\n          <SDivider />\n          <div className=\"flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] text-[11px] leading-[18px]\">\n            {legend.map(item => (\n              <span\n                key={`${item.color}|${item.label}`}\n                className=\"inline-flex items-center gap-[var(--cmp-datepicker-calendar-legend-gap)]\"\n              >\n                <span\n                  className=\"h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full\"\n                  style={{ backgroundColor: resolveColor(item.color) }}\n                  aria-hidden\n                />\n                <span>{item.label}</span>\n              </span>\n            ))}\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\n","'use client';\n\nimport { useState, type CSSProperties } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SCalendar } from '../SCalendar';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { type SColor } from '../../lib/color';\nimport { cn } from '../../lib/cn';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { type STooltipProps } from '../STooltip';\n\nexport type SDatePickerSize = SFieldSize;\n\nexport interface SDatePickerProps {\n  /** 선택 날짜 (YYYY-MM-DD) */\n  value?: string | null;\n  /** 선택 변경 (sdUpdate) */\n  onValueChange?: (date: string) => void;\n  /** 보이는 연·월 변경 (sdViewChange) */\n  onViewChange?: (view: { year: number; month: number }) => void;\n  size?: SDatePickerSize;\n  placeholder?: string;\n  /** 선택 가능 범위 [시작, 종료] */\n  selectable?: [string, string];\n  disabled?: boolean;\n  width?: number | string;\n  name?: string;\n  rules?: Rule[];\n  status?: SFieldStatus;\n  // ── SField ──\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SDatePicker — sd-date-picker 포팅. SField + SPopover(SCalendar). */\nexport function SDatePicker({\n  value,\n  onValueChange,\n  onViewChange,\n  size = 'sm',\n  placeholder = 'YYYY-MM-DD',\n  selectable,\n  disabled = false,\n  width,\n  name,\n  rules,\n  status,\n  label,\n  labelWidth,\n  icon,\n  iconColor,\n  labelTooltip,\n  labelTooltipProps,\n  addonLabel,\n  addonAlign,\n  hint,\n  error,\n  errorMessage,\n  className,\n  style,\n}: SDatePickerProps) {\n  const portalContainer = usePortalContainer();\n  const [open, setOpen] = useState(false);\n  const [focused, setFocused] = useState(false);\n  const [ruleError, setRuleError] = useState('');\n  const hasValue = value != null && value !== '';\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(value, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n  // 트리거 치수 (sd-date-picker DATEPICKER_SIZE_MAP)\n  const dims =\n    size === 'md'\n      ? { padX: 16, gap: 12, icon: 20, minW: 104, fontSize: 14, lineHeight: 24, radius: 6 }\n      : { padX: 12, gap: 8, icon: 16, minW: 80, fontSize: 12, lineHeight: 20, radius: 4 };\n\n  const select = (date: string) => {\n    onValueChange?.(date);\n    if (rules && rules.length > 0) setRuleError(runRules(date, rules));\n    setOpen(false);\n  };\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      size={size}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused || open}\n      errorMessage={ruleError !== '' ? ruleError : errorMessage}\n      width={width}\n      disabled={disabled}\n      className={className}\n      style={style}\n    >\n      <RPopover.Root open={open} onOpenChange={o => !disabled && setOpen(o)}>\n        <RPopover.Trigger asChild>\n          <button\n            type=\"button\"\n            name={name}\n            disabled={disabled}\n            onFocus={() => setFocused(true)}\n            onBlur={() => setFocused(false)}\n            className=\"flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed\"\n            style={{ padding: `0 ${dims.padX}px`, gap: dims.gap, borderRadius: dims.radius }}\n          >\n            {/* 원본: 아이콘(왼쪽, 고정) + 텍스트(flex:1, 중앙정렬, ellipsis) */}\n            <SIcon\n              name=\"date\"\n              size={dims.icon}\n              color={\n                disabled\n                  ? 'var(--cmp-datepicker-icon-disabled)'\n                  : 'var(--cmp-datepicker-icon-default)'\n              }\n              className=\"flex-shrink-0\"\n            />\n            <span\n              className=\"flex-1 truncate text-center\"\n              style={{\n                minWidth: dims.minW,\n                fontSize: dims.fontSize,\n                lineHeight: `${dims.lineHeight}px`,\n                color: disabled\n                  ? 'var(--cmp-datepicker-text-disabled)'\n                  : hasValue\n                    ? 'var(--cmp-datepicker-text-default)'\n                    : 'var(--cmp-field-hint-color)',\n              }}\n            >\n              {hasValue ? value : placeholder}\n            </span>\n          </button>\n        </RPopover.Trigger>\n        <RPopover.Portal container={portalContainer}>\n          <RPopover.Content\n            side=\"bottom\"\n            align=\"start\"\n            sideOffset={4}\n            className={cn('z-50', FLOATING_SLIDE_ANIM)}\n          >\n            <SCalendar\n              value={value ?? undefined}\n              selectable={selectable}\n              elevated\n              onValueChange={select}\n              onViewChange={onViewChange}\n            />\n          </RPopover.Content>\n        </RPopover.Portal>\n      </RPopover.Root>\n    </SField>\n  );\n}\n","'use client';\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SDivider } from '../SDivider';\nimport { SGhostButton } from '../SGhostButton';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { type SColor } from '../../lib/color';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { todayStr, monthCells, calcYearMonth, formatDate, WEEK_LABELS } from '../../lib/date';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { type STooltipProps } from '../STooltip';\n\nexport type SDateRangeValue = [string, string] | null;\nexport type SDateRangePickerSize = SFieldSize;\n\nexport interface SDateRangePickerProps {\n  value?: SDateRangeValue;\n  /** 선택 변경 (sdUpdate) — [start, end] */\n  onValueChange?: (range: SDateRangeValue) => void;\n  /** 보이는 연·월 변경 (sdViewChange) */\n  onViewChange?: (view: { year: number; month: number }) => void;\n  size?: SDateRangePickerSize;\n  placeholder?: string;\n  selectable?: [string, string];\n  /** 최대 선택 일수 */\n  maxRange?: number;\n  /**\n   * 시간(시:분) 선택 푸터 사용 여부.\n   * true이면 value는 \"YYYY-MM-DD HH:mm\" 형식이 되고, 캘린더 하단에 시작·종료 시간 입력이 표시된다.\n   */\n  useTimePicker?: boolean;\n  disabled?: boolean;\n  width?: number | string;\n  name?: string;\n  rules?: Rule[];\n  status?: SFieldStatus;\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** \"YYYY-MM-DD HH:mm\" 또는 \"YYYY-MM-DD\"를 날짜/시/분으로 분리 */\nfunction splitDateTime(v?: string | null): { date: string | null; hour: string; minute: string } {\n  if (!v) return { date: null, hour: '00', minute: '00' };\n  const [date = '', time = ''] = v.split(' ');\n  const [hour = '00', minute = '00'] = time.split(':');\n  return { date: date || null, hour, minute };\n}\n\nfunction RangeCalendar({\n  value,\n  selectable,\n  maxRange,\n  useTimePicker = false,\n  onSelect,\n  onPendingStartChange,\n  onViewChange,\n}: {\n  value: SDateRangeValue;\n  selectable?: [string, string];\n  maxRange?: number;\n  useTimePicker?: boolean;\n  onSelect: (r: [string, string]) => void;\n  /** 시작일만 선택된(종료일 대기) 상태를 상위로 전달 — 트리거에 `start ~` 프리뷰 표시용 */\n  onPendingStartChange?: (start: string | null) => void;\n  onViewChange?: (view: { year: number; month: number }) => void;\n}) {\n  const today = todayStr();\n  const initial = splitDateTime(value?.[0]);\n  const base = initial.date || today;\n  const [y, setY] = useState(Number(base.split('-')[0]));\n  const [m, setM] = useState(Number(base.split('-')[1]));\n  // start/end는 날짜(YYYY-MM-DD)만 보관 — 그리드 로직은 시간과 무관하게 동작한다\n  const [start, setStart] = useState<string | null>(initial.date);\n  const [end, setEnd] = useState<string | null>(splitDateTime(value?.[1]).date);\n  const [hover, setHover] = useState<string | null>(null);\n  // 시:분은 2자리 미만 입력도 허용하기 위해 문자열로 관리하고 emit/blur 시 패딩한다\n  const [sH, setSH] = useState(initial.hour);\n  const [sM, setSM] = useState(initial.minute);\n  const [eH, setEH] = useState(splitDateTime(value?.[1]).hour);\n  const [eM, setEM] = useState(splitDateTime(value?.[1]).minute);\n  /** 직접 emit한 값이 value로 되돌아오는 에코를 구분해 시간 입력 clobber를 막는다 */\n  const lastEmitted = useRef<string>('');\n\n  useEffect(() => {\n    // 자신이 emit한 값이 그대로 돌아온 경우(에코)에는 시간 입력 상태를 건드리지 않는다\n    if (useTimePicker && JSON.stringify(value) === lastEmitted.current) return;\n    const s = splitDateTime(value?.[0]);\n    const e = splitDateTime(value?.[1]);\n    setStart(s.date);\n    setEnd(e.date);\n    setSH(s.hour);\n    setSM(s.minute);\n    setEH(e.hour);\n    setEM(e.minute);\n  }, [value, useTimePicker]);\n\n  // 네비게이션: 상단 연도(±1년) + 패널별 월(좌=이전/우=다음) + 오늘 (원본 sd-date-range-picker-calendar)\n  const setBase = (ny: number, nm: number) => {\n    setY(ny);\n    setM(nm);\n    onViewChange?.({ year: ny, month: nm });\n  };\n  const goPrevYear = () => setBase(y - 1, m);\n  const goNextYear = () => setBase(y + 1, m);\n  const goPrevMonth = () => {\n    const n = calcYearMonth(y, m, 'prev');\n    setBase(n.year, n.month);\n  };\n  const goNextMonth = () => {\n    const n = calcYearMonth(y, m, 'next');\n    setBase(n.year, n.month);\n  };\n  const goToday = () => {\n    const [ty, tm] = today.split('-');\n    setBase(Number(ty), Number(tm));\n  };\n  const nextMonthYM = calcYearMonth(y, m, 'next');\n\n  const addDays = (iso: string, n: number) => {\n    const [Y, M, D] = iso.split('-').map(Number);\n    const dt = new Date(Y, M - 1, D + n);\n    return formatDate(dt.getFullYear(), dt.getMonth() + 1, dt.getDate());\n  };\n\n  const isDisabled = (d: string) => {\n    if (selectable) {\n      const [s, e] = selectable;\n      if (s !== '' && d < s) return true;\n      if (e !== '' && d > e) return true;\n    }\n    // 원본: pendingStart 기준 ±maxRange 대칭 범위 밖은 비활성\n    if (maxRange && maxRange > 0 && start && !end) {\n      if (d < addDays(start, -maxRange) || d > addDays(start, maxRange)) return true;\n    }\n    return false;\n  };\n\n  // 선택 상태 계산 (원본 getRangeState). start만 있으면 pending(프리뷰), start&&end면 확정.\n  const complete = !!(start && end);\n  const rStart = start;\n  const previewEnd = !complete && start && hover && hover >= start ? hover : null;\n  const rEnd = complete ? end : previewEnd;\n  const hasRange = !!(rStart && rEnd && rStart !== rEnd);\n  const inRange = (d: string) => !!(rStart && rEnd && d > rStart && d < rEnd);\n  const RANGE_BG = 'var(--cmp-datepicker-calendar-range-bg)';\n\n  const pad = (v: string) => String(Number(v) || 0).padStart(2, '0');\n\n  /** 날짜 범위(+ useTimePicker면 시:분)를 결합해 상위로 전달 */\n  const emit = (\n    dateStart: string,\n    dateEnd: string,\n    time?: { sH: string; sM: string; eH: string; eM: string },\n  ) => {\n    const t = time ?? { sH, sM, eH, eM };\n    const range: [string, string] = useTimePicker\n      ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`]\n      : [dateStart, dateEnd];\n    lastEmitted.current = JSON.stringify(range);\n    onSelect(range);\n  };\n\n  // 원본: pendingStart 없거나 확정됐거나 \"이전 날짜\" 클릭 시 → 시작점 리셋(정방향만). 이후 클릭이 >= start면 확정.\n  const click = (d: string) => {\n    if (isDisabled(d)) return;\n    if (!start || complete || d < start) {\n      setStart(d);\n      setEnd(null);\n      setHover(null);\n      // 새 범위 선택을 시작하면 시작=00:00, 종료=23:59(하루 전체)로 초기화\n      if (useTimePicker) {\n        setSH('00');\n        setSM('00');\n        setEH('23');\n        setEM('59');\n      }\n      onPendingStartChange?.(d);\n      return;\n    }\n    setEnd(d);\n    onPendingStartChange?.(null);\n    // 종료 기본값은 23:59(하루 끝)\n    emit(start, d, useTimePicker ? { sH, sM, eH: '23', eM: '59' } : undefined);\n  };\n\n  /** 시:분 입력 — 숫자만/2자리로 제한하고 범위(시 0~23, 분 0~59)로 클램프한 뒤, 범위 확정 상태면 재emit */\n  const changeTime = (which: 'start' | 'end', part: 'h' | 'm', raw: string) => {\n    const digits = raw.replace(/\\D/g, '').slice(0, 2);\n    const max = part === 'h' ? 23 : 59;\n    const next = digits !== '' && Number(digits) > max ? String(max) : digits;\n    const nextTime = { sH, sM, eH, eM };\n    if (which === 'start') nextTime[part === 'h' ? 'sH' : 'sM'] = next;\n    else nextTime[part === 'h' ? 'eH' : 'eM'] = next;\n    setSH(nextTime.sH);\n    setSM(nextTime.sM);\n    setEH(nextTime.eH);\n    setEM(nextTime.eM);\n    if (start && end) emit(start, end, nextTime);\n  };\n\n  const blurTime = (which: 'start' | 'end', part: 'h' | 'm') => {\n    if (which === 'start') {\n      if (part === 'h') setSH(pad(sH));\n      else setSM(pad(sM));\n    } else {\n      if (part === 'h') setEH(pad(eH));\n      else setEM(pad(eM));\n    }\n  };\n\n  const GRID_COLS = 'grid grid-cols-[repeat(7,var(--cmp-datepicker-calendar-day-width))]';\n  const renderPanel = (gy: number, gm: number, isLeft: boolean) => (\n    <div className=\"flex flex-col gap-[var(--cmp-datepicker-calendar-gap)]\">\n      {/* 월 네비 헤더 (좌패널=이전달만, 우패널=다음달만; 안쪽 화살표는 숨김 placeholder) */}\n      <div className=\"flex w-full items-center gap-[var(--cmp-datepicker-calendar-gap)]\">\n        <SGhostButton\n          icon=\"chevronLeft\"\n          size=\"xxs\"\n          ariaLabel=\"prevMonth\"\n          onClick={goPrevMonth}\n          className={cn(!isLeft && 'invisible pointer-events-none')}\n        />\n        <span className=\"inline-flex min-w-[40px] flex-1 items-center justify-center text-center text-[14px] font-medium leading-[24px]\">\n          {gy}.{String(gm).padStart(2, '0')}\n        </span>\n        <SGhostButton\n          icon=\"chevronRight\"\n          size=\"xxs\"\n          ariaLabel=\"nextMonth\"\n          onClick={goNextMonth}\n          className={cn(isLeft && 'invisible pointer-events-none')}\n        />\n      </div>\n      <div className={GRID_COLS}>\n        {WEEK_LABELS.map(l => (\n          <span\n            key={l}\n            className=\"flex h-[20px] items-center justify-center text-[12px] font-normal text-[color:var(--cmp-datepicker-calendar-week-color)]\"\n          >\n            {l}\n          </span>\n        ))}\n      </div>\n      <div className={cn(GRID_COLS, 'gap-y-[var(--cmp-datepicker-calendar-grid-rowGap)]')}>\n        {monthCells(gy, gm).map(cell => {\n          // 선택 원(edge): 시작은 항상, 끝은 확정 상태에서만 (프리뷰 끝 셀은 배경만, 원 없음)\n          const isEdge =\n            cell.inCurrentMonth && (cell.date === rStart || (complete && cell.date === rEnd));\n          const between = cell.inCurrentMonth && inRange(cell.date);\n          const disabled = cell.inCurrentMonth && isDisabled(cell.date);\n          const isToday = cell.inCurrentMonth && today === cell.date;\n          // 범위 채우기(원본): 중간=전체, 시작=오른쪽 절반, 끝=전체(range-end full)\n          let cellBg: string | undefined;\n          if (between) cellBg = RANGE_BG;\n          else if (cell.inCurrentMonth && hasRange && cell.date === rStart)\n            cellBg = `linear-gradient(to right, transparent 50%, ${RANGE_BG} 50%)`;\n          else if (cell.inCurrentMonth && hasRange && cell.date === rEnd) cellBg = RANGE_BG;\n          return (\n            <div\n              key={cell.date}\n              className=\"flex h-[var(--cmp-datepicker-calendar-range-height)] w-[var(--cmp-datepicker-calendar-day-width)] items-center justify-center\"\n              style={{ background: cellBg }}\n            >\n              <button\n                type=\"button\"\n                disabled={!cell.inCurrentMonth || disabled}\n                onMouseEnter={() => setHover(cell.date)}\n                onClick={() => cell.inCurrentMonth && click(cell.date)}\n                className={cn(\n                  'relative z-[1] flex h-[var(--cmp-datepicker-calendar-day-circle-size)] w-[var(--cmp-datepicker-calendar-day-circle-size)] items-center justify-center rounded-[var(--cmp-datepicker-calendar-day-circle-radius)] border border-solid border-transparent bg-transparent text-[14px]',\n                  !cell.inCurrentMonth\n                    ? 'invisible pointer-events-none'\n                    : disabled\n                      ? 'cursor-not-allowed'\n                      : 'cursor-pointer',\n                  isEdge\n                    ? 'bg-[var(--cmp-datepicker-calendar-day-select-bg)] text-[color:var(--cmp-datepicker-calendar-day-select-text)]'\n                    : disabled\n                      ? 'text-[color:var(--cmp-datepicker-calendar-day-disabled-text)]'\n                      : 'text-[color:var(--cmp-datepicker-calendar-day-default-text)] hover:border-[color:var(--cmp-datepicker-calendar-day-hover-border)] hover:text-[color:var(--cmp-datepicker-calendar-day-hover-text)]',\n                  isToday && !disabled && 'font-bold',\n                )}\n              >\n                {cell.inCurrentMonth ? cell.day : ''}\n              </button>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n\n  const renderTimeSection = (which: 'start' | 'end', date: string | null, suffix: string) => {\n    const active = !!date;\n    const [yy = '', mm = '', dd = ''] = date ? date.split('-') : [];\n    const hour = which === 'start' ? sH : eH;\n    const minute = which === 'start' ? sM : eM;\n    const num = (n: string, strip: boolean) =>\n      active && n !== '' ? (strip ? String(Number(n)) : n) : '-';\n    const INPUT_CLS =\n      'h-[var(--cmp-datepicker-sm-height)] w-[40px] rounded-[var(--cmp-datepicker-sm-radius)] border border-solid border-[color:var(--cmp-datepicker-border-default)] bg-[var(--cmp-datepicker-bg-default)] text-center text-[12px] font-medium leading-[20px] text-[color:var(--cmp-datepicker-text-default)] outline-none placeholder:text-[color:var(--cmp-datepicker-text-disabled)] focus:border-[color:var(--cmp-datepicker-border-focus)] disabled:cursor-not-allowed';\n    const LABEL = 'text-[color:var(--cmp-datepicker-calendar-time-date-label)]';\n    const UNIT = 'text-[color:var(--cmp-datepicker-calendar-time-date-unit)]';\n    return (\n      <div\n        className={cn(\n          'flex flex-1 items-center justify-center gap-[var(--cmp-datepicker-calendar-time-section-gap)] rounded-[var(--cmp-datepicker-calendar-time-radius)] px-[var(--cmp-datepicker-calendar-time-paddingX)] py-[var(--cmp-datepicker-calendar-time-paddingY)] text-[12px] font-medium leading-[20px]',\n          active\n            ? 'bg-[var(--cmp-datepicker-calendar-time-bg-selected)]'\n            : 'bg-[var(--cmp-datepicker-calendar-time-bg-default)]',\n        )}\n      >\n        <div className=\"inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-date-gap)]\">\n          <span className={LABEL}>{num(yy, false)}</span>\n          <span className={UNIT}>년</span>\n          <span className={LABEL}>{num(mm, true)}</span>\n          <span className={UNIT}>월</span>\n          <span className={LABEL}>{num(dd, true)}</span>\n          <span className={UNIT}>일</span>\n        </div>\n        <div className=\"inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-unit-gap)]\">\n          <input\n            type=\"text\"\n            inputMode=\"numeric\"\n            maxLength={2}\n            aria-label={`${suffix} 시`}\n            disabled={!active}\n            value={active ? hour : ''}\n            placeholder=\"--\"\n            onChange={e => changeTime(which, 'h', e.target.value)}\n            onBlur={() => blurTime(which, 'h')}\n            className={INPUT_CLS}\n          />\n          <span className={LABEL}>:</span>\n          <input\n            type=\"text\"\n            inputMode=\"numeric\"\n            maxLength={2}\n            aria-label={`${suffix} 분`}\n            disabled={!active}\n            value={active ? minute : ''}\n            placeholder=\"--\"\n            onChange={e => changeTime(which, 'm', e.target.value)}\n            onBlur={() => blurTime(which, 'm')}\n            className={INPUT_CLS}\n          />\n        </div>\n        <span className={UNIT}>{suffix}</span>\n      </div>\n    );\n  };\n\n  return (\n    <div\n      className={cn(\n        'inline-flex flex-col gap-[var(--cmp-datepicker-calendar-gap)] rounded-[var(--cmp-datepicker-calendar-radius)] bg-[var(--cmp-datepicker-calendar-bg)] p-[var(--cmp-datepicker-calendar-paddingXY)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.2)] select-none',\n        useTimePicker ? 'h-auto' : 'h-[364px]',\n      )}\n    >\n      {/* 상단 바: 연도 네비(중앙) + 오늘 버튼(우측) */}\n      <div className=\"relative flex items-center justify-center\">\n        <div className=\"flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] text-[14px] font-medium leading-[24px]\">\n          <SGhostButton icon=\"chevronLeft\" size=\"xxs\" ariaLabel=\"prevYear\" onClick={goPrevYear} />\n          <span className=\"inline-flex min-w-[40px] items-center justify-center text-center\">\n            {y}\n          </span>\n          <SGhostButton icon=\"chevronRight\" size=\"xxs\" ariaLabel=\"nextYear\" onClick={goNextYear} />\n        </div>\n        <button\n          type=\"button\"\n          onClick={goToday}\n          className=\"absolute right-0 h-[24px] min-w-[37px] cursor-pointer bg-transparent text-center text-[12px] font-medium leading-[24px] text-[color:var(--cmp-datepicker-calendar-day-default-text)] hover:underline\"\n        >\n          오늘\n        </button>\n      </div>\n      {/* 듀얼 패널 */}\n      <div className=\"flex gap-[var(--cmp-datepicker-calendar-range-panelGap)]\">\n        {renderPanel(y, m, true)}\n        <SDivider vertical />\n        {renderPanel(nextMonthYM.year, nextMonthYM.month, false)}\n      </div>\n      {/* 시간(시:분) 선택 푸터 — 시작(부터)/종료(까지) 섹션 */}\n      {useTimePicker && (\n        <>\n          <SDivider />\n          <div className=\"flex gap-[var(--cmp-datepicker-calendar-time-gap)]\">\n            {renderTimeSection('start', start, '부터')}\n            {renderTimeSection('end', end, '까지')}\n          </div>\n        </>\n      )}\n    </div>\n  );\n}\n\n/** SDateRangePicker — sd-date-range-picker 포팅. SField + SPopover(범위 캘린더). */\nexport function SDateRangePicker({\n  value,\n  onValueChange,\n  onViewChange,\n  size = 'sm',\n  placeholder = 'YYYY-MM-DD ~ YYYY-MM-DD',\n  selectable,\n  maxRange,\n  useTimePicker = false,\n  disabled = false,\n  width,\n  name,\n  rules,\n  status,\n  label,\n  labelWidth,\n  icon,\n  iconColor,\n  labelTooltip,\n  labelTooltipProps,\n  addonLabel,\n  addonAlign,\n  hint,\n  error,\n  errorMessage,\n  className,\n  style,\n}: SDateRangePickerProps) {\n  const portalContainer = usePortalContainer();\n  const [open, setOpen] = useState(false);\n  const [ruleError, setRuleError] = useState('');\n  const [pendingStart, setPendingStart] = useState<string | null>(null);\n  const hasValue = value != null && value[0] !== '' && value[1] !== '';\n  // 시작일만 고른 상태면 `start ~` 프리뷰가 확정 값보다 우선\n  const hasDisplay = pendingStart != null || hasValue;\n  // `~`를 필드 중앙에 고정하기 위해 좌(시작)/우(종료)로 분리\n  const startText = pendingStart ?? (hasValue ? value![0] : '');\n  const endText = pendingStart ? '' : hasValue ? value![1] : '';\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(value, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n  // 트리거 치수 (sd-date-picker-trigger 재사용 — DATEPICKER_SIZE_MAP)\n  const dims =\n    size === 'md'\n      ? { padX: 16, gap: 12, icon: 20, minW: 104, fontSize: 14, lineHeight: 24, radius: 6 }\n      : { padX: 12, gap: 8, icon: 16, minW: 80, fontSize: 12, lineHeight: 20, radius: 4 };\n\n  const select = (r: [string, string]) => {\n    setPendingStart(null);\n    onValueChange?.(r);\n    if (rules && rules.length > 0) setRuleError(runRules(r, rules));\n    // 시간 선택 모드에서는 사용자가 시:분을 조정할 수 있도록 드롭다운을 닫지 않는다\n    if (!useTimePicker) setOpen(false);\n  };\n  // placeholder 미지정 + 시간 선택 모드이면 시:분 포함 기본 placeholder 사용\n  const resolvedPlaceholder =\n    useTimePicker && placeholder === 'YYYY-MM-DD ~ YYYY-MM-DD'\n      ? 'YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm'\n      : placeholder;\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      size={size}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={open}\n      errorMessage={ruleError !== '' ? ruleError : errorMessage}\n      width={width}\n      disabled={disabled}\n      className={className}\n      style={style}\n    >\n      <RPopover.Root\n        open={open}\n        onOpenChange={o => {\n          if (disabled) return;\n          setOpen(o);\n          // 종료일 미선택 상태로 닫으면 프리뷰 취소(확정 값으로 복귀)\n          if (!o) setPendingStart(null);\n        }}\n      >\n        <RPopover.Trigger asChild>\n          <button\n            type=\"button\"\n            name={name}\n            disabled={disabled}\n            className=\"flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed\"\n            style={{ padding: `0 ${dims.padX}px`, gap: dims.gap, borderRadius: dims.radius }}\n          >\n            {/* 원본: 아이콘(왼쪽, 고정) + 텍스트(flex:1, 중앙정렬, ellipsis) */}\n            <SIcon\n              name=\"date\"\n              size={dims.icon}\n              color={\n                disabled\n                  ? 'var(--cmp-datepicker-icon-disabled)'\n                  : 'var(--cmp-datepicker-icon-default)'\n              }\n              className=\"flex-shrink-0\"\n            />\n            <span\n              className={cn(\n                'flex-1 items-center',\n                hasDisplay ? 'flex' : 'block truncate text-center',\n              )}\n              style={{\n                minWidth: dims.minW,\n                fontSize: dims.fontSize,\n                lineHeight: `${dims.lineHeight}px`,\n                color: disabled\n                  ? 'var(--cmp-datepicker-text-disabled)'\n                  : hasDisplay\n                    ? 'var(--cmp-datepicker-text-default)'\n                    : 'var(--cmp-field-hint-color)',\n              }}\n            >\n              {hasDisplay ? (\n                <>\n                  <span className=\"min-w-0 flex-1 truncate text-right\">{startText}</span>\n                  <span className=\"px-[4px]\">~</span>\n                  <span className=\"min-w-0 flex-1 truncate text-left\">{endText}</span>\n                </>\n              ) : (\n                resolvedPlaceholder\n              )}\n            </span>\n          </button>\n        </RPopover.Trigger>\n        <RPopover.Portal container={portalContainer}>\n          <RPopover.Content\n            side=\"bottom\"\n            align=\"start\"\n            sideOffset={4}\n            className={cn('z-50', FLOATING_SLIDE_ANIM)}\n          >\n            <RangeCalendar\n              value={value ?? null}\n              selectable={selectable}\n              maxRange={maxRange}\n              useTimePicker={useTimePicker}\n              onSelect={select}\n              onPendingStartChange={setPendingStart}\n              onViewChange={onViewChange}\n            />\n          </RPopover.Content>\n        </RPopover.Portal>\n      </RPopover.Root>\n    </SField>\n  );\n}\n","'use client';\n\nimport {\n  forwardRef,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n  type CSSProperties,\n  type KeyboardEvent,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport { runRules, type Rule } from '../../lib/form';\nimport { withDisplayName } from '../../lib/display-name';\nimport { SGhostButton } from '../SGhostButton';\n\nexport interface SChipProps {\n  /** 폼 연동용 name */\n  name?: string;\n  /** 칩 텍스트 값 */\n  value?: string;\n  /** 에러 상태 */\n  error?: boolean;\n  /** 비활성 */\n  disabled?: boolean;\n  /** 인라인 편집 가능 (기본값 false) */\n  editable?: boolean;\n  /** 닫기 버튼 표시 */\n  showRemove?: boolean;\n  /** 편집 중 placeholder */\n  placeholder?: string;\n  /** 유효성 규칙 */\n  rules?: Rule[];\n  /** 편집 완료 (sdUpdate) */\n  onValueChange?: (value: string) => void;\n  /** 삭제 (sdRemove) */\n  onRemove?: () => void;\n  /** 편집 진입 (sdFocus) */\n  onFocus?: () => void;\n  /** 편집 이탈 (sdBlur) */\n  onBlur?: () => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** ref로 노출되는 UX 메서드 (sd-chip @Method sdFocus/sdGetNativeElement 대응) */\nexport interface SChipHandle {\n  /** 편집 input에 포커스합니다. */\n  focus: () => void;\n  /** 네이티브 편집 엘리먼트를 반환합니다. */\n  getNativeElement: () => HTMLElement | null;\n}\n\n/** SChip — sd-chip 포팅. 인라인 편집(contentEditable) + 삭제 버튼. */\nconst SChipImpl = forwardRef<SChipHandle, SChipProps>(function SChip(\n  {\n    name,\n    value = '',\n    error: errorProp = false,\n    disabled = false,\n    editable = false,\n    showRemove = true,\n    placeholder = '',\n    rules,\n    onValueChange,\n    onRemove,\n    onFocus,\n    onBlur,\n    className,\n    style,\n  },\n  ref,\n) {\n  const [editing, setEditing] = useState(false);\n  const [error, setError] = useState(errorProp);\n  const inputRef = useRef<HTMLSpanElement>(null);\n  const draftRef = useRef(value);\n\n  useEffect(() => setError(errorProp), [errorProp]);\n\n  // 편집 진입 시 포커스 + 텍스트 세팅 + 커서 끝\n  useEffect(() => {\n    if (editing && inputRef.current) {\n      const el = inputRef.current;\n      el.textContent = draftRef.current;\n      el.focus();\n      const range = document.createRange();\n      range.selectNodeContents(el);\n      range.collapse(false);\n      const sel = window.getSelection();\n      sel?.removeAllRanges();\n      sel?.addRange(range);\n    }\n  }, [editing]);\n\n  const isEditable = editable !== false && !disabled;\n\n  const enterEdit = () => {\n    if (!isEditable || editing) return;\n    draftRef.current = value;\n    setEditing(true);\n    onFocus?.();\n  };\n\n  useImperativeHandle(ref, () => ({\n    // 편집 중이면 input에 바로 포커스, 아니면 편집 모드 진입(진입 시 자동 포커스)\n    focus: () => {\n      if (disabled) return;\n      if (editing) inputRef.current?.focus();\n      else enterEdit();\n    },\n    getNativeElement: () => inputRef.current,\n  }));\n\n  const commit = () => {\n    if (!editing) return;\n    const next = (inputRef.current?.textContent ?? draftRef.current).trim();\n    const changed = next !== draftRef.current;\n    setEditing(false);\n    if (changed) onValueChange?.(next);\n    if (rules && rules.length > 0) setError(runRules(next, rules) !== '');\n    onBlur?.();\n  };\n\n  const cancel = () => {\n    if (!editing) return;\n    setEditing(false);\n    onBlur?.();\n  };\n\n  const onInputKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n    if (e.key === 'Enter') {\n      e.preventDefault();\n      e.stopPropagation();\n      commit();\n    } else if (e.key === 'Escape') {\n      e.preventDefault();\n      e.stopPropagation();\n      cancel();\n    }\n  };\n\n  // disabled 는 전용 bg/content 토큰을 가진 독립 상태라 error·editing 보다 우선한다\n  // (opacity 로 겹쳐 흐리는 대신 토큰 색을 그대로 쓴다).\n  const bg = disabled\n    ? 'var(--cmp-chip-bg-disabled)'\n    : error\n      ? 'var(--cmp-chip-bg-error)'\n      : editing\n        ? 'var(--cmp-chip-bg-focus)'\n        : 'var(--cmp-chip-bg-default)';\n  const content = disabled\n    ? 'var(--cmp-chip-content-disabled)'\n    : error\n      ? 'var(--cmp-chip-content-error)'\n      : editing\n        ? 'var(--cmp-chip-content-focus)'\n        : 'var(--cmp-chip-content-default)';\n  const borderColor = editing && !error ? 'var(--cmp-chip-border-focus)' : 'transparent';\n\n  return (\n    // 외곽 span 은 비상호작용 컨테이너다. 편집 진입 트리거는 값 텍스트의 실제 <button>\n    // 이 담당하고, remove 는 형제 <button> 으로 둔다 — role=\"button\" 안에 버튼을 넣던\n    // 상호작용 요소 중첩을 제거한다. (네이티브 button 이 Enter/Space 키보드를 처리)\n    <span\n      aria-disabled={disabled ? 'true' : undefined}\n      className={cn(\n        'box-border inline-flex h-[var(--cmp-chip-height)] max-w-full items-center justify-center gap-[var(--cmp-chip-gap)] overflow-hidden whitespace-nowrap border-[length:var(--cmp-chip-border-width)] border-solid px-[var(--cmp-chip-paddingX)] text-[12px] leading-[20px] select-none',\n        editing ? 'font-normal' : 'font-medium',\n        disabled ? 'cursor-not-allowed' : '',\n        className,\n      )}\n      style={{\n        borderRadius: 'var(--cmp-chip-radius)',\n        background: bg,\n        color: content,\n        borderColor,\n        ...style,\n      }}\n    >\n      {editing ? (\n        <span\n          ref={inputRef}\n          role=\"textbox\"\n          contentEditable={!disabled}\n          suppressContentEditableWarning\n          spellCheck={false}\n          data-name={name || undefined}\n          data-placeholder={placeholder}\n          onKeyDown={onInputKeyDown}\n          onBlur={commit}\n          onClick={e => e.stopPropagation()}\n          onPaste={e => {\n            e.preventDefault();\n            const text = e.clipboardData?.getData('text/plain') ?? '';\n            document.execCommand('insertText', false, text);\n          }}\n          className=\"inline-block min-w-[1ch] cursor-text bg-transparent whitespace-nowrap text-inherit outline-none [font:inherit] empty:before:pointer-events-none empty:before:opacity-60 empty:before:content-[attr(data-placeholder)]\"\n        />\n      ) : (\n        <>\n          {isEditable ? (\n            <button\n              type=\"button\"\n              onClick={enterEdit}\n              className=\"inline-flex min-w-0 cursor-text items-center overflow-hidden bg-transparent text-ellipsis [font:inherit] text-inherit\"\n            >\n              {value}\n            </button>\n          ) : (\n            <span className=\"inline-flex min-w-0 items-center overflow-hidden text-ellipsis\">\n              {value}\n            </span>\n          )}\n          {!disabled && showRemove && (\n            <SGhostButton\n              icon=\"close\"\n              size=\"xxs\"\n              ariaLabel=\"remove\"\n              onClick={e => {\n                e.stopPropagation();\n                onRemove?.();\n              }}\n            />\n          )}\n        </>\n      )}\n    </span>\n  );\n});\n\nexport const SChip = withDisplayName(SChipImpl, 'SChip');\n","'use client';\n\nimport { useId, useRef, useState, type CSSProperties } from 'react';\nimport * as Ariakit from '@ariakit/react';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { type SColor } from '../../lib/color';\nimport { SGhostButton } from '../SGhostButton';\nimport { SChip } from '../SChip';\nimport { cn } from '../../lib/cn';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { type STooltipProps } from '../STooltip';\n\nexport type SFilePickerValue = File[] | File | null;\nexport type SFilePickerRejectReason = 'max-file-size' | 'max-total-size' | 'max-files';\n\nexport interface SFilePickerProps {\n  value?: SFilePickerValue;\n  /** 파일 변경 (sdUpdate) */\n  onValueChange?: (value: SFilePickerValue) => void;\n  /** 제한 초과 거부 (sdReject) */\n  onReject?: (detail: { files: File[]; reason: SFilePickerRejectReason }) => void;\n  placeholder?: string;\n  disabled?: boolean;\n  /** 포커스 상태 여부 */\n  focused?: boolean;\n  /** 호버 상태 여부 */\n  hovered?: boolean;\n  /** 인라인 표시 — SField 테두리 박스만 사라지고 label/rules/hint 는 그대로 동작 */\n  inline?: boolean;\n  multiple?: boolean;\n  /** multiple 파일 목록을 필드 아래 칩 대신, caret(▼) 클릭 시 열리는 리스트박스 카드로 표시 (바깥 클릭 시 닫힘) */\n  useMultipleListBox?: boolean;\n  accept?: string;\n  maxFileSize?: number | string;\n  maxTotalSize?: number | string;\n  maxFiles?: number | string;\n  name?: string;\n  rules?: Rule[];\n  status?: SFieldStatus;\n  size?: SFieldSize;\n  // ── SField ──\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  width?: number | string;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst toBytes = (v?: number | string) =>\n  v == null ? undefined : typeof v === 'string' ? Number(v) : v;\n\n/** SFilePicker — sd-file-picker 포팅. 단일/다중 파일 + 크기·개수 검증 + 칩 목록. */\nexport function SFilePicker({\n  value = null,\n  onValueChange,\n  onReject,\n  placeholder = 'Click to upload',\n  disabled = false,\n  focused = false,\n  hovered = false,\n  inline = false,\n  multiple = false,\n  useMultipleListBox = false,\n  accept,\n  maxFileSize,\n  maxTotalSize,\n  maxFiles,\n  name,\n  rules,\n  status,\n  size = 'sm',\n  label,\n  labelWidth,\n  icon,\n  iconColor,\n  labelTooltip,\n  labelTooltipProps,\n  addonLabel,\n  addonAlign = 'start',\n  hint,\n  error,\n  errorMessage,\n  width,\n  className,\n  style,\n}: SFilePickerProps) {\n  const autoId = useId();\n  const resolvedName = name ?? autoId;\n  const inputRef = useRef<HTMLInputElement>(null);\n  const contentBoxRef = useRef<HTMLDivElement>(null);\n  const [ruleError, setRuleError] = useState('');\n  const [listOpen, setListOpen] = useState(false);\n  const portalContainer = usePortalContainer();\n  const files = multiple\n    ? Array.isArray(value)\n      ? value\n      : []\n    : value && !Array.isArray(value)\n      ? value\n      : null;\n  const hasFiles = multiple ? (files as File[]).length > 0 : !!files;\n  const displayText = !hasFiles\n    ? placeholder\n    : multiple\n      ? (files as File[]).map(f => f.name).join(', ')\n      : (files as File).name;\n\n  // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(files, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const validate = (\n    arr: File[],\n    existing = 0,\n  ): { accepted: File[]; rejected: File[]; reason?: SFilePickerRejectReason } => {\n    const mfs = toBytes(maxFileSize),\n      mts = toBytes(maxTotalSize),\n      mf = maxFiles != null ? Number(maxFiles) : undefined;\n    if (mf != null && existing + arr.length > mf)\n      return { accepted: [], rejected: arr, reason: 'max-files' };\n    if (mfs != null) {\n      const over = arr.filter(f => f.size > mfs);\n      if (over.length) return { accepted: [], rejected: over, reason: 'max-file-size' };\n    }\n    if (mts != null && arr.reduce((s, f) => s + f.size, 0) > mts)\n      return { accepted: [], rejected: arr, reason: 'max-total-size' };\n    return { accepted: arr, rejected: [] };\n  };\n\n  const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const list = e.target.files;\n    if (!list || list.length === 0) return;\n    const arr = Array.from(list);\n    if (inputRef.current) inputRef.current.value = '';\n    if (multiple) {\n      const existing = Array.isArray(value) ? value : [];\n      const { accepted, rejected, reason } = validate(arr, existing.length);\n      if (reason) {\n        onReject?.({ files: rejected, reason });\n        return;\n      }\n      const merged = [...existing, ...accepted];\n      onValueChange?.(merged);\n      if (rules?.length) setRuleError(runRules(merged, rules));\n    } else {\n      const { accepted, rejected, reason } = validate(arr);\n      if (reason) {\n        onReject?.({ files: rejected, reason });\n        return;\n      }\n      onValueChange?.(accepted[0]);\n      if (rules?.length) setRuleError(runRules(accepted[0], rules));\n    }\n  };\n\n  const clear = (e: React.MouseEvent) => {\n    e.stopPropagation();\n    if (disabled) return;\n    onValueChange?.(multiple ? [] : null);\n    setListOpen(false);\n  };\n  const removeChip = (i: number) => {\n    const next = (files as File[]).filter((_, idx) => idx !== i);\n    onValueChange?.(next);\n    // 리스트박스에서 마지막 파일을 지우면 caret 이 사라지므로 함께 닫는다.\n    if (next.length === 0) setListOpen(false);\n  };\n  const open = () => {\n    if (!disabled) inputRef.current?.click();\n  };\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedStatus =\n    status ?? (rules?.length ? (ruleError !== '' ? 'error' : undefined) : undefined);\n  const padX =\n    size === 'md' ? 'var(--cmp-filepicker-md-paddingX)' : 'var(--cmp-filepicker-sm-paddingX)';\n  const iconSize = size === 'md' ? 20 : 16;\n\n  const gapCls =\n    size === 'md' ? 'gap-[var(--cmp-filepicker-md-gap)]' : 'gap-[var(--cmp-filepicker-sm-gap)]';\n\n  // inline 모드도 SField 를 그대로 사용한다(label/rules/hint/errorMessage 동작 동일).\n  // 차이는 테두리 박스(border/배경/패딩)가 사라지는 것뿐이고,\n  // placeholder 텍스트는 hover 시 기본 텍스트 색으로 진해진다.\n  const inlinePlaceholder = inline && !disabled && !hasFiles;\n\n  const showListbox = multiple && useMultipleListBox;\n  const filesArr = multiple ? (files as File[]) : [];\n\n  // 열기 트리거는 실제 <button> 으로 두고, clear/caret 버튼은 형제로 분리한다.\n  // (role=\"button\" 안에 SGhostButton(<button>) 을 넣던 상호작용 요소 중첩 제거.)\n  const contentInner = (\n    <div\n      ref={contentBoxRef}\n      className={cn('group/filepicker flex h-full w-full items-center', gapCls)}\n      style={{ padding: inline ? 0 : `0 ${padX}` }}\n    >\n      <input\n        ref={inputRef}\n        type=\"file\"\n        className=\"hidden\"\n        disabled={disabled}\n        multiple={multiple}\n        accept={accept}\n        name={resolvedName}\n        onChange={onChange}\n        aria-label={placeholder}\n      />\n      <button\n        type=\"button\"\n        disabled={disabled}\n        onClick={open}\n        aria-label={placeholder}\n        className={cn(\n          'flex min-w-0 flex-1 items-center bg-transparent text-left',\n          gapCls,\n          disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n        )}\n      >\n        <SIcon\n          name=\"attachFile\"\n          size={iconSize}\n          color={disabled ? 'var(--cmp-filepicker-icon-disabled)' : 'var(--color-grey-65)'}\n        />\n        <span\n          className={cn(\n            'min-w-0 flex-1 truncate text-[12px]',\n            inlinePlaceholder &&\n              'text-[color:var(--cmp-filepicker-text-placeholder)] transition-colors group-hover/filepicker:text-[color:var(--cmp-filepicker-text-default)]',\n          )}\n          style={\n            inlinePlaceholder\n              ? undefined\n              : {\n                  color: disabled\n                    ? 'var(--cmp-filepicker-text-disabled)'\n                    : hasFiles\n                      ? 'var(--cmp-filepicker-text-default)'\n                      : 'var(--cmp-filepicker-text-placeholder)',\n                }\n          }\n        >\n          {displayText}\n        </span>\n      </button>\n      {/* useMultipleListBox: caret(▼) 클릭 시 파일 목록 리스트박스 토글 */}\n      {showListbox && hasFiles && !disabled && (\n        <Ariakit.PopoverDisclosure\n          render={<SGhostButton icon=\"caretDown\" size=\"xxs\" ariaLabel=\"toggle file list\" />}\n          className={cn('shrink-0 transition-transform duration-150', listOpen && 'rotate-180')}\n        />\n      )}\n      {!disabled && hasFiles && (\n        <SGhostButton icon=\"close\" size=\"xxs\" ariaLabel=\"clear\" onClick={clear} />\n      )}\n    </div>\n  );\n\n  // useMultipleListBox: caret 클릭 시 열리는 파일 목록 카드.\n  // sd-select-listbox 와 동일한 배경/radius/그림자, 칩을 세로로 나열하며 바깥 클릭 시 닫힌다.\n  // 위치·너비는 caret(disclosure) 이 아니라 SField 입력 박스(contentBoxRef)에 맞춘다.\n  // - getAnchorRect: 입력 박스 좌측 하단에 정렬 (caret 아래가 아님)\n  // - minWidth: 최소 입력 박스 너비 (긴 파일명은 그 이상으로 늘어날 수 있음)\n  const content = showListbox ? (\n    <Ariakit.PopoverProvider open={listOpen} setOpen={setListOpen} placement=\"bottom-start\">\n      {contentInner}\n      <Ariakit.Popover\n        portal\n        portalElement={portalContainer}\n        gutter={4}\n        unmountOnHide\n        getAnchorRect={() => contentBoxRef.current?.getBoundingClientRect() ?? null}\n        style={{ minWidth: contentBoxRef.current?.offsetWidth }}\n        className=\"z-50 box-border flex flex-col items-start gap-[8px] rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] p-[8px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]\"\n      >\n        {filesArr.map((f, i) => (\n          <SChip key={i} value={f.name} editable={false} onRemove={() => removeChip(i)} />\n        ))}\n      </Ariakit.Popover>\n    </Ariakit.PopoverProvider>\n  ) : (\n    contentInner\n  );\n\n  // 기본(useMultipleListBox=false) multiple: 칩을 필드 아래 flex-wrap 으로 가로 나열.\n  const chips = multiple && !useMultipleListBox && filesArr.length > 0 && (\n    <div className=\"mt-[8px] flex flex-wrap gap-[8px]\">\n      {filesArr.map((f, i) => (\n        <SChip key={i} value={f.name} editable={false} onRemove={() => removeChip(i)} />\n      ))}\n    </div>\n  );\n\n  return (\n    <div className={className} style={style}>\n      <SField\n        borderless={inline}\n        label={label}\n        labelWidth={labelWidth}\n        icon={icon}\n        iconColor={iconColor}\n        labelTooltip={labelTooltip}\n        labelTooltipProps={labelTooltipProps}\n        addonLabel={addonLabel}\n        addonAlign={addonAlign}\n        size={size}\n        hint={hint}\n        error={resolvedError}\n        status={resolvedStatus}\n        focused={focused}\n        hovered={hovered}\n        errorMessage={ruleError !== '' ? ruleError : errorMessage}\n        width={width}\n        disabled={disabled}\n      >\n        {content}\n      </SField>\n      {chips}\n    </div>\n  );\n}\n","'use client';\n\nimport { Fragment, type CSSProperties, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\nimport { SIcon } from '../SIcon';\nimport { STooltip } from '../STooltip';\nimport { SButton } from '../SButton';\nimport { SInput, type SInputProps } from '../SInput';\nimport { STextarea, type STextareaProps } from '../STextarea';\nimport { SNumberInput, type SNumberInputProps } from '../SNumberInput';\nimport { SSelect, type SSelectProps } from '../SSelect';\nimport { SRadioGroup, type SRadioGroupProps } from '../SRadio';\nimport { SCheckbox, type SCheckboxProps } from '../SCheckbox';\nimport { SDatePicker, type SDatePickerProps } from '../SDatePicker';\nimport { SDateRangePicker, type SDateRangePickerProps } from '../SDateRangePicker';\nimport { SFilePicker, type SFilePickerProps } from '../SFilePicker';\n\nexport type SKeyValueFieldType =\n  | 'text'\n  | 'input'\n  | 'textarea'\n  | 'number-input'\n  | 'select'\n  | 'radio'\n  | 'checkbox'\n  | 'date-picker'\n  | 'date-range-picker'\n  | 'file-picker';\n\n/** field type과 무관한 공통 속성 (레이아웃·레이블·스팬 등) */\nexport interface SKeyValueFieldBase {\n  name: string;\n  label?: string;\n  required?: boolean;\n  helpText?: string[];\n  hideTh?: boolean;\n  thRowSpan?: number;\n  thColSpan?: number;\n  tdRowSpan?: number;\n  tdColSpan?: number;\n  thWidth?: number | string;\n  thClass?: string;\n  tdClass?: string;\n  /** 셀 커스텀 렌더 (React 확장). 지정 시 type/options는 무시되고 이 노드가 그대로 렌더됩니다. */\n  render?: ReactNode;\n}\n\n/**\n * `options`에서 제외되는 키.\n * - `onValueChange`: 테이블이 `onChange`로 승격시키므로 field 단위로 지정할 수 없습니다.\n * - `value`: 지정은 가능하나 `values` prop이 같은 name을 가지면 그쪽이 우선합니다. (타입은 유지)\n */\ntype FieldOptions<P> = Omit<P, 'onValueChange'>;\n\n/**\n * `type`에 따라 `options`가 해당 컴포넌트의 props로 좁혀지는 discriminated union.\n * `type` 생략 시 `text`로 동작합니다.\n */\nexport type SKeyValueFieldByType =\n  | { type?: 'text'; options?: { value?: ReactNode } }\n  | { type: 'input'; options?: FieldOptions<SInputProps> }\n  | { type: 'textarea'; options?: FieldOptions<STextareaProps> }\n  | { type: 'number-input'; options?: FieldOptions<SNumberInputProps> }\n  | { type: 'select'; options?: FieldOptions<SSelectProps> }\n  | { type: 'radio'; options?: FieldOptions<SRadioGroupProps> }\n  | { type: 'checkbox'; options?: FieldOptions<SCheckboxProps> }\n  | { type: 'date-picker'; options?: FieldOptions<SDatePickerProps> }\n  | { type: 'date-range-picker'; options?: FieldOptions<SDateRangePickerProps> }\n  | { type: 'file-picker'; options?: FieldOptions<SFilePickerProps> };\n\nexport type SKeyValueField = SKeyValueFieldBase & SKeyValueFieldByType;\n\n/**\n * field type별 `onChange`로 올라오는 값 타입.\n * - `string`: input · textarea · select · radio · date-picker\n * - `number`: number-input\n * - `boolean`: checkbox\n * - `string[]`: date-range-picker\n */\nexport type SKeyValueFieldValue = string | number | boolean | string[];\n\n/**\n * `onChange` 콜백 detail.\n * 제네릭 `V`에 폼 값 형태(`{ [name]: value }`)를 넘기면 `name`/`value`/`values`가 정밀하게 타이핑됩니다.\n * 미지정 시 `value`는 {@link SKeyValueFieldValue} 유니온으로 잡힙니다.\n */\nexport interface SKeyValueChangeDetail<\n  V extends Record<string, SKeyValueFieldValue> = Record<string, SKeyValueFieldValue>,\n> {\n  /** 변경된 field의 name */\n  name: Extract<keyof V, string>;\n  /** 변경된 field의 새 값 */\n  value: V[Extract<keyof V, string>];\n  /** 변경이 반영된 전체 값 객체 (`{ [name]: value }`). controlled 패턴에서 그대로 상태에 반영하면 됩니다. */\n  values: V;\n}\n\nexport interface SKeyValueTableProps {\n  /** 2차원 배열. row → [th|td] 필드들 */\n  fields?: SKeyValueField[][];\n  /**\n   * field name을 key로 하는 값 객체 (`{ [name]: value }`).\n   * 지정 시 해당 field의 값으로 사용되며, field별 `options.value`보다 우선합니다.\n   * `onChange`의 `detail.values`와 함께 controlled 패턴으로 사용합니다.\n   */\n  values?: Record<string, unknown>;\n  /** 우측 검색 패널 */\n  search?: boolean;\n  /** border-radius 제어 */\n  radius?: 'default' | 'useTop' | 'full';\n  /** 값 변경 (sdChange) */\n  onChange?: (detail: SKeyValueChangeDetail) => void;\n  /** 검색 클릭 (sdSearch) */\n  onSearch?: () => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\nconst cssLen = (v?: number | string) =>\n  v == null ? undefined : typeof v === 'number' ? `${v}px` : v;\n\n/** SKeyValueTable — sd-key-value-table 포팅. th/td 폼 레이아웃 + 필드 렌더러. */\nexport function SKeyValueTable({\n  fields = [],\n  values = {},\n  search = false,\n  radius = 'default',\n  onChange,\n  onSearch,\n  className,\n  style,\n}: SKeyValueTableProps) {\n  if (fields.length === 0) return null;\n\n  const emit = (name: string, value: unknown) =>\n    onChange?.({\n      name,\n      value: value as SKeyValueFieldValue,\n      values: { ...values, [name]: value } as Record<string, SKeyValueFieldValue>,\n    });\n\n  const cellHeight = 'var(--cmp-table-keyValue-height)';\n  const cellPadY = 'var(--cmp-table-keyValue-body-paddingY)';\n\n  const renderField = (f: SKeyValueField): ReactNode => {\n    if (f.render) return f.render;\n    // values prop이 해당 field를 가지면 그 값을, 없으면 f.options.value를 사용.\n    // 공개 타입(SKeyValueFieldByType)은 type별로 좁혀지지만, 여기서는 하나의 렌더러가 모든\n    // type을 분기하므로 내부적으로만 느슨한 레코드로 다룬다.\n    const opt: Record<string, any> = { ...(f.options ?? {}) };\n    if (Object.prototype.hasOwnProperty.call(values, f.name)) opt.value = values[f.name];\n    const up = (v: unknown) => emit(f.name, v);\n    switch (f.type) {\n      case 'input':\n        return <SInput width=\"100%\" {...opt} onValueChange={up} />;\n      case 'textarea':\n        return <STextarea width=\"100%\" {...opt} onValueChange={up} />;\n      case 'number-input':\n        return <SNumberInput width=\"100%\" {...opt} onValueChange={up} />;\n      case 'select':\n        return <SSelect width=\"100%\" {...opt} onValueChange={up} />;\n      case 'radio':\n        return <SRadioGroup direction=\"horizontal\" {...opt} onValueChange={up} />;\n      case 'checkbox':\n        return <SCheckbox {...opt} onValueChange={up} />;\n      case 'date-picker':\n        return <SDatePicker width=\"100%\" {...opt} onValueChange={up} />;\n      case 'date-range-picker':\n        return <SDateRangePicker width=\"100%\" {...opt} onValueChange={up} />;\n      case 'file-picker':\n        return <SFilePicker width=\"100%\" {...opt} onValueChange={up} />;\n      case 'text':\n      default:\n        return (\n          <span className=\"text-[12px] text-[color:var(--sys-color-fg-primary)]\">\n            {opt.value ?? ''}\n          </span>\n        );\n    }\n  };\n\n  // thRowSpan에 의해 가려지는 위치 자동 계산\n  const skip: boolean[][] = fields.map(row => row.map(() => false));\n  fields.forEach((row, r) =>\n    row.forEach((f, c) => {\n      const span = f.thRowSpan && f.thRowSpan > 1 ? f.thRowSpan : 1;\n      for (let dr = 1; dr < span; dr++) {\n        const tr = skip[r + dr];\n        if (tr && c < tr.length) tr[c] = true;\n      }\n    }),\n  );\n\n  // 모든 row를 훑어 전체 컬럼 수 계산 (th/td + colSpan + hideTh/thRowSpan 반영)\n  let maxCols = 0;\n  fields.forEach((row, r) => {\n    let cols = 0;\n    row.forEach((f, c) => {\n      const thCols = f.hideTh\n        ? 0\n        : skip[r]?.[c]\n          ? 1\n          : f.thColSpan && f.thColSpan > 1\n            ? f.thColSpan\n            : 1;\n      const tdCols = f.tdColSpan && f.tdColSpan > 1 ? f.tdColSpan : 1;\n      cols += thCols + tdCols;\n    });\n    if (cols > maxCols) maxCols = cols;\n  });\n\n  const radiusClass =\n    radius === 'full'\n      ? 'rounded-none'\n      : radius === 'useTop'\n        ? 'rounded-b-[8px] rounded-t-none'\n        : 'rounded-[8px]';\n  // 외곽 프레임: 보더 + 라운드 + overflow. (원본 sd-key-value-table__wrapper / .sd-key-value-table)\n  // search 유무에 따라 flex 래퍼(양쪽 포함) 또는 table 컨테이너에 적용한다.\n  const frameClass = cn(\n    'overflow-hidden border border-solid border-[color:var(--cmp-table-border-color)]',\n    radiusClass,\n  );\n\n  // 원본은 border-collapse: separate + 셀은 border-top(행 구분선)만, 첫 행은 top 보더 제거.\n  // 세로 구분선은 없고 th(회색)/td(frame) 배경 차이로 구분한다. 프레임이 외곽 보더/라운드를 담당.\n  const table = (\n    <table\n      className=\"w-full border-separate border-spacing-0\"\n      style={{ tableLayout: 'fixed', ...style }}\n    >\n      <colgroup>\n        {Array.from({ length: maxCols }, (_, i) => {\n          if (i % 2 !== 0) return <col key={`col-${i}`} />;\n          const fieldIdx = i / 2;\n          const fieldThWidth = fields.reduce<number | string | undefined>((found, row) => {\n            if (found != null) return found;\n            return row[fieldIdx]?.thWidth;\n          }, undefined);\n          return <col key={`col-${i}`} style={{ width: cssLen(fieldThWidth) ?? '120px' }} />;\n        })}\n      </colgroup>\n      <tbody>\n        {fields.map((row, r) => {\n          const cellBorder =\n            r === 0 ? '' : 'border-t border-solid border-[color:var(--cmp-table-border-color)]';\n          return (\n            <tr key={r}>\n              {row.map((f, c) => {\n                const showTh = !f.hideTh && !skip[r][c];\n                return (\n                  <Fragment key={`${r}-${c}`}>\n                    {showTh && (\n                      <th\n                        key={`th-${r}-${c}`}\n                        scope=\"row\"\n                        rowSpan={f.thRowSpan && f.thRowSpan > 1 ? f.thRowSpan : undefined}\n                        colSpan={f.thColSpan && f.thColSpan > 1 ? f.thColSpan : undefined}\n                        className={cn(\n                          'box-border bg-[var(--cmp-table-header-bg)] px-[var(--cmp-table-header-paddingX)] text-left align-middle',\n                          cellBorder,\n                          f.thClass,\n                        )}\n                        style={{\n                          height: cellHeight,\n                          paddingTop: cellPadY,\n                          paddingBottom: cellPadY,\n                        }}\n                      >\n                        {/* 원본 th-inner: gap=header.gap(4), space-between으로 help를 우측 배치 / label group gap=content.gap(8) */}\n                        <div className=\"flex h-full w-full items-center justify-between gap-[var(--cmp-table-header-gap)]\">\n                          <div className=\"inline-flex items-center gap-[8px]\">\n                            <span className=\"text-[12px] font-bold leading-[20px] text-[color:var(--sys-color-fg-primary)]\">\n                              {f.label}\n                            </span>\n                            {f.required && (\n                              <SIcon name=\"asterisk\" size={12} color=\"var(--sys-color-fg-accent)\" />\n                            )}\n                          </div>\n                          {f.helpText && f.helpText.length > 0 && (\n                            <STooltip\n                              trigger=\"hover\"\n                              icon=\"helpOutline\"\n                              iconSize={16}\n                              color=\"var(--sys-color-fg-success)\"\n                              message={f.helpText}\n                            />\n                          )}\n                        </div>\n                      </th>\n                    )}\n                    <td\n                      key={`td-${r}-${c}`}\n                      rowSpan={f.tdRowSpan && f.tdRowSpan > 1 ? f.tdRowSpan : undefined}\n                      colSpan={f.tdColSpan && f.tdColSpan > 1 ? f.tdColSpan : undefined}\n                      className={cn(\n                        'box-border bg-[var(--sys-color-bg-frame)] align-middle',\n                        // text 타입(및 미지정 기본값)은 읽기 전용 콘텐츠라 넓은 paddingX(wide),\n                        // 폼 필드 셀은 default paddingX 유지\n                        f.type == null || f.type === 'text'\n                          ? 'px-[var(--cmp-table-keyValue-body-paddingX-wide)]'\n                          : 'px-[var(--cmp-table-keyValue-body-paddingX-default)]',\n                        cellBorder,\n                        f.tdClass,\n                      )}\n                      style={{ height: cellHeight, paddingTop: cellPadY, paddingBottom: cellPadY }}\n                    >\n                      {renderField(f)}\n                    </td>\n                  </Fragment>\n                );\n              })}\n            </tr>\n          );\n        })}\n      </tbody>\n    </table>\n  );\n\n  if (!search) return <div className={cn(frameClass, className)}>{table}</div>;\n\n  return (\n    <div className={cn('flex items-stretch', frameClass, className)}>\n      <div className=\"min-w-0 flex-1\">{table}</div>\n      <div\n        className=\"flex flex-shrink-0 items-center justify-center border-l border-solid border-[color:var(--cmp-table-border-color)] px-[var(--cmp-table-keyValue-search-paddingX)]\"\n        style={{ background: 'var(--cmp-table-keyValue-search-bg)' }}\n      >\n        <SButton color=\"neutral\" outline size=\"md\" label=\"검색\" onClick={() => onSearch?.()} />\n      </div>\n    </div>\n  );\n}\n","'use client';\n\nimport { type CSSProperties, type MouseEvent } from 'react';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SButton, type SButtonColor } from '../SButton';\nimport { SGhostButton } from '../SGhostButton';\n\nexport type SToastType = 'default' | 'danger' | 'caution' | 'complete' | 'accent' | 'info';\n\nconst BUTTON_STYLE: Record<SToastType, { color: SButtonColor; outline?: boolean }> = {\n  default: { color: 'secondary' },\n  danger: { color: 'danger', outline: true },\n  caution: { color: 'neutral', outline: true },\n  complete: { color: 'neutral', outline: true },\n  accent: { color: 'neutral', outline: true },\n  info: { color: 'secondary' },\n};\n\nexport interface SToastProps {\n  /** 좌측 아이콘 */\n  icon?: SIconName;\n  /** 메시지 */\n  message: string;\n  /** 우측 링크 URL */\n  link?: string;\n  /** 링크 레이블 (없으면 URL) */\n  linkLabel?: string;\n  /** 우측 버튼 레이블 */\n  buttonLabel?: string;\n  /** 닫기 버튼 표시 */\n  useClose?: boolean;\n  /** 타입(색상/프리셋) */\n  type?: SToastType;\n  /** 닫기 (sdClose) */\n  onClose?: () => void;\n  /** 버튼 클릭 (sdButtonClick) */\n  onButtonClick?: (e: MouseEvent) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SToast — sd-toast 포팅. 타입별 색상 + 아이콘/링크/버튼/닫기. */\nexport function SToast({\n  icon,\n  message,\n  link,\n  linkLabel,\n  buttonLabel,\n  useClose = false,\n  type = 'default',\n  onClose,\n  onButtonClick,\n  className,\n  style,\n}: SToastProps) {\n  const bg = `var(--cmp-toast-${type}-bg)`;\n  const content =\n    type === 'info' ? 'var(--cmp-toast-info-text)' : `var(--cmp-toast-${type}-content)`;\n  const iconColor = type === 'info' ? 'var(--cmp-toast-info-icon)' : content;\n  const linkColor = type === 'info' ? 'var(--cmp-toast-info-textLink)' : content;\n  const defaultCloseIntent = ['default', 'caution', 'info'].includes(type);\n\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-atomic=\"true\"\n      className={className}\n      style={{\n        display: 'inline-flex',\n        alignItems: 'center',\n        gap: 'var(--cmp-toast-gap)',\n        padding: 'var(--cmp-toast-paddingY) var(--cmp-toast-paddingX)',\n        borderRadius: 'var(--cmp-toast-radius)',\n        background: bg,\n        color: content,\n        boxShadow: '2px 2px 8px 2px #00000033',\n        ...style,\n      }}\n    >\n      {icon && <SIcon name={icon} size={16} color={iconColor} />}\n      <span\n        className=\"text-[14px] font-medium leading-[24px] text-nowrap\"\n        style={{ color: content }}\n      >\n        {message}\n      </span>\n      {link && (\n        <a\n          href={link}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"text-[14px] font-bold leading-[24px] underline text-nowrap\"\n          style={{ color: linkColor }}\n        >\n          {linkLabel || link}\n        </a>\n      )}\n      {buttonLabel && (\n        <SButton\n          {...BUTTON_STYLE[type]}\n          size=\"sm\"\n          label={buttonLabel}\n          onClick={e => onButtonClick?.(e)}\n        />\n      )}\n      {useClose && (\n        <SGhostButton\n          icon=\"close\"\n          size=\"xs\"\n          intent={defaultCloseIntent ? 'default' : 'inverse'}\n          ariaLabel=\"close\"\n          onClick={() => onClose?.()}\n        />\n      )}\n    </div>\n  );\n}\n","'use client';\n\nimport {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useLayoutEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { globalOverlayProps } from '../../lib/global-overlay';\nimport { Z_INDEX } from '../../lib/z-index';\nimport { SToast, type SToastProps } from './SToast';\n\nexport type SToastPosition =\n  'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\nexport interface SToastNotifyOptions extends Omit<SToastProps, 'onClose'> {\n  /** 자동 닫힘 지연(ms). 0이면 자동 닫힘 없음 (없으면 defaultDuration) */\n  duration?: number;\n}\n\nexport interface SToastContainerHandle {\n  create: (options: SToastNotifyOptions) => string;\n  dismiss: (id: string) => void;\n  dismissAll: () => void;\n}\n\nexport interface SToastContainerProps {\n  position?: SToastPosition;\n  maxVisible?: number;\n  /** 자동 닫힘 기본 지연(ms) */\n  defaultDuration?: number;\n  /** 스택 z-index. 기본값(1100)은 모달 호스트(1000) 위 — 토스트는 전역 알림이라 항상 최상단 */\n  zIndex?: number;\n  /** 토스트가 표시될 때 (sdToastShow) */\n  onShow?: (payload: { id: string }) => void;\n  /** 토스트가 제거될 때 (sdToastDismiss) */\n  onDismiss?: (payload: { id: string }) => void;\n}\n\ntype ToastState = 'entering' | 'visible' | 'exiting';\ninterface Entry {\n  id: string;\n  options: SToastNotifyOptions;\n  state: ToastState;\n}\n\n// 원본 sd-toast-container.config 상수\nconst GAP = 8;\nconst TRANSITION_DURATION = 400;\nconst TRANSITION_FALLBACK_BUFFER = 100;\nconst COLLAPSED_SCALE_STEP = 0.05;\nconst COLLAPSED_OFFSET_STEP = 8;\n\nconst POS_ANCHOR: Record<SToastPosition, CSSProperties> = {\n  'top-left': { top: 20, left: 20 },\n  'top-center': { top: 20, left: '50%' },\n  'top-right': { top: 20, right: 20 },\n  'bottom-left': { bottom: 100, left: 20 },\n  'bottom-center': { bottom: 100, left: '50%' },\n  'bottom-right': { bottom: 100, right: 20 },\n};\n\nlet counter = 0;\n\n/** SToastContainer — sd-toast-container 포팅. 스택/호버-확장 + 슬라이드 애니메이션. ref로 create/dismiss/dismissAll. */\nexport const SToastContainer = forwardRef<SToastContainerHandle, SToastContainerProps>(\n  function SToastContainer(\n    {\n      position = 'bottom-center',\n      maxVisible = 3,\n      defaultDuration = 4000,\n      zIndex = Z_INDEX.toast,\n      onShow,\n      onDismiss,\n    },\n    ref,\n  ) {\n    const [toasts, setToasts] = useState<Entry[]>([]);\n    const [expanded, setExpanded] = useState(false);\n    const [mounted, setMounted] = useState(false);\n    const timers = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n    const elRefs = useRef(new Map<string, HTMLDivElement>());\n    const [heights, setHeights] = useState<Map<string, number>>(new Map());\n    const onShowRef = useRef(onShow);\n    const onDismissRef = useRef(onDismiss);\n    onShowRef.current = onShow;\n    onDismissRef.current = onDismiss;\n    const liveIds = useRef(new Set<string>());\n\n    useEffect(() => setMounted(true), []);\n\n    const isBottom = position.startsWith('bottom');\n    const alignment = position.split('-')[1] as 'left' | 'center' | 'right';\n\n    const removeToast = useCallback((id: string) => {\n      if (!liveIds.current.has(id)) return;\n      liveIds.current.delete(id);\n      setToasts(prev => prev.filter(t => t.id !== id));\n      elRefs.current.delete(id);\n      const tm = timers.current.get(id);\n      if (tm) {\n        clearTimeout(tm);\n        timers.current.delete(id);\n      }\n      onDismissRef.current?.({ id });\n    }, []);\n\n    const startDismiss = useCallback(\n      (id: string) => {\n        const tm = timers.current.get(id);\n        if (tm) {\n          clearTimeout(tm);\n          timers.current.delete(id);\n        }\n        setToasts(prev => prev.map(t => (t.id === id ? { ...t, state: 'exiting' } : t)));\n        setTimeout(() => removeToast(id), TRANSITION_DURATION + TRANSITION_FALLBACK_BUFFER);\n      },\n      [removeToast],\n    );\n\n    // entering → visible (다음 프레임)\n    useEffect(() => {\n      if (!toasts.some(t => t.state === 'entering')) return;\n      const raf = requestAnimationFrame(() => {\n        setToasts(prev => prev.map(t => (t.state === 'entering' ? { ...t, state: 'visible' } : t)));\n      });\n      return () => cancelAnimationFrame(raf);\n    }, [toasts]);\n\n    // 높이 측정 (확장 모드 오프셋 계산용)\n    useLayoutEffect(() => {\n      let changed = false;\n      const next = new Map(heights);\n      toasts.forEach(t => {\n        const el = elRefs.current.get(t.id);\n        if (el) {\n          const h = el.offsetHeight;\n          if (h > 0 && next.get(t.id) !== h) {\n            next.set(t.id, h);\n            changed = true;\n          }\n        }\n      });\n      if (changed) setHeights(next);\n    }); // 매 렌더 측정\n\n    const scheduleAutoClose = useCallback(\n      (id: string, duration: number) => {\n        if (duration > 0)\n          timers.current.set(\n            id,\n            setTimeout(() => startDismiss(id), duration),\n          );\n      },\n      [startDismiss],\n    );\n\n    useImperativeHandle(\n      ref,\n      () => ({\n        create: options => {\n          const id = `toast-${++counter}`;\n          const duration = options.duration ?? defaultDuration;\n          liveIds.current.add(id);\n          setToasts(prev => [...prev, { id, options, state: 'entering' }]);\n          scheduleAutoClose(id, duration);\n          onShowRef.current?.({ id });\n          return id;\n        },\n        dismiss: startDismiss,\n        dismissAll: () =>\n          setToasts(prev => {\n            prev.forEach(t => startDismiss(t.id));\n            return prev;\n          }),\n      }),\n      [defaultDuration, scheduleAutoClose, startDismiss],\n    );\n\n    useEffect(\n      () => () => {\n        timers.current.forEach(t => clearTimeout(t));\n      },\n      [],\n    );\n\n    // maxVisible 초과 시 가장 오래된 토스트부터 자동 퇴장\n    useEffect(() => {\n      const activeIds = toasts.filter(t => t.state !== 'exiting').map(t => t.id);\n      if (activeIds.length > maxVisible) {\n        activeIds.slice(0, activeIds.length - maxVisible).forEach(id => startDismiss(id));\n      }\n    }, [toasts, maxVisible, startDismiss]);\n\n    const pauseTimers = () => {\n      timers.current.forEach(t => clearTimeout(t));\n      timers.current.clear();\n    };\n    const resumeTimers = () => {\n      if (defaultDuration <= 0) return;\n      toasts.forEach(t => {\n        if (t.state === 'visible' && !timers.current.has(t.id)) {\n          const d = t.options.duration ?? defaultDuration;\n          if (d > 0)\n            timers.current.set(\n              t.id,\n              setTimeout(() => startDismiss(t.id), d),\n            );\n        }\n      });\n    };\n\n    if (!mounted) return null;\n\n    // 활성 토스트(퇴장 제외), 최신이 앞(front, index 0)\n    const active = toasts\n      .filter(t => t.state !== 'exiting')\n      .slice()\n      .reverse();\n    const frontIndexOf = (id: string) => active.findIndex(t => t.id === id);\n\n    const anchorProp: 'top' | 'bottom' = isBottom ? 'bottom' : 'top';\n    const alignStyle: CSSProperties =\n      alignment === 'center' ? { left: '50%' } : alignment === 'right' ? { right: 0 } : { left: 0 };\n    const centerX = alignment === 'center' ? 'translateX(-50%) ' : '';\n\n    const itemStyle = (entry: Entry): CSSProperties => {\n      const base: CSSProperties = {\n        position: 'absolute',\n        [anchorProp]: 0,\n        ...alignStyle,\n        pointerEvents: 'auto',\n      };\n      const enterY = isBottom ? 20 : -20;\n\n      if (entry.state === 'entering')\n        return {\n          ...base,\n          opacity: 0,\n          transform: `${centerX}translateY(${enterY}px)`,\n          transition: 'none',\n        };\n      if (entry.state === 'exiting')\n        return {\n          ...base,\n          opacity: 0,\n          transform: `${centerX}translateY(${enterY}px)`,\n          transition: `transform .4s ease, opacity .4s ease`,\n          pointerEvents: 'none',\n        };\n\n      const fi = frontIndexOf(entry.id);\n      const transition = `transform .4s ease, opacity .4s ease, ${anchorProp} .4s ease`;\n\n      if (expanded) {\n        let offset = 0;\n        for (let i = 0; i < fi; i++) offset += (heights.get(active[i].id) || 0) + GAP;\n        return {\n          ...base,\n          [anchorProp]: offset,\n          opacity: 1,\n          transform: `${centerX}translateY(0) scale(1)`,\n          zIndex: active.length - fi,\n          transition,\n        };\n      }\n\n      // collapsed(스택)\n      const peek = fi * COLLAPSED_OFFSET_STEP;\n      const peekY = isBottom ? -peek : peek;\n      const scale = 1 - fi * COLLAPSED_SCALE_STEP;\n      const opacity = [1, 0.8, 0.6][fi] ?? 0;\n      return {\n        ...base,\n        opacity,\n        transform: `${centerX}translateY(${peekY}px) scale(${scale})`,\n        transformOrigin: isBottom ? 'bottom center' : 'top center',\n        zIndex: active.length - fi,\n        transition,\n      };\n    };\n\n    return createPortal(\n      <div\n        {...globalOverlayProps}\n        style={{\n          position: 'fixed',\n          zIndex,\n          pointerEvents: 'none',\n          ...POS_ANCHOR[position],\n          ...(alignment === 'center' ? { transform: 'translateX(-50%)' } : {}),\n        }}\n        onMouseEnter={() => {\n          setExpanded(true);\n          pauseTimers();\n        }}\n        onMouseLeave={() => {\n          setExpanded(false);\n          resumeTimers();\n        }}\n      >\n        {toasts.map(entry => (\n          <div\n            key={entry.id}\n            ref={el => {\n              if (el) elRefs.current.set(entry.id, el);\n            }}\n            style={itemStyle(entry)}\n          >\n            <SToast {...entry.options} onClose={() => startDismiss(entry.id)} />\n          </div>\n        ))}\n      </div>,\n      document.body,\n    );\n  },\n);\n","'use client';\n\nimport {\n  forwardRef,\n  useCallback,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  type CSSProperties,\n  type FormEvent,\n  type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/cn';\nimport { FormContext, type FormContextValue, type FormFieldEntry } from '../../lib/form';\n\nexport interface SFormValidationError {\n  /** 검증에 실패한 필드 name 목록 (DOM 순서) */\n  names: string[];\n}\n\n/** ref로 노출되는 폼 제어 메서드 (sd-form @Method 대응) */\nexport interface SFormHandle {\n  /** 등록된 모든 필드를 검증하고 통과 여부를 반환 */\n  validate: () => boolean;\n  /** 모든 필드의 검증 상태만 초기화 (값은 소비자 소유) */\n  resetValidation: () => void;\n  /** resetValidation 별칭 — sd-form sdReset 대응. 값 리셋은 소비자(value/onChange) 책임 */\n  reset: () => void;\n  /** 첫 번째 실패 필드로 포커스 이동 */\n  focusFirstInvalid: () => void;\n}\n\nexport interface SFormProps {\n  /** form 엘리먼트에 추가할 클래스 (sd-form formClass 대응) */\n  formClass?: string;\n  /** 모든 필드 검증 통과 후 발생 (sd-form sdSubmit 대응) */\n  onSubmit?: () => void;\n  /** 검증 실패 시 실패한 필드 name 목록 전달 (sd-form sdValidationError 대응) */\n  onValidationError?: (error: SFormValidationError) => void;\n  children?: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SForm — sd-form 포팅. 폼 안의 rule-bearing 컨트롤(useFormField로 등록)을 모아\n * submit 시 일괄 검증한다. 하나라도 실패하면 제출을 막고 첫 실패 필드에 포커스한 뒤\n * onValidationError를 발생시킨다. 값은 여전히 소비자 소유(form-agnostic 유지).\n */\nexport const SForm = forwardRef<SFormHandle, SFormProps>(function SForm(\n  { formClass, onSubmit, onValidationError, children, className, style },\n  ref,\n) {\n  const formRef = useRef<HTMLFormElement>(null);\n  const fieldsRef = useRef<Set<FormFieldEntry>>(new Set());\n\n  const register = useCallback((entry: FormFieldEntry) => {\n    fieldsRef.current.add(entry);\n    return () => {\n      fieldsRef.current.delete(entry);\n    };\n  }, []);\n\n  const ctx = useMemo<FormContextValue>(() => ({ register }), [register]);\n\n  /** 실패 필드 name들을 DOM 등장 순서로 정렬 (name / data-name 기준) */\n  const orderByDom = useCallback((names: string[]): string[] => {\n    const form = formRef.current;\n    if (!form || names.length < 2) return names;\n    const domOrder = new Map<string, number>();\n    form.querySelectorAll<HTMLElement>('[name],[data-name]').forEach((el, i) => {\n      const n = el.getAttribute('name') || el.getAttribute('data-name');\n      if (n && !domOrder.has(n)) domOrder.set(n, i);\n    });\n    return [...names].sort((a, b) => (domOrder.get(a) ?? Infinity) - (domOrder.get(b) ?? Infinity));\n  }, []);\n\n  const focusByName = useCallback((name: string) => {\n    const form = formRef.current;\n    if (!form || !name) return;\n    const host =\n      form.querySelector<HTMLElement>(`[name=\"${CSS.escape(name)}\"]`) ??\n      form.querySelector<HTMLElement>(`[data-name=\"${CSS.escape(name)}\"]`);\n    if (!host) return;\n    const focusable = host.matches('input,textarea,select,button,[tabindex]')\n      ? host\n      : host.querySelector<HTMLElement>('input,textarea,select,button,[tabindex]');\n    focusable?.focus();\n    (focusable ?? host).scrollIntoView({ block: 'nearest' });\n  }, []);\n\n  /**\n   * 등록된 모든 필드를 검증한다.\n   * - valid: 전체 통과 여부 (이름 없는 필드도 실패하면 false → 제출 차단)\n   * - names: 실패한 필드 중 name이 있는 것들 (DOM 순서, onValidationError용)\n   */\n  const runValidation = useCallback((): { valid: boolean; names: string[] } => {\n    let valid = true;\n    const invalidNames: string[] = [];\n    fieldsRef.current.forEach(f => {\n      if (!f.validate()) {\n        valid = false;\n        if (f.name) invalidNames.push(f.name);\n      }\n    });\n    return { valid, names: orderByDom(invalidNames) };\n  }, [orderByDom]);\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      validate: () => runValidation().valid,\n      resetValidation: () => fieldsRef.current.forEach(f => f.resetValidation()),\n      reset: () => fieldsRef.current.forEach(f => f.resetValidation()),\n      focusFirstInvalid: () => {\n        const { names } = runValidation();\n        if (names.length > 0) focusByName(names[0]);\n      },\n    }),\n    [runValidation, focusByName],\n  );\n\n  const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n    const { valid, names } = runValidation();\n    if (!valid) {\n      if (names.length > 0) focusByName(names[0]);\n      onValidationError?.({ names });\n      return;\n    }\n    onSubmit?.();\n  };\n\n  return (\n    <FormContext.Provider value={ctx}>\n      <form\n        ref={formRef}\n        onSubmit={handleSubmit}\n        className={cn(formClass, className)}\n        style={style}\n        noValidate\n      >\n        {children}\n      </form>\n    </FormContext.Provider>\n  );\n});\n","'use client';\n\nimport { type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type SRadioButtonSize = 'xs' | 'sm';\n\nexport interface SRadioButtonOption {\n  value: string | number;\n  label: string;\n  disabled?: boolean;\n}\n\nexport interface SRadioButtonProps {\n  /** 옵션 목록 */\n  options?: SRadioButtonOption[];\n  /** 현재 선택 값 */\n  value?: string | number | null;\n  /** 크기 */\n  size?: SRadioButtonSize;\n  /** 전체 비활성 */\n  disabled?: boolean;\n  /** input name 속성 */\n  name?: string;\n  /** 변경 (sdUpdate) */\n  onValueChange?: (value: string | number) => void;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/**\n * SRadioButton — sd-radio-button 포팅. 세그먼트형 라디오(버튼 그룹).\n * default(흰 배경/회색, hover 파란 채움) · select(흰 배경/파란 테두리·글자) · disabled.\n */\nexport function SRadioButton({\n  options = [],\n  value,\n  size = 'sm',\n  disabled = false,\n  name,\n  onValueChange,\n  className,\n  style,\n}: SRadioButtonProps) {\n  return (\n    <div\n      role=\"radiogroup\"\n      aria-disabled={disabled}\n      className={cn('inline-flex', className)}\n      style={style}\n    >\n      {options.map((o, i) => {\n        const selected = o.value === value;\n        const od = disabled || o.disabled;\n        return (\n          <button\n            key={o.value}\n            type=\"button\"\n            role=\"radio\"\n            name={name}\n            aria-checked={selected}\n            disabled={od}\n            onClick={() => !od && !selected && onValueChange?.(o.value)}\n            className={cn(\n              'relative box-border inline-flex items-center justify-center whitespace-nowrap border border-solid text-[12px] font-medium leading-[20px] transition-colors',\n              i === 0 ? 'rounded-l-[var(--cmp-radioButton-radius)]' : '-ml-px',\n              i === options.length - 1 ? 'rounded-r-[var(--cmp-radioButton-radius)]' : '',\n              selected ? 'z-10' : '',\n              !od &&\n                !selected &&\n                'hover:!bg-[var(--cmp-radioButton-bg-hover)] hover:!text-[color:var(--cmp-radioButton-content-hover)] hover:!border-[color:var(--cmp-radioButton-bg-hover)] hover:z-10',\n              od ? 'cursor-not-allowed' : 'cursor-pointer',\n            )}\n            style={{\n              height: `var(--cmp-radioButton-${size}-height)`,\n              padding: `0 var(--cmp-radioButton-${size}-paddingX)`,\n              background: od\n                ? 'var(--cmp-radioButton-bg-disabled)'\n                : 'var(--cmp-radioButton-bg-default)',\n              borderColor: od\n                ? 'var(--cmp-radioButton-border-disabled)'\n                : selected\n                  ? 'var(--cmp-radioButton-border-select)'\n                  : 'var(--cmp-radioButton-border-default)',\n              color: od\n                ? 'var(--cmp-radioButton-content-disabled)'\n                : selected\n                  ? 'var(--cmp-radioButton-content-select)'\n                  : 'var(--cmp-radioButton-content-default)',\n            }}\n          >\n            {o.label}\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n","'use client';\n\nimport {\n  forwardRef,\n  useEffect,\n  useId,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n  type CSSProperties,\n  type KeyboardEvent,\n} from 'react';\nimport { SField, type SFieldSize, type SFieldStatus } from '../SField';\nimport { SChip } from '../SChip';\nimport { STextLink } from '../STextLink';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { type SColor } from '../../lib/color';\nimport { SPortal } from '../SPortal';\nimport { cn } from '../../lib/cn';\nimport { AUTOFILL_RESET_CLASS } from '../../lib/autofill';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { type STooltipProps } from '../STooltip';\n\nexport type SChipInputSize = SFieldSize;\nexport type SChipInputMetaPlacement = 'end' | 'inline';\n\n/** ref로 노출되는 UX 메서드 (sd-chip-input @Method sdFocus 대응) */\nexport interface SChipInputHandle {\n  /** 입력 필드에 포커스를 이동합니다. */\n  focus: () => void;\n}\n\nexport interface SChipInputProps {\n  /** 칩 값 목록 */\n  values?: string[];\n  /** 값 변경 (sdUpdate) — 전체 배열 */\n  onValueChange?: (values: string[]) => void;\n  /** 입력 중 문자열 변경 (sdInput) */\n  onInput?: (value: string) => void;\n  onFocus?: () => void;\n  onBlur?: () => void;\n  /** 칩별 에러 (배열 또는 판별 함수) */\n  errors?: boolean[] | ((value: string) => boolean);\n  /** 칩별 비활성 (배열 또는 판별 함수) */\n  disabledChips?: boolean[] | ((value: string) => boolean);\n  size?: SChipInputSize;\n  disabled?: boolean;\n  placeholder?: string;\n  name?: string;\n  rules?: Rule[];\n  error?: boolean;\n  /** 입력 초기화 버튼 표시 */\n  useReset?: boolean;\n  /** 최대 칩 개수 */\n  maxCount?: number;\n  /** 최대 개수·초기화 meta 위치 */\n  metaPlacement?: SChipInputMetaPlacement;\n  /** 중복 에러 메시지 항목명 */\n  duplicateLabel?: string;\n  /** 자동완성 후보 */\n  suggestions?: string[];\n  loadingSuggestions?: boolean;\n  /** 추천 항목 (입력값 없을 때) */\n  recommendedItems?: string[];\n  loadingRecommendedItems?: boolean;\n  /** 드롭다운 최소 너비 (숫자=px) */\n  dropdownMinWidth?: number | string;\n  // ── SField ──\n  label?: string;\n  labelWidth?: number | string;\n  hint?: string;\n  errorMessage?: string;\n  width?: number | string;\n  status?: SFieldStatus;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SChipInput — sd-chip-input 포팅. 칩 목록 + 입력 + 자동완성/추천 드롭다운 + 초기화. */\nexport const SChipInput = forwardRef<SChipInputHandle, SChipInputProps>(function SChipInput(\n  {\n    values = [],\n    onValueChange,\n    onInput,\n    onFocus,\n    onBlur,\n    errors = [],\n    disabledChips = [],\n    size = 'sm',\n    disabled = false,\n    placeholder = '태그 입력 (Enter로 등록 / 콤마로 구분 / 띄어쓰기 불가)',\n    name,\n    rules,\n    error,\n    useReset = false,\n    maxCount,\n    metaPlacement = 'end',\n    duplicateLabel,\n    suggestions = [],\n    loadingSuggestions = false,\n    recommendedItems = [],\n    loadingRecommendedItems = false,\n    dropdownMinWidth = 200,\n    label,\n    labelWidth,\n    hint,\n    errorMessage,\n    width,\n    status,\n    icon,\n    iconColor,\n    labelTooltip,\n    labelTooltipProps,\n    className,\n    style,\n  }: SChipInputProps,\n  ref,\n) {\n  const autoId = useId();\n  const resolvedName = name ?? autoId;\n  const [inputValue, setInputValue] = useState('');\n  const [focused, setFocused] = useState(false);\n  const [hovered, setHovered] = useState(false);\n  const [activeIndex, setActiveIndex] = useState(-1);\n  const [suppressSuggestions, setSuppressSuggestions] = useState(false);\n  const [suppressRecommendations, setSuppressRecommendations] = useState(false);\n  const inputRef = useRef<HTMLInputElement>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const inputShellRef = useRef<HTMLDivElement>(null);\n  // 한글 등 IME 조합 상태 추적 — 브라우저별로 조합을 끝내는 Enter의 e.nativeEvent.isComposing이\n  // 부정확한 경우가 있어(예: 일부 Chrome 환경) compositionstart/end로 직접 추적한다.\n  const isComposingRef = useRef(false);\n\n  useImperativeHandle(ref, () => ({ focus: () => inputRef.current?.focus() }), []);\n\n  const chipError = (i: number): boolean => {\n    if (values.indexOf(values[i]) !== i) return true; // 중복\n    if (typeof errors === 'function') return errors(values[i] ?? '');\n    return errors[i] ?? false;\n  };\n  const chipDisabled = (i: number): boolean => {\n    if (disabled) return true;\n    if (typeof disabledChips === 'function') return disabledChips(values[i] ?? '');\n    return disabledChips[i] ?? false;\n  };\n\n  // 중복 검사 rule + 사용자 rules\n  const duplicateMessage = useMemo(() => {\n    const seen = new Set<string>();\n    for (const v of values) {\n      if (seen.has(v))\n        return duplicateLabel ? `이미 입력된 ${duplicateLabel}입니다.` : '중복된 값이 존재합니다.';\n      seen.add(v);\n    }\n    return '';\n  }, [values, duplicateLabel]);\n  const ruleMessage = useMemo(() => runRules(values, rules), [values, rules]);\n  const resolvedErrorMessage = duplicateMessage || ruleMessage || errorMessage;\n  const resolvedError = error || duplicateMessage !== '' || ruleMessage !== '';\n  const resolvedStatus = status ?? (resolvedError ? 'error' : undefined);\n\n  // SForm 등록 — 에러는 memo로 항상 반영되므로 검증 통과 여부만 보고한다 (폼 밖이면 no-op)\n  useFormField({\n    name,\n    validate: () => runRules(values, rules) === '' && duplicateMessage === '',\n    resetValidation: () => {},\n  });\n\n  const isMax = maxCount != null && values.length >= maxCount;\n  const resolvedDropdownMinWidth =\n    dropdownMinWidth == null\n      ? undefined\n      : typeof dropdownMinWidth === 'number'\n        ? `${dropdownMinWidth}px`\n        : dropdownMinWidth;\n\n  const commit = (next: string[]) => onValueChange?.(next);\n\n  const addChip = (v: string) => {\n    if (maxCount != null && values.length >= maxCount) return;\n    commit([...values, v]);\n    setInputValue('');\n    setActiveIndex(-1);\n    onInput?.('');\n    inputRef.current?.focus();\n  };\n  const removeChip = (i: number) => {\n    commit(values.filter((_, idx) => idx !== i));\n    // .focus()는 동기 실행 → onFocus가 suppressRecommendations=false로 리셋하므로 이후 덮어쓴다.\n    inputRef.current?.focus();\n    setSuppressRecommendations(true);\n  };\n  const reset = () => {\n    const kept = values.filter((_, i) => chipDisabled(i));\n    commit(kept);\n    inputRef.current?.focus();\n  };\n\n  // 드롭다운 표시 로직\n  const showAutocomplete =\n    focused &&\n    inputValue !== '' &&\n    !suppressSuggestions &&\n    (suggestions.length > 0 || loadingSuggestions);\n  const showRecommendations =\n    focused &&\n    inputValue === '' &&\n    !suppressRecommendations &&\n    (recommendedItems.length > 0 || loadingRecommendedItems);\n  const showDropdown = showAutocomplete || showRecommendations;\n  // 닫힐 때 focused가 먼저 false가 되어 showAutocomplete/showRecommendations가 동시에 꺼지는데,\n  // SPortal은 닫힘 애니메이션 동안 콘텐츠를 그대로 유지·재렌더하므로 마지막 모드를 기억해 유지한다.\n  // (그렇지 않으면 닫히는 애니메이션 도중 추천(그리드) → 자동완성(리스트) 스타일로 잠깐 바뀌어 보인다.)\n  const lastAutocompleteRef = useRef(showAutocomplete);\n  useEffect(() => {\n    if (showAutocomplete || showRecommendations) {\n      lastAutocompleteRef.current = showAutocomplete;\n    }\n  }, [showAutocomplete, showRecommendations]);\n  const effectiveAutocomplete = showDropdown ? showAutocomplete : lastAutocompleteRef.current;\n  const dropdownAnchorRef = effectiveAutocomplete ? inputShellRef : containerRef;\n  const items = effectiveAutocomplete ? suggestions : recommendedItems;\n  const loading = effectiveAutocomplete\n    ? loadingSuggestions && suggestions.length === 0\n    : loadingRecommendedItems && recommendedItems.length === 0;\n  const isFieldEmpty = inputValue === '' && values.length > 0 && !focused;\n  const isFieldFilled = inputValue !== '';\n\n  const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n    if (showDropdown && items.length > 0) {\n      if (e.key === 'ArrowDown') {\n        e.preventDefault();\n        setActiveIndex(i => Math.min(i + 1, items.length - 1));\n        return;\n      }\n      if (e.key === 'ArrowUp') {\n        e.preventDefault();\n        setActiveIndex(i => Math.max(i - 1, -1));\n        return;\n      }\n      if (e.key === 'Escape') {\n        if (showAutocomplete) setSuppressSuggestions(true);\n        if (showRecommendations) setSuppressRecommendations(true);\n        setActiveIndex(-1);\n        return;\n      }\n      if (e.key === 'Enter' && activeIndex >= 0) {\n        e.preventDefault();\n        const sel = items[activeIndex];\n        if (!values.includes(sel)) addChip(sel);\n        return;\n      }\n    }\n    if (e.key === 'Enter' && !isComposingRef.current && inputValue.trim() !== '') {\n      if (isMax) return;\n      e.preventDefault();\n      addChip(inputValue.trim());\n    } else if (e.key === 'Backspace' && inputValue === '' && values.length > 0) {\n      if (chipDisabled(values.length - 1)) return;\n      e.preventDefault();\n      commit(values.slice(0, -1));\n    }\n  };\n\n  const showResetLink = useReset && values.length > 0;\n  const showMaxCount = maxCount != null;\n  const showMetaInfo = showResetLink || showMaxCount;\n\n  const closeDropdown = () => {\n    setFocused(false);\n    setActiveIndex(-1);\n    setSuppressSuggestions(true);\n    setSuppressRecommendations(true);\n  };\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      // 라벨을 칩 첫 행에 세로 중앙 정렬 — 컨트롤 박스는 기본 필드 높이(28/36)보다 큰\n      // min-height(36/40) + SField 테두리 1px×2 로 렌더되므로, 그 실제 높이를 라벨에 맞춘다.\n      labelHeight={`calc(var(--cmp-chipInput-${size}-minHeight) + 2px)`}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      size={size}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused}\n      hovered={hovered}\n      errorMessage={resolvedErrorMessage}\n      width={width}\n      disabled={disabled}\n      multiline\n      className={className}\n      style={style}\n      onMouseEnter={() => setHovered(true)}\n      onMouseLeave={() => setHovered(false)}\n    >\n      <div\n        ref={containerRef}\n        className={cn(\n          'relative box-border flex w-full flex-wrap content-center items-center gap-(--cmp-chipInput-chip-gap)',\n          size === 'md'\n            ? 'min-h-(--cmp-chipInput-md-minHeight) px-(--cmp-chipInput-md-paddingX) py-(--cmp-chipInput-md-paddingY)'\n            : 'min-h-(--cmp-chipInput-sm-minHeight) px-(--cmp-chipInput-sm-paddingX) py-(--cmp-chipInput-sm-paddingY)',\n        )}\n        onClick={() => {\n          if (!disabled) {\n            setSuppressSuggestions(false);\n            setSuppressRecommendations(false);\n            inputRef.current?.focus();\n          }\n        }}\n      >\n        {values.map((v, i) => (\n          <SChip\n            key={i}\n            value={v}\n            error={chipError(i)}\n            disabled={chipDisabled(i)}\n            editable={false}\n            onRemove={() => removeChip(i)}\n          />\n        ))}\n\n        {!isMax && (\n          <div\n            ref={inputShellRef}\n            className={cn(\n              's-chip-input__field inline-grid shrink-0 items-center overflow-hidden',\n              isFieldFilled && 's-chip-input__field--filled',\n              isFieldEmpty && 's-chip-input__field--empty',\n            )}\n            data-value={inputValue !== '' ? inputValue : values.length === 0 ? placeholder : ''}\n            style={{\n              flex: '0 0 auto',\n              gridTemplateColumns: 'minmax(0, max-content)',\n              maxWidth: '100%',\n              boxSizing: 'border-box',\n              padding: 0,\n              border: 'none',\n              position: isFieldEmpty ? 'absolute' : undefined,\n              top: isFieldEmpty ? 0 : undefined,\n              left: isFieldEmpty ? 0 : undefined,\n              width: isFieldEmpty ? 0 : undefined,\n              minWidth: isFieldEmpty ? 0 : '1ch',\n              height: isFieldEmpty ? 0 : 'var(--cmp-chip-height)',\n              paddingInline: isFieldFilled ? 'var(--cmp-chip-paddingX)' : undefined,\n              borderWidth: isFieldFilled ? 'var(--cmp-chip-border-width)' : undefined,\n              borderStyle: isFieldFilled ? 'solid' : undefined,\n              // 작성중 필드는 SChip의 editable 수정중(editing) 스타일과 동일하게 —\n              // bg/보더/글자색 모두 focus 토큰을 사용한다.\n              borderColor: isFieldFilled ? 'var(--cmp-chip-border-focus)' : undefined,\n              borderRadius: isFieldFilled ? 'var(--cmp-chip-radius)' : 0,\n              background: isFieldFilled ? 'var(--cmp-chip-bg-focus)' : 'transparent',\n              overflow: 'hidden',\n            }}\n          >\n            {/* 실제 <input>과 같은 칸에 겹쳐 렌더되는 투명 텍스트 — 타이핑한 내용만큼만 필드 폭이 늘어나게 한다. */}\n            <span\n              aria-hidden\n              className={cn(\n                'invisible col-start-1 row-start-1 whitespace-pre font-normal',\n                size === 'md' ? 'text-14 leading-sd-24' : 'text-12 leading-sd-20',\n              )}\n            >\n              {inputValue !== '' ? inputValue : values.length === 0 ? placeholder : ''}\n            </span>\n            <input\n              ref={inputRef}\n              name={resolvedName}\n              size={1}\n              className={cn(\n                's-chip-input__input col-start-1 row-start-1 w-full border-0 bg-transparent p-0 font-normal text-(--cmp-chip-content-focus) outline-none placeholder:text-(--cmp-chipInput-text-placeholder) disabled:cursor-not-allowed',\n                AUTOFILL_RESET_CLASS,\n                size === 'md' ? 'text-14 leading-sd-24' : 'text-12 leading-sd-20',\n              )}\n              style={{\n                minWidth: '1ch',\n                // height는 지정하지 않고 line-height(20/24px)에 맞춰 자동 크기로 둔다.\n                // var(--cmp-chip-height)(24px)로 고정하면 네이티브 <input>이 남는 세로 여백에\n                // 텍스트를 아래로 밀어 넣어, 확정된 chip 텍스트보다 2px 낮게 보인다.\n                margin: 0,\n                overflow: 'hidden',\n                textOverflow: 'ellipsis',\n              }}\n              placeholder={values.length === 0 ? placeholder : ''}\n              disabled={disabled}\n              value={inputValue}\n              onChange={e => {\n                const nextValue = e.target.value;\n                const wasEmpty = inputValue === '';\n                const isEmpty = nextValue === '';\n                if (wasEmpty !== isEmpty) {\n                  setActiveIndex(-1);\n                  if (isEmpty) setSuppressRecommendations(false);\n                }\n                setInputValue(nextValue);\n                setSuppressSuggestions(false);\n                onInput?.(nextValue);\n              }}\n              onKeyDown={onKeyDown}\n              onCompositionStart={() => {\n                isComposingRef.current = true;\n              }}\n              onCompositionEnd={() => {\n                isComposingRef.current = false;\n              }}\n              onFocus={() => {\n                setFocused(true);\n                setSuppressRecommendations(false);\n                onFocus?.();\n              }}\n              onBlur={() => {\n                setFocused(false);\n                setActiveIndex(-1);\n                onBlur?.();\n              }}\n            />\n          </div>\n        )}\n\n        {showMetaInfo && (\n          <div\n            className={cn(\n              's-chip-input__meta flex items-center gap-sd-8',\n              metaPlacement === 'end' && 'ml-auto',\n            )}\n            data-placement={metaPlacement}\n            onMouseDown={e => e.preventDefault()}\n          >\n            <span\n              className=\"s-chip-input__divider shrink-0\"\n              style={{ width: 1, height: 12, backgroundColor: 'var(--color-divider-default)' }}\n            />\n            {showMaxCount && (\n              <span\n                className={cn(\n                  's-chip-input__max-count text-12',\n                  isMax\n                    ? 'text-(--sys-color-fg-warning)'\n                    : 'text-(--cmp-chipInput-text-placeholder)',\n                )}\n              >\n                최대 {maxCount}개\n              </span>\n            )}\n            {showResetLink && (\n              <STextLink\n                className=\"s-chip-input__reset\"\n                icon={'reset' as SIconName}\n                iconColor=\"var(--color-grey-65)\"\n                label=\"입력 초기화\"\n                underline\n                disabled={disabled}\n                onClick={reset}\n                style={{ color: 'var(--color-grey-80)' } as CSSProperties}\n              />\n            )}\n          </div>\n        )}\n\n        <SPortal\n          open={showDropdown}\n          anchorRef={dropdownAnchorRef}\n          onClose={closeDropdown}\n          onOpenAutoFocus={e => e.preventDefault()}\n          onCloseAutoFocus={e => e.preventDefault()}\n          maxHeight={260}\n          viewportPadding={8}\n          className=\"s-chip-input__dropdown shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]\"\n          style={\n            effectiveAutocomplete\n              ? { minWidth: resolvedDropdownMinWidth }\n              : { width: 'var(--radix-popover-trigger-width)' }\n          }\n        >\n          <div\n            role=\"listbox\"\n            className=\"s-chip-input__suggestions flex w-full flex-col outline-none\"\n            onMouseDown={e => e.preventDefault()}\n          >\n            {loading && (\n              <div className=\"s-chip-input__suggestions-empty p-sd-12 text-center text-12 leading-sd-20 text-(--color-grey-65)\">\n                불러오는 중...\n              </div>\n            )}\n            {!effectiveAutocomplete ? (\n              <div className=\"flex flex-wrap gap-sd-8 px-sd-12 py-sd-6\">\n                {items.map((item, i) => {\n                  const selected = values.includes(item);\n                  const active = i === activeIndex && !selected;\n                  return (\n                    <div\n                      key={item}\n                      role=\"option\"\n                      aria-selected={selected || active}\n                      className=\"rounded-full\"\n                      style={\n                        active\n                          ? { outline: '2px solid var(--color-border-accent)', outlineOffset: 1 }\n                          : undefined\n                      }\n                      onMouseDown={e => {\n                        e.preventDefault();\n                        if (!selected) addChip(item);\n                      }}\n                    >\n                      <SChip value={item} disabled={selected} editable={false} showRemove={false} />\n                    </div>\n                  );\n                })}\n              </div>\n            ) : (\n              items.map((item, i) => {\n                const selected = values.includes(item);\n                const active = i === activeIndex && !selected;\n                return (\n                  <div\n                    key={item}\n                    role=\"option\"\n                    aria-selected={selected || active}\n                    className={cn(\n                      's-chip-input__suggestion-item flex shrink-0 cursor-pointer items-center gap-sd-8 overflow-hidden text-ellipsis whitespace-nowrap px-sd-12 py-sd-4 text-12 leading-sd-20',\n                      selected\n                        ? 'cursor-default overflow-visible font-bold text-(--cmp-listBoxItem-content-selected)'\n                        : active\n                          ? 'bg-(--cmp-listBoxItem-bg-hover) font-medium text-(--cmp-listBoxItem-content-hover)'\n                          : 'text-(--cmp-listBoxItem-content-default)',\n                    )}\n                    onMouseDown={e => {\n                      e.preventDefault();\n                      if (!selected) addChip(item);\n                    }}\n                  >\n                    <span className=\"flex-1\">{item}</span>\n                    {selected && (\n                      <SIcon\n                        name=\"check\"\n                        size={12}\n                        color=\"var(--cmp-listBoxItem-content-selected)\"\n                      />\n                    )}\n                  </div>\n                );\n              })\n            )}\n          </div>\n        </SPortal>\n      </div>\n    </SField>\n  );\n});\n","'use client';\n\nimport { forwardRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SGhostButton } from '../SGhostButton';\nimport { type SIconName } from '../SIcon';\nimport { cn } from '../../lib/cn';\nimport { AUTOFILL_RESET_CLASS } from '../../lib/autofill';\nimport { type SColor } from '../../lib/color';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { type STooltipProps } from '../STooltip';\n\nexport type SBarcodeInputSize = SFieldSize;\n\nconst FONT: Record<SBarcodeInputSize, { fontSize: number; paddingX: string; gap: string }> = {\n  sm: {\n    fontSize: 12,\n    paddingX: 'var(--cmp-textinput-sm-paddingX)',\n    gap: 'var(--cmp-textinput-sm-gap)',\n  },\n  md: {\n    fontSize: 14,\n    paddingX: 'var(--cmp-textinput-md-paddingX)',\n    gap: 'var(--cmp-textinput-md-gap)',\n  },\n};\n\nexport interface SBarcodeInputProps {\n  value?: string | number | null;\n  /** 값 변경 (sdUpdate) */\n  onValueChange?: (value: string) => void;\n  onFocus?: () => void;\n  onBlur?: () => void;\n  size?: SBarcodeInputSize;\n  clearable?: boolean;\n  autoFocus?: boolean;\n  name?: string;\n  placeholder?: string;\n  disabled?: boolean;\n  readOnly?: boolean;\n  rules?: Rule[];\n  status?: SFieldStatus;\n  focused?: boolean;\n  hovered?: boolean;\n  /** 입력 앞 슬롯 */\n  prefix?: ReactNode;\n  /** 입력 뒤 슬롯 */\n  suffix?: ReactNode;\n  inputClass?: string;\n  inputStyle?: CSSProperties;\n  // ── SField ──\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  width?: number | string;\n  className?: string;\n  style?: CSSProperties;\n}\n\n/** SBarcodeInput — sd-barcode-input 포팅. 바코드용 노란 배경 입력 + prefix/suffix + clearable. */\nexport const SBarcodeInput = forwardRef<HTMLInputElement, SBarcodeInputProps>(\n  function SBarcodeInput(\n    {\n      value,\n      onValueChange,\n      onFocus,\n      onBlur,\n      size = 'sm',\n      clearable = false,\n      autoFocus,\n      name,\n      placeholder = '입력해 주세요.',\n      disabled = false,\n      readOnly = false,\n      rules,\n      status,\n      focused,\n      hovered,\n      prefix,\n      suffix,\n      inputClass,\n      inputStyle,\n      label,\n      labelWidth,\n      icon,\n      iconColor,\n      labelTooltip,\n      labelTooltipProps,\n      addonLabel,\n      addonAlign,\n      hint,\n      error,\n      errorMessage,\n      width,\n      className,\n      style,\n    },\n    ref,\n  ) {\n    const f = FONT[size];\n    const [ruleError, setRuleError] = useState('');\n    const hasValue = value !== undefined && value !== null && String(value) !== '';\n\n    // SForm 등록 — submit 시 폼이 이 필드를 일괄 검증한다 (폼 밖이면 no-op)\n    useFormField({\n      name,\n      validate: () => {\n        const msg = runRules(value, rules);\n        setRuleError(msg);\n        return msg === '';\n      },\n      resetValidation: () => setRuleError(''),\n    });\n\n    const resolvedError = error || ruleError !== '';\n    const resolvedStatus =\n      status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n\n    return (\n      <SField\n        label={label}\n        labelWidth={labelWidth}\n        icon={icon}\n        iconColor={iconColor}\n        labelTooltip={labelTooltip}\n        labelTooltipProps={labelTooltipProps}\n        addonLabel={addonLabel}\n        addonAlign={addonAlign}\n        size={size}\n        hint={hint}\n        error={resolvedError}\n        status={resolvedStatus}\n        focused={focused}\n        hovered={hovered}\n        errorMessage={ruleError !== '' ? ruleError : errorMessage}\n        width={width}\n        disabled={disabled}\n        readOnly={readOnly}\n        className={className}\n        // 바코드 배경색 override\n        style={{\n          ['--sys-color-field-bg-default' as string]: 'var(--cmp-textinput-bg-barcode)',\n          ...style,\n        }}\n      >\n        <label\n          className=\"flex h-full w-full items-center\"\n          style={{ gap: f.gap, padding: `0 ${f.paddingX}` }}\n        >\n          {prefix}\n          <input\n            ref={ref}\n            name={name}\n            type=\"text\"\n            value={value ?? ''}\n            placeholder={placeholder}\n            disabled={disabled}\n            readOnly={readOnly}\n            autoFocus={autoFocus}\n            onChange={e => {\n              onValueChange?.(e.target.value);\n              if (ruleError !== '') setRuleError(runRules(e.target.value, rules));\n            }}\n            onFocus={() => onFocus?.()}\n            onBlur={e => {\n              if (rules && rules.length > 0) setRuleError(runRules(e.target.value, rules));\n              onBlur?.();\n            }}\n            className={cn(\n              'h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-textinput-text-placeholder)] disabled:cursor-not-allowed',\n              AUTOFILL_RESET_CLASS,\n              inputClass,\n            )}\n            style={{\n              fontSize: f.fontSize,\n              color: disabled\n                ? 'var(--cmp-textinput-text-disabled)'\n                : 'var(--cmp-textinput-text-default)',\n              ...inputStyle,\n            }}\n          />\n          {suffix}\n          {clearable && hasValue && !disabled && (\n            <SGhostButton\n              icon=\"close\"\n              size=\"xxs\"\n              ariaLabel=\"clear\"\n              onClick={() => {\n                onValueChange?.('');\n                setRuleError(runRules('', rules));\n              }}\n            />\n          )}\n        </label>\n      </SField>\n    );\n  },\n);\n","export type STimePickerSize = 'sm' | 'md';\nexport type STimePickerType = 'default' | 'midday';\nexport type STimePickerMeridiem = 'AM' | 'PM';\n\nconst V = (path: string) => `var(--cmp-timepicker-${path})`;\n\nexport const TIMEPICKER_SIZES = ['sm', 'md'] as const;\n\nexport const TIMEPICKER_SIZE_CONFIG: Record<\n  STimePickerSize,\n  {\n    height: string;\n    paddingX: string;\n    gap: string;\n    icon: string;\n    radius: string;\n    fontSize: number;\n    lineHeight: number;\n    minWidth: number;\n    fieldMinWidth: number;\n  }\n> = {\n  sm: {\n    height: V('sm-height'),\n    paddingX: V('sm-paddingX'),\n    gap: V('sm-gap'),\n    icon: V('sm-icon'),\n    radius: V('sm-radius'),\n    // TODO: component.timepicker 토큰에 typography가 추가되면 CSS 변수로 교체한다.\n    fontSize: 12,\n    lineHeight: 20,\n    minWidth: 80,\n    fieldMinWidth: 128,\n  },\n  md: {\n    height: V('md-height'),\n    paddingX: V('md-paddingX'),\n    gap: V('md-gap'),\n    icon: V('md-icon'),\n    radius: V('md-radius'),\n    // TODO: component.timepicker 토큰에 typography가 추가되면 CSS 변수로 교체한다.\n    fontSize: 14,\n    lineHeight: 24,\n    minWidth: 96,\n    fieldMinWidth: 160,\n  },\n};\n\nexport function clampTimePart(value: number, min: number, max: number): number {\n  if (!Number.isFinite(value)) return min;\n  return Math.min(Math.max(value, min), max);\n}\n\nexport function padTimePart(value: number): string {\n  return String(value).padStart(2, '0');\n}\n\nexport function parseTimeValue(value: string | null | undefined): {\n  hour: number;\n  minute: number;\n} {\n  const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(value ?? '');\n  if (!match) return { hour: 0, minute: 0 };\n  return {\n    hour: clampTimePart(Number(match[1]), 0, 23),\n    minute: clampTimePart(Number(match[2]), 0, 59),\n  };\n}\n\nexport function formatTimeValue(hour: number, minute: number): string {\n  return `${padTimePart(clampTimePart(hour, 0, 23))}:${padTimePart(clampTimePart(minute, 0, 59))}`;\n}\n\nexport function formatTimeDisplay(value: string | null | undefined, type: STimePickerType): string {\n  if (value == null || value === '') return '';\n  const { hour, minute } = parseTimeValue(value);\n  if (type === 'default') return formatTimeValue(hour, minute);\n\n  const meridiem = hour >= 12 ? '오후' : '오전';\n  const displayHour = hour % 12 === 0 ? 12 : hour % 12;\n  return `${meridiem} ${padTimePart(displayHour)}:${padTimePart(minute)}`;\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { SField, type SFieldSize, type SFieldAddonAlign, type SFieldStatus } from '../SField';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SGhostButton } from '../SGhostButton';\nimport { type SColor } from '../../lib/color';\nimport { cn } from '../../lib/cn';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { type STooltipProps } from '../STooltip';\nimport {\n  TIMEPICKER_SIZE_CONFIG,\n  clampTimePart,\n  formatTimeDisplay,\n  formatTimeValue,\n  parseTimeValue,\n  type STimePickerMeridiem,\n  type STimePickerSize,\n  type STimePickerType,\n} from './timepicker.config';\n\nexport type { STimePickerSize, STimePickerType } from './timepicker.config';\n\nconst TIME_SELECTOR_WIDTH = 136;\nconst MERIDIEM_TIME_SELECTOR_WIDTH = 154;\n\nexport interface STimePickerProps {\n  /** 선택 시간 (HH:mm) */\n  value?: string | null;\n  /** 선택 변경 (sdUpdate) */\n  onValueChange?: (time: string | null) => void;\n  /** 열림/닫힘 변경 (sdDropDownShow) */\n  onOpenChange?: (open: boolean) => void;\n  /** 표시 타입: default(24시간) / midday(오전·오후) */\n  type?: STimePickerType;\n  size?: STimePickerSize;\n  placeholder?: string;\n  disabled?: boolean;\n  clearable?: boolean;\n  /** 오전/오후 선택 표시 여부. 지정하지 않으면 type=\"midday\"일 때만 켜집니다. */\n  useMeridiem?: boolean;\n  minuteStep?: number;\n  width?: number | string;\n  name?: string;\n  rules?: Rule[];\n  status?: SFieldStatus;\n  // ── SField ──\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\nexport function TimeSelector({\n  value,\n  useMeridiem,\n  minuteStep,\n  onChange,\n}: {\n  value?: string | null;\n  useMeridiem: boolean;\n  minuteStep: number;\n  onChange: (time: string) => void;\n}) {\n  const parsed = useMemo(() => parseTimeValue(value), [value]);\n  const [hour, setHour] = useState(parsed.hour);\n  const [minute, setMinute] = useState(parsed.minute);\n  const [editingPart, setEditingPart] = useState<'hour' | 'minute' | null>(null);\n  const [inputDraft, setInputDraft] = useState<Partial<Record<'hour' | 'minute', string>>>({});\n\n  useEffect(() => {\n    setHour(parsed.hour);\n    setMinute(parsed.minute);\n  }, [parsed.hour, parsed.minute]);\n\n  const meridiem: STimePickerMeridiem = hour >= 12 ? 'PM' : 'AM';\n  const displayHour = useMeridiem ? (hour % 12 === 0 ? 12 : hour % 12) : hour;\n\n  const commit = (nextHour: number, nextMinute: number) => {\n    const h = clampTimePart(nextHour, 0, 23);\n    const m = clampTimePart(nextMinute, 0, 59);\n    setHour(h);\n    setMinute(m);\n    onChange(formatTimeValue(h, m));\n  };\n\n  const setMeridiem = (next: STimePickerMeridiem) => {\n    if (next === meridiem) return;\n    commit(next === 'AM' ? hour - 12 : hour + 12, minute);\n  };\n\n  const changeMinute = (delta: number) => {\n    const next = minute + delta;\n    if (next > 59) {\n      commit((hour + 1) % 24, next - 60);\n      return;\n    }\n    if (next < 0) {\n      commit((hour + 23) % 24, next + 60);\n      return;\n    }\n    commit(hour, next);\n  };\n\n  const changeHour = (delta: number) => commit((hour + delta + 24) % 24, minute);\n\n  const sanitizeInput = (next: string) => next.replace(/\\D/g, '').slice(0, 2);\n\n  const beginEdit = (part: 'hour' | 'minute', currentValue: number) => {\n    setEditingPart(part);\n    setInputDraft(prev => ({ ...prev, [part]: String(currentValue).padStart(2, '0') }));\n  };\n\n  const commitHourDraft = (draft: string) => {\n    const clamped = clampTimePart(Number(draft), useMeridiem ? 1 : 0, useMeridiem ? 12 : 23);\n    const nextHour = useMeridiem\n      ? meridiem === 'PM'\n        ? clamped === 12\n          ? 12\n          : clamped + 12\n        : clamped === 12\n          ? 0\n          : clamped\n      : clamped;\n    commit(nextHour, minute);\n    return clamped;\n  };\n\n  const commitMinuteDraft = (draft: string) => {\n    const clamped = clampTimePart(Number(draft), 0, 59);\n    commit(hour, clamped);\n    return clamped;\n  };\n\n  const endEdit = (part: 'hour' | 'minute') => {\n    const draft = inputDraft[part];\n    if (part === 'hour' && draft != null && draft !== '') {\n      commitHourDraft(draft);\n    }\n    if (part === 'minute' && draft != null && draft !== '') {\n      commitMinuteDraft(draft);\n    }\n    setEditingPart(null);\n    setInputDraft({});\n  };\n\n  const inputStyle = {\n    width: 'var(--cmp-timepicker-selector-time-input-width)',\n    height: 'var(--cmp-textinput-sm-height)',\n    borderRadius: 'var(--cmp-textinput-sm-radius)',\n    border: 'var(--cmp-textinput-borderWidth) solid var(--cmp-textinput-border-default)',\n    color: 'var(--cmp-textinput-text-default)',\n    fontSize: 12,\n    lineHeight: '20px',\n  } as CSSProperties;\n\n  const renderColumn = (type: 'hour' | 'minute') => {\n    const isHour = type === 'hour';\n    const val = isHour ? displayHour : minute;\n    const displayValue =\n      editingPart === type ? (inputDraft[type] ?? '') : String(val).padStart(2, '0');\n\n    return (\n      <div\n        className=\"flex flex-col items-center justify-center\"\n        style={{ gap: 'var(--cmp-timepicker-selector-time-column-gap)' }}\n      >\n        <SGhostButton\n          icon=\"chevronUp\"\n          size=\"xs\"\n          ariaLabel={`${isHour ? '시' : '분'} 증가`}\n          onClick={() => (isHour ? changeHour(1) : changeMinute(minuteStep))}\n        />\n        <input\n          aria-label={isHour ? '시' : '분'}\n          inputMode=\"numeric\"\n          value={displayValue}\n          placeholder=\"-\"\n          onFocus={() => beginEdit(type, val)}\n          onBlur={() => endEdit(type)}\n          onChange={event => {\n            const draft = sanitizeInput(event.target.value);\n            setInputDraft(prev => ({ ...prev, [type]: draft }));\n            if (draft === '') return;\n\n            const raw = Number(draft);\n            if (isHour) {\n              if (draft.length < 2) return;\n              const clamped = commitHourDraft(draft);\n              const displayDraft = raw === clamped ? draft : String(clamped);\n              setInputDraft(prev => ({ ...prev, [type]: displayDraft }));\n              return;\n            }\n            if (draft.length < 2) return;\n            const clamped = commitMinuteDraft(draft);\n            const displayDraft = raw === clamped ? draft : String(clamped);\n            setInputDraft(prev => ({ ...prev, [type]: displayDraft }));\n          }}\n          className=\"box-border bg-white text-center outline-none\"\n          style={inputStyle}\n        />\n        <SGhostButton\n          icon=\"chevronDown\"\n          size=\"xs\"\n          ariaLabel={`${isHour ? '시' : '분'} 감소`}\n          onClick={() => (isHour ? changeHour(-1) : changeMinute(-minuteStep))}\n        />\n      </div>\n    );\n  };\n\n  return (\n    <div\n      className=\"flex flex-col items-stretch justify-center overflow-hidden\"\n      style={{\n        background: 'var(--cmp-timepicker-selector-bg)',\n        borderRadius: 'var(--cmp-timepicker-selector-radius)',\n        boxShadow: '4px 8px 16px -4px rgba(34,34,34,0.1), 0 0 24px -6px rgba(34,34,34,0.12)',\n      }}\n    >\n      {useMeridiem && (\n        <div\n          className=\"flex items-center justify-center\"\n          style={{\n            padding:\n              'var(--cmp-timepicker-selector-section-paddingY) var(--cmp-timepicker-selector-section-paddingX)',\n          }}\n        >\n          <div className=\"isolate flex\">\n            {(['AM', 'PM'] as const).map((item, index) => {\n              const selected = item === meridiem;\n              return (\n                <button\n                  key={item}\n                  type=\"button\"\n                  onClick={() => setMeridiem(item)}\n                  className={cn(\n                    'box-border h-[var(--cmp-textinput-sm-height)] w-[61px] cursor-pointer border border-solid bg-white text-center text-[12px] font-medium leading-[20px]',\n                    index === 0\n                      ? 'rounded-l-[var(--cmp-select-sm-radius)]'\n                      : 'rounded-r-[var(--cmp-select-sm-radius)]',\n                    index === 0 ? '-mr-px' : '',\n                    selected\n                      ? 'z-[1] border-[var(--cmp-timepicker-border-focus)] text-[var(--cmp-timepicker-border-focus)]'\n                      : 'border-[var(--cmp-timepicker-border-default)] text-[var(--cmp-field-hint-color)]',\n                  )}\n                >\n                  {item === 'AM' ? '오전' : '오후'}\n                </button>\n              );\n            })}\n          </div>\n        </div>\n      )}\n      {useMeridiem && <div className=\"h-px w-full bg-[var(--sys-color-divider-default)]\" />}\n      <div\n        className=\"flex items-center justify-center\"\n        style={{\n          gap: 'var(--cmp-timepicker-selector-time-gap)',\n          padding:\n            'var(--cmp-timepicker-selector-section-paddingY) var(--cmp-timepicker-selector-section-paddingX)',\n        }}\n      >\n        {renderColumn('hour')}\n        <span\n          className=\"text-center\"\n          style={{\n            width: 'var(--cmp-timepicker-selector-colon-size)',\n            color: 'var(--cmp-field-hint-color)',\n            fontSize: 'var(--cmp-timepicker-selector-colon-size)',\n            lineHeight: 'var(--cmp-timepicker-selector-colon-size)',\n          }}\n        >\n          :\n        </span>\n        {renderColumn('minute')}\n      </div>\n    </div>\n  );\n}\n\n/** STimePicker — sd-time-picker 포팅. SField + Popover(TimeSelector). */\nexport function STimePicker({\n  value,\n  onValueChange,\n  onOpenChange,\n  type = 'default',\n  size = 'sm',\n  placeholder = '00:00',\n  disabled = false,\n  clearable = false,\n  useMeridiem,\n  minuteStep = 1,\n  width,\n  name,\n  rules,\n  status,\n  label,\n  labelWidth,\n  icon,\n  iconColor,\n  labelTooltip,\n  labelTooltipProps,\n  addonLabel,\n  addonAlign,\n  hint,\n  error,\n  errorMessage,\n  className,\n  style,\n}: STimePickerProps) {\n  const portalContainer = usePortalContainer();\n  const triggerRef = useRef<HTMLDivElement | null>(null);\n  const [open, setOpen] = useState(false);\n  const [popoverAlignOffset, setPopoverAlignOffset] = useState(0);\n  const [focused, setFocused] = useState(false);\n  const [ruleError, setRuleError] = useState('');\n  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;\n  const normalized = value\n    ? formatTimeValue(parseTimeValue(value).hour, parseTimeValue(value).minute)\n    : null;\n  const effectiveUseMeridiem = useMeridiem ?? type === 'midday';\n  const displayText = formatTimeDisplay(normalized, effectiveUseMeridiem ? 'midday' : 'default');\n  const hasValue = normalized != null && normalized !== '';\n\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(value, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n\n  const commitOpen = (next: boolean) => {\n    if (disabled) return;\n    if (next) {\n      const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;\n      const selectorWidth = effectiveUseMeridiem\n        ? MERIDIEM_TIME_SELECTOR_WIDTH\n        : TIME_SELECTOR_WIDTH;\n      setPopoverAlignOffset(Math.max(0, (triggerWidth - selectorWidth) / 2));\n    }\n    setOpen(next);\n    onOpenChange?.(next);\n    if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));\n  };\n\n  const commitValue = (next: string | null) => {\n    onValueChange?.(next);\n    if (rules && rules.length > 0) setRuleError(runRules(next, rules));\n  };\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      size={size as SFieldSize}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused || open}\n      errorMessage={ruleError !== '' ? ruleError : errorMessage}\n      width={width}\n      minWidth={dims.fieldMinWidth}\n      disabled={disabled}\n      className={className}\n      style={style}\n    >\n      <RPopover.Root open={open} onOpenChange={commitOpen}>\n        <RPopover.Trigger asChild>\n          <div\n            ref={triggerRef}\n            role=\"button\"\n            aria-disabled={disabled}\n            tabIndex={disabled ? -1 : 0}\n            data-name={name}\n            onFocus={() => setFocused(true)}\n            onBlur={() => setFocused(false)}\n            onKeyDown={event => {\n              if (disabled) return;\n              if (event.key === 'Enter' || event.key === ' ') {\n                event.preventDefault();\n                commitOpen(!open);\n              }\n            }}\n            className={cn(\n              'flex h-full w-full items-center overflow-hidden bg-transparent outline-none',\n              disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n            )}\n            style={{ padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius }}\n          >\n            <SIcon\n              name=\"clockOutline\"\n              size={dims.icon}\n              color={\n                disabled\n                  ? 'var(--cmp-timepicker-icon-disabled)'\n                  : 'var(--cmp-timepicker-icon-default)'\n              }\n              className=\"flex-shrink-0\"\n            />\n            <span\n              className=\"flex-1 truncate text-center\"\n              style={{\n                minWidth: dims.minWidth,\n                fontSize: dims.fontSize,\n                lineHeight: `${dims.lineHeight}px`,\n                color: disabled\n                  ? 'var(--cmp-timepicker-text-disabled)'\n                  : hasValue\n                    ? 'var(--cmp-timepicker-text-default)'\n                    : 'var(--cmp-field-hint-color)',\n              }}\n            >\n              {hasValue ? displayText : placeholder}\n            </span>\n            {clearable && hasValue && !disabled && (\n              <SGhostButton\n                icon=\"close\"\n                size=\"xs\"\n                ariaLabel=\"시간 지우기\"\n                onClick={event => {\n                  event.stopPropagation();\n                  commitValue(null);\n                }}\n              />\n            )}\n          </div>\n        </RPopover.Trigger>\n        <RPopover.Portal container={portalContainer}>\n          <RPopover.Content\n            side=\"bottom\"\n            align=\"start\"\n            sideOffset={4}\n            alignOffset={popoverAlignOffset}\n            className={cn('z-50', FLOATING_SLIDE_ANIM)}\n          >\n            <TimeSelector\n              value={normalized}\n              useMeridiem={effectiveUseMeridiem}\n              minuteStep={minuteStep}\n              onChange={commitValue}\n            />\n          </RPopover.Content>\n        </RPopover.Portal>\n      </RPopover.Root>\n    </SField>\n  );\n}\n","import {\n  TIMEPICKER_SIZE_CONFIG,\n  clampTimePart,\n  formatTimeDisplay,\n  formatTimeValue,\n  parseTimeValue,\n  type STimePickerMeridiem,\n  type STimePickerSize,\n  type STimePickerType,\n} from '../STimePicker/timepicker.config';\n\nexport type STimeRangePickerSize = STimePickerSize;\nexport type STimeRangePickerType = STimePickerType;\nexport type STimeRangePickerMeridiem = STimePickerMeridiem;\nexport type STimeRangePickerRangeOrder = 'strict' | 'allow-cross-day';\nexport type STimeRangeValue = [string, string] | null;\n\nexport {\n  TIMEPICKER_SIZE_CONFIG as TIME_RANGE_PICKER_SIZE_CONFIG,\n  clampTimePart,\n  formatTimeDisplay,\n  formatTimeValue,\n  parseTimeValue,\n};\n\nfunction getTimeMinutes(value: string): number {\n  const { hour, minute } = parseTimeValue(value);\n  return hour * 60 + minute;\n}\n\nexport function normalizeTimeRangeValue(\n  value: STimeRangeValue,\n  rangeOrder: STimeRangePickerRangeOrder = 'strict',\n): STimeRangeValue {\n  if (value == null) return null;\n  const normalized = value.map(item => {\n    const parsed = parseTimeValue(item);\n    return formatTimeValue(parsed.hour, parsed.minute);\n  }) as [string, string];\n\n  if (rangeOrder === 'strict' && getTimeMinutes(normalized[0]) > getTimeMinutes(normalized[1])) {\n    return [normalized[0], normalized[0]];\n  }\n\n  return normalized;\n}\n\nexport function formatTimeRangeDisplay(value: STimeRangeValue, type: STimeRangePickerType): string {\n  if (value == null || value[0] === '' || value[1] === '') return '';\n  return `${formatTimeDisplay(value[0], type)} ~ ${formatTimeDisplay(value[1], type)}`;\n}\n","'use client';\n\nimport { useMemo, useRef, useState, type CSSProperties } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { SField, type SFieldAddonAlign, type SFieldSize, type SFieldStatus } from '../SField';\nimport { SIcon, type SIconName } from '../SIcon';\nimport { SGhostButton } from '../SGhostButton';\nimport { type SColor } from '../../lib/color';\nimport { cn } from '../../lib/cn';\nimport { runRules, useFormField, type Rule } from '../../lib/form';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\nimport { type STooltipProps } from '../STooltip';\nimport {\n  TIME_RANGE_PICKER_SIZE_CONFIG,\n  clampTimePart,\n  formatTimeRangeDisplay,\n  formatTimeValue,\n  normalizeTimeRangeValue,\n  parseTimeValue,\n  type STimeRangePickerMeridiem,\n  type STimeRangePickerRangeOrder,\n  type STimeRangePickerSize,\n  type STimeRangePickerType,\n  type STimeRangeValue,\n} from './time-range-picker.config';\n\nexport type {\n  STimeRangePickerSize,\n  STimeRangePickerRangeOrder,\n  STimeRangePickerType,\n  STimeRangeValue,\n} from './time-range-picker.config';\n\nconst TIME_RANGE_SELECTOR_WIDTH = 345;\nconst MIDDAY_FIELD_MIN_WIDTH: Record<STimeRangePickerSize, number> = {\n  sm: 178,\n  md: 216,\n};\n\nexport interface STimeRangePickerProps {\n  /** 선택 시간 범위 [시작, 종료] (HH:mm) */\n  value?: STimeRangeValue;\n  /** 선택 변경 (sdUpdate) */\n  onValueChange?: (range: STimeRangeValue) => void;\n  /** 열림/닫힘 변경 (sdDropDownShow) */\n  onOpenChange?: (open: boolean) => void;\n  /** 표시 타입: default(24시간) / midday(오전·오후) */\n  type?: STimeRangePickerType;\n  size?: STimeRangePickerSize;\n  placeholder?: string;\n  disabled?: boolean;\n  clearable?: boolean;\n  /** 오전/오후 선택 표시 여부. 지정하지 않으면 type=\"midday\"일 때만 켜집니다. */\n  useMeridiem?: boolean;\n  minuteStep?: number;\n  /** 범위 순서 정책. strict는 시작 시간이 종료 시간보다 늦어지지 않도록 보정합니다. */\n  rangeOrder?: STimeRangePickerRangeOrder;\n  width?: number | string;\n  name?: string;\n  rules?: Rule[];\n  status?: SFieldStatus;\n  label?: string;\n  labelWidth?: number | string;\n  icon?: SIconName;\n  iconColor?: SColor;\n  labelTooltip?: string;\n  labelTooltipProps?: Partial<STooltipProps>;\n  addonLabel?: string;\n  addonAlign?: SFieldAddonAlign;\n  hint?: string;\n  error?: boolean;\n  errorMessage?: string;\n  className?: string;\n  style?: CSSProperties;\n}\n\ntype RangeSide = 'start' | 'end';\ntype RangePart = 'hour' | 'minute';\ntype EditingKey = `${RangeSide}-${RangePart}`;\ntype ChangeDirection = 'increase' | 'decrease' | 'unknown';\n\nexport function RangeTimeSelector({\n  value,\n  useMeridiem,\n  minuteStep,\n  rangeOrder,\n  onChange,\n}: {\n  value?: STimeRangeValue;\n  useMeridiem: boolean;\n  minuteStep: number;\n  rangeOrder: STimeRangePickerRangeOrder;\n  onChange: (range: [string, string]) => void;\n}) {\n  const range = useMemo<[string, string]>(() => value ?? ['00:00', '23:59'], [value]);\n  const [editingKey, setEditingKey] = useState<EditingKey | null>(null);\n  const [inputDraft, setInputDraft] = useState<Partial<Record<EditingKey, string>>>({});\n  const autoAdjustedRef = useRef<{\n    side: RangeSide;\n    direction: Exclude<ChangeDirection, 'unknown'>;\n  } | null>(null);\n\n  const getParts = (side: RangeSide) => parseTimeValue(side === 'start' ? range[0] : range[1]);\n  const getMeridiem = (side: RangeSide): STimeRangePickerMeridiem =>\n    getParts(side).hour >= 12 ? 'PM' : 'AM';\n  const getDisplayHour = (side: RangeSide) => {\n    const { hour } = getParts(side);\n    if (!useMeridiem) return hour;\n    const displayHour = hour % 12;\n    return displayHour === 0 ? 12 : displayHour;\n  };\n\n  const commit = (\n    side: RangeSide,\n    hour: number,\n    minute: number,\n    direction: ChangeDirection = 'unknown',\n  ) => {\n    const next = formatTimeValue(hour, minute);\n    onChange(\n      normalizeNextRange(side === 'start' ? [next, range[1]] : [range[0], next], side, direction),\n    );\n  };\n\n  const getTimeMinutes = (time: string) => {\n    const { hour, minute } = parseTimeValue(time);\n    return hour * 60 + minute;\n  };\n\n  const normalizeNextRange = (\n    nextRange: [string, string],\n    changedSide: RangeSide,\n    direction: ChangeDirection,\n  ): [string, string] => {\n    if (rangeOrder === 'allow-cross-day') return nextRange;\n    const [start, end] = nextRange;\n    const [currentStart, currentEnd] = range;\n    if (getTimeMinutes(start) <= getTimeMinutes(end)) {\n      const shouldKeepSynced =\n        autoAdjustedRef.current?.side === changedSide &&\n        currentStart === currentEnd &&\n        start !== end &&\n        (direction === 'unknown' || autoAdjustedRef.current.direction === direction);\n\n      if (shouldKeepSynced) {\n        return changedSide === 'start' ? [start, start] : [end, end];\n      }\n      autoAdjustedRef.current = null;\n      return nextRange;\n    }\n    autoAdjustedRef.current = {\n      side: changedSide,\n      direction: changedSide === 'start' ? 'increase' : 'decrease',\n    };\n    return changedSide === 'start' ? [start, start] : [end, end];\n  };\n\n  const changeHour = (side: RangeSide, delta: number) => {\n    const { hour, minute } = getParts(side);\n    commit(side, (hour + delta + 24) % 24, minute, delta > 0 ? 'increase' : 'decrease');\n  };\n\n  const changeMinute = (side: RangeSide, delta: number) => {\n    const { hour, minute } = getParts(side);\n    const next = minute + delta;\n    if (next > 59) {\n      commit(side, (hour + 1) % 24, next - 60, delta > 0 ? 'increase' : 'decrease');\n      return;\n    }\n    if (next < 0) {\n      commit(side, (hour + 23) % 24, next + 60, delta > 0 ? 'increase' : 'decrease');\n      return;\n    }\n    commit(side, hour, next, delta > 0 ? 'increase' : 'decrease');\n  };\n\n  const setMeridiem = (side: RangeSide, next: STimeRangePickerMeridiem) => {\n    const current = getMeridiem(side);\n    if (current === next) return;\n    const { hour, minute } = getParts(side);\n    commit(side, next === 'AM' ? hour - 12 : hour + 12, minute);\n  };\n\n  const getEditingKey = (side: RangeSide, part: RangePart): EditingKey => `${side}-${part}`;\n  const sanitizeInput = (next: string) => next.replace(/\\D/g, '').slice(0, 2);\n\n  const beginEdit = (side: RangeSide, part: RangePart, currentValue: number) => {\n    const key = getEditingKey(side, part);\n    setEditingKey(key);\n    setInputDraft(prev => ({ ...prev, [key]: String(currentValue).padStart(2, '0') }));\n  };\n\n  const commitHourDraft = (side: RangeSide, draft: string) => {\n    const clamped = clampTimePart(Number(draft), useMeridiem ? 1 : 0, useMeridiem ? 12 : 23);\n    const parts = getParts(side);\n    const meridiem = getMeridiem(side);\n    const nextHour = useMeridiem\n      ? meridiem === 'PM'\n        ? clamped === 12\n          ? 12\n          : clamped + 12\n        : clamped === 12\n          ? 0\n          : clamped\n      : clamped;\n    commit(side, nextHour, parts.minute);\n    return clamped;\n  };\n\n  const commitMinuteDraft = (side: RangeSide, draft: string) => {\n    const { hour } = getParts(side);\n    const clamped = clampTimePart(Number(draft), 0, 59);\n    commit(side, hour, clamped);\n    return clamped;\n  };\n\n  const endEdit = (side: RangeSide, part: RangePart) => {\n    const key = getEditingKey(side, part);\n    const draft = inputDraft[key];\n    if (part === 'hour' && draft != null && draft !== '') {\n      commitHourDraft(side, draft);\n    }\n    if (part === 'minute' && draft != null && draft !== '') {\n      commitMinuteDraft(side, draft);\n    }\n    setEditingKey(null);\n    setInputDraft({});\n  };\n\n  const inputStyle = {\n    width: 'var(--cmp-timepicker-selector-time-input-width)',\n    height: 'var(--cmp-textinput-sm-height)',\n    borderRadius: 'var(--cmp-textinput-sm-radius)',\n    border: 'var(--cmp-textinput-borderWidth) solid var(--cmp-textinput-border-default)',\n    color: 'var(--cmp-textinput-text-default)',\n    fontSize: 12,\n    lineHeight: '20px',\n  } as CSSProperties;\n\n  const renderColumn = (side: RangeSide, kind: 'hour' | 'minute') => {\n    const isHour = kind === 'hour';\n    const { minute } = getParts(side);\n    const val = isHour ? getDisplayHour(side) : minute;\n    const currentEditingKey = getEditingKey(side, kind);\n    const displayValue =\n      editingKey === currentEditingKey\n        ? (inputDraft[currentEditingKey] ?? '')\n        : String(val).padStart(2, '0');\n\n    return (\n      <div\n        className=\"flex flex-col items-center justify-center\"\n        style={{ gap: 'var(--cmp-timepicker-selector-time-column-gap)' }}\n      >\n        <SGhostButton\n          icon=\"chevronUp\"\n          size=\"xs\"\n          ariaLabel={`${side === 'start' ? '시작' : '종료'} ${isHour ? '시' : '분'} 증가`}\n          onClick={() => (isHour ? changeHour(side, 1) : changeMinute(side, minuteStep))}\n        />\n        <input\n          aria-label={`${side === 'start' ? '시작' : '종료'} ${isHour ? '시' : '분'}`}\n          inputMode=\"numeric\"\n          value={displayValue}\n          placeholder=\"-\"\n          onFocus={() => beginEdit(side, kind, val)}\n          onBlur={() => endEdit(side, kind)}\n          onChange={event => {\n            const draft = sanitizeInput(event.target.value);\n            setInputDraft(prev => ({ ...prev, [currentEditingKey]: draft }));\n            if (draft === '') return;\n\n            const raw = Number(draft);\n            if (isHour) {\n              if (draft.length < 2) return;\n              const clamped = commitHourDraft(side, draft);\n              const displayDraft = raw === clamped ? draft : String(clamped);\n              setInputDraft(prev => ({ ...prev, [currentEditingKey]: displayDraft }));\n              return;\n            }\n            if (draft.length < 2) return;\n            const clamped = commitMinuteDraft(side, draft);\n            const displayDraft = raw === clamped ? draft : String(clamped);\n            setInputDraft(prev => ({ ...prev, [currentEditingKey]: displayDraft }));\n          }}\n          className=\"box-border bg-white text-center outline-none\"\n          style={inputStyle}\n        />\n        <SGhostButton\n          icon=\"chevronDown\"\n          size=\"xs\"\n          ariaLabel={`${side === 'start' ? '시작' : '종료'} ${isHour ? '시' : '분'} 감소`}\n          onClick={() => (isHour ? changeHour(side, -1) : changeMinute(side, -minuteStep))}\n        />\n      </div>\n    );\n  };\n\n  const renderPanel = (side: RangeSide, title: string) => (\n    <div\n      className=\"flex flex-col items-center justify-center\"\n      style={{ gap: 'var(--cmp-timepicker-selector-range-section-gap)' }}\n    >\n      <div\n        className=\"flex flex-col items-center\"\n        style={{ gap: 'var(--cmp-timepicker-selector-range-heading-gap)' }}\n      >\n        <div className=\"whitespace-nowrap text-center text-[12px] font-bold leading-[20px] text-[var(--cmp-timepicker-selector-range-heading-color)]\">\n          {title}\n        </div>\n        {useMeridiem && (\n          <div className=\"isolate flex\">\n            {(['AM', 'PM'] as const).map((item, index) => {\n              const selected = item === getMeridiem(side);\n              return (\n                <button\n                  key={item}\n                  type=\"button\"\n                  onClick={() => setMeridiem(side, item)}\n                  className={cn(\n                    'box-border h-[var(--cmp-textinput-sm-height)] w-[61px] cursor-pointer border border-solid bg-white text-center text-[12px] font-medium leading-[20px]',\n                    index === 0\n                      ? 'rounded-l-[var(--cmp-select-sm-radius)] -mr-px'\n                      : 'rounded-r-[var(--cmp-select-sm-radius)]',\n                    selected\n                      ? 'z-[1] border-[var(--cmp-timepicker-border-focus)] text-[var(--cmp-timepicker-border-focus)]'\n                      : 'border-[var(--cmp-timepicker-border-default)] text-[var(--cmp-field-hint-color)]',\n                  )}\n                >\n                  {item === 'AM' ? '오전' : '오후'}\n                </button>\n              );\n            })}\n          </div>\n        )}\n      </div>\n      <div\n        className=\"flex items-center justify-center\"\n        style={{\n          gap: 'var(--cmp-timepicker-selector-time-gap)',\n          padding: '0 var(--cmp-timepicker-selector-section-paddingX)',\n        }}\n      >\n        {renderColumn(side, 'hour')}\n        <span\n          className=\"text-center\"\n          style={{\n            width: 'var(--cmp-timepicker-selector-colon-size)',\n            color: 'var(--cmp-field-hint-color)',\n            fontSize: 'var(--cmp-timepicker-selector-colon-size)',\n            lineHeight: 'var(--cmp-timepicker-selector-colon-size)',\n          }}\n        >\n          :\n        </span>\n        {renderColumn(side, 'minute')}\n      </div>\n    </div>\n  );\n\n  return (\n    <div\n      className=\"flex items-start justify-center overflow-hidden\"\n      style={{\n        gap: 'var(--cmp-timepicker-selector-range-panelGap)',\n        padding: 'var(--cmp-timepicker-selector-range-paddingXY)',\n        background: 'var(--cmp-timepicker-selector-bg)',\n        borderRadius: 'var(--cmp-timepicker-selector-radius)',\n        boxShadow: 'var(--shadow-spread-sm), var(--shadow-spread-md)',\n      }}\n    >\n      {renderPanel('start', '시작 시간')}\n      <div className=\"self-stretch w-px bg-[var(--sys-color-divider-default)]\" />\n      {renderPanel('end', '종료 시간')}\n    </div>\n  );\n}\n\n/** STimeRangePicker — sd-time-range-picker 포팅. SField + Popover(RangeTimeSelector). */\nexport function STimeRangePicker({\n  value,\n  onValueChange,\n  onOpenChange,\n  type = 'default',\n  size = 'sm',\n  placeholder = '00:00 ~ 23:59',\n  disabled = false,\n  clearable = false,\n  useMeridiem,\n  minuteStep = 1,\n  rangeOrder = 'strict',\n  width,\n  name,\n  rules,\n  status,\n  label,\n  labelWidth,\n  icon,\n  iconColor,\n  labelTooltip,\n  labelTooltipProps,\n  addonLabel,\n  addonAlign,\n  hint,\n  error,\n  errorMessage,\n  className,\n  style,\n}: STimeRangePickerProps) {\n  const portalContainer = usePortalContainer();\n  const triggerRef = useRef<HTMLDivElement | null>(null);\n  const [open, setOpen] = useState(false);\n  const [popoverAlignOffset, setPopoverAlignOffset] = useState(0);\n  const [focused, setFocused] = useState(false);\n  const [ruleError, setRuleError] = useState('');\n  const dims = TIME_RANGE_PICKER_SIZE_CONFIG[size] ?? TIME_RANGE_PICKER_SIZE_CONFIG.sm;\n  const normalized = normalizeTimeRangeValue(value ?? null, rangeOrder);\n  const effectiveUseMeridiem = useMeridiem ?? type === 'midday';\n  const displayText = formatTimeRangeDisplay(\n    normalized,\n    effectiveUseMeridiem ? 'midday' : 'default',\n  );\n  const hasValue = normalized != null && normalized[0] !== '' && normalized[1] !== '';\n\n  useFormField({\n    name,\n    validate: () => {\n      const msg = runRules(value, rules);\n      setRuleError(msg);\n      return msg === '';\n    },\n    resetValidation: () => setRuleError(''),\n  });\n\n  const resolvedError = error || ruleError !== '';\n  const resolvedStatus =\n    status ?? (rules && rules.length > 0 ? (ruleError !== '' ? 'error' : undefined) : undefined);\n\n  const commitOpen = (next: boolean) => {\n    if (disabled) return;\n    if (next) {\n      const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;\n      setPopoverAlignOffset(Math.max(0, (triggerWidth - TIME_RANGE_SELECTOR_WIDTH) / 2));\n    }\n    setOpen(next);\n    onOpenChange?.(next);\n    if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));\n  };\n\n  const commitValue = (next: STimeRangeValue) => {\n    onValueChange?.(next);\n    if (rules && rules.length > 0) setRuleError(runRules(next, rules));\n  };\n\n  return (\n    <SField\n      label={label}\n      labelWidth={labelWidth}\n      icon={icon}\n      iconColor={iconColor}\n      labelTooltip={labelTooltip}\n      labelTooltipProps={labelTooltipProps}\n      addonLabel={addonLabel}\n      addonAlign={addonAlign}\n      size={size as SFieldSize}\n      hint={hint}\n      error={resolvedError}\n      status={resolvedStatus}\n      focused={focused || open}\n      errorMessage={ruleError !== '' ? ruleError : errorMessage}\n      width={width}\n      minWidth={effectiveUseMeridiem ? MIDDAY_FIELD_MIN_WIDTH[size] : dims.fieldMinWidth}\n      disabled={disabled}\n      className={className}\n      style={style}\n    >\n      <RPopover.Root open={open} onOpenChange={commitOpen}>\n        <RPopover.Trigger asChild>\n          <div\n            ref={triggerRef}\n            role=\"button\"\n            aria-disabled={disabled}\n            tabIndex={disabled ? -1 : 0}\n            data-name={name}\n            onFocus={() => setFocused(true)}\n            onBlur={() => setFocused(false)}\n            onKeyDown={event => {\n              if (disabled) return;\n              if (event.key === 'Enter' || event.key === ' ') {\n                event.preventDefault();\n                commitOpen(!open);\n              }\n            }}\n            className={cn(\n              'flex h-full w-full items-center overflow-hidden bg-transparent outline-none',\n              disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n            )}\n            style={{ padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius }}\n          >\n            <SIcon\n              name=\"clockOutline\"\n              size={dims.icon}\n              color={\n                disabled\n                  ? 'var(--cmp-timepicker-icon-disabled)'\n                  : 'var(--cmp-timepicker-icon-default)'\n              }\n              className=\"flex-shrink-0\"\n            />\n            <span\n              className=\"flex-1 truncate text-center\"\n              style={{\n                minWidth: dims.minWidth,\n                fontSize: dims.fontSize,\n                lineHeight: `${dims.lineHeight}px`,\n                color: disabled\n                  ? 'var(--cmp-timepicker-text-disabled)'\n                  : hasValue\n                    ? 'var(--cmp-timepicker-text-default)'\n                    : 'var(--cmp-field-hint-color)',\n              }}\n            >\n              {hasValue ? displayText : placeholder}\n            </span>\n            {clearable && hasValue && !disabled && (\n              <SGhostButton\n                icon=\"close\"\n                size=\"xs\"\n                ariaLabel=\"시간 범위 지우기\"\n                onClick={event => {\n                  event.stopPropagation();\n                  commitValue(null);\n                }}\n              />\n            )}\n          </div>\n        </RPopover.Trigger>\n        <RPopover.Portal container={portalContainer}>\n          <RPopover.Content\n            side=\"bottom\"\n            align=\"start\"\n            sideOffset={4}\n            alignOffset={popoverAlignOffset}\n            className={cn('z-50', FLOATING_SLIDE_ANIM)}\n          >\n            <RangeTimeSelector\n              value={normalized}\n              useMeridiem={effectiveUseMeridiem}\n              minuteStep={minuteStep}\n              rangeOrder={rangeOrder}\n              onChange={commitValue}\n            />\n          </RPopover.Content>\n        </RPopover.Portal>\n      </RPopover.Root>\n    </SField>\n  );\n}\n"]}